=0||(o[n]=e[n]);return o}n.d(t,{Z:()=>r})},8776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},7529:e=>{"use strict";e.exports={}},6887:e=>{"use strict";e.exports=JSON.parse('{"/markdown-page-9d5":{"__comp":"1f391b9e","__context":{"plugin":"a7434565"},"content":"393be207"},"/docs/4.x-c9e":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"cae0f04b"},"/docs/4.x/category/administrator-103":{"__comp":"14eb3368","categoryGeneratedIndex":"9c3aeab1"},"/docs/4.x/category/apps-04a":{"__comp":"14eb3368","categoryGeneratedIndex":"6a4aefb0"},"/docs/4.x/category/cloud-provider-guides-f84":{"__comp":"14eb3368","categoryGeneratedIndex":"51763432"},"/docs/4.x/category/configuration-bbc":{"__comp":"14eb3368","categoryGeneratedIndex":"39534802"},"/docs/4.x/category/debug-files-dd6":{"__comp":"14eb3368","categoryGeneratedIndex":"3dd373c6"},"/docs/4.x/category/deployment-469":{"__comp":"14eb3368","categoryGeneratedIndex":"b9de103e"},"/docs/4.x/category/local-development-600":{"__comp":"14eb3368","categoryGeneratedIndex":"cd4eb1ed"},"/docs/4.x/category/monitoring-0aa":{"__comp":"14eb3368","categoryGeneratedIndex":"14094f46"},"/docs/4.x/category/sdks-f90":{"__comp":"14eb3368","categoryGeneratedIndex":"fe6331dc"},"/docs/4.x/category/toolkits-eeb":{"__comp":"14eb3368","categoryGeneratedIndex":"6cdd9503"},"/docs/4.x/contributing-guide/-595":{"__comp":"17896441","content":"72b5199f"},"/docs/4.x/contributing-guide/local-development/devcontainer-8a7":{"__comp":"17896441","content":"14a24e11"},"/docs/4.x/contributing-guide/local-development/source-code-9c2":{"__comp":"17896441","content":"c02123b5"},"/docs/4.x/developer-guide/-ce0":{"__comp":"17896441","content":"31dae65f"},"/docs/4.x/developer-guide/api-074":{"__comp":"17896441","content":"6c0d6c9a"},"/docs/4.x/developer-guide/api/apps-213":{"__comp":"17896441","content":"616acc84"},"/docs/4.x/developer-guide/api/debug_files-632":{"__comp":"17896441","content":"f9b37612"},"/docs/4.x/developer-guide/fastlane-9ff":{"__comp":"17896441","content":"c9fa300e"},"/docs/4.x/developer-guide/fastlane/zealot-191":{"__comp":"17896441","content":"c01945e0"},"/docs/4.x/developer-guide/fastlane/zealot_debug_file-187":{"__comp":"17896441","content":"ea003b3f"},"/docs/4.x/developer-guide/fastlane/zealot_sync_devices-609":{"__comp":"17896441","content":"ad4ca79f"},"/docs/4.x/developer-guide/fastlane/zealot_version_check-8f5":{"__comp":"17896441","content":"e7a8c7f9"},"/docs/4.x/developer-guide/sdk/android-dd8":{"__comp":"17896441","content":"aecd11f5"},"/docs/4.x/developer-guide/sdk/ios-d34":{"__comp":"17896441","content":"84706228"},"/docs/4.x/self-hosted/-472":{"__comp":"17896441","content":"fb7a7e13"},"/docs/4.x/self-hosted/configuration/environment-variables-78e":{"__comp":"17896441","content":"55db4623"},"/docs/4.x/self-hosted/configuration/schedule-jobs-db7":{"__comp":"17896441","content":"889fb5f5"},"/docs/4.x/self-hosted/configuration/third-party-authentication-8f0":{"__comp":"17896441","content":"69bb3584"},"/docs/4.x/self-hosted/deployment/architecture-575":{"__comp":"17896441","content":"5a522f46"},"/docs/4.x/self-hosted/deployment/docker-a96":{"__comp":"17896441","content":"2b8fdfa9"},"/docs/4.x/self-hosted/deployment/docker/step-by-step-f5a":{"__comp":"17896441","content":"52f780b0"},"/docs/4.x/self-hosted/deployment/fly-777":{"__comp":"17896441","content":"30a84665"},"/docs/4.x/self-hosted/deployment/kubernetes-80b":{"__comp":"17896441","content":"799ffaed"},"/docs/4.x/self-hosted/deployment/nomad-4be":{"__comp":"17896441","content":"ef513ce2"},"/docs/4.x/self-hosted/deployment/railway-6d9":{"__comp":"17896441","content":"b272fba4"},"/docs/4.x/self-hosted/deployment/render-23a":{"__comp":"17896441","content":"ddf401e0"},"/docs/4.x/self-hosted/deployment/requirements-9ee":{"__comp":"17896441","content":"21b281f9"},"/docs/4.x/self-hosted/deployment/source-code-2e3":{"__comp":"17896441","content":"35a98222"},"/docs/4.x/self-hosted/reverse-proxies-c94":{"__comp":"17896441","content":"f8a75f5e"},"/docs/4.x/self-hosted/storage-d32":{"__comp":"17896441","content":"220930de"},"/docs/4.x/user-guide/-814":{"__comp":"17896441","content":"5f8b303a"},"/docs/4.x/user-guide/administrator/apple-team-a72":{"__comp":"17896441","content":"5ec84ac2"},"/docs/4.x/user-guide/administrator/backup-846":{"__comp":"17896441","content":"1b734938"},"/docs/4.x/user-guide/administrator/monitoring/background-jobs-7ea":{"__comp":"17896441","content":"5da52b15"},"/docs/4.x/user-guide/administrator/monitoring/database-analytics-671":{"__comp":"17896441","content":"bf6ff0a4"},"/docs/4.x/user-guide/administrator/monitoring/logging-578":{"__comp":"17896441","content":"25301e6f"},"/docs/4.x/user-guide/administrator/monitoring/system-info-b65":{"__comp":"17896441","content":"8aa13b20"},"/docs/4.x/user-guide/administrator/permissions-adb":{"__comp":"17896441","content":"699a8fef"},"/docs/4.x/user-guide/administrator/project-settings-3b3":{"__comp":"17896441","content":"a949db22"},"/docs/4.x/user-guide/apps/create-af8":{"__comp":"17896441","content":"35a60b9c"},"/docs/4.x/user-guide/best_practices-fd7":{"__comp":"17896441","content":"8992496f"},"/docs/4.x/user-guide/changelog-88f":{"__comp":"17896441","content":"4d44c677"},"/docs/4.x/user-guide/credits-2b3":{"__comp":"17896441","content":"4cad2fe6"},"/docs/4.x/user-guide/dashboard-70e":{"__comp":"17896441","content":"4c432e95"},"/docs/4.x/user-guide/debug-files/upload-03e":{"__comp":"17896441","content":"002e3694"},"/docs/4.x/user-guide/qa-67e":{"__comp":"17896441","content":"3ee87be9"},"/docs/4.x/user-guide/toolkits/fetch-udid-b2a":{"__comp":"17896441","content":"52d3380a"},"/docs/4.x/user-guide/toolkits/teardown-8c8":{"__comp":"17896441","content":"bbec0ea8"},"/docs/4.x/user-guide/webhooks-322":{"__comp":"17896441","content":"e40683f4"},"/docs/4.x/user-guide/webhooks/dingtalk-54a":{"__comp":"17896441","content":"9e3eaffa"},"/docs/4.x/user-guide/webhooks/discord-e9c":{"__comp":"17896441","content":"2dc3018f"},"/docs/4.x/user-guide/webhooks/feishu-670":{"__comp":"17896441","content":"c0aa555d"},"/docs/4.x/user-guide/webhooks/slack-815":{"__comp":"17896441","content":"b5e1e414"},"/docs/4.x/user-guide/webhooks/wecom-8ae":{"__comp":"17896441","content":"011dea14"},"/docs/next-1c1":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"935f2afb"},"/docs/next/category/administrator-380":{"__comp":"14eb3368","categoryGeneratedIndex":"78cdd3ae"},"/docs/next/category/apps-102":{"__comp":"14eb3368","categoryGeneratedIndex":"20ab3326"},"/docs/next/category/cloud-provider-guides-df8":{"__comp":"14eb3368","categoryGeneratedIndex":"d59c50f6"},"/docs/next/category/configuration-1f8":{"__comp":"14eb3368","categoryGeneratedIndex":"226ba89c"},"/docs/next/category/debug-files-bf7":{"__comp":"14eb3368","categoryGeneratedIndex":"8bf7b385"},"/docs/next/category/deployment-de4":{"__comp":"14eb3368","categoryGeneratedIndex":"ab71d4e1"},"/docs/next/category/local-development-b0d":{"__comp":"14eb3368","categoryGeneratedIndex":"367ed454"},"/docs/next/category/monitoring-f5c":{"__comp":"14eb3368","categoryGeneratedIndex":"bdd7b463"},"/docs/next/category/sdks-34d":{"__comp":"14eb3368","categoryGeneratedIndex":"ef294a35"},"/docs/next/category/toolkits-00e":{"__comp":"14eb3368","categoryGeneratedIndex":"c8054fdf"},"/docs/next/contributing-guide/-414":{"__comp":"17896441","content":"600ac4e1"},"/docs/next/contributing-guide/local-development/devcontainer-499":{"__comp":"17896441","content":"0da88c94"},"/docs/next/contributing-guide/local-development/source-code-475":{"__comp":"17896441","content":"4bf92ea9"},"/docs/next/developer-guide/-796":{"__comp":"17896441","content":"848dab9f"},"/docs/next/developer-guide/api-2d3":{"__comp":"17896441","content":"45ab56fc"},"/docs/next/developer-guide/api/apps-ac7":{"__comp":"17896441","content":"f02d2d32"},"/docs/next/developer-guide/api/debug_files-aa9":{"__comp":"17896441","content":"aaab4dd5"},"/docs/next/developer-guide/fastlane-50f":{"__comp":"17896441","content":"adf2c0d2"},"/docs/next/developer-guide/fastlane/zealot-ce6":{"__comp":"17896441","content":"ede4b0bb"},"/docs/next/developer-guide/fastlane/zealot_debug_file-79f":{"__comp":"17896441","content":"d1dd54d0"},"/docs/next/developer-guide/fastlane/zealot_sync_devices-bde":{"__comp":"17896441","content":"0e2cdf96"},"/docs/next/developer-guide/fastlane/zealot_version_check-95a":{"__comp":"17896441","content":"bc9a5c2d"},"/docs/next/developer-guide/sdk/android-815":{"__comp":"17896441","content":"43ef865f"},"/docs/next/developer-guide/sdk/ios-1eb":{"__comp":"17896441","content":"c5b0ab6a"},"/docs/next/self-hosted/-4a8":{"__comp":"17896441","content":"5f153871"},"/docs/next/self-hosted/configuration/environment-variables-d1d":{"__comp":"17896441","content":"f90fa3e0"},"/docs/next/self-hosted/configuration/schedule-jobs-396":{"__comp":"17896441","content":"56af2409"},"/docs/next/self-hosted/configuration/third-party-authentication-4ed":{"__comp":"17896441","content":"566ccdfa"},"/docs/next/self-hosted/deployment/architecture-820":{"__comp":"17896441","content":"d4be948d"},"/docs/next/self-hosted/deployment/docker-bab":{"__comp":"17896441","content":"84e62756"},"/docs/next/self-hosted/deployment/docker/step-by-step-b7c":{"__comp":"17896441","content":"fa199c0f"},"/docs/next/self-hosted/deployment/fly-35b":{"__comp":"17896441","content":"0e6c8da6"},"/docs/next/self-hosted/deployment/kubernetes-db7":{"__comp":"17896441","content":"b4e44ac6"},"/docs/next/self-hosted/deployment/nomad-022":{"__comp":"17896441","content":"dd05d4e3"},"/docs/next/self-hosted/deployment/railway-042":{"__comp":"17896441","content":"f8e38d3d"},"/docs/next/self-hosted/deployment/render-a27":{"__comp":"17896441","content":"784c299a"},"/docs/next/self-hosted/deployment/requirements-274":{"__comp":"17896441","content":"09ee1501"},"/docs/next/self-hosted/deployment/source-code-d47":{"__comp":"17896441","content":"37ca8f58"},"/docs/next/self-hosted/reverse-proxies-f22":{"__comp":"17896441","content":"477073af"},"/docs/next/self-hosted/storage-e44":{"__comp":"17896441","content":"5df973a0"},"/docs/next/user-guide/-3eb":{"__comp":"17896441","content":"7737c9f3"},"/docs/next/user-guide/administrator/apple-team-71d":{"__comp":"17896441","content":"27385049"},"/docs/next/user-guide/administrator/backup-1c6":{"__comp":"17896441","content":"9da9701d"},"/docs/next/user-guide/administrator/monitoring/background-jobs-24f":{"__comp":"17896441","content":"88e80bd0"},"/docs/next/user-guide/administrator/monitoring/database-analytics-708":{"__comp":"17896441","content":"cd085125"},"/docs/next/user-guide/administrator/monitoring/logging-621":{"__comp":"17896441","content":"0b1f21de"},"/docs/next/user-guide/administrator/monitoring/system-info-68b":{"__comp":"17896441","content":"1129db35"},"/docs/next/user-guide/administrator/permissions-347":{"__comp":"17896441","content":"58234510"},"/docs/next/user-guide/administrator/settings-75a":{"__comp":"17896441","content":"39b02d66"},"/docs/next/user-guide/apps/-0f2":{"__comp":"17896441","content":"454f6929"},"/docs/next/user-guide/apps/create-679":{"__comp":"17896441","content":"1e930e9c"},"/docs/next/user-guide/apps/detail-a89":{"__comp":"17896441","content":"433a7c95"},"/docs/next/user-guide/apps/upload-e60":{"__comp":"17896441","content":"f906dd81"},"/docs/next/user-guide/best_practices-5ea":{"__comp":"17896441","content":"99e3e97f"},"/docs/next/user-guide/changelog-b74":{"__comp":"17896441","content":"c53e755e"},"/docs/next/user-guide/credits-535":{"__comp":"17896441","content":"eb2d718d"},"/docs/next/user-guide/dashboard-a36":{"__comp":"17896441","content":"0a799d0e"},"/docs/next/user-guide/debug-files/-727":{"__comp":"17896441","content":"6573317f"},"/docs/next/user-guide/debug-files/review-e27":{"__comp":"17896441","content":"aaf82ead"},"/docs/next/user-guide/debug-files/upload-f76":{"__comp":"17896441","content":"60fb9086"},"/docs/next/user-guide/qa-fd5":{"__comp":"17896441","content":"e92f4833"},"/docs/next/user-guide/toolkits/fetch-udid-cf3":{"__comp":"17896441","content":"5c74b3a7"},"/docs/next/user-guide/toolkits/teardown-98d":{"__comp":"17896441","content":"14fae669"},"/docs/next/user-guide/webhooks-795":{"__comp":"17896441","content":"45923ef2"},"/docs/next/user-guide/webhooks/dingtalk-b50":{"__comp":"17896441","content":"f3108074"},"/docs/next/user-guide/webhooks/discord-e4a":{"__comp":"17896441","content":"fe140d6b"},"/docs/next/user-guide/webhooks/feishu-066":{"__comp":"17896441","content":"4b3973b8"},"/docs/next/user-guide/webhooks/slack-484":{"__comp":"17896441","content":"10830de6"},"/docs/next/user-guide/webhooks/wecom-241":{"__comp":"17896441","content":"88f9ce8f"},"/docs-b73":{"__comp":"1be78505","__context":{"plugin":"247783bb"},"versionMetadata":"c9b278a8"},"/docs/category/administrator-614":{"__comp":"14eb3368","categoryGeneratedIndex":"bdc68495"},"/docs/category/apps-e5b":{"__comp":"14eb3368","categoryGeneratedIndex":"5a3653dd"},"/docs/category/cloud-provider-guides-15e":{"__comp":"14eb3368","categoryGeneratedIndex":"437849bc"},"/docs/category/configuration-28b":{"__comp":"14eb3368","categoryGeneratedIndex":"1caa3b90"},"/docs/category/debug-files-a8f":{"__comp":"14eb3368","categoryGeneratedIndex":"1efa993c"},"/docs/category/deployment-cf3":{"__comp":"14eb3368","categoryGeneratedIndex":"1addd124"},"/docs/category/local-development-411":{"__comp":"14eb3368","categoryGeneratedIndex":"7386cd72"},"/docs/category/monitoring-1ad":{"__comp":"14eb3368","categoryGeneratedIndex":"5191259b"},"/docs/category/sdks-28f":{"__comp":"14eb3368","categoryGeneratedIndex":"7e370ea7"},"/docs/category/toolkits-f3f":{"__comp":"14eb3368","categoryGeneratedIndex":"aceb8a36"},"/docs/contributing-guide/-1c7":{"__comp":"17896441","content":"49206f6f"},"/docs/contributing-guide/local-development/devcontainer-6bc":{"__comp":"17896441","content":"8f9c93ae"},"/docs/contributing-guide/local-development/source-code-20c":{"__comp":"17896441","content":"2c0f0ab1"},"/docs/developer-guide/-efd":{"__comp":"17896441","content":"77590075"},"/docs/developer-guide/api-479":{"__comp":"17896441","content":"6768319c"},"/docs/developer-guide/api/apps-b42":{"__comp":"17896441","content":"c3e055b8"},"/docs/developer-guide/api/debug_files-e16":{"__comp":"17896441","content":"b56911e0"},"/docs/developer-guide/fastlane-1a0":{"__comp":"17896441","content":"687041db"},"/docs/developer-guide/fastlane/zealot-e1d":{"__comp":"17896441","content":"a1f04802"},"/docs/developer-guide/fastlane/zealot_debug_file-d03":{"__comp":"17896441","content":"b7ca75af"},"/docs/developer-guide/fastlane/zealot_sync_devices-b34":{"__comp":"17896441","content":"2020b7aa"},"/docs/developer-guide/fastlane/zealot_version_check-1b7":{"__comp":"17896441","content":"20b08819"},"/docs/developer-guide/sdk/android-3a2":{"__comp":"17896441","content":"45256cfe"},"/docs/developer-guide/sdk/ios-c33":{"__comp":"17896441","content":"48295ea8"},"/docs/self-hosted/-666":{"__comp":"17896441","content":"bc9d66cc"},"/docs/self-hosted/configuration/environment-variables-d7d":{"__comp":"17896441","content":"7ab8d5f3"},"/docs/self-hosted/configuration/schedule-jobs-a57":{"__comp":"17896441","content":"a087da7b"},"/docs/self-hosted/configuration/third-party-authentication-7f5":{"__comp":"17896441","content":"2593a83b"},"/docs/self-hosted/deployment/architecture-e1c":{"__comp":"17896441","content":"9d2c8d89"},"/docs/self-hosted/deployment/docker-a75":{"__comp":"17896441","content":"41f50648"},"/docs/self-hosted/deployment/docker/step-by-step-bf4":{"__comp":"17896441","content":"93688e09"},"/docs/self-hosted/deployment/fly-ed1":{"__comp":"17896441","content":"10daa3a4"},"/docs/self-hosted/deployment/kubernetes-e83":{"__comp":"17896441","content":"897621f7"},"/docs/self-hosted/deployment/nomad-15f":{"__comp":"17896441","content":"b8b76bfb"},"/docs/self-hosted/deployment/railway-df1":{"__comp":"17896441","content":"aaf543f1"},"/docs/self-hosted/deployment/render-766":{"__comp":"17896441","content":"71b71564"},"/docs/self-hosted/deployment/requirements-8ec":{"__comp":"17896441","content":"e6546d07"},"/docs/self-hosted/deployment/source-code-0d9":{"__comp":"17896441","content":"8ac0e0b2"},"/docs/self-hosted/reverse-proxies-42c":{"__comp":"17896441","content":"14b2f636"},"/docs/self-hosted/storage-ca7":{"__comp":"17896441","content":"36bff928"},"/docs/user-guide/-853":{"__comp":"17896441","content":"aef75111"},"/docs/user-guide/administrator/apple-team-f62":{"__comp":"17896441","content":"a8003ee7"},"/docs/user-guide/administrator/backup-240":{"__comp":"17896441","content":"bf0a73a8"},"/docs/user-guide/administrator/monitoring/background-jobs-a44":{"__comp":"17896441","content":"da03b20b"},"/docs/user-guide/administrator/monitoring/database-analytics-d89":{"__comp":"17896441","content":"475cf40c"},"/docs/user-guide/administrator/monitoring/logging-8d8":{"__comp":"17896441","content":"79fb26a6"},"/docs/user-guide/administrator/monitoring/system-info-71b":{"__comp":"17896441","content":"e532b6bb"},"/docs/user-guide/administrator/permissions-0d3":{"__comp":"17896441","content":"7d49456b"},"/docs/user-guide/administrator/project-settings-737":{"__comp":"17896441","content":"d02aa106"},"/docs/user-guide/administrator/settings-ca5":{"__comp":"17896441","content":"c94f5806"},"/docs/user-guide/apps/-621":{"__comp":"17896441","content":"f6a4c755"},"/docs/user-guide/apps/create-bfc":{"__comp":"17896441","content":"286cd782"},"/docs/user-guide/apps/detail-9a6":{"__comp":"17896441","content":"58e8de69"},"/docs/user-guide/apps/upload-1b1":{"__comp":"17896441","content":"90050cbc"},"/docs/user-guide/best_practices-91c":{"__comp":"17896441","content":"674c5fcf"},"/docs/user-guide/changelog-b06":{"__comp":"17896441","content":"f0954aa2"},"/docs/user-guide/credits-7f0":{"__comp":"17896441","content":"1948baf2"},"/docs/user-guide/dashboard-aaf":{"__comp":"17896441","content":"56f1fb64"},"/docs/user-guide/debug-files/-70a":{"__comp":"17896441","content":"8cddcc36"},"/docs/user-guide/debug-files/review-dbc":{"__comp":"17896441","content":"61175dc6"},"/docs/user-guide/debug-files/upload-601":{"__comp":"17896441","content":"a86b8a96"},"/docs/user-guide/qa-569":{"__comp":"17896441","content":"db37eded"},"/docs/user-guide/toolkits/fetch-udid-ac3":{"__comp":"17896441","content":"0efaccc0"},"/docs/user-guide/toolkits/teardown-f07":{"__comp":"17896441","content":"49510311"},"/docs/user-guide/webhooks-6ea":{"__comp":"17896441","content":"fe4d1fcf"},"/docs/user-guide/webhooks/dingtalk-44c":{"__comp":"17896441","content":"1cb76857"},"/docs/user-guide/webhooks/discord-2e3":{"__comp":"17896441","content":"708d50e3"},"/docs/user-guide/webhooks/feishu-96d":{"__comp":"17896441","content":"568a2802"},"/docs/user-guide/webhooks/slack-5cf":{"__comp":"17896441","content":"a7227298"},"/docs/user-guide/webhooks/wecom-f9b":{"__comp":"17896441","content":"f944a33e"},"/-fc2":{"__comp":"c4f5d8e4","__context":{"plugin":"a7434565"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[532],(()=>{return t=7221,e(e.s=t);var t}));e.O()}]);
\ No newline at end of file
diff --git a/assets/js/main.c58bb435.js.LICENSE.txt b/assets/js/main.cdb43f45.js.LICENSE.txt
similarity index 100%
rename from assets/js/main.c58bb435.js.LICENSE.txt
rename to assets/js/main.cdb43f45.js.LICENSE.txt
diff --git a/docs/4.x/category/administrator/index.html b/docs/4.x/category/administrator/index.html
index 37f1a455e..28410bbd9 100644
--- a/docs/4.x/category/administrator/index.html
+++ b/docs/4.x/category/administrator/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Administrator | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/apps/index.html b/docs/4.x/category/apps/index.html
index ad8325dee..9e5817b3d 100644
--- a/docs/4.x/category/apps/index.html
+++ b/docs/4.x/category/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Apps | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/cloud-provider-guides/index.html b/docs/4.x/category/cloud-provider-guides/index.html
index cb849e5c0..390ab6768 100644
--- a/docs/4.x/category/cloud-provider-guides/index.html
+++ b/docs/4.x/category/cloud-provider-guides/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Cloud Provider Guides | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/configuration/index.html b/docs/4.x/category/configuration/index.html
index 37e0ca94a..cf756ab74 100644
--- a/docs/4.x/category/configuration/index.html
+++ b/docs/4.x/category/configuration/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Configuration | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/debug-files/index.html b/docs/4.x/category/debug-files/index.html
index 4715026d4..84e20ae9b 100644
--- a/docs/4.x/category/debug-files/index.html
+++ b/docs/4.x/category/debug-files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Debug Files | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/deployment/index.html b/docs/4.x/category/deployment/index.html
index 638b70edf..a7ce9c041 100644
--- a/docs/4.x/category/deployment/index.html
+++ b/docs/4.x/category/deployment/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deployment | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/local-development/index.html b/docs/4.x/category/local-development/index.html
index 6b3528335..715db50af 100644
--- a/docs/4.x/category/local-development/index.html
+++ b/docs/4.x/category/local-development/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Local development | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/monitoring/index.html b/docs/4.x/category/monitoring/index.html
index 5b9715850..d197d6a35 100644
--- a/docs/4.x/category/monitoring/index.html
+++ b/docs/4.x/category/monitoring/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Monitoring | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/sdks/index.html b/docs/4.x/category/sdks/index.html
index de114979a..030669317 100644
--- a/docs/4.x/category/sdks/index.html
+++ b/docs/4.x/category/sdks/index.html
@@ -1,16 +1,16 @@
-
+
-
+
SDKs | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/category/toolkits/index.html b/docs/4.x/category/toolkits/index.html
index c97dd10af..e7224ef51 100644
--- a/docs/4.x/category/toolkits/index.html
+++ b/docs/4.x/category/toolkits/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Toolkits | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
-
+
\ No newline at end of file
diff --git a/docs/4.x/contributing-guide/index.html b/docs/4.x/contributing-guide/index.html
index 92773cfbb..af256927e 100644
--- a/docs/4.x/contributing-guide/index.html
+++ b/docs/4.x/contributing-guide/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Contributing Guide | Zealot
-
+
@@ -17,6 +17,6 @@
For new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful.
Feel free to join our discord community, if you need further discussions with the core team.
Setup for local development These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use.
-
+
\ No newline at end of file
diff --git a/docs/4.x/contributing-guide/local-development/devcontainer/index.html b/docs/4.x/contributing-guide/local-development/devcontainer/index.html
index 3db2456d9..75b1767cf 100644
--- a/docs/4.x/contributing-guide/local-development/devcontainer/index.html
+++ b/docs/4.x/contributing-guide/local-development/devcontainer/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Visual Studio Code Dev Container Setup | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Visual Studio Code Dev Container Setup The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.
System requirements Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose.
Install Git Install it from offical website.
Install Docker & docker-compose Install Visual Studio Code Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems.
Follow the platform-specific guides below:
Download Visual Studio Code for macOS. Open the browser's download list and locate the downloaded app or archive. If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari. Drag Visual Studio Code.app
to the Applications folder, making it available in the macOS Launchpad. Open VS Code from the Applications folder, by double clicking the icon. Download the Visual Studio Code installer for Windows. Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute. By default, VS Code is installed under C:\Users\{Username}\AppData\Local\Programs\Microsoft VS Code
. Install Remote container extension Install the Remote Container extension .
Fetch Zealot Codesoace Zealot Codespace was in the .devcontailer
folder of Zealot project, so you need clone the source code.
git clone https://github.com/tryzealot/zealot.git
Explan these files in Codespace:
File Description devcontainer.json
VSCode devcontainer config Dockerfile.base
Base Dockerfile, auto push multi registry servers after changes Dockerfile
Speed up build time, depends on above image. docker-compose.yml
All services of Zealot create-db-user.sql
Create user and role for Zealot
Open the project in a container Start Visual Studio Code, run the Dev Containers: Open Folder in Container...
command in Command Palette and select the Zealot folder.
Click the Starting Dev Container (show log) to review zealot codespace build real time logging messages.
When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:
[7293 ms] Start: Run in container: cat /proc/344/environ [9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container. [9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e [9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established [14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close [14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null. [29221 ms] Port forwarding 53148 > 43379 > 43379: Local close
In host Docker containers:
Start the project Press Ctrl + `
to open the integrated terminal in Visual Studio Code if it isn't already open. then run bin/dev
to run all services.
Notice that the terminal prompt might look different than your normal terminal prompt.
Open in browser A while after run bin/dev
, select Ports to see all forwarded ports, Open in Browser in quick way.
-
+
\ No newline at end of file
diff --git a/docs/4.x/contributing-guide/local-development/source-code/index.html b/docs/4.x/contributing-guide/local-development/source-code/index.html
index b4ea9a7a2..f561ab9c8 100644
--- a/docs/4.x/contributing-guide/local-development/source-code/index.html
+++ b/docs/4.x/contributing-guide/local-development/source-code/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Source code | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Source code The following is a tutorial on local deployment development for different operating systems.
Prepare dependencies macOS Install homebrew First you need to install Xcode Command tools:
Then install Homebrew, the package management tool for macOS
$ ruby -e " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install ) "
Install dependencies $ brew install redis postgresql webp imagemagick node git
Setup Database and cache services Run postgresql and redis services
$ brew services start postgresql $ brew services start redis
You also need to create a default username in Postgresql:
$ createuser --superuser zealot $ createuser --createdb zealot
yarn Debian (Ubuntu) System dependencies $ apt update $ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev
Install dependencies $ apt install -y redis postgresql-client node
Setup Database and cache services Run postgresql and redis services
$ systemctl postgres start $ systemctl redis start
You also need to create a default username in Postgresql:
$ initdb -D /var/lib/postgresql/data $ createuser --superuser zealot $ createuser --createdb zealot
node Alpine Linux System dependencies $ apk --update --no-cache add build-base libxml2 libxslt git \ libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \ tzdata
Needs install gcompat
if use arm
architecture. or an exception will throws such like "Error loading shared library ".
Install dependencies $ apk --update --no-cache redis postgresql
Setup Database and cache services Run postgresql and redis services
$ rc-service postgres start $ rc-service redis start
You also need to create a default username in Postgresql:
$ initdb -D /var/lib/postgresql/data $ createuser --superuser zealot $ createuser --createdb zealot
Install Ruby Can be installed by either asdf, rvm as ruby version manager.
Following the offical install guide then:
asdf plugin add rust asdf install rust latest asdf global rust latest export RUBY_CONFIGURE_OPTS = --enable-yjit asdf plugin add ruby asdf install ruby 3.2 .0 asdf global ruby 3.2 .0
$ curl -sSL https://get.rvm.io | bash -s stable $ rvm install 3.2 .0 --disable-binary
Fetch source code git clone https://github.com/tryzealot/zealot.git
Initialize Zealot All the following steps need to be performed in the zealot root directory.
bundler Install Ruby gems
$ [ sudo ] gem install bundler $ bundle install
yarn Install javascript packages:
Initialize database Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:
$ rails db:create $ rails db:migrate
Configuring the connection database can be done via environment variables or by changing the config/database.yml
file.
Initialize default account and demo data Initialize administrator account and sample application
Launch services Open brower http://localhost:3000
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/api/apps/index.html b/docs/4.x/developer-guide/api/apps/index.html
index 2495accb2..945ee67eb 100644
--- a/docs/4.x/developer-guide/api/apps/index.html
+++ b/docs/4.x/developer-guide/api/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
App APIs | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
App APIs Upload an app This allows you to upload an single iOS, Android or macOS file.
Parameters Attribute Type Required Description file File
true an App file channel_key String
false Channel key Create a new App if leave it empty name String
false the name of App Use app name from parsed metadata in given file if leave it empty release_type String
false Eg, debug, beta, adhoc, release, enterprise 等 source String
false the source of upload (default is api
) changelog String
false Changelog Avaiables in plain text or JSON formatted struct branch String
false a branch name from git git_commit String
false git commit ci_url String
false the build url of a C custom_fields String
false JSON formatted custom fileds It could configures and display title, value and icon from fontawesome in a Release page from an App
For changelog
attribute which it accepts both plain text
and JSON
formatted contents:
plain text :
JSON :
[ { "message": "message 1", "author": "admin", "email": "admin@zealot.com", "date": "2021-11-11 11:11:11" }, { "message": "message 1", "author": "developer", "email": "developer@zealot.com", "date": "2021-11-11 11:11:11" } ]
For custom_fields
attribute which it use JSON
formatted struct to build from each key-value. for example, Display country name like country=China
with icon flag :
curl -X POST \ 'https://YOUR_ZEALOT_URL/api/apps/upload' \ --form 'token="token"' \ --form 'channel_key="channel_key"' \ + --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \ --form 'file=@/path/to/your/app'
Return body { "id" : 50 , "version" : 7 , "app_name" : "Test Android" , "bundle_id" : "com.test.app" , "release_version" : "1.0" , "build_version" : "1" , "source" : "SOURCE" , "branch" : "master" , "git_commit" : "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx" , "ci_url" : "" , "size" : 1565486 , "icon_url" : "/uploads/apps/a1/r1/icons/app_icon.png" , "release_url" : "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1" , "install_url" : "https://YOUR_ZEALOT_URL/download/releases/1" , "qrcode_url" : "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb" , "changelog" : [ { "message" : "Changelog message 1" } , { "message" : "Changelog message 2" } ] , "text_changelog" : "- Changelog message 1\n- Changelog message 2" , "custom_fields" : [ ] , "created_at" : "2021-09-01T11:43:33.977+08:00" , "app" : { "id" : 1 , "name" : "App name" } , "scheme" : { "id" : 8 , "name" : "Test" } , "channel" : { "slug" : "1XmpC" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } }
List apps Get a list of app.
This function takes pagination parameters page and per_page to restrict the list of app.
Parameters Attribute Type Required Description page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body [ { "id" : 1 , "name" : "Zealot" , "schemes" : [ { "id" : 1 , "name" : "Adhoc" , "channels" : [ { "slug" : "X1IXN" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "O1qHk" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } , { "id" : 2 , "name" : "内测版" , "channels" : [ { "slug" : "l19Tl" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "8selv" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } ] } ]
Get an app Allows you to receive information about an app like name, scheme, channel.
Parameters Attribute Type Required Description id String
true ID
Return body { "id" : 1 , "name" : "Zealot" , "schemes" : [ { "id" : 5 , "name" : "Test App" , "channels" : [ { "slug" : "X1IXN" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "O1qHk" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } ] }
Get versions list of app Get a list of apps by the given channel key
Parameters Attribute Type Required Description channel_key String
true Channel key page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body { "app_name" : "Zealot iOS" , "bundle_id" : "*" , "git_url" : null , "app" : { "id" : 3 , "name" : "Zealot" } , "scheme" : { "id" : 5 , "name" : "AdHoc" } , "releases" : [ { "version" : 2 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10292024" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } , { "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } , ] }
Get the latest version of app Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url.
Parameters Attribute Type Required Description channel_key String
true Channel key release_version String
true Release version build_version String
true Build version
Return body { "app_name" : "Zealot iOS" , "bundle_id" : "*" , "git_url" : null , "app" : { "id" : 3 , "name" : "Zealot" } , "scheme" : { "id" : 5 , "name" : "AdHoc" } , "releases" : { "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } }
Check version exists Allows you to check the Release exists by given query, query accepts two combo group:
bundle_id
, release_version
and build_verion
bundle_id
and git_commit
GET /api/apps/version_exist
Parameters Attribute Type Required Description channel_key String
true Channel key bundle_id String
true bundle_id or package_name release_version String
false Release version build_version String
false Build version git_commit String
false git commit hash
Return body Return 200 if release existed. Return 404 if release not existed. Success returns:
{ "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "4.1.1" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" }
Not found returns:
{ "error" : "Not found release" }
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/api/debug_files/index.html b/docs/4.x/developer-guide/api/debug_files/index.html
index b8bf085de..40b940a0f 100644
--- a/docs/4.x/developer-guide/api/debug_files/index.html
+++ b/docs/4.x/developer-guide/api/debug_files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Debug File APIs | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Debug File APIs Upload debug file This allows you to upload an single iOS, Android debug file.
Debug file accepts:
iOS: a Zipped dSYM file Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files. POST /api/debug_files/upload
Parameters Attribute Type Required Description channel_key String
true Channel key file File
true Arichved file by zip release_version String
true Release version, ignore this param if iOS app build_version String
true Build version, ignore this param if iOS app
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Download debug file This allows you to download an single iOS, Android debug file.
POST /api/debug_files/download
Parameters Attribute Type Required Description channel_key String
true Channel key release_version String
true Release version, ignore this param if iOS app build_version String
false Build version, ignore this param if iOS app order String
false Order by version
= latest version, upload_date
= last uploaded dateVaild in release_version is latest
Return body Retun 200 status code if the version exists and redirect to the download address with a 302 status code. return 404 status code if the version does not exist. List debug files Get a list of debug files.
This function takes pagination parameters page and per_page to restrict the list of debug files.
Parameters Attribute Type Required Description channel_key String
true Channel key page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body [ { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] } ]
Get a debug file Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only).
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Update a existed debug file This allows you to update a debug file.
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID file File
true a Zipped debug file release_version String
true Release version, ignore this param if iOS app build_version String
true Build version, ignore this param if iOS app
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Delete a debug file This allows you to delete a debug file.
DELETE /api/debug_files/:id
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID
Return body
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/api/index.html b/docs/4.x/developer-guide/api/index.html
index cbd7531a5..e3fd8ecbe 100644
--- a/docs/4.x/developer-guide/api/index.html
+++ b/docs/4.x/developer-guide/api/index.html
@@ -1,17 +1,17 @@
-
+
-
+
APIs | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
APIs Use the Zealot APIs to view, upload, download the build of app or debug file.
Authentication Requests currently only support query authentication for User Token, found in API - Key
at the bottom of the login user details page.
example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN
Version The current version is v1
, the APIs does not need to explicitly pass the version parameter,
and the GraphGL interface is being developed gradually.
Apps Resource Available endpoints Upload an App /api/apps/upload
List Apps /api/apps
Get an App by id /api/apps/:id
List verions from an App /api/apps/versions
Get the latest Release from an App /api/apps/latest
Check an Release from App exists /api/apps/version_exist
Full APIs to check api/apps page.
Debug files Resource Available endpoints Upload a debug file /api/debug_files/upload
Download a debug file by id /api/debug_files/download
List Debug files /api/debug_files
Get an debug file by id /api/debug_files/:id
Check a debug file exists by id /api/debug_files/version_exist
Update a debug file by id /api/debug_files/:id
Delete a debug file by id /api/debug_files/:id
Full APIs to check api/debug_files page.
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/fastlane/index.html b/docs/4.x/developer-guide/fastlane/index.html
index 33205a264..877fd5d73 100644
--- a/docs/4.x/developer-guide/fastlane/index.html
+++ b/docs/4.x/developer-guide/fastlane/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Fastlane plugins | Zealot
-
+
@@ -14,6 +14,6 @@
customize your deployment workflows using the hundreds of community built fastlane actions and plugins.
fastlane-plugin-zealot provides upload app, debug_file and
version check actions to Zealot, install it in shell:
$ fastlane add_plugin zealot
More usefully plugins In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/fastlane/zealot/index.html b/docs/4.x/developer-guide/fastlane/zealot/index.html
index 8dc34ed9e..2d785ab0b 100644
--- a/docs/4.x/developer-guide/fastlane/zealot/index.html
+++ b/docs/4.x/developer-guide/fastlane/zealot/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Fastlane action: zealot Uploading iOS, Android and macOS app, it requires three params:
zealot ( endpoint : 'https://zealot.com' , token : '...' , channel_key : '...' , )
Parameters +-----------------+---------------------------------+------------------------+----------+ | zealot Options | +-----------------+---------------------------------+------------------------+----------+ | Key | Description | Env Var | Default | +-----------------+---------------------------------+------------------------+----------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | | | file | The path of app file. Optional | ZEALOT_FILE | | | | if you use the `gym`, `ipa`, | | | | | `xcodebuild` or `gradle` | | | | | action. | | | | name | The name of app to display on | ZEALOT_NAME | | | | zealot | | | | changelog | The changelog of app | ZEALOT_CHANGELOG | | | slug | The slug of app | ZEALOT_SLUG | | | release_type | The release type of app | ZEALOT_RELEASE_TYPE | | | branch | The name of git branch | ZEALOT_BRANCH | | | git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | | | custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | | | | fields | | | | password | The password of app to download | ZEALOT_PASSWORD | | | source | The name of upload source | ZEALOT_SOURCE | fastlane | | ci_url | The name of upload source | ZEALOT_CI_CURL | | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true | | | keep secret | | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure | | | +-----------------+---------------------------------+------------------------+----------+ * = default value is dependent on the user's system +-----------------------+---------------------------------------------+ | zealot Output Variables | +-----------------------+---------------------------------------------+ | Key | Description | +-----------------------+---------------------------------------------+ | ZEALOT_APP_ID | The id of app | | ZEALOT_RELEASE_ID | The id of app's release | | ZEALOT_RELEASE_URL | The release URL of the newly uploaded build | | ZEALOT_INSTALL_URL | The install URL of the newly uploaded build | | ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build | | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+---------------------------------------------+
Output Variables +-----------------------+---------------------------------------------+ | zealot Output Variables | +-----------------------+---------------------------------------------+ | Key | Description | +-----------------------+---------------------------------------------+ | ZEALOT_APP_ID | The id of app | | ZEALOT_RELEASE_ID | The id of app's release | | ZEALOT_RELEASE_URL | The release URL of the newly uploaded build | | ZEALOT_INSTALL_URL | The install URL of the newly uploaded build | | ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build | | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+---------------------------------------------+ Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html b/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html
index 17f08c663..af6c493b1 100644
--- a/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html
+++ b/docs/4.x/developer-guide/fastlane/zealot_debug_file/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot_debug_file | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Fastlane action: zealot_debug_file Upload iOS dSYM or Android Proguard file(s) to Zealot
zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , platform : :ios , xcode_scheme : 'AppName' , verify_ssl : false ) zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , platform : :android , android_build_type : 'release' , android_flavor : 'store' , release_version : '1.1.0' , build_version : '1' , overwrite : true ) zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , zip_file : 'path/to/your/zip_file' , release_version : '1.1.0' , build_version : '1' , verify_ssl : false )
Parameters +--------------------+-----------------------------------+---------------------------+---------+ | zealot_debug_file Options | +--------------------+-----------------------------------+---------------------------+---------+ | Key | Description | Env Var | Default | +--------------------+-----------------------------------+---------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | | | zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | | | | to direct upload | | | | platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | | | | value are | | | | | ios,mac,macos,osx,android | | | | path | The path of debug file | ZEALOT_PATH | | | | (iOS/macOS is archive path for | | | | | Xcode, Android is path for app | | | | | project) | | | | xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | | | android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release | | android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | | | extra_files | A set file names | ZEALOT_EXTRA_FILES | [] | | output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . | | | dSYM file | | | | release_version | The release version of app | ZEALOT_RELEASE_VERSION | | | | (Android needs) | | | | build_version | The build version of app | ZEALOT_BUILD_VERSION | | | | (Android needs) | | | | overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false | | | if it existed | | | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure? (true/false) | | | +--------------------+-----------------------------------+---------------------------+---------+ * = default value is dependent on the user's system +-----------------------+-----------------------------------------+ | zealot_debug_file Output Variables | +-----------------------+-----------------------------------------+ | Key | Description | +-----------------------+-----------------------------------------+ | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+-----------------------------------------+
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html b/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html
index 0c8fc9513..363ceb312 100644
--- a/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html
+++ b/docs/4.x/developer-guide/fastlane/zealot_sync_devices/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Fastlane action: zealot_sync_devices | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Fastlane action: zealot_sync_devices 🔔 Zealot 4.5.0 built in Apple team manage which it use Apple API Key
to sync iOS devices, even CAN registe the device after fetch the UDID, Check detail
Use Apple Developer account to syncing UDIDs and relates the value in Zealot.
zealot_sync_devices ( endpoint : 'https://zealot.com' , token : '...' , api_key_path : '/path/to/your/api_key_json_file' , team_id : '...' ) zealot_sync_devices ( endpoint : 'https://zealot.com' , token : '...' , username : 'user@example.com' , team_id : '...' )
Parameters +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | zealot_sync_devices Options | +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | Key | Description | Env Var(s) | Default | +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * | | api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | | | | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | | | | -json-file) | | | | api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * | | | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | | | | -hash-option) | | | | team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * | | team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * | | platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios | | verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false | +---------------+-----------------------------------------------------------------------------+------------------------+---------+
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html b/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html
index 834c89659..26fc301af 100644
--- a/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html
+++ b/docs/4.x/developer-guide/fastlane/zealot_version_check/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot_version_check | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Fastlane action: zealot_version_check Check given build exists or not on Zealot
zealot_version_check ( endpoint : 'https://zealot.com' , token : '...' , bundle_id : 'com.example.app.name' , release_version : '1.0.0' , build_version : '1' )
Parameters +-----------------+---------------------------------+------------------------+---------+ | zealot_version_check Options | +-----------------+---------------------------------+------------------------+---------+ | Key | Description | Env Var | Default | +-----------------+---------------------------------+------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | | | bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | | | | app | | | | release_version | The release version of app | ZEALOT_RELEASE_VERSION | | | build_version | The build version of app | ZEALOT_BUILD_VERSION | | | git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure? (true/false) | | | +-----------------+---------------------------------+------------------------+---------+
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/index.html b/docs/4.x/developer-guide/index.html
index d6793a0c8..24c7f5c0a 100644
--- a/docs/4.x/developer-guide/index.html
+++ b/docs/4.x/developer-guide/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Developer Guide | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Developer Guide Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/sdk/android/index.html b/docs/4.x/developer-guide/sdk/android/index.html
index 676397ab4..f5f1b6db4 100644
--- a/docs/4.x/developer-guide/sdk/android/index.html
+++ b/docs/4.x/developer-guide/sdk/android/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Zealot Android SDK | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Zealot Android SDK The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.
Install JitPack Using jitpack to install:
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
In build.gradle
file of main app project add:
dependencies { implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT' }
Permission Zealot needs internet permission
< uses-permission android: name = " android.permission.INTERNET " />
Usages Add the start code to the onCreate
method block of your Application
file:
Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "..." ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "xxxxxxx" , "beta" ) . setCHannelKey ( "yyyyyyy" , "test" ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( )
Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "..." ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) ; Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "xxxxxxx" , "beta" ) . setCHannelKey ( "yyyyyyy" , "test" ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) ;
-
+
\ No newline at end of file
diff --git a/docs/4.x/developer-guide/sdk/ios/index.html b/docs/4.x/developer-guide/sdk/ios/index.html
index bcabfef2b..0c307b7b2 100644
--- a/docs/4.x/developer-guide/sdk/ios/index.html
+++ b/docs/4.x/developer-guide/sdk/ios/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Zealot iOS SDK | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Zealot iOS SDK The iOS component provides a service to check for new versions and installations for Zealot,
supporting Swift and Objective-C.
Install Cocoapods Adding below code into Podfile
:
pod 'Zealot' , :git => 'https://github.com/tryzealot/zealot-ios.git' , :branch => 'master'
Install it:
Usages Add the code in your AppDelegate
: # import < Zealot / Zealot - Swift . h >
Add the following code in application:didFinishLaunchingWithOptions:
method block: let zealot = Zealot ( endpoint : "http://zealot.com" , channelKey : "..." ) zealot . checkVersion ( ) let zealot = Zealot ( endpoint : "http://zealot.com" , channelKeys : [ "beta" : "xxxxxxx" , "test" : "yyyyyyy" ] , default_enviroment : "beta" ) zealot . checkVersion ( )
Zealot * zealot = [ [ Zealot alloc ] initWithEndpoint : @"http://zealot.com" channelKey : @"..." ] ; Zealot * zealot = [ [ Zealot alloc ] initWithEndpoint : @"http://zealot.com" channelKeys : @ { @"beta" : @"xxxxxxx" , @"gray" : @"yyyyyyy" } default_enviroment : @"beta" ] ; [ zealot checkVersion ] ;
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/configuration/environment-variables/index.html b/docs/4.x/self-hosted/configuration/environment-variables/index.html
index bdb7a190e..59bc73f7d 100644
--- a/docs/4.x/self-hosted/configuration/environment-variables/index.html
+++ b/docs/4.x/self-hosted/configuration/environment-variables/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Environment Variables | Zealot
-
+
@@ -20,6 +20,6 @@
Email notification mainly affects are user registration, sending activation emails and
changing password service, but it does not affect the use if it is not turned on.
SMTP_ADDRESS = smtp.gmail.com SMTP_PORT = 587 SMTP_DOMAIN = gmail.com SMTP_USERNAME = you@gmail.com SMTP_PASSWORD = yourpassword SMTP_AUTH_METHOD = plain SMTP_ENABLE_STARTTLS_AUTO = true ACTION_MAILER_DEFAULT_FROM = you@gmail.com ACTION_MAILER_DEFAULT_TO = you@gmail.com
Disbale Cable request protection Experimental:
ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION = true
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/configuration/schedule-jobs/index.html b/docs/4.x/self-hosted/configuration/schedule-jobs/index.html
index 6983092a3..fa67fb1bd 100644
--- a/docs/4.x/self-hosted/configuration/schedule-jobs/index.html
+++ b/docs/4.x/self-hosted/configuration/schedule-jobs/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Schedule Jobs | Zealot
-
+
@@ -15,6 +15,6 @@
there is thought to support a variety of processing logic, see
https://github.com/tryzealot/zealot/issues/376 - 2.0 - 3 - 2 - 1 - 1.0.1 - 10 - 9 - 8 ... - 1.0 - 5 - 4 - 3 ...
The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4,
leaving the final version file as follows:
- 2.0 - 3 - 2 - 1 - 1.0.1 - 10 - 1.0 - 5
If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ZEALOT_KEEP_UPLOADS=false
.
ZEALOT_KEEP_UPLOADS
set true
by default.
Backup When you create any backup it will join itself to the schedule job list.
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/configuration/third-party-authentication/index.html b/docs/4.x/self-hosted/configuration/third-party-authentication/index.html
index 5f035db65..2dcf765a0 100644
--- a/docs/4.x/self-hosted/configuration/third-party-authentication/index.html
+++ b/docs/4.x/self-hosted/configuration/third-party-authentication/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Third-party Authentication | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Third-party Authentication Avaiable services:
Service Name provider value Feishu feishu
Gitlab gitlab
Google google_oauth2
LDAP ldap
If the above services need to set the callback address please set it uniformly as follows
http://zealot.com/users/auth/:provider/callback
where :provider
is the identifier of the above supported third-party service, for example:
http://zealot.com/users/auth/google_oauth2/callback
Gitlab Register a Gitlab On line account or use self-host service Create an application in Preferences -> Applications page. Configure Redirect URI
such like http://zealot.com/users/auth/gitlab/callback
(replace the domain in your case) Check scope: read_user
,By default zealot only uses this license, if your enable scope is api
that's fine too GITLAB_ENABLED = true GITLAB_SITE = https://gitlab.com/api/v4 GITLAB_SCOPE = read_user GITLAB_APP_ID = GITLAB_SECRET =
Google Register a Google account Enable Google Cloud Platform service Choose or create a Project then go to Credentials page Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like http://zealot.com/users/auth/google_oauth2/callback
(replace the domain in your case) GOOGLE_OAUTH_ENABLED = true GOOGLE_CLIENT_ID = GOOGLE_SECRET =
Feishu (Lark) Register a feishu (lark) account and download the Phone app. Enable Open platform and create application to get app_id, app_secret Configure callback url such like http://zealot.com/users/auth/feishu/callback
(replace the domain in your case) Check user filed information scope: email address
(Optional) Create a version and publish FEISHU_ENABLED = true FEISHU_APP_ID = FEISHU_APP_SECRET =
LDAP LDAP_ENABLED = true LDAP_HOST = 10.0 .0.1 LDAP_PORT = 389 LDAP_METHOD = plain LDAP_BIND_DN = "cn=Manager,dc=example,dc=com" LDAP_PASSWORD = password LDAP_BASE = "ou=People,dc=example,dc=com" LDAP_UID = uid
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/architecture/index.html b/docs/4.x/self-hosted/deployment/architecture/index.html
index ee36777a9..e12fbf660 100644
--- a/docs/4.x/self-hosted/deployment/architecture/index.html
+++ b/docs/4.x/self-hosted/deployment/architecture/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Zealot Architecture | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Zealot Architecture Running Zealot requires the following set of services.
Mostly Linux based on amd86/arm64/armv7. Ruby on Rails powered Web and API services Sidekiq provides asynchronous background task management PostgreSQL database Redis cache
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/docker/index.html b/docs/4.x/self-hosted/deployment/docker/index.html
index df66724da..ee702056d 100644
--- a/docs/4.x/self-hosted/deployment/docker/index.html
+++ b/docs/4.x/self-hosted/deployment/docker/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Deploy Zealot with Docker guide | Zealot
-
+
@@ -26,6 +26,6 @@
and Chrome may also deny access due to the certificate.
If the domain name is unregistered, you need to tie the host to access it,
usually by modifying the system's /etc/hosts
file.
/etc/hosts
$ sudo vim /etc/hosts 127.0 .0.1 zealot.test
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html b/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html
index c83f66cce..718109ff2 100644
--- a/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html
+++ b/docs/4.x/self-hosted/deployment/docker/step-by-step/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Docker deployment guide | Zealot
-
+
@@ -14,6 +14,6 @@
which is required for subsequent zealot updates.
Setup database data The first time you use it, you will initialize the database, load the sample application data
and set up the administrator account, which is required for subsequent zealot updates.
docker-compose run --rm zealot run_upgrade
Launch docker-compose Manual execution is required to run the service for security periods and user-defined operations:
Advanced Custom volumes You have two t
There are two ways to customize the path: (Assuming that the custom path is /data/zealot
)
1. Create custom docker volume docker volume create --name zealot-data \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/zealot-data docker volume create --name zealot-redis \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/redis docker volume create --name zealot-postgres \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/postgres
2. Change volumes part of docker-compose file Open docker-compose.yml
file and find volumes:
:
volumes : zealot-data : driver : local driver_opts : o : bind type : none device : /data/zealot/data zealot-redis : driver : local driver_opts : o : bind type : none device : /data/zealot/redis zealot-postgres : driver : local driver_opts : o : bind type : none device : /data/zealot/postgres
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/fly/index.html b/docs/4.x/self-hosted/deployment/fly/index.html
index fc4388df4..823b9e4f0 100644
--- a/docs/4.x/self-hosted/deployment/fly/index.html
+++ b/docs/4.x/self-hosted/deployment/fly/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Fly guide | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Deploy Zealot to Fly guide Zealot support use App Configuration (fly.toml) to deploy on fly.io .
Deploying on Fly Install flyctl . Copy full content of app configuration save to fly.toml
then change the app
value . Run flyctl deploy
. Run fly scale vm shared-cpu-1x --memory 512
. App Configuration app = "[app-name:changeme]" kill_signal = "SIGINT" kill_timeout = 120 processes = [ ] [ build ] image = "ghcr.io/tryzealot/zealot:nightly" [ experimental ] allowed_public_ports = [ ] auto_rollback = true [ [ services ] ] http_checks = [ ] internal_port = 80 processes = [ "app" ] protocol = "tcp" script_checks = [ ] [ services.concurrency ] hard_limit = 25 soft_limit = 20 type = "connections" [ [ services.ports ] ] force_https = true handlers = [ "http" ] port = 80 [ [ services.ports ] ] handlers = [ "tls" , "http" ] port = 443 [ [ services.tcp_checks ] ] grace_period = "1s" interval = "15s" restart_limit = 0 timeout = "2s" [ [ statics ] ] guest_path = "/app/public" url_prefix = "/"
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/kubernetes/index.html b/docs/4.x/self-hosted/deployment/kubernetes/index.html
index f26d1ce80..cfb87707f 100644
--- a/docs/4.x/self-hosted/deployment/kubernetes/index.html
+++ b/docs/4.x/self-hosted/deployment/kubernetes/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot with Kubernetes guide | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Deploy Zealot with Kubernetes guide Zealot support deployments using Kubernetes, but only .yaml
config files are available currently.
Check list ConfigMap
and Secret
to configure enviroment variables.PersistentVolumeClaim
to configure public/uploads
, public/bakcup
.Deployment
to control zealot
pod.Steps 10-zealot-namespace.yml Zealot namespace.
10-zealot-namespace.yml
api Version : v1 kind : Namespace metadata : name : zealot
20-zealot-secrets.yml Zealot enviroments secrets. This is loaded all secrets enviroments , all values need encryt by base64 .
20-zealot-secrets.yml
apiVersion : v1 kind : Secret metadata : namespace : zealot name : zealot - secrets data : ZEALOT_ADMIN_EMAIL : V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk= ZEALOT_ADMIN_PASSWORD : emVAbDB0 ZEALOT_POSTGRES_HOST : cG9zdGdyZXM= ZEALOT_POSTGRES_PORT : NTQzMg== ZEALOT_POSTGRES_USERNAME : emVhbG90 ZEALOT_POSTGRES_PASSWORD : emVAbDB0 ZEALOT_POSTGRES_DB_NAME : emVhbG90 REDIS_URL : cmVkaXM6Ly9yZWRpczo2Mzc5LzE= SECRET_TOKEN : ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==
21-zealot-configmap.yml Zealot enviroments config map. This is loaded safe enviroments .
21-zealot-configmap.yml
apiVersion : v1 kind : ConfigMap metadata : namespace : zealot name : zealot - config data : ZEALOT_DOMAIN : zealot.icyleaf.dev DEFAULT_LOCALE : en ZEALOT_REGISTER_ENABLED : "true"
30-zealot-storage.yml The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed.
30-zealot-storage.yml
apiVersion : v1 kind : PersistentVolumeClaim metadata : name : zealot - uploads namespace : zealot labels : app : zealot spec : accessModes : - ReadWriteOnce resources : requests : storage : 20Gi --- apiVersion : v1 kind : PersistentVolumeClaim metadata : name : zealot - backup namespace : zealot labels : app : zealot spec : accessModes : - ReadWriteOnce resources : requests : storage : 20Gi
40-zealot-deployment.yml Create zealot deployment, edit replicas
and image
tag.
40-zealot-deployment.yml
apiVersion : apps/v1 kind : Deployment metadata : name : zealot namespace : zealot spec : restartPolicy : Always replicas : 1 selector : matchLabels : app : zealot template : metadata : labels : app : zealot spec : containers : - name : zealot image : ghcr.io/tryzealot/zealot : nightly ports : - containerPort : 80 protocol : TCP name : http envFrom : - configMapRef : name : zealot - env - secretRef : name : zealot - secrets volumeMounts : - mountPath : /app/public/uploads name : uploads - mountPath : /app/public/backup name : backup volumes : - name : uploads persistentVolumeClaim : claimName : zealot - uploads - name : backup persistentVolumeClaim : claimName : zealot - backup
50-zealot-service.yml Creating zealot service.
50-zealot-service.yml
apiVersion : v1 kind : Service metadata : name : zealot namespace : zealot labels : app : zealot spec : selector : app : zealot ports : - port : 80 targetPort : http name : http protocol : TCP
60-zealot-ingress.yml Setting up the ingress for the zealot service.
50-zealot-ingress.yml
apiVersion : networking.k8s.io/v1 kind : Ingress metadata : name : zealot namespace : zealot annotations : spec : rules : - host : zealot.icyleaf.dev http : paths : - web : service : name : zealot port : number : 80 path : / pathType : Prefix
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/nomad/index.html b/docs/4.x/self-hosted/deployment/nomad/index.html
index 8e1a850da..27ac2b504 100644
--- a/docs/4.x/self-hosted/deployment/nomad/index.html
+++ b/docs/4.x/self-hosted/deployment/nomad/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Deploy Zealot with Nomad guide | Zealot
-
+
@@ -16,6 +16,6 @@
Nomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad.
You can find a list of plugins in the
Kubernetes CSI Developer Documentation .
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/railway/index.html b/docs/4.x/self-hosted/deployment/railway/index.html
index ffd7ecde5..c2621f62e 100644
--- a/docs/4.x/self-hosted/deployment/railway/index.html
+++ b/docs/4.x/self-hosted/deployment/railway/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Railway guide | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Deploy Zealot to Railway guide Zealot support use Dockfile
to deploy on Railway .
Deploying on Railway
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/render/index.html b/docs/4.x/self-hosted/deployment/render/index.html
index 7fbaf52b3..263c431f9 100644
--- a/docs/4.x/self-hosted/deployment/render/index.html
+++ b/docs/4.x/self-hosted/deployment/render/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Render guide | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Deploy Zealot to Render guide Zealot support a render blueprint named render.yaml
to deploy on render.com .
Deploying on Render
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/requirements/index.html b/docs/4.x/self-hosted/deployment/requirements/index.html
index ca8a34536..d468d8995 100644
--- a/docs/4.x/self-hosted/deployment/requirements/index.html
+++ b/docs/4.x/self-hosted/deployment/requirements/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Zealot Self Hosted Requirements | Zealot
-
+
@@ -16,6 +16,6 @@
This process starts with the entire Rails stack but it can grow over time due to memory leaks.
On a very active server the Sidekiq process can use 1GB+ of memory.
Supported web browsers We don't support running Zealot with JavaScript disabled in the browser.
Zealot supports the following web browsers:
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/deployment/source-code/index.html b/docs/4.x/self-hosted/deployment/source-code/index.html
index a5ea186c0..224b08c18 100644
--- a/docs/4.x/self-hosted/deployment/source-code/index.html
+++ b/docs/4.x/self-hosted/deployment/source-code/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Source code | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/index.html b/docs/4.x/self-hosted/index.html
index b2db90af5..170a0d021 100644
--- a/docs/4.x/self-hosted/index.html
+++ b/docs/4.x/self-hosted/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Self-hosted Installation Guide | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Self-hosted Installation Guide This guide will help you to install and setup a production ready Zealot.
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/reverse-proxies/index.html b/docs/4.x/self-hosted/reverse-proxies/index.html
index a0f19084b..c3fb35c27 100644
--- a/docs/4.x/self-hosted/reverse-proxies/index.html
+++ b/docs/4.x/self-hosted/reverse-proxies/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Reverse Proxies | Zealot
-
+
@@ -16,6 +16,6 @@
cross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options.
Consul Enable Consul provider or Consul Catalog provider , add key-value below:
consul kv put traefik/http/services/zealot/loadbalancer/server/port 5 consul kv put traefik/http/routers/zealot/service zealot consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)' consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev
Nomad Enable Nomad provider and make sure Nomad version >= 1.3:
zealot.nomad
job "zealot" { datacenters = [ "dc1" ] type = "service" group "zealot" { count = 1 network { port "http" { static = 80 } } service { name = "zealot-http" provider = "nomad" port = "http" } task "server" { driver = "docker" config { image = "ghcr.io/tryzealot/zealot:nightly" ports = [ "http" ] args = [ - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)" , - "traefik.http.routers.zealot.tls=true" , - "traefik.http.routers.zealot.tls.certresolver=letsencrypt" , - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev" , - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev" ] } } } }
Caddy 2 The configuration only needs to relate the ip part after tls
and proxy
:
Caddyfile
:443 log tls your-email@example.com reverse_proxy 172.16.56.100:8901
Nginx The following is the general configuration, if not effects welcome to file a issue :
conf.d/zealot.conf
upstream zealot { zone upstreams 64K ; server 172.16.56.100:8901 ; keepalive 32 ; } map $http_upgrade $connection_upgrade { default upgrade ; '' close ; } server { listen 80 ; listen [::]:80 ; server_name zealot.icyleaf.dev ; location /.well-known/acme-challenge/ { allow all ; } location / { return 301 https:// $host $request_uri ; } } server { listen 443 ssl http2 ; listen [::]:443 ssl http2 ; server_name zealot.icyleaf.dev ; ssl_certificate /etc/certs/zealot-cert.pem ; ssl_certificate_key /etc/certs/zealot.pem ; location / { proxy_pass http://zealot ; proxy_redirect off ; proxy_pass_header Authorization ; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_http_version 1.1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection $connection_upgrade ; client_max_body_size 0 ; proxy_read_timeout 36000s ; } }
And you need update max body size in http
block. Recommended is 200MB, if it's a game,
50% more can be played to make a surplus according to the actual file size.
nginx.conf
http { [...] client_max_body_size 200M ; }
-
+
\ No newline at end of file
diff --git a/docs/4.x/self-hosted/storage/index.html b/docs/4.x/self-hosted/storage/index.html
index 02be218e3..a0db91004 100644
--- a/docs/4.x/self-hosted/storage/index.html
+++ b/docs/4.x/self-hosted/storage/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Data storages | Zealot
-
+
@@ -14,6 +14,6 @@
It is currently stored in the filesystem in the
public/uploads
directory.
apps The directory for uploading applications debugs_files directory for uploading debug files Backup storage The Zealot service currently supports command-generated backup data, which will contain
the database and binary packages of the uploaded apps and debug files.
The backup data is currently stored in the file system in the public/backup
directory.
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/apple-team/index.html b/docs/4.x/user-guide/administrator/apple-team/index.html
index fe8344970..6b4f4b749 100644
--- a/docs/4.x/user-guide/administrator/apple-team/index.html
+++ b/docs/4.x/user-guide/administrator/apple-team/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Apple Team (Developer) | Zealot
-
+
@@ -23,6 +23,6 @@
providing a feature to register a testing device that has not been registered with any application
would greatly improve the efficiency of the team. This is the role of the Apple Developer feature.
The initial feature introduction: https://github.com/tryzealot/zealot/issues/723 .
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/backup/index.html b/docs/4.x/user-guide/administrator/backup/index.html
index 344912c05..721b5d820 100644
--- a/docs/4.x/user-guide/administrator/backup/index.html
+++ b/docs/4.x/user-guide/administrator/backup/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Backup Schedule | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
Backup Schedule
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html b/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html
index 63ca32d53..0b6d90972 100644
--- a/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html
+++ b/docs/4.x/user-guide/administrator/monitoring/background-jobs/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Background Jobs | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
Background Jobs
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html b/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html
index 509b78a94..78a6f9ee1 100644
--- a/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html
+++ b/docs/4.x/user-guide/administrator/monitoring/database-analytics/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Database Analytics | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x
Database Analytics
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/monitoring/logging/index.html b/docs/4.x/user-guide/administrator/monitoring/logging/index.html
index e772e0bbd..034942dfe 100644
--- a/docs/4.x/user-guide/administrator/monitoring/logging/index.html
+++ b/docs/4.x/user-guide/administrator/monitoring/logging/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Logging | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/monitoring/system-info/index.html b/docs/4.x/user-guide/administrator/monitoring/system-info/index.html
index 40cb2881e..e9ea92b75 100644
--- a/docs/4.x/user-guide/administrator/monitoring/system-info/index.html
+++ b/docs/4.x/user-guide/administrator/monitoring/system-info/index.html
@@ -1,16 +1,16 @@
-
+
-
+
System informations | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x System informations
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/permissions/index.html b/docs/4.x/user-guide/administrator/permissions/index.html
index 6824ba9be..2a4738583 100644
--- a/docs/4.x/user-guide/administrator/permissions/index.html
+++ b/docs/4.x/user-guide/administrator/permissions/index.html
@@ -1,16 +1,16 @@
-
+
-
+
User Permissions and roles | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
User Permissions and roles Zealot offers four types of user permissions.
Guest User Developer Administrator Comparison Action Guest[On/Off] User Developer Administrator Dashboard
View all data✓/✕ ✓ ✓ ✓ App
View app list✓/✕ ✓ ✓ ✓ App
View app scheme(s) and channel(s) detail✓/✕ ✓ ✓ ✓ App
View the build(release) of app✓/✓ Password Auth ✓ ✓ ✓ App
View webhook list✓/✕ ✓ ✓ ✓ App
Upload/Install/Download app✓ ✓ ✓ ✓ App
Create/Edit/Delete an app✓ ✓ App
Create/Edit/Delete a scheme/channel of app✓ ✓ App
Delete a given version of app✓ ✓ App
Test a webhook network connection✓ ✓ App
Enable/Disable webhook✓ ✓ App
Delete an app✓ ✓ DebugFile
View debug file list✓/✕ ✓ ✓ ✓ DebugFile
View debug file detail✓ ✓ ✓ ✓ DebugFile
Download debug file✓ ✓ ✓ ✓ DebugFile
Upload/Delete a debug file✓ ✓ Teardown
View teardown list✓/✕ ✓ ✓ ✓ Teardown
View teardown detail✓/✕ ✓ ✓ ✓ Teardown
Delete a teardown✓ ✓ Admin
View and manage users✓ Admin
View and manage webhooks✓ Admin
iew and manage apple keys✓ Admin
View and manage settings✓ Admin
View system informations✓ Admin
View and manage background jobs✓ Admin
View page analytices✓
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/administrator/project-settings/index.html b/docs/4.x/user-guide/administrator/project-settings/index.html
index 9c7ce8e8f..fd18f5982 100644
--- a/docs/4.x/user-guide/administrator/project-settings/index.html
+++ b/docs/4.x/user-guide/administrator/project-settings/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Project Settings | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Project Settings
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/apps/create/index.html b/docs/4.x/user-guide/apps/create/index.html
index f5fb9bb9c..497257e2a 100644
--- a/docs/4.x/user-guide/apps/create/index.html
+++ b/docs/4.x/user-guide/apps/create/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Create an App | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/best_practices/index.html b/docs/4.x/user-guide/best_practices/index.html
index 629bdd8db..024a433fa 100644
--- a/docs/4.x/user-guide/best_practices/index.html
+++ b/docs/4.x/user-guide/best_practices/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Best Practices | Zealot
-
+
@@ -14,6 +14,6 @@
a configured web hook is triggered to send a notification to the third-party service that a new version has been received,
and for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time.
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/changelog/index.html b/docs/4.x/user-guide/changelog/index.html
index 84ce84f1c..10439df70 100644
--- a/docs/4.x/user-guide/changelog/index.html
+++ b/docs/4.x/user-guide/changelog/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Change Log | Zealot
-
+
@@ -13,6 +13,6 @@
It used to undertake many functions, but now it has been separated to focus on providing
application hosting and distribution services
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/credits/index.html b/docs/4.x/user-guide/credits/index.html
index b2f86a073..afbfbf4cb 100644
--- a/docs/4.x/user-guide/credits/index.html
+++ b/docs/4.x/user-guide/credits/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Credits | Zealot
-
+
@@ -13,6 +13,6 @@
later changed to their own design icons, if there are enthusiastic designers can help design better icons,
I represent this project to express my sincere gratitude.
License Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at LICENSE file 。
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/dashboard/index.html b/docs/4.x/user-guide/dashboard/index.html
index 2eef51b91..6fba02776 100644
--- a/docs/4.x/user-guide/dashboard/index.html
+++ b/docs/4.x/user-guide/dashboard/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Dashboard | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Dashboard
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/debug-files/upload/index.html b/docs/4.x/user-guide/debug-files/upload/index.html
index d564c2812..6afb3e1de 100644
--- a/docs/4.x/user-guide/debug-files/upload/index.html
+++ b/docs/4.x/user-guide/debug-files/upload/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Create a Debug File | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Create a Debug File
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/index.html b/docs/4.x/user-guide/index.html
index 814c5061e..da66fdd9b 100644
--- a/docs/4.x/user-guide/index.html
+++ b/docs/4.x/user-guide/index.html
@@ -1,11 +1,11 @@
-
+
-
+
User Guide | Zealot
-
+
@@ -15,6 +15,6 @@
Self-hosted Beta App Distribution for Android, iOS and macOS apps.
Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.
Features 🌏 Cross platform of app : macOS, iOS, even APK and AAB of Android upload, install(include Arm based macOS) and download support. 🗄 Multiple category : Orgainze by any category, like Debug, AdHoc, Enterprise or channels of Android. 📱 iOS device in control : Automate synchronized iOS device information, register device to Apple Developer. 🧑💻 Full developer toolkit : REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDK and [fastlane][fastlane-plugin-zealot] plugin support. 💥 Teardown app inside : Parse iOS, Android or iOS profile metadata. 🚨 Notification support : Build data strucite with Income WebHook. 🎳 Multiple Architectures : amd86, arm64 and armv7 deploy ready. 🔑 The third-party OAuth : Google, Gitlab, Feishu and LDAP support. 🌑 Dark mode : Switch theme from light to dark. Demo Simplified Chinese by default, change the language in Settings page.
Notification : There is instability run on a free resource cloud service and RESET ALL DATA daily.
About the translation The translation powered by DeepL and it inevitably have some defects, please provide feedback in time, thanks!
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/qa/index.html b/docs/4.x/user-guide/qa/index.html
index c93d4c2fb..ae55dd77a 100644
--- a/docs/4.x/user-guide/qa/index.html
+++ b/docs/4.x/user-guide/qa/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Q&A | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/toolkits/fetch-udid/index.html b/docs/4.x/user-guide/toolkits/fetch-udid/index.html
index f197d5acd..ad0b61dfe 100644
--- a/docs/4.x/user-guide/toolkits/fetch-udid/index.html
+++ b/docs/4.x/user-guide/toolkits/fetch-udid/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Find iOS Device UDID | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Find iOS Device UDID
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/toolkits/teardown/index.html b/docs/4.x/user-guide/toolkits/teardown/index.html
index ad474a8d7..16c593adb 100644
--- a/docs/4.x/user-guide/toolkits/teardown/index.html
+++ b/docs/4.x/user-guide/toolkits/teardown/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Teardown App view itself metadata | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x Teardown App view itself metadata
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/webhooks/dingtalk/index.html b/docs/4.x/user-guide/webhooks/dingtalk/index.html
index 85ff844d0..57c8f2d53 100644
--- a/docs/4.x/user-guide/webhooks/dingtalk/index.html
+++ b/docs/4.x/user-guide/webhooks/dingtalk/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Dingtalk (Dingding) | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Dingtalk (Dingding) 钉钉 use Incoming Webhooks whose constructs
typically support both text and markdown, and can be configured as follows:
Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.
Text format { "msgtype" : "text" , "text" : { "content" : " #{ @title } \n\n安装地址: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog.
{ "msgtype" : "markdown" , "markdown" : { "title" : @title , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" } }
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/webhooks/discord/index.html b/docs/4.x/user-guide/webhooks/discord/index.html
index 90ac8c566..42b266837 100644
--- a/docs/4.x/user-guide/webhooks/discord/index.html
+++ b/docs/4.x/user-guide/webhooks/discord/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Discord | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Discord Discord should use Slack-Compatible Webhook whose constructs
typically support both text and block rich text, and can be configured as follows:
Text format { "text" : "# #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } " }
Block rich text format A simple block with markdown support
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } \nInstal QRcode:\n![qrcode]( #{ @qrcode_url } )" } } ] }
Better look at some of the structures shown in the block
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : @title , } } , { "type" : "section" , "fields" : [ { "type" : "mrkdwn" , "text" : "*Platform:*\n #{ @device_type } " } , { "type" : "mrkdwn" , "text" : "*Upload at:*\n #{ @uploaded_at } " } ] } , "accessory" : { "type" : "image" , "image_url" : @qrcode_url , "alt_text" : "install qrcode" } ] }
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/webhooks/feishu/index.html b/docs/4.x/user-guide/webhooks/feishu/index.html
index 0d51f44f6..5c5c3ef45 100644
--- a/docs/4.x/user-guide/webhooks/feishu/index.html
+++ b/docs/4.x/user-guide/webhooks/feishu/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Lark (Feishu) | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Lark (Feishu) 飞书 use Incoming Webhooks whose constructs
typically support both text and interactive card, and can be configured as follows:
Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.
Text format { "msg_type" : "text" , "text" : { "content" : " #{ @title } \n\n安装地址: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
Use card format could use partly of markdown syntax:
{ "msg_type" : "interactive" , "card" : { "config" : { "wide_screen_mode" : true , "enable_forward" : true } , "elements" : [ { "tag" : "div" , "text" : { "content" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" , "tag" : "lark_md" } } , { "actions" : [ { "tag" : "button" , "text" : { "content" : "Install" , "tag" : "lark_md" } , "url" : @install_url , "type" : "default" , "value" : { } } ] , "tag" : "action" } ] } }
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/webhooks/index.html b/docs/4.x/user-guide/webhooks/index.html
index 9603b6253..0ea0eb39a 100644
--- a/docs/4.x/user-guide/webhooks/index.html
+++ b/docs/4.x/user-guide/webhooks/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Webhooks | Zealot
-
+
@@ -14,6 +14,6 @@
and each variable starts with
@
, the default structure will be used if the custom structure is left empty when creating the webhook.
The following variables are all provided.
{ event : @event , title : @title , app_name : @name , device_type : @device_type , release_version : @release_version , build_version : @build_version , size : @file_size , changelog : @changelog , install_url : @install_url , icon_url : @icon_url , qrcode_url : @qrcode_url , uploaded_at : @uploaded_at }
Output:
{ "event" : "upload_events" , "title" : "Zealot upload 1.0.0 version" , "app_name" : "Zealot" , "device_type" : "iOS" , "release_version" : "1.0.0" , "build_version" : "1" , "size" : "30 MB" , "install_url" : "https://zealot.test/api/apps/download/12354" , "icon_url" : "https://zealot.test/api/apps/icon.png" , "qrcode_url" : "https://zealot.test/api/apps/354/qrcode" , "uploaded_at" : "2019-12-30 11:33:00" , "changelog" : "- Add feture A\n- Fix issue B\n- Release v1.0.0" , }
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/webhooks/slack/index.html b/docs/4.x/user-guide/webhooks/slack/index.html
index eeda645d0..01b9b5aa2 100644
--- a/docs/4.x/user-guide/webhooks/slack/index.html
+++ b/docs/4.x/user-guide/webhooks/slack/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Slack | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Slack Slack use Incoming Webhooks whose constructs
typically support both text and block rich text, and can be configured as follows:
Text format { "text" : " #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } " }
Block rich text format A simple block with markdown support
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } \nInstal QRcode:\n![qrcode]( #{ @qrcode_url } )" } } ] }
Better look at some of the structures shown in the block
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : @title , } } , { "type" : "section" , "fields" : [ { "type" : "mrkdwn" , "text" : "*Platform:*\n #{ @device_type } " } , { "type" : "mrkdwn" , "text" : "*Upload at:*\n #{ @uploaded_at } " } ] } , "accessory" : { "type" : "image" , "image_url" : @qrcode_url , "alt_text" : "install qrcode" } ] }
-
+
\ No newline at end of file
diff --git a/docs/4.x/user-guide/webhooks/wecom/index.html b/docs/4.x/user-guide/webhooks/wecom/index.html
index f4fb3f839..bc2d349d2 100644
--- a/docs/4.x/user-guide/webhooks/wecom/index.html
+++ b/docs/4.x/user-guide/webhooks/wecom/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Wecom (Wechat Work) | Zealot
-
+
This is documentation for Zealot 4.x , which is no longer actively maintained.
Version: 4.x On this page
Wecom (Wechat Work) 企业微信 use Incoming Webhooks whose constructs
typically support both text and markdown, and can be configured as follows:
Text format { "msgtype" : "text" , "text" : { "content" : " #{ @title } \n\nInstall url: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
{ "msgtype" : "markdown" , "markdown" : { "content" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" } }
-
+
\ No newline at end of file
diff --git a/docs/category/administrator/index.html b/docs/category/administrator/index.html
index 0e5e05e70..5605bc853 100644
--- a/docs/category/administrator/index.html
+++ b/docs/category/administrator/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Administrator | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/apps/index.html b/docs/category/apps/index.html
index 37998210b..3d4f5d66e 100644
--- a/docs/category/apps/index.html
+++ b/docs/category/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Apps | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/cloud-provider-guides/index.html b/docs/category/cloud-provider-guides/index.html
index ae71fe293..469ef0a6b 100644
--- a/docs/category/cloud-provider-guides/index.html
+++ b/docs/category/cloud-provider-guides/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Cloud Provider Guides | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/configuration/index.html b/docs/category/configuration/index.html
index d6d712e25..d8c2945d8 100644
--- a/docs/category/configuration/index.html
+++ b/docs/category/configuration/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Configuration | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/debug-files/index.html b/docs/category/debug-files/index.html
index 504dc5b24..d30fd24ad 100644
--- a/docs/category/debug-files/index.html
+++ b/docs/category/debug-files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Debug Files | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/deployment/index.html b/docs/category/deployment/index.html
index 0de03f52b..abec9be08 100644
--- a/docs/category/deployment/index.html
+++ b/docs/category/deployment/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deployment | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/local-development/index.html b/docs/category/local-development/index.html
index 49ae7d63d..c88e7cfff 100644
--- a/docs/category/local-development/index.html
+++ b/docs/category/local-development/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Local development | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/monitoring/index.html b/docs/category/monitoring/index.html
index 491225bae..e6ce28203 100644
--- a/docs/category/monitoring/index.html
+++ b/docs/category/monitoring/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Monitoring | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/sdks/index.html b/docs/category/sdks/index.html
index 284f07669..42705103b 100644
--- a/docs/category/sdks/index.html
+++ b/docs/category/sdks/index.html
@@ -1,16 +1,16 @@
-
+
-
+
SDKs | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/category/toolkits/index.html b/docs/category/toolkits/index.html
index fab52e22c..9f3dbd87d 100644
--- a/docs/category/toolkits/index.html
+++ b/docs/category/toolkits/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Toolkits | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/contributing-guide/index.html b/docs/contributing-guide/index.html
index f618c8c6d..cf5bce6c1 100644
--- a/docs/contributing-guide/index.html
+++ b/docs/contributing-guide/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Contributing Guide | Zealot
-
+
@@ -17,6 +17,6 @@
For new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful.
Feel free to join our discord community, if you need further discussions with the core team.
Setup for local development These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use.
-
+
\ No newline at end of file
diff --git a/docs/contributing-guide/local-development/devcontainer/index.html b/docs/contributing-guide/local-development/devcontainer/index.html
index 1ce5549e5..980f31bc3 100644
--- a/docs/contributing-guide/local-development/devcontainer/index.html
+++ b/docs/contributing-guide/local-development/devcontainer/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Visual Studio Code Dev Container Setup | Zealot
-
+
Version: 5.0.0 On this page
Visual Studio Code Dev Container Setup The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.
System requirements Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose.
Install Git Install it from offical website.
Install Docker & docker-compose Install Visual Studio Code Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems.
Follow the platform-specific guides below:
Download Visual Studio Code for macOS. Open the browser's download list and locate the downloaded app or archive. If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari. Drag Visual Studio Code.app
to the Applications folder, making it available in the macOS Launchpad. Open VS Code from the Applications folder, by double clicking the icon. Download the Visual Studio Code installer for Windows. Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute. By default, VS Code is installed under C:\Users\{Username}\AppData\Local\Programs\Microsoft VS Code
. Install Remote container extension Install the Remote Container extension .
Fetch Zealot Codesoace Zealot Codespace was in the .devcontailer
folder of Zealot project, so you need clone the source code.
git clone https://github.com/tryzealot/zealot.git
Explan these files in Codespace:
File Description devcontainer.json
VSCode devcontainer config Dockerfile.base
Base Dockerfile, auto push multi registry servers after changes Dockerfile
Speed up build time, depends on above image. docker-compose.yml
All services of Zealot create-db-user.sql
Create user and role for Zealot
Open the project in a container Start Visual Studio Code, run the Dev Containers: Open Folder in Container...
command in Command Palette and select the Zealot folder.
Click the Starting Dev Container (show log) to review zealot codespace build real time logging messages.
When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:
[7293 ms] Start: Run in container: cat /proc/344/environ [9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container. [9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e [9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established [14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close [14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null. [29221 ms] Port forwarding 53148 > 43379 > 43379: Local close
In host Docker containers:
Start the project Press Ctrl + `
to open the integrated terminal in Visual Studio Code if it isn't already open. then run bin/dev
to run all services.
Notice that the terminal prompt might look different than your normal terminal prompt.
Open in browser A while after run bin/dev
, select Ports to see all forwarded ports, Open in Browser in quick way.
-
+
\ No newline at end of file
diff --git a/docs/contributing-guide/local-development/source-code/index.html b/docs/contributing-guide/local-development/source-code/index.html
index 778c5ace0..355da3741 100644
--- a/docs/contributing-guide/local-development/source-code/index.html
+++ b/docs/contributing-guide/local-development/source-code/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Source code | Zealot
-
+
Version: 5.0.0 On this page
Source code The following is a tutorial on local deployment development for different operating systems.
Prepare dependencies macOS Install homebrew First you need to install Xcode Command tools:
Then install Homebrew, the package management tool for macOS
$ ruby -e " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install ) "
Install dependencies $ brew install redis postgresql webp imagemagick node git
Setup Database and cache services Run postgresql and redis services
$ brew services start postgresql $ brew services start redis
You also need to create a default username in Postgresql:
$ createuser --superuser zealot $ createuser --createdb zealot
yarn Debian (Ubuntu) System dependencies $ apt update $ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev
Install dependencies $ apt install -y redis postgresql-client node
Setup Database and cache services Run postgresql and redis services
$ systemctl postgres start $ systemctl redis start
You also need to create a default username in Postgresql:
$ initdb -D /var/lib/postgresql/data $ createuser --superuser zealot $ createuser --createdb zealot
node Alpine Linux System dependencies $ apk --update --no-cache add build-base libxml2 libxslt git \ libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \ tzdata
Needs install gcompat
if use arm
architecture. or an exception will throws such like "Error loading shared library ".
Install dependencies $ apk --update --no-cache redis postgresql
Setup Database and cache services Run postgresql and redis services
$ rc-service postgres start $ rc-service redis start
You also need to create a default username in Postgresql:
$ initdb -D /var/lib/postgresql/data $ createuser --superuser zealot $ createuser --createdb zealot
Install Ruby Can be installed by either asdf, rvm as ruby version manager.
Following the offical install guide then:
asdf plugin add rust asdf install rust latest asdf global rust latest export RUBY_CONFIGURE_OPTS = --enable-yjit asdf plugin add ruby asdf install ruby 3.2 .0 asdf global ruby 3.2 .0
$ curl -sSL https://get.rvm.io | bash -s stable $ rvm install 3.2 .0 --disable-binary
Fetch source code git clone https://github.com/tryzealot/zealot.git
Initialize Zealot All the following steps need to be performed in the zealot root directory.
bundler Install Ruby gems
$ [ sudo ] gem install bundler $ bundle install
yarn Install javascript packages:
Initialize database Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:
$ rails db:create $ rails db:migrate
Configuring the connection database can be done via environment variables or by changing the config/database.yml
file.
Initialize default account and demo data Initialize administrator account and sample application
Launch services Open brower http://localhost:3000
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/api/apps/index.html b/docs/developer-guide/api/apps/index.html
index e57a26e92..7f45be2fb 100644
--- a/docs/developer-guide/api/apps/index.html
+++ b/docs/developer-guide/api/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
App APIs | Zealot
-
+
Version: 5.0.0 On this page
App APIs Upload an app This allows you to upload an single iOS, Android or macOS file.
Parameters Attribute Type Required Description file File
true an App file channel_key String
false Channel key Create a new App if leave it empty name String
false the name of App Use app name from parsed metadata in given file if leave it empty release_type String
false Eg, debug, beta, adhoc, release, enterprise 等 source String
false the source of upload (default is api
) changelog String
false Changelog Avaiables in plain text or JSON formatted struct branch String
false a branch name from git git_commit String
false git commit ci_url String
false the build url of a C custom_fields String
false JSON formatted custom fileds It could configures and display title, value and icon from fontawesome in a Release page from an App
For changelog
attribute which it accepts both plain text
and JSON
formatted contents:
plain text :
JSON :
[ { "message": "message 1", "author": "admin", "email": "admin@zealot.com", "date": "2021-11-11 11:11:11" }, { "message": "message 1", "author": "developer", "email": "developer@zealot.com", "date": "2021-11-11 11:11:11" } ]
For custom_fields
attribute which it use JSON
formatted struct to build from each key-value. for example, Display country name like country=China
with icon flag :
curl -X POST \ 'https://YOUR_ZEALOT_URL/api/apps/upload' \ --form 'token="token"' \ --form 'channel_key="channel_key"' \ + --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \ --form 'file=@/path/to/your/app'
Return body { "id" : 50 , "version" : 7 , "app_name" : "Test Android" , "bundle_id" : "com.test.app" , "release_version" : "1.0" , "build_version" : "1" , "source" : "SOURCE" , "branch" : "master" , "git_commit" : "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx" , "ci_url" : "" , "size" : 1565486 , "icon_url" : "/uploads/apps/a1/r1/icons/app_icon.png" , "release_url" : "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1" , "install_url" : "https://YOUR_ZEALOT_URL/download/releases/1" , "qrcode_url" : "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb" , "changelog" : [ { "message" : "Changelog message 1" } , { "message" : "Changelog message 2" } ] , "text_changelog" : "- Changelog message 1\n- Changelog message 2" , "custom_fields" : [ ] , "created_at" : "2021-09-01T11:43:33.977+08:00" , "app" : { "id" : 1 , "name" : "App name" } , "scheme" : { "id" : 8 , "name" : "Test" } , "channel" : { "slug" : "1XmpC" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } }
List apps Get a list of app.
This function takes pagination parameters page and per_page to restrict the list of app.
Parameters Attribute Type Required Description page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body [ { "id" : 1 , "name" : "Zealot" , "schemes" : [ { "id" : 1 , "name" : "Adhoc" , "channels" : [ { "slug" : "X1IXN" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "O1qHk" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } , { "id" : 2 , "name" : "内测版" , "channels" : [ { "slug" : "l19Tl" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "8selv" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } ] } ]
Get an app Allows you to receive information about an app like name, scheme, channel.
Parameters Attribute Type Required Description id String
true ID
Return body { "id" : 1 , "name" : "Zealot" , "schemes" : [ { "id" : 5 , "name" : "Test App" , "channels" : [ { "slug" : "X1IXN" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "O1qHk" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } ] }
Get versions list of app Get a list of apps by the given channel key
Parameters Attribute Type Required Description channel_key String
true Channel key page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body { "app_name" : "Zealot iOS" , "bundle_id" : "*" , "git_url" : null , "app" : { "id" : 3 , "name" : "Zealot" } , "scheme" : { "id" : 5 , "name" : "AdHoc" } , "releases" : [ { "version" : 2 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10292024" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } , { "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } , ] }
Get the latest version of app Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url.
Parameters Attribute Type Required Description channel_key String
true Channel key release_version String
true Release version build_version String
true Build version
Return body { "app_name" : "Zealot iOS" , "bundle_id" : "*" , "git_url" : null , "app" : { "id" : 3 , "name" : "Zealot" } , "scheme" : { "id" : 5 , "name" : "AdHoc" } , "releases" : { "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } }
Check version exists Allows you to check the Release exists by given query, query accepts two combo group:
bundle_id
, release_version
and build_verion
bundle_id
and git_commit
GET /api/apps/version_exist
Parameters Attribute Type Required Description channel_key String
true Channel key bundle_id String
true bundle_id or package_name release_version String
false Release version build_version String
false Build version git_commit String
false git commit hash
Return body Return 200 if release existed. Return 404 if release not existed. Success returns:
{ "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "4.1.1" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" }
Not found returns:
{ "error" : "Not found release" }
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/api/debug_files/index.html b/docs/developer-guide/api/debug_files/index.html
index 1a7ec80d6..c8497297d 100644
--- a/docs/developer-guide/api/debug_files/index.html
+++ b/docs/developer-guide/api/debug_files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Debug File APIs | Zealot
-
+
Version: 5.0.0 On this page
Debug File APIs Upload debug file This allows you to upload an single iOS, Android debug file.
Debug file accepts:
iOS: a Zipped dSYM file Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files. POST /api/debug_files/upload
Parameters Attribute Type Required Description channel_key String
true Channel key file File
true Arichved file by zip release_version String
true Release version, ignore this param if iOS app build_version String
true Build version, ignore this param if iOS app
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Download debug file This allows you to download an single iOS, Android debug file.
POST /api/debug_files/download
Parameters Attribute Type Required Description channel_key String
true Channel key release_version String
true Release version, ignore this param if iOS app build_version String
false Build version, ignore this param if iOS app order String
false Order by version
= latest version, upload_date
= last uploaded dateVaild in release_version is latest
Return body Retun 200 status code if the version exists and redirect to the download address with a 302 status code. return 404 status code if the version does not exist. List debug files Get a list of debug files.
This function takes pagination parameters page and per_page to restrict the list of debug files.
Parameters Attribute Type Required Description channel_key String
true Channel key page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body [ { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] } ]
Get a debug file Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only).
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Update a existed debug file This allows you to update a debug file.
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID file File
true a Zipped debug file release_version String
true Release version, ignore this param if iOS app build_version String
true Build version, ignore this param if iOS app
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Delete a debug file This allows you to delete a debug file.
DELETE /api/debug_files/:id
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID
Return body
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/api/index.html b/docs/developer-guide/api/index.html
index 38faa9fe7..71e39f459 100644
--- a/docs/developer-guide/api/index.html
+++ b/docs/developer-guide/api/index.html
@@ -1,17 +1,17 @@
-
+
-
+
APIs | Zealot
-
+
Version: 5.0.0 On this page
APIs Use the Zealot APIs to view, upload, download the build of app or debug file.
Authentication Requests currently only support query authentication for User Token, found in API - Key
at the bottom of the login user details page.
example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN
Version The current version is v1
, the APIs does not need to explicitly pass the version parameter,
and the GraphGL interface is being developed gradually.
Apps Resource Available endpoints Upload an App /api/apps/upload
List Apps /api/apps
Get an App by id /api/apps/:id
List verions from an App /api/apps/versions
Get the latest Release from an App /api/apps/latest
Check an Release from App exists /api/apps/version_exist
Full APIs to check api/apps page.
Debug files Resource Available endpoints Upload a debug file /api/debug_files/upload
Download a debug file by id /api/debug_files/download
List Debug files /api/debug_files
Get an debug file by id /api/debug_files/:id
Check a debug file exists by id /api/debug_files/version_exist
Update a debug file by id /api/debug_files/:id
Delete a debug file by id /api/debug_files/:id
Full APIs to check api/debug_files page.
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/fastlane/index.html b/docs/developer-guide/fastlane/index.html
index 26ffb6fcc..e3576c746 100644
--- a/docs/developer-guide/fastlane/index.html
+++ b/docs/developer-guide/fastlane/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Fastlane plugins | Zealot
-
+
@@ -14,6 +14,6 @@
customize your deployment workflows using the hundreds of community built fastlane actions and plugins.
fastlane-plugin-zealot provides upload app, debug_file and
version check actions to Zealot, install it in shell:
$ fastlane add_plugin zealot
More usefully plugins In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/fastlane/zealot/index.html b/docs/developer-guide/fastlane/zealot/index.html
index 23abc43b6..ba1634972 100644
--- a/docs/developer-guide/fastlane/zealot/index.html
+++ b/docs/developer-guide/fastlane/zealot/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot | Zealot
-
+
Version: 5.0.0 On this page
Fastlane action: zealot Uploading iOS, Android and macOS app, it requires three params:
zealot ( endpoint : 'https://zealot.com' , token : '...' , channel_key : '...' , )
Parameters +-----------------+---------------------------------+------------------------+----------+ | zealot Options | +-----------------+---------------------------------+------------------------+----------+ | Key | Description | Env Var | Default | +-----------------+---------------------------------+------------------------+----------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | | | file | The path of app file. Optional | ZEALOT_FILE | | | | if you use the `gym`, `ipa`, | | | | | `xcodebuild` or `gradle` | | | | | action. | | | | name | The name of app to display on | ZEALOT_NAME | | | | zealot | | | | changelog | The changelog of app | ZEALOT_CHANGELOG | | | slug | The slug of app | ZEALOT_SLUG | | | release_type | The release type of app | ZEALOT_RELEASE_TYPE | | | branch | The name of git branch | ZEALOT_BRANCH | | | git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | | | custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | | | | fields | | | | password | The password of app to download | ZEALOT_PASSWORD | | | source | The name of upload source | ZEALOT_SOURCE | fastlane | | ci_url | The name of upload source | ZEALOT_CI_CURL | | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true | | | keep secret | | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure | | | +-----------------+---------------------------------+------------------------+----------+ * = default value is dependent on the user's system +-----------------------+---------------------------------------------+ | zealot Output Variables | +-----------------------+---------------------------------------------+ | Key | Description | +-----------------------+---------------------------------------------+ | ZEALOT_APP_ID | The id of app | | ZEALOT_RELEASE_ID | The id of app's release | | ZEALOT_RELEASE_URL | The release URL of the newly uploaded build | | ZEALOT_INSTALL_URL | The install URL of the newly uploaded build | | ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build | | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+---------------------------------------------+
Output Variables +-----------------------+---------------------------------------------+ | zealot Output Variables | +-----------------------+---------------------------------------------+ | Key | Description | +-----------------------+---------------------------------------------+ | ZEALOT_APP_ID | The id of app | | ZEALOT_RELEASE_ID | The id of app's release | | ZEALOT_RELEASE_URL | The release URL of the newly uploaded build | | ZEALOT_INSTALL_URL | The install URL of the newly uploaded build | | ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build | | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+---------------------------------------------+ Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/fastlane/zealot_debug_file/index.html b/docs/developer-guide/fastlane/zealot_debug_file/index.html
index 9f4d7c4ea..493fa7011 100644
--- a/docs/developer-guide/fastlane/zealot_debug_file/index.html
+++ b/docs/developer-guide/fastlane/zealot_debug_file/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot_debug_file | Zealot
-
+
Version: 5.0.0 On this page
Fastlane action: zealot_debug_file Upload iOS dSYM or Android Proguard file(s) to Zealot
zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , platform : :ios , xcode_scheme : 'AppName' , verify_ssl : false ) zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , platform : :android , android_build_type : 'release' , android_flavor : 'store' , release_version : '1.1.0' , build_version : '1' , overwrite : true ) zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , zip_file : 'path/to/your/zip_file' , release_version : '1.1.0' , build_version : '1' , verify_ssl : false )
Parameters +--------------------+-----------------------------------+---------------------------+---------+ | zealot_debug_file Options | +--------------------+-----------------------------------+---------------------------+---------+ | Key | Description | Env Var | Default | +--------------------+-----------------------------------+---------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | | | zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | | | | to direct upload | | | | platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | | | | value are | | | | | ios,mac,macos,osx,android | | | | path | The path of debug file | ZEALOT_PATH | | | | (iOS/macOS is archive path for | | | | | Xcode, Android is path for app | | | | | project) | | | | xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | | | android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release | | android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | | | extra_files | A set file names | ZEALOT_EXTRA_FILES | [] | | output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . | | | dSYM file | | | | release_version | The release version of app | ZEALOT_RELEASE_VERSION | | | | (Android needs) | | | | build_version | The build version of app | ZEALOT_BUILD_VERSION | | | | (Android needs) | | | | overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false | | | if it existed | | | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure? (true/false) | | | +--------------------+-----------------------------------+---------------------------+---------+ * = default value is dependent on the user's system +-----------------------+-----------------------------------------+ | zealot_debug_file Output Variables | +-----------------------+-----------------------------------------+ | Key | Description | +-----------------------+-----------------------------------------+ | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+-----------------------------------------+
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/fastlane/zealot_sync_devices/index.html b/docs/developer-guide/fastlane/zealot_sync_devices/index.html
index 172e2660e..ce5dc8180 100644
--- a/docs/developer-guide/fastlane/zealot_sync_devices/index.html
+++ b/docs/developer-guide/fastlane/zealot_sync_devices/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Fastlane action: zealot_sync_devices | Zealot
-
+
Version: 5.0.0 On this page
Fastlane action: zealot_sync_devices 🔔 Zealot 4.5.0 built in Apple team manage which it use Apple API Key
to sync iOS devices, even CAN registe the device after fetch the UDID, Check detail
Use Apple Developer account to syncing UDIDs and relates the value in Zealot.
zealot_sync_devices ( endpoint : 'https://zealot.com' , token : '...' , api_key_path : '/path/to/your/api_key_json_file' , team_id : '...' ) zealot_sync_devices ( endpoint : 'https://zealot.com' , token : '...' , username : 'user@example.com' , team_id : '...' )
Parameters +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | zealot_sync_devices Options | +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | Key | Description | Env Var(s) | Default | +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * | | api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | | | | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | | | | -json-file) | | | | api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * | | | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | | | | -hash-option) | | | | team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * | | team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * | | platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios | | verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false | +---------------+-----------------------------------------------------------------------------+------------------------+---------+
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/fastlane/zealot_version_check/index.html b/docs/developer-guide/fastlane/zealot_version_check/index.html
index 0628bfb5c..a5252bdf6 100644
--- a/docs/developer-guide/fastlane/zealot_version_check/index.html
+++ b/docs/developer-guide/fastlane/zealot_version_check/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot_version_check | Zealot
-
+
Version: 5.0.0 On this page
Fastlane action: zealot_version_check Check given build exists or not on Zealot
zealot_version_check ( endpoint : 'https://zealot.com' , token : '...' , bundle_id : 'com.example.app.name' , release_version : '1.0.0' , build_version : '1' )
Parameters +-----------------+---------------------------------+------------------------+---------+ | zealot_version_check Options | +-----------------+---------------------------------+------------------------+---------+ | Key | Description | Env Var | Default | +-----------------+---------------------------------+------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | | | bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | | | | app | | | | release_version | The release version of app | ZEALOT_RELEASE_VERSION | | | build_version | The build version of app | ZEALOT_BUILD_VERSION | | | git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure? (true/false) | | | +-----------------+---------------------------------+------------------------+---------+
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/index.html b/docs/developer-guide/index.html
index 00914fc2b..dd36056dc 100644
--- a/docs/developer-guide/index.html
+++ b/docs/developer-guide/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Developer Guide | Zealot
-
+
Version: 5.0.0 Developer Guide Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/sdk/android/index.html b/docs/developer-guide/sdk/android/index.html
index e4226d370..299662b6e 100644
--- a/docs/developer-guide/sdk/android/index.html
+++ b/docs/developer-guide/sdk/android/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Zealot Android SDK | Zealot
-
+
Version: 5.0.0 On this page
Zealot Android SDK The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.
Install JitPack Using jitpack to install:
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
In build.gradle
file of main app project add:
dependencies { implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT' }
Permission Zealot needs internet permission
< uses-permission android: name = " android.permission.INTERNET " />
Usages Add the start code to the onCreate
method block of your Application
file:
Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "..." ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "xxxxxxx" , "beta" ) . setCHannelKey ( "yyyyyyy" , "test" ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( )
Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "..." ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) ; Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "xxxxxxx" , "beta" ) . setCHannelKey ( "yyyyyyy" , "test" ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) ;
-
+
\ No newline at end of file
diff --git a/docs/developer-guide/sdk/ios/index.html b/docs/developer-guide/sdk/ios/index.html
index bb43a01c0..777dfaf8e 100644
--- a/docs/developer-guide/sdk/ios/index.html
+++ b/docs/developer-guide/sdk/ios/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Zealot iOS SDK | Zealot
-
+
Version: 5.0.0 On this page
Zealot iOS SDK The iOS component provides a service to check for new versions and installations for Zealot,
supporting Swift and Objective-C.
Install Cocoapods Adding below code into Podfile
:
pod 'Zealot' , :git => 'https://github.com/tryzealot/zealot-ios.git' , :branch => 'master'
Install it:
Usages Add the code in your AppDelegate
: # import < Zealot / Zealot - Swift . h >
Add the following code in application:didFinishLaunchingWithOptions:
method block: let zealot = Zealot ( endpoint : "http://zealot.com" , channelKey : "..." ) zealot . checkVersion ( ) let zealot = Zealot ( endpoint : "http://zealot.com" , channelKeys : [ "beta" : "xxxxxxx" , "test" : "yyyyyyy" ] , default_enviroment : "beta" ) zealot . checkVersion ( )
Zealot * zealot = [ [ Zealot alloc ] initWithEndpoint : @"http://zealot.com" channelKey : @"..." ] ; Zealot * zealot = [ [ Zealot alloc ] initWithEndpoint : @"http://zealot.com" channelKeys : @ { @"beta" : @"xxxxxxx" , @"gray" : @"yyyyyyy" } default_enviroment : @"beta" ] ; [ zealot checkVersion ] ;
-
+
\ No newline at end of file
diff --git a/docs/next/category/administrator/index.html b/docs/next/category/administrator/index.html
index b4c789e0a..281d91295 100644
--- a/docs/next/category/administrator/index.html
+++ b/docs/next/category/administrator/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Administrator | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/apps/index.html b/docs/next/category/apps/index.html
index f851a4f11..91613237f 100644
--- a/docs/next/category/apps/index.html
+++ b/docs/next/category/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Apps | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/cloud-provider-guides/index.html b/docs/next/category/cloud-provider-guides/index.html
index a3717fde0..43df7b5ce 100644
--- a/docs/next/category/cloud-provider-guides/index.html
+++ b/docs/next/category/cloud-provider-guides/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Cloud Provider Guides | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/configuration/index.html b/docs/next/category/configuration/index.html
index ec19faedb..f89a7f60c 100644
--- a/docs/next/category/configuration/index.html
+++ b/docs/next/category/configuration/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Configuration | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/debug-files/index.html b/docs/next/category/debug-files/index.html
index cbf5573fb..7251b4ec5 100644
--- a/docs/next/category/debug-files/index.html
+++ b/docs/next/category/debug-files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Debug Files | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/deployment/index.html b/docs/next/category/deployment/index.html
index 433543b86..016523cf9 100644
--- a/docs/next/category/deployment/index.html
+++ b/docs/next/category/deployment/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deployment | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/local-development/index.html b/docs/next/category/local-development/index.html
index 58f323466..4cf740fc7 100644
--- a/docs/next/category/local-development/index.html
+++ b/docs/next/category/local-development/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Local development | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/monitoring/index.html b/docs/next/category/monitoring/index.html
index 7640aa251..645709cf0 100644
--- a/docs/next/category/monitoring/index.html
+++ b/docs/next/category/monitoring/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Monitoring | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/sdks/index.html b/docs/next/category/sdks/index.html
index 42855fd25..799e09e39 100644
--- a/docs/next/category/sdks/index.html
+++ b/docs/next/category/sdks/index.html
@@ -1,16 +1,16 @@
-
+
-
+
SDKs | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/category/toolkits/index.html b/docs/next/category/toolkits/index.html
index 0c54afa4a..e3759752e 100644
--- a/docs/next/category/toolkits/index.html
+++ b/docs/next/category/toolkits/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Toolkits | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧
-
+
\ No newline at end of file
diff --git a/docs/next/contributing-guide/index.html b/docs/next/contributing-guide/index.html
index d94977ddf..ce9188662 100644
--- a/docs/next/contributing-guide/index.html
+++ b/docs/next/contributing-guide/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Contributing Guide | Zealot
-
+
@@ -17,6 +17,6 @@
For new feature requests, Provide a convincing reason to add this feature. Real-life business use-cases will be super helpful.
Feel free to join our discord community, if you need further discussions with the core team.
Setup for local development These guides will help you to setup the environment required for Zealot. Follow the guide based on the operating system you use.
-
+
\ No newline at end of file
diff --git a/docs/next/contributing-guide/local-development/devcontainer/index.html b/docs/next/contributing-guide/local-development/devcontainer/index.html
index 954f235cc..7ac6f2130 100644
--- a/docs/next/contributing-guide/local-development/devcontainer/index.html
+++ b/docs/next/contributing-guide/local-development/devcontainer/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Visual Studio Code Dev Container Setup | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Visual Studio Code Dev Container Setup The Visual Studio Code Dev Containers lets you use a Docker container as a full-featured development environment.
System requirements Before processing, make sure you have the lateset version of Git, Virsual Studio Code, Docker and docker-compose.
Install Git Install it from offical website.
Install Docker & docker-compose Install Visual Studio Code Visual Studio Code is a free code editor, which runs on the macOS, Linux, and Windows operating systems.
Follow the platform-specific guides below:
Download Visual Studio Code for macOS. Open the browser's download list and locate the downloaded app or archive. If archive, extract the archive contents. Use double-click for some browsers or select the 'magnifying glass' icon with Safari. Drag Visual Studio Code.app
to the Applications folder, making it available in the macOS Launchpad. Open VS Code from the Applications folder, by double clicking the icon. Download the Visual Studio Code installer for Windows. Once it is downloaded, run the installer (VSCodeUserSetup-{version}.exe). This will only take a minute. By default, VS Code is installed under C:\Users\{Username}\AppData\Local\Programs\Microsoft VS Code
. Install Remote container extension Install the Remote Container extension .
Fetch Zealot Codesoace Zealot Codespace was in the .devcontailer
folder of Zealot project, so you need clone the source code.
git clone https://github.com/tryzealot/zealot.git
Explan these files in Codespace:
File Description devcontainer.json
VSCode devcontainer config Dockerfile.base
Base Dockerfile, auto push multi registry servers after changes Dockerfile
Speed up build time, depends on above image. docker-compose.yml
All services of Zealot create-db-user.sql
Create user and role for Zealot
Open the project in a container Start Visual Studio Code, run the Dev Containers: Open Folder in Container...
command in Command Palette and select the Zealot folder.
Click the Starting Dev Container (show log) to review zealot codespace build real time logging messages.
When finish the task, project files will load in file explorer and the zsh terminal. Access log outputs messages:
[7293 ms] Start: Run in container: cat /proc/344/environ [9836 ms] Port forwarding connection from 53148 > 43379 > 43379 in the container. [9836 ms] Start: Run in container: /home/vscode/.vscode-server/bin/5235c6bb189b60b01b1f49062f4ffa42384f8c91/node -e [9981 ms] Port forwarding 53148 > 43379 > 43379 stderr: Connection established [14988 ms] Port forwarding 53148 > 43379 > 43379 stderr: Remote close [14999 ms] Port forwarding 53148 > 43379 > 43379 terminated with code 0 and signal null. [29221 ms] Port forwarding 53148 > 43379 > 43379: Local close
In host Docker containers:
Start the project Press Ctrl + `
to open the integrated terminal in Visual Studio Code if it isn't already open. then run bin/dev
to run all services.
Notice that the terminal prompt might look different than your normal terminal prompt.
Open in browser A while after run bin/dev
, select Ports to see all forwarded ports, Open in Browser in quick way.
-
+
\ No newline at end of file
diff --git a/docs/next/contributing-guide/local-development/source-code/index.html b/docs/next/contributing-guide/local-development/source-code/index.html
index 842d1b516..b4c6dabb5 100644
--- a/docs/next/contributing-guide/local-development/source-code/index.html
+++ b/docs/next/contributing-guide/local-development/source-code/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Source code | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Source code The following is a tutorial on local deployment development for different operating systems.
Prepare dependencies macOS Install homebrew First you need to install Xcode Command tools:
Then install Homebrew, the package management tool for macOS
$ ruby -e " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install ) "
Install dependencies $ brew install redis postgresql webp imagemagick node git
Setup Database and cache services Run postgresql and redis services
$ brew services start postgresql $ brew services start redis
You also need to create a default username in Postgresql:
$ createuser --superuser zealot $ createuser --createdb zealot
yarn Debian (Ubuntu) System dependencies $ apt update $ apt install -y libssl-dev tar tzdata git imagemagick libjpeg-dev libpng-dev libtiff-dev libwebp-dev
Install dependencies $ apt install -y redis postgresql-client node
Setup Database and cache services Run postgresql and redis services
$ systemctl postgres start $ systemctl redis start
You also need to create a default username in Postgresql:
$ initdb -D /var/lib/postgresql/data $ createuser --superuser zealot $ createuser --createdb zealot
node Alpine Linux System dependencies $ apk --update --no-cache add build-base libxml2 libxslt git \ libxml2-dev libxslt-dev yaml-dev postgresql-dev nodejs npm yarn libwebp-dev libpng-dev tiff-dev \ tzdata
Needs install gcompat
if use arm
architecture. or an exception will throws such like "Error loading shared library ".
Install dependencies $ apk --update --no-cache redis postgresql
Setup Database and cache services Run postgresql and redis services
$ rc-service postgres start $ rc-service redis start
You also need to create a default username in Postgresql:
$ initdb -D /var/lib/postgresql/data $ createuser --superuser zealot $ createuser --createdb zealot
Install Ruby Can be installed by either asdf, rvm as ruby version manager.
Following the offical install guide then:
asdf plugin add rust asdf install rust latest asdf global rust latest export RUBY_CONFIGURE_OPTS = --enable-yjit asdf plugin add ruby asdf install ruby 3.2 .0 asdf global ruby 3.2 .0
$ curl -sSL https://get.rvm.io | bash -s stable $ rvm install 3.2 .0 --disable-binary
Fetch source code git clone https://github.com/tryzealot/zealot.git
Initialize Zealot All the following steps need to be performed in the zealot root directory.
bundler Install Ruby gems
$ [ sudo ] gem install bundler $ bundle install
yarn Install javascript packages:
Initialize database Make sure there are no problems with the connection database information, then the database tables will be created and the table structure will be created:
$ rails db:create $ rails db:migrate
Configuring the connection database can be done via environment variables or by changing the config/database.yml
file.
Initialize default account and demo data Initialize administrator account and sample application
Launch services Open brower http://localhost:3000
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/api/apps/index.html b/docs/next/developer-guide/api/apps/index.html
index 58816dedc..4cf6d9e02 100644
--- a/docs/next/developer-guide/api/apps/index.html
+++ b/docs/next/developer-guide/api/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
App APIs | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
App APIs Upload an app This allows you to upload an single iOS, Android or macOS file.
Parameters Attribute Type Required Description file File
true an App file channel_key String
false Channel key Create a new App if leave it empty name String
false the name of App Use app name from parsed metadata in given file if leave it empty release_type String
false Eg, debug, beta, adhoc, release, enterprise 等 source String
false the source of upload (default is api
) changelog String
false Changelog Avaiables in plain text or JSON formatted struct branch String
false a branch name from git git_commit String
false git commit ci_url String
false the build url of a C custom_fields String
false JSON formatted custom fileds It could configures and display title, value and icon from fontawesome in a Release page from an App
For changelog
attribute which it accepts both plain text
and JSON
formatted contents:
plain text :
JSON :
[ { "message": "message 1", "author": "admin", "email": "admin@zealot.com", "date": "2021-11-11 11:11:11" }, { "message": "message 1", "author": "developer", "email": "developer@zealot.com", "date": "2021-11-11 11:11:11" } ]
For custom_fields
attribute which it use JSON
formatted struct to build from each key-value. for example, Display country name like country=China
with icon flag :
curl -X POST \ 'https://YOUR_ZEALOT_URL/api/apps/upload' \ --form 'token="token"' \ --form 'channel_key="channel_key"' \ + --form 'custom_fields="[{"name":"country","value":"China","icon":"fas fa-flag"}]"' \ --form 'file=@/path/to/your/app'
Return body { "id" : 50 , "version" : 7 , "app_name" : "Test Android" , "bundle_id" : "com.test.app" , "release_version" : "1.0" , "build_version" : "1" , "source" : "SOURCE" , "branch" : "master" , "git_commit" : "e9de48513dbb6abfbxxxxxxxxxxxxxxxxxxxxxxxx" , "ci_url" : "" , "size" : 1565486 , "icon_url" : "/uploads/apps/a1/r1/icons/app_icon.png" , "release_url" : "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1" , "install_url" : "https://YOUR_ZEALOT_URL/download/releases/1" , "qrcode_url" : "https://YOUR_ZEALOT_URL/channels/1XmpC/releases/1/qrcode?size=thumb" , "changelog" : [ { "message" : "Changelog message 1" } , { "message" : "Changelog message 2" } ] , "text_changelog" : "- Changelog message 1\n- Changelog message 2" , "custom_fields" : [ ] , "created_at" : "2021-09-01T11:43:33.977+08:00" , "app" : { "id" : 1 , "name" : "App name" } , "scheme" : { "id" : 8 , "name" : "Test" } , "channel" : { "slug" : "1XmpC" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } }
List apps Get a list of app.
This function takes pagination parameters page and per_page to restrict the list of app.
Parameters Attribute Type Required Description page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body [ { "id" : 1 , "name" : "Zealot" , "schemes" : [ { "id" : 1 , "name" : "Adhoc" , "channels" : [ { "slug" : "X1IXN" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "O1qHk" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } , { "id" : 2 , "name" : "内测版" , "channels" : [ { "slug" : "l19Tl" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "8selv" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } ] } ]
Get an app Allows you to receive information about an app like name, scheme, channel.
Parameters Attribute Type Required Description id String
true ID
Return body { "id" : 1 , "name" : "Zealot" , "schemes" : [ { "id" : 5 , "name" : "Test App" , "channels" : [ { "slug" : "X1IXN" , "name" : "Android" , "device_type" : "android" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } , { "slug" : "O1qHk" , "name" : "iOS" , "device_type" : "ios" , "bundle_id" : "*" , "git_url" : null , "has_password" : false } ] } ] }
Get versions list of app Get a list of apps by the given channel key
Parameters Attribute Type Required Description channel_key String
true Channel key page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body { "app_name" : "Zealot iOS" , "bundle_id" : "*" , "git_url" : null , "app" : { "id" : 3 , "name" : "Zealot" } , "scheme" : { "id" : 5 , "name" : "AdHoc" } , "releases" : [ { "version" : 2 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10292024" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } , { "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } , ] }
Get the latest version of app Allows you to receive the latest information about a Release version from App like app metadata, changelog, icon url, install (download) url.
Parameters Attribute Type Required Description channel_key String
true Channel key release_version String
true Release version build_version String
true Build version
Return body { "app_name" : "Zealot iOS" , "bundle_id" : "*" , "git_url" : null , "app" : { "id" : 3 , "name" : "Zealot" } , "scheme" : { "id" : 5 , "name" : "AdHoc" } , "releases" : { "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "1.0.0" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" } }
Check version exists Allows you to check the Release exists by given query, query accepts two combo group:
bundle_id
, release_version
and build_verion
bundle_id
and git_commit
GET /api/apps/version_exist
Parameters Attribute Type Required Description channel_key String
true Channel key bundle_id String
true bundle_id or package_name release_version String
false Release version build_version String
false Build version git_commit String
false git commit hash
Return body Return 200 if release existed. Return 404 if release not existed. Success returns:
{ "version" : 1 , "app_name" : "Zealot iOS" , "bundle_id" : "im.ews.zealot" , "release_version" : "4.1.1" , "build_version" : "10291524" , "source" : "Web" , "branch" : "" , "git_commit" : "" , "ci_url" : "" , "size" : 79712596 , "icon_url" : "https://tryzealot.ews.im/uploads/apps/a3/r21/icons/8ab13dc08321f9f3412a9fa98689d9c3.png" , "install_url" : "itms-services://?action=download-manifest&url=https://tryzealot.ews.im/api/apps/O1qHk/1/install" , "changelog" : [ ] , "created_at" : "2019-12-25T14:26:06.608+08:00" }
Not found returns:
{ "error" : "Not found release" }
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/api/debug_files/index.html b/docs/next/developer-guide/api/debug_files/index.html
index 75bf79d31..3988cb1fc 100644
--- a/docs/next/developer-guide/api/debug_files/index.html
+++ b/docs/next/developer-guide/api/debug_files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Debug File APIs | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Debug File APIs Upload debug file This allows you to upload an single iOS, Android debug file.
Debug file accepts:
iOS: a Zipped dSYM file Android: a Zipped file includes mapping.txt, R.txt or AndroidManifest.xml files. POST /api/debug_files/upload
Parameters Attribute Type Required Description channel_key String
true Channel key file File
true Arichved file by zip release_version String
true Release version, ignore this param if iOS app build_version String
true Build version, ignore this param if iOS app
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Download debug file This allows you to download an single iOS, Android debug file.
POST /api/debug_files/download
Parameters Attribute Type Required Description channel_key String
true Channel key release_version String
true Release version, ignore this param if iOS app build_version String
false Build version, ignore this param if iOS app order String
false Order by version
= latest version, upload_date
= last uploaded dateVaild in release_version is latest
Return body Retun 200 status code if the version exists and redirect to the download address with a 302 status code. return 404 status code if the version does not exist. List debug files Get a list of debug files.
This function takes pagination parameters page and per_page to restrict the list of debug files.
Parameters Attribute Type Required Description channel_key String
true Channel key page Integer
false Page number (default: 1
) per_page Integer
false Number of items to list per page (default: 25
, max: 100
).
Return body [ { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] } ]
Get a debug file Allows you to receive information about debug file like name, file size, UUID (iOS only), platform (iOS only) or file list (Android only).
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Update a existed debug file This allows you to update a debug file.
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID file File
true a Zipped debug file release_version String
true Release version, ignore this param if iOS app build_version String
true Build version, ignore this param if iOS app
Return body { "id" : 1 , "app_name" : "Demo App" , "device_type" : "ios" , "release_version" : "1.14.0" , "build_version" : "980" , "file_url" : "https://tryzealot.ews.im/download/debug_files/1" , "metadata" : [ { "id" : 1 , "debug_file_id" : 1 , "uuid" : "34656552-21ae-3722-a7fb-3582bc9b1d98" , "type" : "arm64" , "object" : "AppName" , "data" : { } , "size" : 4137941 , "created_at" : "2022-11-25T15:53:15.157+08:00" , "updated_at" : "2022-11-25T15:53:15.157+08:00" } ] }
Delete a debug file This allows you to delete a debug file.
DELETE /api/debug_files/:id
Parameters Attribute Type Required Description channel_key String
true Channel key id String
true ID
Return body
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/api/index.html b/docs/next/developer-guide/api/index.html
index 5cd3292f6..d9f08fa55 100644
--- a/docs/next/developer-guide/api/index.html
+++ b/docs/next/developer-guide/api/index.html
@@ -1,17 +1,17 @@
-
+
-
+
APIs | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
APIs Use the Zealot APIs to view, upload, download the build of app or debug file.
Authentication Requests currently only support query authentication for User Token, found in API - Key
at the bottom of the login user details page.
example : https://YOUR_ZEALOT_URL/api?token=YOUR_TOKEN
Version The current version is v1
, the APIs does not need to explicitly pass the version parameter,
and the GraphGL interface is being developed gradually.
Apps Resource Available endpoints Upload an App /api/apps/upload
List Apps /api/apps
Get an App by id /api/apps/:id
List verions from an App /api/apps/versions
Get the latest Release from an App /api/apps/latest
Check an Release from App exists /api/apps/version_exist
Full APIs to check api/apps page.
Debug files Resource Available endpoints Upload a debug file /api/debug_files/upload
Download a debug file by id /api/debug_files/download
List Debug files /api/debug_files
Get an debug file by id /api/debug_files/:id
Check a debug file exists by id /api/debug_files/version_exist
Update a debug file by id /api/debug_files/:id
Delete a debug file by id /api/debug_files/:id
Full APIs to check api/debug_files page.
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/fastlane/index.html b/docs/next/developer-guide/fastlane/index.html
index 0cedfdd49..806422728 100644
--- a/docs/next/developer-guide/fastlane/index.html
+++ b/docs/next/developer-guide/fastlane/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Fastlane plugins | Zealot
-
+
@@ -14,6 +14,6 @@
customize your deployment workflows using the hundreds of community built fastlane actions and plugins.
fastlane-plugin-zealot provides upload app, debug_file and
version check actions to Zealot, install it in shell:
$ fastlane add_plugin zealot
More usefully plugins In addition, as the author of the project also open source a number of other fastlane plug-ins there is always one you will use:
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/fastlane/zealot/index.html b/docs/next/developer-guide/fastlane/zealot/index.html
index 725ddaa36..21d2ecc87 100644
--- a/docs/next/developer-guide/fastlane/zealot/index.html
+++ b/docs/next/developer-guide/fastlane/zealot/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Fastlane action: zealot Uploading iOS, Android and macOS app, it requires three params:
zealot ( endpoint : 'https://zealot.com' , token : '...' , channel_key : '...' , )
Parameters +-----------------+---------------------------------+------------------------+----------+ | zealot Options | +-----------------+---------------------------------+------------------------+----------+ | Key | Description | Env Var | Default | +-----------------+---------------------------------+------------------------+----------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | | | file | The path of app file. Optional | ZEALOT_FILE | | | | if you use the `gym`, `ipa`, | | | | | `xcodebuild` or `gradle` | | | | | action. | | | | name | The name of app to display on | ZEALOT_NAME | | | | zealot | | | | changelog | The changelog of app | ZEALOT_CHANGELOG | | | slug | The slug of app | ZEALOT_SLUG | | | release_type | The release type of app | ZEALOT_RELEASE_TYPE | | | branch | The name of git branch | ZEALOT_BRANCH | | | git_commit | The hash of git commit | ZEALOT_GIT_COMMIT | | | custom_fields | The key-value hash of custom | ZEALOT_CUSTOM_FIELDS | | | | fields | | | | password | The password of app to download | ZEALOT_PASSWORD | | | source | The name of upload source | ZEALOT_SOURCE | fastlane | | ci_url | The name of upload source | ZEALOT_CI_CURL | | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | hide_user_token | replase user token to *** to | ZEALOT_HIDE_USER_TOKEN | true | | | keep secret | | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure | | | +-----------------+---------------------------------+------------------------+----------+ * = default value is dependent on the user's system +-----------------------+---------------------------------------------+ | zealot Output Variables | +-----------------------+---------------------------------------------+ | Key | Description | +-----------------------+---------------------------------------------+ | ZEALOT_APP_ID | The id of app | | ZEALOT_RELEASE_ID | The id of app's release | | ZEALOT_RELEASE_URL | The release URL of the newly uploaded build | | ZEALOT_INSTALL_URL | The install URL of the newly uploaded build | | ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build | | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+---------------------------------------------+
Output Variables +-----------------------+---------------------------------------------+ | zealot Output Variables | +-----------------------+---------------------------------------------+ | Key | Description | +-----------------------+---------------------------------------------+ | ZEALOT_APP_ID | The id of app | | ZEALOT_RELEASE_ID | The id of app's release | | ZEALOT_RELEASE_URL | The release URL of the newly uploaded build | | ZEALOT_INSTALL_URL | The install URL of the newly uploaded build | | ZEALOT_QRCODE_URL | The QRCode URL of the newly uploaded build | | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+---------------------------------------------+ Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/fastlane/zealot_debug_file/index.html b/docs/next/developer-guide/fastlane/zealot_debug_file/index.html
index 6601fe03b..056794aa5 100644
--- a/docs/next/developer-guide/fastlane/zealot_debug_file/index.html
+++ b/docs/next/developer-guide/fastlane/zealot_debug_file/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot_debug_file | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Fastlane action: zealot_debug_file Upload iOS dSYM or Android Proguard file(s) to Zealot
zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , platform : :ios , xcode_scheme : 'AppName' , verify_ssl : false ) zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , platform : :android , android_build_type : 'release' , android_flavor : 'store' , release_version : '1.1.0' , build_version : '1' , overwrite : true ) zealot_debug_file ( endpoint : 'https://tryzealot.ews.im' , token : '...' , channel_key : '...' , zip_file : 'path/to/your/zip_file' , release_version : '1.1.0' , build_version : '1' , verify_ssl : false )
Parameters +--------------------+-----------------------------------+---------------------------+---------+ | zealot_debug_file Options | +--------------------+-----------------------------------+---------------------------+---------+ | Key | Description | Env Var | Default | +--------------------+-----------------------------------+---------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | Any channel key of app | ZEALOT_CHANNEL_KEY | | | zip_file | Using given the path of zip file | DF_DSYM_ZIP_FILE | | | | to direct upload | | | | platform | The name of platfrom, avaiable | ZEALOT_PLATFORM | | | | value are | | | | | ios,mac,macos,osx,android | | | | path | The path of debug file | ZEALOT_PATH | | | | (iOS/macOS is archive path for | | | | | Xcode, Android is path for app | | | | | project) | | | | xcode_scheme | The scheme name of app | ZEALOT_XCODE_SCHEME | | | android_build_type | The build type of app | ZEALOT_ANDROID_BUILD_TYPE | release | | android_flavor | The product flavor of app | ZEALOT_ANDROID_FLAVOR | | | extra_files | A set file names | ZEALOT_EXTRA_FILES | [] | | output_path | The output path of compressed | DF_DSYM_OUTPUT_PATH | . | | | dSYM file | | | | release_version | The release version of app | ZEALOT_RELEASE_VERSION | | | | (Android needs) | | | | build_version | The build version of app | ZEALOT_BUILD_VERSION | | | | (Android needs) | | | | overwrite | Overwrite output compressed file | DF_DSYM_OVERWRITE | false | | | if it existed | | | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error uploading app | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure? (true/false) | | | +--------------------+-----------------------------------+---------------------------+---------+ * = default value is dependent on the user's system +-----------------------+-----------------------------------------+ | zealot_debug_file Output Variables | +-----------------------+-----------------------------------------+ | Key | Description | +-----------------------+-----------------------------------------+ | ZEAALOT_ERROR_MESSAGE | The error message during upload process | +-----------------------+-----------------------------------------+
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html b/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html
index 552d361f6..b9e26537a 100644
--- a/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html
+++ b/docs/next/developer-guide/fastlane/zealot_sync_devices/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Fastlane action: zealot_sync_devices | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Fastlane action: zealot_sync_devices 🔔 Zealot 4.5.0 built in Apple team manage which it use Apple API Key
to sync iOS devices, even CAN registe the device after fetch the UDID, Check detail
Use Apple Developer account to syncing UDIDs and relates the value in Zealot.
zealot_sync_devices ( endpoint : 'https://zealot.com' , token : '...' , api_key_path : '/path/to/your/api_key_json_file' , team_id : '...' ) zealot_sync_devices ( endpoint : 'https://zealot.com' , token : '...' , username : 'user@example.com' , team_id : '...' )
Parameters +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | zealot_sync_devices Options | +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | Key | Description | Env Var(s) | Default | +---------------+-----------------------------------------------------------------------------+------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | username | The apple id (username) of Apple Developer Portal | ZEALOT_USERNAME | * | | api_key_path | Path to your App Store Connect API Key JSON file | ZEALOT_API_PATH | | | | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | | | | -json-file) | | | | api_key | Your App Store Connect API Key information | ZEALOT_API_KEY | * | | | (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key | | | | | -hash-option) | | | | team_id | The ID of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_ID | * | | team_name | The name of your Developer Portal team if you're in multiple teams | ZEALOT_APPLE_TEAM_NAME | * | | platform | The platform to use (optional) | ZEALOT_APPLE_PLATFORM | ios | | verify_ssl | Should verify SSL of zealot service | ZEALOT_VERIFY_SSL | true | | timeout | Request timeout in seconds | ZEALOT_TIMEOUT | | | fail_on_error | Should an error http request cause a failure? (true/false) | ZEALOT_FAIL_ON_ERROR | false | +---------------+-----------------------------------------------------------------------------+------------------------+---------+
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/fastlane/zealot_version_check/index.html b/docs/next/developer-guide/fastlane/zealot_version_check/index.html
index ee3d20558..d0abd7761 100644
--- a/docs/next/developer-guide/fastlane/zealot_version_check/index.html
+++ b/docs/next/developer-guide/fastlane/zealot_version_check/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Fastlane action: zealot_version_check | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Fastlane action: zealot_version_check Check given build exists or not on Zealot
zealot_version_check ( endpoint : 'https://zealot.com' , token : '...' , bundle_id : 'com.example.app.name' , release_version : '1.0.0' , build_version : '1' )
Parameters +-----------------+---------------------------------+------------------------+---------+ | zealot_version_check Options | +-----------------+---------------------------------+------------------------+---------+ | Key | Description | Env Var | Default | +-----------------+---------------------------------+------------------------+---------+ | endpoint | The endpoint of zealot | ZEALOT_ENDPOINT | | | token | The token of user | ZEALOT_TOKEN | | | channel_key | The key of app's channel | ZEALOT_CHANNEL_KEY | | | bundle_id | The bundle id(package name) of | ZEALOT_BUNDLE_ID | | | | app | | | | release_version | The release version of app | ZEALOT_RELEASE_VERSION | | | build_version | The build version of app | ZEALOT_BUILD_VERSION | | | git_commit | The latest git commit of app | ZEALOT_GIT_COMMIT | | | verify_ssl | Should verify SSL of zealot | ZEALOT_VERIFY_SSL | true | | | service | | | | fail_on_error | Should an error http request | ZEALOT_FAIL_ON_ERROR | false | | | cause a failure? (true/false) | | | +-----------------+---------------------------------+------------------------+---------+
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/index.html b/docs/next/developer-guide/index.html
index 52c80e7c3..b7153b661 100644
--- a/docs/next/developer-guide/index.html
+++ b/docs/next/developer-guide/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Developer Guide | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Developer Guide Zealot offers a rich set of components for iOS, Android, and all aspects of the packaging process.
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/sdk/android/index.html b/docs/next/developer-guide/sdk/android/index.html
index 0a579a9e0..7d8d8a77f 100644
--- a/docs/next/developer-guide/sdk/android/index.html
+++ b/docs/next/developer-guide/sdk/android/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Zealot Android SDK | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Zealot Android SDK The Android component provides a service to check for new versions and installations for Zealot, supporting both Kotlin and Java.
Install JitPack Using jitpack to install:
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
In build.gradle
file of main app project add:
dependencies { implementation 'com.github.tryzealot:zealot-android:master-SNAPSHOT' }
Permission Zealot needs internet permission
< uses-permission android: name = " android.permission.INTERNET " />
Usages Add the start code to the onCreate
method block of your Application
file:
Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "..." ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "xxxxxxx" , "beta" ) . setCHannelKey ( "yyyyyyy" , "test" ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( )
Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "..." ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) ; Zealot . create ( getActivity ( ) ) . setEndpoint ( "https://zealot.com" ) . setChannelKey ( "xxxxxxx" , "beta" ) . setCHannelKey ( "yyyyyyy" , "test" ) . setBuildType ( BuildConfig . BUILD_TYPE ) . launch ( ) ;
-
+
\ No newline at end of file
diff --git a/docs/next/developer-guide/sdk/ios/index.html b/docs/next/developer-guide/sdk/ios/index.html
index e7f8b81b2..c89e880a5 100644
--- a/docs/next/developer-guide/sdk/ios/index.html
+++ b/docs/next/developer-guide/sdk/ios/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Zealot iOS SDK | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Zealot iOS SDK The iOS component provides a service to check for new versions and installations for Zealot,
supporting Swift and Objective-C.
Install Cocoapods Adding below code into Podfile
:
pod 'Zealot' , :git => 'https://github.com/tryzealot/zealot-ios.git' , :branch => 'master'
Install it:
Usages Add the code in your AppDelegate
: # import < Zealot / Zealot - Swift . h >
Add the following code in application:didFinishLaunchingWithOptions:
method block: let zealot = Zealot ( endpoint : "http://zealot.com" , channelKey : "..." ) zealot . checkVersion ( ) let zealot = Zealot ( endpoint : "http://zealot.com" , channelKeys : [ "beta" : "xxxxxxx" , "test" : "yyyyyyy" ] , default_enviroment : "beta" ) zealot . checkVersion ( )
Zealot * zealot = [ [ Zealot alloc ] initWithEndpoint : @"http://zealot.com" channelKey : @"..." ] ; Zealot * zealot = [ [ Zealot alloc ] initWithEndpoint : @"http://zealot.com" channelKeys : @ { @"beta" : @"xxxxxxx" , @"gray" : @"yyyyyyy" } default_enviroment : @"beta" ] ; [ zealot checkVersion ] ;
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/configuration/environment-variables/index.html b/docs/next/self-hosted/configuration/environment-variables/index.html
index eff2595da..0ce741aba 100644
--- a/docs/next/self-hosted/configuration/environment-variables/index.html
+++ b/docs/next/self-hosted/configuration/environment-variables/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Environment Variables | Zealot
-
+
@@ -20,6 +20,6 @@
Email notification mainly affects are user registration, sending activation emails and
changing password service, but it does not affect the use if it is not turned on.
SMTP_ADDRESS = smtp.gmail.com SMTP_PORT = 587 SMTP_DOMAIN = gmail.com SMTP_USERNAME = you@gmail.com SMTP_PASSWORD = yourpassword SMTP_AUTH_METHOD = plain SMTP_ENABLE_STARTTLS_AUTO = true ACTION_MAILER_DEFAULT_FROM = you@gmail.com ACTION_MAILER_DEFAULT_TO = you@gmail.com
Disbale Cable request protection Experimental:
ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION = true
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/configuration/schedule-jobs/index.html b/docs/next/self-hosted/configuration/schedule-jobs/index.html
index f43488f51..a5679d26a 100644
--- a/docs/next/self-hosted/configuration/schedule-jobs/index.html
+++ b/docs/next/self-hosted/configuration/schedule-jobs/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Schedule Jobs | Zealot
-
+
@@ -15,6 +15,6 @@
there is thought to support a variety of processing logic, see
https://github.com/tryzealot/zealot/issues/376 - 2.0 - 3 - 2 - 1 - 1.0.1 - 10 - 9 - 8 ... - 1.0 - 5 - 4 - 3 ...
The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4,
leaving the final version file as follows:
- 2.0 - 3 - 2 - 1 - 1.0.1 - 10 - 1.0 - 5
If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ZEALOT_KEEP_UPLOADS=false
.
ZEALOT_KEEP_UPLOADS
set true
by default.
Backup When you create any backup it will join itself to the schedule job list.
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/configuration/third-party-authentication/index.html b/docs/next/self-hosted/configuration/third-party-authentication/index.html
index 930abe65b..89c65ade1 100644
--- a/docs/next/self-hosted/configuration/third-party-authentication/index.html
+++ b/docs/next/self-hosted/configuration/third-party-authentication/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Third-party Authentication | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Third-party Authentication Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.
Service provider Feishu feishu
Gitlab gitlab
Google google_oauth2
LDAP ldap
OpenID Connect openid_connect
If the above services need to set the callback address please set it uniformly as follows
http://zealot.com/users/auth/:provider/callback
where :provider
is the identifier of the above supported third-party service, for example:
http://zealot.com/users/auth/google_oauth2/callback
Gitlab Register a Gitlab On line account or use self-host service Create an application in Preferences -> Applications page. Configure Redirect URI
such like http://zealot.com/users/auth/gitlab/callback
(replace the domain in your case) Check scope: read_user
,By default zealot only uses this license, if your enable scope is api
that's fine too GITLAB_ENABLED = true GITLAB_SITE = https://gitlab.com/api/v4 GITLAB_SCOPE = read_user GITLAB_APP_ID = GITLAB_SECRET =
Google Register a Google account Enable Google Cloud Platform service Choose or create a Project then go to Credentials page Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like http://zealot.com/users/auth/google_oauth2/callback
(replace the domain in your case) GOOGLE_OAUTH_ENABLED = true GOOGLE_CLIENT_ID = GOOGLE_SECRET =
Feishu (Lark) Register a feishu (lark) account and download the Phone app. Enable Open platform and create application to get app_id, app_secret Configure callback url such like http://zealot.com/users/auth/feishu/callback
(replace the domain in your case) Check user filed information scope: email address
(Optional) Create a version and publish FEISHU_ENABLED = true FEISHU_APP_ID = FEISHU_APP_SECRET =
LDAP LDAP_ENABLED = true LDAP_HOST = 10.0 .0.1 LDAP_PORT = 389 LDAP_METHOD = plain LDAP_BIND_DN = "cn=Manager,dc=example,dc=com" LDAP_PASSWORD = password LDAP_BASE = "ou=People,dc=example,dc=com" LDAP_UID = uid
OpenID Connect Supports both auto-discovery mode and manual settings.
Auto-discovery Turning on auto-discovery mode will automatically fetch the [OIDC_ISSUER_URL]/.well-known/openid-configuration
configuration.
OIDC_ENABLED = true OIDC_CLIENT_ID = OIDC_CLIENT_SECRET = OIDC_ISSUER_URL = https://oidc.example.com OIDC_DISCOVERY = true
Manual OIDC_ENABLED=true OIDC_CLIENT_ID= OIDC_CLIENT_SECRET= OIDC_ISSUER_URL=https://oidc.example.com OIDC_AUTH_URI=/authorize OIDC_TOKEN_URI=/token OIDC_USERINFO_URI=/userinfo
Above OIDC_AUTH_URI
, OIDC_TOKEN_URI
, OIDC_USERINFO_URI
will use the default path as above if not set.
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/architecture/index.html b/docs/next/self-hosted/deployment/architecture/index.html
index b6cae2b32..c115a6c12 100644
--- a/docs/next/self-hosted/deployment/architecture/index.html
+++ b/docs/next/self-hosted/deployment/architecture/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Zealot Architecture | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Zealot Architecture Running Zealot requires the following set of services.
Mostly Linux based on amd86/arm64/armv7. Ruby on Rails powered Web and API services Sidekiq provides asynchronous background task management PostgreSQL database Redis cache
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/docker/index.html b/docs/next/self-hosted/deployment/docker/index.html
index b6f1a4644..c399bfbbf 100644
--- a/docs/next/self-hosted/deployment/docker/index.html
+++ b/docs/next/self-hosted/deployment/docker/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Deploy Zealot with Docker guide | Zealot
-
+
@@ -26,6 +26,6 @@
and Chrome may also deny access due to the certificate.
If the domain name is unregistered, you need to tie the host to access it,
usually by modifying the system's /etc/hosts
file.
/etc/hosts
$ sudo vim /etc/hosts 127.0 .0.1 zealot.test
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/docker/step-by-step/index.html b/docs/next/self-hosted/deployment/docker/step-by-step/index.html
index d3f3123c5..111324fe1 100644
--- a/docs/next/self-hosted/deployment/docker/step-by-step/index.html
+++ b/docs/next/self-hosted/deployment/docker/step-by-step/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Docker deployment guide | Zealot
-
+
@@ -14,6 +14,6 @@
which is required for subsequent zealot updates.
Setup database data The first time you use it, you will initialize the database, load the sample application data
and set up the administrator account, which is required for subsequent zealot updates.
docker-compose run --rm zealot run_upgrade
Launch docker-compose Manual execution is required to run the service for security periods and user-defined operations:
Advanced Custom volumes You have two t
There are two ways to customize the path: (Assuming that the custom path is /data/zealot
)
1. Create custom docker volume docker volume create --name zealot-data \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/zealot-data docker volume create --name zealot-redis \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/redis docker volume create --name zealot-postgres \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/postgres
2. Change volumes part of docker-compose file Open docker-compose.yml
file and find volumes:
:
volumes : zealot-data : driver : local driver_opts : o : bind type : none device : /data/zealot/data zealot-redis : driver : local driver_opts : o : bind type : none device : /data/zealot/redis zealot-postgres : driver : local driver_opts : o : bind type : none device : /data/zealot/postgres
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/fly/index.html b/docs/next/self-hosted/deployment/fly/index.html
index 59480d2ec..61d4d4da3 100644
--- a/docs/next/self-hosted/deployment/fly/index.html
+++ b/docs/next/self-hosted/deployment/fly/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Fly guide | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Deploy Zealot to Fly guide Zealot support use App Configuration (fly.toml) to deploy on fly.io .
Deploying on Fly Install flyctl . Copy full content of app configuration save to fly.toml
then change the app
value . Run flyctl deploy
. Run fly scale vm shared-cpu-1x --memory 512
. App Configuration app = "[app-name:changeme]" kill_signal = "SIGINT" kill_timeout = 120 processes = [ ] [ build ] image = "ghcr.io/tryzealot/zealot:nightly" [ experimental ] allowed_public_ports = [ ] auto_rollback = true [ [ services ] ] http_checks = [ ] internal_port = 80 processes = [ "app" ] protocol = "tcp" script_checks = [ ] [ services.concurrency ] hard_limit = 25 soft_limit = 20 type = "connections" [ [ services.ports ] ] force_https = true handlers = [ "http" ] port = 80 [ [ services.ports ] ] handlers = [ "tls" , "http" ] port = 443 [ [ services.tcp_checks ] ] grace_period = "1s" interval = "15s" restart_limit = 0 timeout = "2s" [ [ statics ] ] guest_path = "/app/public" url_prefix = "/"
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/kubernetes/index.html b/docs/next/self-hosted/deployment/kubernetes/index.html
index cf9776547..b29db2a8d 100644
--- a/docs/next/self-hosted/deployment/kubernetes/index.html
+++ b/docs/next/self-hosted/deployment/kubernetes/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot with Kubernetes guide | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Deploy Zealot with Kubernetes guide Zealot support deployments using Kubernetes, but only .yaml
config files are available currently.
Check list ConfigMap
and Secret
to configure enviroment variables.PersistentVolumeClaim
to configure public/uploads
, public/bakcup
.Deployment
to control zealot
pod.Steps 10-zealot-namespace.yml Zealot namespace.
10-zealot-namespace.yml
api Version : v1 kind : Namespace metadata : name : zealot
20-zealot-secrets.yml Zealot enviroments secrets. This is loaded all secrets enviroments , all values need encryt by base64 .
20-zealot-secrets.yml
apiVersion : v1 kind : Secret metadata : namespace : zealot name : zealot - secrets data : ZEALOT_ADMIN_EMAIL : V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk= ZEALOT_ADMIN_PASSWORD : emVAbDB0 ZEALOT_POSTGRES_HOST : cG9zdGdyZXM= ZEALOT_POSTGRES_PORT : NTQzMg== ZEALOT_POSTGRES_USERNAME : emVhbG90 ZEALOT_POSTGRES_PASSWORD : emVAbDB0 ZEALOT_POSTGRES_DB_NAME : emVhbG90 REDIS_URL : cmVkaXM6Ly9yZWRpczo2Mzc5LzE= SECRET_TOKEN : ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==
21-zealot-configmap.yml Zealot enviroments config map. This is loaded safe enviroments .
21-zealot-configmap.yml
apiVersion : v1 kind : ConfigMap metadata : namespace : zealot name : zealot - config data : ZEALOT_DOMAIN : zealot.icyleaf.dev DEFAULT_LOCALE : en ZEALOT_REGISTER_ENABLED : "true"
30-zealot-storage.yml The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed.
30-zealot-storage.yml
apiVersion : v1 kind : PersistentVolumeClaim metadata : name : zealot - uploads namespace : zealot labels : app : zealot spec : accessModes : - ReadWriteOnce resources : requests : storage : 20Gi --- apiVersion : v1 kind : PersistentVolumeClaim metadata : name : zealot - backup namespace : zealot labels : app : zealot spec : accessModes : - ReadWriteOnce resources : requests : storage : 20Gi
40-zealot-deployment.yml Create zealot deployment, edit replicas
and image
tag.
40-zealot-deployment.yml
apiVersion : apps/v1 kind : Deployment metadata : name : zealot namespace : zealot spec : restartPolicy : Always replicas : 1 selector : matchLabels : app : zealot template : metadata : labels : app : zealot spec : containers : - name : zealot image : ghcr.io/tryzealot/zealot : nightly ports : - containerPort : 80 protocol : TCP name : http envFrom : - configMapRef : name : zealot - env - secretRef : name : zealot - secrets volumeMounts : - mountPath : /app/public/uploads name : uploads - mountPath : /app/public/backup name : backup volumes : - name : uploads persistentVolumeClaim : claimName : zealot - uploads - name : backup persistentVolumeClaim : claimName : zealot - backup
50-zealot-service.yml Creating zealot service.
50-zealot-service.yml
apiVersion : v1 kind : Service metadata : name : zealot namespace : zealot labels : app : zealot spec : selector : app : zealot ports : - port : 80 targetPort : http name : http protocol : TCP
60-zealot-ingress.yml Setting up the ingress for the zealot service.
50-zealot-ingress.yml
apiVersion : networking.k8s.io/v1 kind : Ingress metadata : name : zealot namespace : zealot annotations : spec : rules : - host : zealot.icyleaf.dev http : paths : - web : service : name : zealot port : number : 80 path : / pathType : Prefix
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/nomad/index.html b/docs/next/self-hosted/deployment/nomad/index.html
index 377260b64..fed40d9dc 100644
--- a/docs/next/self-hosted/deployment/nomad/index.html
+++ b/docs/next/self-hosted/deployment/nomad/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Deploy Zealot with Nomad guide | Zealot
-
+
@@ -16,6 +16,6 @@
Nomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad.
You can find a list of plugins in the
Kubernetes CSI Developer Documentation .
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/railway/index.html b/docs/next/self-hosted/deployment/railway/index.html
index 9684d456b..454d48358 100644
--- a/docs/next/self-hosted/deployment/railway/index.html
+++ b/docs/next/self-hosted/deployment/railway/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Railway guide | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Deploy Zealot to Railway guide Zealot support use Dockfile
to deploy on Railway .
Deploying on Railway
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/render/index.html b/docs/next/self-hosted/deployment/render/index.html
index c398fa1c3..6754f29c2 100644
--- a/docs/next/self-hosted/deployment/render/index.html
+++ b/docs/next/self-hosted/deployment/render/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Render guide | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Deploy Zealot to Render guide Zealot support a render blueprint named render.yaml
to deploy on render.com .
Deploying on Render
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/requirements/index.html b/docs/next/self-hosted/deployment/requirements/index.html
index 6e4ff1e58..9a491135a 100644
--- a/docs/next/self-hosted/deployment/requirements/index.html
+++ b/docs/next/self-hosted/deployment/requirements/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Zealot Self Hosted Requirements | Zealot
-
+
@@ -16,6 +16,6 @@
This process starts with the entire Rails stack but it can grow over time due to memory leaks.
On a very active server the Sidekiq process can use 1GB+ of memory.
Supported web browsers We don't support running Zealot with JavaScript disabled in the browser.
Zealot supports the following web browsers:
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/deployment/source-code/index.html b/docs/next/self-hosted/deployment/source-code/index.html
index bca4e2d09..e6ab95e02 100644
--- a/docs/next/self-hosted/deployment/source-code/index.html
+++ b/docs/next/self-hosted/deployment/source-code/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Source code | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/index.html b/docs/next/self-hosted/index.html
index f97e53422..807979cd6 100644
--- a/docs/next/self-hosted/index.html
+++ b/docs/next/self-hosted/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Self-hosted Installation Guide | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Self-hosted Installation Guide This guide will help you to install and setup a production ready Zealot.
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/reverse-proxies/index.html b/docs/next/self-hosted/reverse-proxies/index.html
index 159f22fe9..d787dcabc 100644
--- a/docs/next/self-hosted/reverse-proxies/index.html
+++ b/docs/next/self-hosted/reverse-proxies/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Reverse Proxies | Zealot
-
+
@@ -16,6 +16,6 @@
cross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options.
Consul Enable Consul provider or Consul Catalog provider , add key-value below:
consul kv put traefik/http/services/zealot/loadbalancer/server/port 5 consul kv put traefik/http/routers/zealot/service zealot consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)' consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev
Nomad Enable Nomad provider and make sure Nomad version >= 1.3:
zealot.nomad
job "zealot" { datacenters = [ "dc1" ] type = "service" group "zealot" { count = 1 network { port "http" { static = 80 } } service { name = "zealot-http" provider = "nomad" port = "http" } task "server" { driver = "docker" config { image = "ghcr.io/tryzealot/zealot:nightly" ports = [ "http" ] args = [ - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)" , - "traefik.http.routers.zealot.tls=true" , - "traefik.http.routers.zealot.tls.certresolver=letsencrypt" , - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev" , - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev" ] } } } }
Caddy 2 The configuration only needs to relate the ip part after tls
and proxy
:
Caddyfile
:443 log tls your-email@example.com reverse_proxy 172.16.56.100:8901
Nginx The following is the general configuration, if not effects welcome to file a issue :
conf.d/zealot.conf
upstream zealot { zone upstreams 64K ; server 172.16.56.100:8901 ; keepalive 32 ; } map $http_upgrade $connection_upgrade { default upgrade ; '' close ; } server { listen 80 ; listen [::]:80 ; server_name zealot.icyleaf.dev ; location /.well-known/acme-challenge/ { allow all ; } location / { return 301 https:// $host $request_uri ; } } server { listen 443 ssl http2 ; listen [::]:443 ssl http2 ; server_name zealot.icyleaf.dev ; ssl_certificate /etc/certs/zealot-cert.pem ; ssl_certificate_key /etc/certs/zealot.pem ; location / { proxy_pass http://zealot ; proxy_redirect off ; proxy_pass_header Authorization ; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_http_version 1.1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection $connection_upgrade ; client_max_body_size 0 ; proxy_read_timeout 36000s ; } }
And you need update max body size in http
block. Recommended is 200MB, if it's a game,
50% more can be played to make a surplus according to the actual file size.
nginx.conf
http { [...] client_max_body_size 200M ; }
-
+
\ No newline at end of file
diff --git a/docs/next/self-hosted/storage/index.html b/docs/next/self-hosted/storage/index.html
index bcc4c6dac..a83a655fd 100644
--- a/docs/next/self-hosted/storage/index.html
+++ b/docs/next/self-hosted/storage/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Data storages | Zealot
-
+
@@ -14,6 +14,6 @@
It is currently stored in the filesystem in the
public/uploads
directory.
apps The directory for uploading applications debugs_files directory for uploading debug files Backup storage The Zealot service currently supports command-generated backup data, which will contain
the database and binary packages of the uploaded apps and debug files.
The backup data is currently stored in the file system in the public/backup
directory.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/apple-team/index.html b/docs/next/user-guide/administrator/apple-team/index.html
index 7e03d9f41..dc946deee 100644
--- a/docs/next/user-guide/administrator/apple-team/index.html
+++ b/docs/next/user-guide/administrator/apple-team/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Apple Team (Developer) | Zealot
-
+
@@ -23,6 +23,6 @@
providing a feature to register a testing device that has not been registered with any application
would greatly improve the efficiency of the team. This is the role of the Apple Developer feature.
The initial feature introduction: https://github.com/tryzealot/zealot/issues/723 .
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/backup/index.html b/docs/next/user-guide/administrator/backup/index.html
index 203617f2d..9172dd23a 100644
--- a/docs/next/user-guide/administrator/backup/index.html
+++ b/docs/next/user-guide/administrator/backup/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Backup Schedule | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/monitoring/background-jobs/index.html b/docs/next/user-guide/administrator/monitoring/background-jobs/index.html
index 08491b466..2e3c32fdc 100644
--- a/docs/next/user-guide/administrator/monitoring/background-jobs/index.html
+++ b/docs/next/user-guide/administrator/monitoring/background-jobs/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Background Jobs | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Background Jobs
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/monitoring/database-analytics/index.html b/docs/next/user-guide/administrator/monitoring/database-analytics/index.html
index 363e91981..a96e483ba 100644
--- a/docs/next/user-guide/administrator/monitoring/database-analytics/index.html
+++ b/docs/next/user-guide/administrator/monitoring/database-analytics/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Database Analytics | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Database Analytics
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/monitoring/logging/index.html b/docs/next/user-guide/administrator/monitoring/logging/index.html
index 7d8715550..ad300a792 100644
--- a/docs/next/user-guide/administrator/monitoring/logging/index.html
+++ b/docs/next/user-guide/administrator/monitoring/logging/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Logging | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Logging
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/monitoring/system-info/index.html b/docs/next/user-guide/administrator/monitoring/system-info/index.html
index 1cd88448c..7f789e89c 100644
--- a/docs/next/user-guide/administrator/monitoring/system-info/index.html
+++ b/docs/next/user-guide/administrator/monitoring/system-info/index.html
@@ -1,16 +1,16 @@
-
+
-
+
System informations | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 System informations
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/permissions/index.html b/docs/next/user-guide/administrator/permissions/index.html
index 722c3608c..b939a5da2 100644
--- a/docs/next/user-guide/administrator/permissions/index.html
+++ b/docs/next/user-guide/administrator/permissions/index.html
@@ -1,16 +1,16 @@
-
+
-
+
User Permissions and roles | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
User Permissions and roles Zealot offers four types of user permissions.
Guest User Developer Administrator Comparison Action Guest[On/Off] User Developer Administrator Dashboard
View all data✓/✕ ✓ ✓ ✓ App
View app list✓/✕ ✓ ✓ ✓ App
View app scheme(s) and channel(s) detail✓/✕ ✓ ✓ ✓ App
View the build(release) of app✓/✓ Password Auth ✓ ✓ ✓ App
View webhook list✓/✕ ✓ ✓ ✓ App
Upload/Install/Download app✓ ✓ ✓ ✓ App
Create/Edit/Delete an app✓ ✓ App
Create/Edit/Delete a scheme/channel of app✓ ✓ App
Delete a given version of app✓ ✓ App
Test a webhook network connection✓ ✓ App
Enable/Disable webhook✓ ✓ App
Delete an app✓ ✓ DebugFile
View debug file list✓/✕ ✓ ✓ ✓ DebugFile
View debug file detail✓ ✓ ✓ ✓ DebugFile
Download debug file✓ ✓ ✓ ✓ DebugFile
Upload/Delete a debug file✓ ✓ Teardown
View teardown list✓/✕ ✓ ✓ ✓ Teardown
View teardown detail✓/✕ ✓ ✓ ✓ Teardown
Delete a teardown✓ ✓ Admin
View and manage users✓ Admin
View and manage webhooks✓ Admin
View and manage settings✓ Admin
View system informations✓ Admin
View and manage background jobs✓ Admin
View page analytices✓
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/administrator/settings/index.html b/docs/next/user-guide/administrator/settings/index.html
index 4173e35c1..2dd8a1615 100644
--- a/docs/next/user-guide/administrator/settings/index.html
+++ b/docs/next/user-guide/administrator/settings/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Settings | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Settings
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/apps/create/index.html b/docs/next/user-guide/apps/create/index.html
index 56f8556b0..ff9bebb16 100644
--- a/docs/next/user-guide/apps/create/index.html
+++ b/docs/next/user-guide/apps/create/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Create an App | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Create an App
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/apps/detail/index.html b/docs/next/user-guide/apps/detail/index.html
index 08fd34682..7a595dc48 100644
--- a/docs/next/user-guide/apps/detail/index.html
+++ b/docs/next/user-guide/apps/detail/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Uploaded releases | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Uploaded releases
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/apps/index.html b/docs/next/user-guide/apps/index.html
index ab7ecb3d5..5114cefe7 100644
--- a/docs/next/user-guide/apps/index.html
+++ b/docs/next/user-guide/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Manage apps | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/apps/upload/index.html b/docs/next/user-guide/apps/upload/index.html
index 4c1b49786..8f2b92d21 100644
--- a/docs/next/user-guide/apps/upload/index.html
+++ b/docs/next/user-guide/apps/upload/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Uploaded a release | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Uploaded a release
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/best_practices/index.html b/docs/next/user-guide/best_practices/index.html
index 9eff748e5..99086996e 100644
--- a/docs/next/user-guide/best_practices/index.html
+++ b/docs/next/user-guide/best_practices/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Best Practices | Zealot
-
+
@@ -14,6 +14,6 @@
a configured web hook is triggered to send a notification to the third-party service that a new version has been received,
and for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/changelog/index.html b/docs/next/user-guide/changelog/index.html
index 524bdc7da..67857d978 100644
--- a/docs/next/user-guide/changelog/index.html
+++ b/docs/next/user-guide/changelog/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Change Log | Zealot
-
+
@@ -13,6 +13,6 @@
It used to undertake many functions, but now it has been separated to focus on providing
application hosting and distribution services
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/credits/index.html b/docs/next/user-guide/credits/index.html
index 8a24a9c21..3b5b8e412 100644
--- a/docs/next/user-guide/credits/index.html
+++ b/docs/next/user-guide/credits/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Credits | Zealot
-
+
@@ -13,6 +13,6 @@
later changed to their own design icons, if there are enthusiastic designers can help design better icons,
I represent this project to express my sincere gratitude.
License Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at LICENSE file 。
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/dashboard/index.html b/docs/next/user-guide/dashboard/index.html
index 78944a905..261b8b67f 100644
--- a/docs/next/user-guide/dashboard/index.html
+++ b/docs/next/user-guide/dashboard/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Dashboard | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Dashboard
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/debug-files/index.html b/docs/next/user-guide/debug-files/index.html
index e3e4d4537..1b6307a54 100644
--- a/docs/next/user-guide/debug-files/index.html
+++ b/docs/next/user-guide/debug-files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
List debug files | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 List debug files List all uploaded debug files oragiazed by app.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/debug-files/review/index.html b/docs/next/user-guide/debug-files/review/index.html
index db378447d..4fcb227d5 100644
--- a/docs/next/user-guide/debug-files/review/index.html
+++ b/docs/next/user-guide/debug-files/review/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Review metadata | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/debug-files/upload/index.html b/docs/next/user-guide/debug-files/upload/index.html
index c7f5f2112..fcf3150ff 100644
--- a/docs/next/user-guide/debug-files/upload/index.html
+++ b/docs/next/user-guide/debug-files/upload/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Create a Debug File | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 Create a Debug File
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/index.html b/docs/next/user-guide/index.html
index b9949b6ed..6a4eb748b 100644
--- a/docs/next/user-guide/index.html
+++ b/docs/next/user-guide/index.html
@@ -1,11 +1,11 @@
-
+
-
+
User Guide | Zealot
-
+
@@ -15,6 +15,6 @@
Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.
Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.
Features 🌏 Cross-platform hosting : supports macOS, iOS, Android (apk/aab ), Windows, Linux extensive platforms. 📱 iOS device in control : automatically synchronizes iOS test device information and allows for one-click registration of new devices with Apple developers. 🧑💻 Full developer toolkit : provides REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDKs and [fastlane][fastlane-plugin-zealot] automation plugins for building. 💥 Analyze secrets within applications : interpret metadata for iOS or Android applications or describe files. 🚨 Multiple notification built-in : customizable data income WebHook to any notification service. 🗄 Multi-channel classification management : freely divide application channel management into different scenarios and product forms. 🎳 Multiple Architectures amd86/arm64/armv7 architectures deployment ready. 🔑 Third-party Auth : Google, Gitlab, LDAP, OIDC and Lark suppotted. 🌑 Dark mode : Feel free to switch between day and night. Demo Simplified Chinese by default, change the language in Settings page.
Notification : There is instability run on a free resource cloud service and RESET ALL DATA daily.
About the translation The translation powered by DeepL and it inevitably have some defects, please provide feedback in time, thanks!
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/qa/index.html b/docs/next/user-guide/qa/index.html
index 064a680e1..345b9f9cd 100644
--- a/docs/next/user-guide/qa/index.html
+++ b/docs/next/user-guide/qa/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Q&A | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/toolkits/fetch-udid/index.html b/docs/next/user-guide/toolkits/fetch-udid/index.html
index 84ccf1ed7..2d78e1024 100644
--- a/docs/next/user-guide/toolkits/fetch-udid/index.html
+++ b/docs/next/user-guide/toolkits/fetch-udid/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Fetch iOS Device UDID | Zealot
-
+
@@ -16,6 +16,6 @@
corresponding Ad-Hoc certificate, then install and repackage it before
allowing the device to install the application.
Registered Device For a registered test device, the list of installable applications will be displayed. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account.
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/toolkits/teardown/index.html b/docs/next/user-guide/toolkits/teardown/index.html
index e44806279..293ad166e 100644
--- a/docs/next/user-guide/toolkits/teardown/index.html
+++ b/docs/next/user-guide/toolkits/teardown/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Teardown App view itself metadata | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/webhooks/dingtalk/index.html b/docs/next/user-guide/webhooks/dingtalk/index.html
index 853610aac..c0744dbe6 100644
--- a/docs/next/user-guide/webhooks/dingtalk/index.html
+++ b/docs/next/user-guide/webhooks/dingtalk/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Dingtalk (Dingding) | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Dingtalk (Dingding) 钉钉 use Incoming Webhooks whose constructs
typically support both text and markdown, and can be configured as follows:
Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.
Text format { "msgtype" : "text" , "text" : { "content" : " #{ @title } \n\n安装地址: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog.
{ "msgtype" : "markdown" , "markdown" : { "title" : @title , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" } }
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/webhooks/discord/index.html b/docs/next/user-guide/webhooks/discord/index.html
index 3442cd3e4..972bffb64 100644
--- a/docs/next/user-guide/webhooks/discord/index.html
+++ b/docs/next/user-guide/webhooks/discord/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Discord | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Discord Discord should use Slack-Compatible Webhook whose constructs
typically support both text and block rich text, and can be configured as follows:
Text format { "text" : "# #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } " }
Block rich text format A simple block with markdown support
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } \nInstal QRcode:\n![qrcode]( #{ @qrcode_url } )" } } ] }
Better look at some of the structures shown in the block
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : @title , } } , { "type" : "section" , "fields" : [ { "type" : "mrkdwn" , "text" : "*Platform:*\n #{ @device_type } " } , { "type" : "mrkdwn" , "text" : "*Upload at:*\n #{ @uploaded_at } " } ] } , "accessory" : { "type" : "image" , "image_url" : @qrcode_url , "alt_text" : "install qrcode" } ] }
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/webhooks/feishu/index.html b/docs/next/user-guide/webhooks/feishu/index.html
index fb8bdc600..22c7d2cda 100644
--- a/docs/next/user-guide/webhooks/feishu/index.html
+++ b/docs/next/user-guide/webhooks/feishu/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Lark (Feishu) | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Lark (Feishu) 飞书 use Incoming Webhooks whose constructs
typically support both text and interactive card, and can be configured as follows:
Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.
Text format { "msg_type" : "text" , "text" : { "content" : " #{ @title } \n\n安装地址: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
Use card format could use partly of markdown syntax:
{ "msg_type" : "interactive" , "card" : { "config" : { "wide_screen_mode" : true , "enable_forward" : true } , "elements" : [ { "tag" : "div" , "text" : { "content" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" , "tag" : "lark_md" } } , { "actions" : [ { "tag" : "button" , "text" : { "content" : "Install" , "tag" : "lark_md" } , "url" : @install_url , "type" : "default" , "value" : { } } ] , "tag" : "action" } ] } }
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/webhooks/index.html b/docs/next/user-guide/webhooks/index.html
index 8805d1f16..ab25672f7 100644
--- a/docs/next/user-guide/webhooks/index.html
+++ b/docs/next/user-guide/webhooks/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Webhooks | Zealot
-
+
@@ -14,6 +14,6 @@
and each variable starts with
@
, the default structure will be used if the custom structure is left empty when creating the webhook.
The following variables are all provided.
{ event : @event , title : @title , app_name : @name , device_type : @device_type , release_version : @release_version , build_version : @build_version , size : @file_size , changelog : @changelog , install_url : @install_url , icon_url : @icon_url , qrcode_url : @qrcode_url , uploaded_at : @uploaded_at }
Output:
{ "event" : "upload_events" , "title" : "Zealot upload 1.0.0 version" , "app_name" : "Zealot" , "device_type" : "iOS" , "release_version" : "1.0.0" , "build_version" : "1" , "size" : "30 MB" , "install_url" : "https://zealot.test/api/apps/download/12354" , "icon_url" : "https://zealot.test/api/apps/icon.png" , "qrcode_url" : "https://zealot.test/api/apps/354/qrcode" , "uploaded_at" : "2019-12-30 11:33:00" , "changelog" : "- Add feture A\n- Fix issue B\n- Release v1.0.0" , }
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/webhooks/slack/index.html b/docs/next/user-guide/webhooks/slack/index.html
index 4e2f65391..2ecb43cc7 100644
--- a/docs/next/user-guide/webhooks/slack/index.html
+++ b/docs/next/user-guide/webhooks/slack/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Slack | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Slack Slack use Incoming Webhooks whose constructs
typically support both text and block rich text, and can be configured as follows:
Text format { "text" : " #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } " }
Block rich text format A simple block with markdown support
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } \nInstal QRcode:\n![qrcode]( #{ @qrcode_url } )" } } ] }
Better look at some of the structures shown in the block
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : @title , } } , { "type" : "section" , "fields" : [ { "type" : "mrkdwn" , "text" : "*Platform:*\n #{ @device_type } " } , { "type" : "mrkdwn" , "text" : "*Upload at:*\n #{ @uploaded_at } " } ] } , "accessory" : { "type" : "image" , "image_url" : @qrcode_url , "alt_text" : "install qrcode" } ] }
-
+
\ No newline at end of file
diff --git a/docs/next/user-guide/webhooks/wecom/index.html b/docs/next/user-guide/webhooks/wecom/index.html
index 4bfc3a4f2..272f1197c 100644
--- a/docs/next/user-guide/webhooks/wecom/index.html
+++ b/docs/next/user-guide/webhooks/wecom/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Wecom (Wechat Work) | Zealot
-
+
This is unreleased documentation for Zealot Next 🚧 version.
Version: Next 🚧 On this page
Wecom (Wechat Work) 企业微信 use Incoming Webhooks whose constructs
typically support both text and markdown, and can be configured as follows:
Text format { "msgtype" : "text" , "text" : { "content" : " #{ @title } \n\nInstall url: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
{ "msgtype" : "markdown" , "markdown" : { "content" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" } }
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/configuration/environment-variables/index.html b/docs/self-hosted/configuration/environment-variables/index.html
index 67bf98960..9511840ef 100644
--- a/docs/self-hosted/configuration/environment-variables/index.html
+++ b/docs/self-hosted/configuration/environment-variables/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Environment Variables | Zealot
-
+
@@ -20,6 +20,6 @@
Email notification mainly affects are user registration, sending activation emails and
changing password service, but it does not affect the use if it is not turned on.
SMTP_ADDRESS = smtp.gmail.com SMTP_PORT = 587 SMTP_DOMAIN = gmail.com SMTP_USERNAME = you@gmail.com SMTP_PASSWORD = yourpassword SMTP_AUTH_METHOD = plain SMTP_ENABLE_STARTTLS_AUTO = true ACTION_MAILER_DEFAULT_FROM = you@gmail.com ACTION_MAILER_DEFAULT_TO = you@gmail.com
Disbale Cable request protection Experimental:
ZEALOT_DISABLE_CABLE_REQUEST_PROTECTION = true
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/configuration/schedule-jobs/index.html b/docs/self-hosted/configuration/schedule-jobs/index.html
index 501b99706..d5c9fac8d 100644
--- a/docs/self-hosted/configuration/schedule-jobs/index.html
+++ b/docs/self-hosted/configuration/schedule-jobs/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Schedule Jobs | Zealot
-
+
@@ -15,6 +15,6 @@
there is thought to support a variety of processing logic, see
https://github.com/tryzealot/zealot/issues/376 - 2.0 - 3 - 2 - 1 - 1.0.1 - 10 - 9 - 8 ... - 1.0 - 5 - 4 - 3 ...
The task will clean up all versions up to version 1.0.1 containing 9 and version 1.0 containing 4,
leaving the final version file as follows:
- 2.0 - 3 - 2 - 1 - 1.0.1 - 10 - 1.0 - 5
If disk space is limited, you can enable cleanup of timed tasks by setting the environment variable ZEALOT_KEEP_UPLOADS=false
.
ZEALOT_KEEP_UPLOADS
set true
by default.
Backup When you create any backup it will join itself to the schedule job list.
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/configuration/third-party-authentication/index.html b/docs/self-hosted/configuration/third-party-authentication/index.html
index 40f85ab12..c24809ece 100644
--- a/docs/self-hosted/configuration/third-party-authentication/index.html
+++ b/docs/self-hosted/configuration/third-party-authentication/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Third-party Authentication | Zealot
-
+
Version: 5.0.0 On this page
Third-party Authentication Zealot supports authorized logins using supported third-party services, which can be currently configured via the following environment variables or in the settings page of the admin panel.
Service provider Feishu feishu
Gitlab gitlab
Google google_oauth2
LDAP ldap
OpenID Connect openid_connect
If the above services need to set the callback address please set it uniformly as follows
http://zealot.com/users/auth/:provider/callback
where :provider
is the identifier of the above supported third-party service, for example:
http://zealot.com/users/auth/google_oauth2/callback
Gitlab Register a Gitlab On line account or use self-host service Create an application in Preferences -> Applications page. Configure Redirect URI
such like http://zealot.com/users/auth/gitlab/callback
(replace the domain in your case) Check scope: read_user
,By default zealot only uses this license, if your enable scope is api
that's fine too GITLAB_ENABLED = true GITLAB_SITE = https://gitlab.com/api/v4 GITLAB_SCOPE = read_user GITLAB_APP_ID = GITLAB_SECRET =
Google Register a Google account Enable Google Cloud Platform service Choose or create a Project then go to Credentials page Create OAuth Client ID with Web Application, and configure Authorized redirect URI such like http://zealot.com/users/auth/google_oauth2/callback
(replace the domain in your case) GOOGLE_OAUTH_ENABLED = true GOOGLE_CLIENT_ID = GOOGLE_SECRET =
Feishu (Lark) Register a feishu (lark) account and download the Phone app. Enable Open platform and create application to get app_id, app_secret Configure callback url such like http://zealot.com/users/auth/feishu/callback
(replace the domain in your case) Check user filed information scope: email address
(Optional) Create a version and publish FEISHU_ENABLED = true FEISHU_APP_ID = FEISHU_APP_SECRET =
LDAP LDAP_ENABLED = true LDAP_HOST = 10.0 .0.1 LDAP_PORT = 389 LDAP_METHOD = plain LDAP_BIND_DN = "cn=Manager,dc=example,dc=com" LDAP_PASSWORD = password LDAP_BASE = "ou=People,dc=example,dc=com" LDAP_UID = uid
OpenID Connect Supports both auto-discovery mode and manual settings.
Auto-discovery Turning on auto-discovery mode will automatically fetch the [OIDC_ISSUER_URL]/.well-known/openid-configuration
configuration.
OIDC_ENABLED = true OIDC_CLIENT_ID = OIDC_CLIENT_SECRET = OIDC_ISSUER_URL = https://oidc.example.com OIDC_DISCOVERY = true
Manual OIDC_ENABLED=true OIDC_CLIENT_ID= OIDC_CLIENT_SECRET= OIDC_ISSUER_URL=https://oidc.example.com OIDC_AUTH_URI=/authorize OIDC_TOKEN_URI=/token OIDC_USERINFO_URI=/userinfo
Above OIDC_AUTH_URI
, OIDC_TOKEN_URI
, OIDC_USERINFO_URI
will use the default path as above if not set.
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/architecture/index.html b/docs/self-hosted/deployment/architecture/index.html
index a042443b3..e3499a6f9 100644
--- a/docs/self-hosted/deployment/architecture/index.html
+++ b/docs/self-hosted/deployment/architecture/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Zealot Architecture | Zealot
-
+
Version: 5.0.0 Zealot Architecture Running Zealot requires the following set of services.
Mostly Linux based on amd86/arm64/armv7. Ruby on Rails powered Web and API services Sidekiq provides asynchronous background task management PostgreSQL database Redis cache
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/docker/index.html b/docs/self-hosted/deployment/docker/index.html
index 587af1f42..df6e8736e 100644
--- a/docs/self-hosted/deployment/docker/index.html
+++ b/docs/self-hosted/deployment/docker/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Deploy Zealot with Docker guide | Zealot
-
+
@@ -26,6 +26,6 @@
and Chrome may also deny access due to the certificate.
If the domain name is unregistered, you need to tie the host to access it,
usually by modifying the system's /etc/hosts
file.
/etc/hosts
$ sudo vim /etc/hosts 127.0 .0.1 zealot.test
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/docker/step-by-step/index.html b/docs/self-hosted/deployment/docker/step-by-step/index.html
index 9c6cb9e11..8693c560a 100644
--- a/docs/self-hosted/deployment/docker/step-by-step/index.html
+++ b/docs/self-hosted/deployment/docker/step-by-step/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Docker deployment guide | Zealot
-
+
@@ -14,6 +14,6 @@
which is required for subsequent zealot updates.
Setup database data The first time you use it, you will initialize the database, load the sample application data
and set up the administrator account, which is required for subsequent zealot updates.
docker-compose run --rm zealot run_upgrade
Launch docker-compose Manual execution is required to run the service for security periods and user-defined operations:
Advanced Custom volumes You have two t
There are two ways to customize the path: (Assuming that the custom path is /data/zealot
)
1. Create custom docker volume docker volume create --name zealot-data \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/zealot-data docker volume create --name zealot-redis \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/redis docker volume create --name zealot-postgres \ --opt type=none \ --opt o=bind \ --opt device=/data/zealot/postgres
2. Change volumes part of docker-compose file Open docker-compose.yml
file and find volumes:
:
volumes : zealot-data : driver : local driver_opts : o : bind type : none device : /data/zealot/data zealot-redis : driver : local driver_opts : o : bind type : none device : /data/zealot/redis zealot-postgres : driver : local driver_opts : o : bind type : none device : /data/zealot/postgres
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/fly/index.html b/docs/self-hosted/deployment/fly/index.html
index 53449099e..c8769be25 100644
--- a/docs/self-hosted/deployment/fly/index.html
+++ b/docs/self-hosted/deployment/fly/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Fly guide | Zealot
-
+
Version: 5.0.0 On this page
Deploy Zealot to Fly guide Zealot support use App Configuration (fly.toml) to deploy on fly.io .
Deploying on Fly Install flyctl . Copy full content of app configuration save to fly.toml
then change the app
value . Run flyctl deploy
. Run fly scale vm shared-cpu-1x --memory 512
. App Configuration app = "[app-name:changeme]" kill_signal = "SIGINT" kill_timeout = 120 processes = [ ] [ build ] image = "ghcr.io/tryzealot/zealot:nightly" [ experimental ] allowed_public_ports = [ ] auto_rollback = true [ [ services ] ] http_checks = [ ] internal_port = 80 processes = [ "app" ] protocol = "tcp" script_checks = [ ] [ services.concurrency ] hard_limit = 25 soft_limit = 20 type = "connections" [ [ services.ports ] ] force_https = true handlers = [ "http" ] port = 80 [ [ services.ports ] ] handlers = [ "tls" , "http" ] port = 443 [ [ services.tcp_checks ] ] grace_period = "1s" interval = "15s" restart_limit = 0 timeout = "2s" [ [ statics ] ] guest_path = "/app/public" url_prefix = "/"
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/kubernetes/index.html b/docs/self-hosted/deployment/kubernetes/index.html
index fb11c7af5..74c527514 100644
--- a/docs/self-hosted/deployment/kubernetes/index.html
+++ b/docs/self-hosted/deployment/kubernetes/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot with Kubernetes guide | Zealot
-
+
Version: 5.0.0 On this page
Deploy Zealot with Kubernetes guide Zealot support deployments using Kubernetes, but only .yaml
config files are available currently.
Check list ConfigMap
and Secret
to configure enviroment variables.PersistentVolumeClaim
to configure public/uploads
, public/bakcup
.Deployment
to control zealot
pod.Steps 10-zealot-namespace.yml Zealot namespace.
10-zealot-namespace.yml
api Version : v1 kind : Namespace metadata : name : zealot
20-zealot-secrets.yml Zealot enviroments secrets. This is loaded all secrets enviroments , all values need encryt by base64 .
20-zealot-secrets.yml
apiVersion : v1 kind : Secret metadata : namespace : zealot name : zealot - secrets data : ZEALOT_ADMIN_EMAIL : V1ZkU2RHRlhOVUZsYlZab1lrYzVNRXh0VG5aaVVUMDk= ZEALOT_ADMIN_PASSWORD : emVAbDB0 ZEALOT_POSTGRES_HOST : cG9zdGdyZXM= ZEALOT_POSTGRES_PORT : NTQzMg== ZEALOT_POSTGRES_USERNAME : emVhbG90 ZEALOT_POSTGRES_PASSWORD : emVAbDB0 ZEALOT_POSTGRES_DB_NAME : emVhbG90 REDIS_URL : cmVkaXM6Ly9yZWRpczo2Mzc5LzE= SECRET_TOKEN : ODVkYmUxNWQ3NWVmOTMwOGM3YWUwZjMzYzdhMzI0Y2M2ZjRiZjUxOWEyZWQyZjMwMjdiZDMzYzE0MGE0ZjlhYQ==
21-zealot-configmap.yml Zealot enviroments config map. This is loaded safe enviroments .
21-zealot-configmap.yml
apiVersion : v1 kind : ConfigMap metadata : namespace : zealot name : zealot - config data : ZEALOT_DOMAIN : zealot.icyleaf.dev DEFAULT_LOCALE : en ZEALOT_REGISTER_ENABLED : "true"
30-zealot-storage.yml The creation of the persistent volume claims for uploaded files (apps/debug files) and backup files. May you want to increase the size. This expects to have a storage class installed.
30-zealot-storage.yml
apiVersion : v1 kind : PersistentVolumeClaim metadata : name : zealot - uploads namespace : zealot labels : app : zealot spec : accessModes : - ReadWriteOnce resources : requests : storage : 20Gi --- apiVersion : v1 kind : PersistentVolumeClaim metadata : name : zealot - backup namespace : zealot labels : app : zealot spec : accessModes : - ReadWriteOnce resources : requests : storage : 20Gi
40-zealot-deployment.yml Create zealot deployment, edit replicas
and image
tag.
40-zealot-deployment.yml
apiVersion : apps/v1 kind : Deployment metadata : name : zealot namespace : zealot spec : restartPolicy : Always replicas : 1 selector : matchLabels : app : zealot template : metadata : labels : app : zealot spec : containers : - name : zealot image : ghcr.io/tryzealot/zealot : nightly ports : - containerPort : 80 protocol : TCP name : http envFrom : - configMapRef : name : zealot - env - secretRef : name : zealot - secrets volumeMounts : - mountPath : /app/public/uploads name : uploads - mountPath : /app/public/backup name : backup volumes : - name : uploads persistentVolumeClaim : claimName : zealot - uploads - name : backup persistentVolumeClaim : claimName : zealot - backup
50-zealot-service.yml Creating zealot service.
50-zealot-service.yml
apiVersion : v1 kind : Service metadata : name : zealot namespace : zealot labels : app : zealot spec : selector : app : zealot ports : - port : 80 targetPort : http name : http protocol : TCP
60-zealot-ingress.yml Setting up the ingress for the zealot service.
50-zealot-ingress.yml
apiVersion : networking.k8s.io/v1 kind : Ingress metadata : name : zealot namespace : zealot annotations : spec : rules : - host : zealot.icyleaf.dev http : paths : - web : service : name : zealot port : number : 80 path : / pathType : Prefix
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/nomad/index.html b/docs/self-hosted/deployment/nomad/index.html
index 4453c10ca..1d450face 100644
--- a/docs/self-hosted/deployment/nomad/index.html
+++ b/docs/self-hosted/deployment/nomad/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Deploy Zealot with Nomad guide | Zealot
-
+
@@ -16,6 +16,6 @@
Nomad can utilize CSI volumes, but it can not automatically create, destroy, or manage them in any capacity. Volumes have to be created externally and then registered with Nomad.
You can find a list of plugins in the
Kubernetes CSI Developer Documentation .
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/railway/index.html b/docs/self-hosted/deployment/railway/index.html
index a3e594efb..9903a6e5a 100644
--- a/docs/self-hosted/deployment/railway/index.html
+++ b/docs/self-hosted/deployment/railway/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Railway guide | Zealot
-
+
Version: 5.0.0 On this page
Deploy Zealot to Railway guide Zealot support use Dockfile
to deploy on Railway .
Deploying on Railway
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/render/index.html b/docs/self-hosted/deployment/render/index.html
index f3c9394ad..627a2019d 100644
--- a/docs/self-hosted/deployment/render/index.html
+++ b/docs/self-hosted/deployment/render/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Deploy Zealot to Render guide | Zealot
-
+
Version: 5.0.0 On this page
Deploy Zealot to Render guide Zealot support a render blueprint named render.yaml
to deploy on render.com .
Deploying on Render
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/requirements/index.html b/docs/self-hosted/deployment/requirements/index.html
index 8dee843f4..cb7df220b 100644
--- a/docs/self-hosted/deployment/requirements/index.html
+++ b/docs/self-hosted/deployment/requirements/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Zealot Self Hosted Requirements | Zealot
-
+
@@ -16,6 +16,6 @@
This process starts with the entire Rails stack but it can grow over time due to memory leaks.
On a very active server the Sidekiq process can use 1GB+ of memory.
Supported web browsers We don't support running Zealot with JavaScript disabled in the browser.
Zealot supports the following web browsers:
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/deployment/source-code/index.html b/docs/self-hosted/deployment/source-code/index.html
index 7af67e509..82ef8f68d 100644
--- a/docs/self-hosted/deployment/source-code/index.html
+++ b/docs/self-hosted/deployment/source-code/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Source code | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/index.html b/docs/self-hosted/index.html
index 9e7d24403..74b03e674 100644
--- a/docs/self-hosted/index.html
+++ b/docs/self-hosted/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Self-hosted Installation Guide | Zealot
-
+
Version: 5.0.0 Self-hosted Installation Guide This guide will help you to install and setup a production ready Zealot.
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/reverse-proxies/index.html b/docs/self-hosted/reverse-proxies/index.html
index 07d2536e6..2c45142e3 100644
--- a/docs/self-hosted/reverse-proxies/index.html
+++ b/docs/self-hosted/reverse-proxies/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Reverse Proxies | Zealot
-
+
@@ -16,6 +16,6 @@
cross-machine can not achieve communication, for cross-machine need to refer to the following two configuration options.
Consul Enable Consul provider or Consul Catalog provider , add key-value below:
consul kv put traefik/http/services/zealot/loadbalancer/server/port 5 consul kv put traefik/http/routers/zealot/service zealot consul kv put traefik/http/routers/zealot/rule 'Host(`zealot.icyleaf.dev`)' consul kv put traefik/http/routers/zealot/tls/certresolver letsencrypt consul kv put traefik/http/routers/zealot/tls/domains/0/main icyleaf.dev consul kv put traefik/http/routers/zealot/tls/domains/0/sans zealot.icyleaf.dev
Nomad Enable Nomad provider and make sure Nomad version >= 1.3:
zealot.nomad
job "zealot" { datacenters = [ "dc1" ] type = "service" group "zealot" { count = 1 network { port "http" { static = 80 } } service { name = "zealot-http" provider = "nomad" port = "http" } task "server" { driver = "docker" config { image = "ghcr.io/tryzealot/zealot:nightly" ports = [ "http" ] args = [ - "traefik.http.routers.zealot.rule=Host(`zealot.icyleaf.dev`)" , - "traefik.http.routers.zealot.tls=true" , - "traefik.http.routers.zealot.tls.certresolver=letsencrypt" , - "traefik.http.routers.zealot.tls.domains[0].main=icyleaf.dev" , - "traefik.http.routers.zealot.tls.domains[0].sans=zealot.icyleaf.dev" ] } } } }
Caddy 2 The configuration only needs to relate the ip part after tls
and proxy
:
Caddyfile
:443 log tls your-email@example.com reverse_proxy 172.16.56.100:8901
Nginx The following is the general configuration, if not effects welcome to file a issue :
conf.d/zealot.conf
upstream zealot { zone upstreams 64K ; server 172.16.56.100:8901 ; keepalive 32 ; } map $http_upgrade $connection_upgrade { default upgrade ; '' close ; } server { listen 80 ; listen [::]:80 ; server_name zealot.icyleaf.dev ; location /.well-known/acme-challenge/ { allow all ; } location / { return 301 https:// $host $request_uri ; } } server { listen 443 ssl http2 ; listen [::]:443 ssl http2 ; server_name zealot.icyleaf.dev ; ssl_certificate /etc/certs/zealot-cert.pem ; ssl_certificate_key /etc/certs/zealot.pem ; location / { proxy_pass http://zealot ; proxy_redirect off ; proxy_pass_header Authorization ; proxy_set_header Host $host ; proxy_set_header X-Real-IP $remote_addr ; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $scheme ; proxy_http_version 1.1 ; proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection $connection_upgrade ; client_max_body_size 0 ; proxy_read_timeout 36000s ; } }
And you need update max body size in http
block. Recommended is 200MB, if it's a game,
50% more can be played to make a surplus according to the actual file size.
nginx.conf
http { [...] client_max_body_size 200M ; }
-
+
\ No newline at end of file
diff --git a/docs/self-hosted/storage/index.html b/docs/self-hosted/storage/index.html
index 98f117eb9..8864a4f56 100644
--- a/docs/self-hosted/storage/index.html
+++ b/docs/self-hosted/storage/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Data storages | Zealot
-
+
@@ -14,6 +14,6 @@
It is currently stored in the filesystem in the
public/uploads
directory.
apps The directory for uploading applications debugs_files directory for uploading debug files Backup storage The Zealot service currently supports command-generated backup data, which will contain
the database and binary packages of the uploaded apps and debug files.
The backup data is currently stored in the file system in the public/backup
directory.
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/apple-team/index.html b/docs/user-guide/administrator/apple-team/index.html
index 5c3ef2b87..a5a7fcb3a 100644
--- a/docs/user-guide/administrator/apple-team/index.html
+++ b/docs/user-guide/administrator/apple-team/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Apple Team (Developer) | Zealot
-
+
@@ -23,6 +23,6 @@
providing a feature to register a testing device that has not been registered with any application
would greatly improve the efficiency of the team. This is the role of the Apple Developer feature.
The initial feature introduction: https://github.com/tryzealot/zealot/issues/723 .
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/backup/index.html b/docs/user-guide/administrator/backup/index.html
index 381615bef..9168b7fe1 100644
--- a/docs/user-guide/administrator/backup/index.html
+++ b/docs/user-guide/administrator/backup/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Backup Schedule | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/monitoring/background-jobs/index.html b/docs/user-guide/administrator/monitoring/background-jobs/index.html
index 3b87676c8..d66855888 100644
--- a/docs/user-guide/administrator/monitoring/background-jobs/index.html
+++ b/docs/user-guide/administrator/monitoring/background-jobs/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Background Jobs | Zealot
-
+
Version: 5.0.0 Background Jobs
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/monitoring/database-analytics/index.html b/docs/user-guide/administrator/monitoring/database-analytics/index.html
index c0a911439..c2b9bd26f 100644
--- a/docs/user-guide/administrator/monitoring/database-analytics/index.html
+++ b/docs/user-guide/administrator/monitoring/database-analytics/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Database Analytics | Zealot
-
+
Version: 5.0.0 Database Analytics
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/monitoring/logging/index.html b/docs/user-guide/administrator/monitoring/logging/index.html
index c7f024092..2083cb278 100644
--- a/docs/user-guide/administrator/monitoring/logging/index.html
+++ b/docs/user-guide/administrator/monitoring/logging/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Logging | Zealot
-
+
Version: 5.0.0 Logging
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/monitoring/system-info/index.html b/docs/user-guide/administrator/monitoring/system-info/index.html
index e849467c8..2a4b73118 100644
--- a/docs/user-guide/administrator/monitoring/system-info/index.html
+++ b/docs/user-guide/administrator/monitoring/system-info/index.html
@@ -1,16 +1,16 @@
-
+
-
+
System informations | Zealot
-
+
Version: 5.0.0 System informations
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/permissions/index.html b/docs/user-guide/administrator/permissions/index.html
index 5218e8d2e..d6d64bf6f 100644
--- a/docs/user-guide/administrator/permissions/index.html
+++ b/docs/user-guide/administrator/permissions/index.html
@@ -1,16 +1,16 @@
-
+
-
+
User Permissions and roles | Zealot
-
+
Version: 5.0.0 On this page
User Permissions and roles Zealot offers four types of user permissions.
Guest User Developer Administrator Comparison Action Guest[On/Off] User Developer Administrator Dashboard
View all data✓/✕ ✓ ✓ ✓ App
View app list✓/✕ ✓ ✓ ✓ App
View app scheme(s) and channel(s) detail✓/✕ ✓ ✓ ✓ App
View the build(release) of app✓/✓ Password Auth ✓ ✓ ✓ App
View webhook list✓/✕ ✓ ✓ ✓ App
Upload/Install/Download app✓ ✓ ✓ ✓ App
Create/Edit/Delete an app✓ ✓ App
Create/Edit/Delete a scheme/channel of app✓ ✓ App
Delete a given version of app✓ ✓ App
Test a webhook network connection✓ ✓ App
Enable/Disable webhook✓ ✓ App
Delete an app✓ ✓ DebugFile
View debug file list✓/✕ ✓ ✓ ✓ DebugFile
View debug file detail✓ ✓ ✓ ✓ DebugFile
Download debug file✓ ✓ ✓ ✓ DebugFile
Upload/Delete a debug file✓ ✓ Teardown
View teardown list✓/✕ ✓ ✓ ✓ Teardown
View teardown detail✓/✕ ✓ ✓ ✓ Teardown
Delete a teardown✓ ✓ Admin
View and manage users✓ Admin
View and manage webhooks✓ Admin
View and manage settings✓ Admin
View system informations✓ Admin
View and manage background jobs✓ Admin
View page analytices✓
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/project-settings/index.html b/docs/user-guide/administrator/project-settings/index.html
index 9dbb27a1a..6dd846e81 100644
--- a/docs/user-guide/administrator/project-settings/index.html
+++ b/docs/user-guide/administrator/project-settings/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Project Settings | Zealot
-
+
Version: 5.0.0 Project Settings
-
+
\ No newline at end of file
diff --git a/docs/user-guide/administrator/settings/index.html b/docs/user-guide/administrator/settings/index.html
index 2538cc28e..8b76f546d 100644
--- a/docs/user-guide/administrator/settings/index.html
+++ b/docs/user-guide/administrator/settings/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Settings | Zealot
-
+
Version: 5.0.0 Settings
-
+
\ No newline at end of file
diff --git a/docs/user-guide/apps/create/index.html b/docs/user-guide/apps/create/index.html
index b7996b95e..1055f0b20 100644
--- a/docs/user-guide/apps/create/index.html
+++ b/docs/user-guide/apps/create/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Create an App | Zealot
-
+
Version: 5.0.0 Create an App
-
+
\ No newline at end of file
diff --git a/docs/user-guide/apps/detail/index.html b/docs/user-guide/apps/detail/index.html
index 04e7e29e6..85e1a1037 100644
--- a/docs/user-guide/apps/detail/index.html
+++ b/docs/user-guide/apps/detail/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Uploaded releases | Zealot
-
+
Version: 5.0.0 Uploaded releases
-
+
\ No newline at end of file
diff --git a/docs/user-guide/apps/index.html b/docs/user-guide/apps/index.html
index fa40a01fb..3955a5b74 100644
--- a/docs/user-guide/apps/index.html
+++ b/docs/user-guide/apps/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Manage apps | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/user-guide/apps/upload/index.html b/docs/user-guide/apps/upload/index.html
index 166f82e74..aabcccdaa 100644
--- a/docs/user-guide/apps/upload/index.html
+++ b/docs/user-guide/apps/upload/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Uploaded a release | Zealot
-
+
Version: 5.0.0 Uploaded a release
-
+
\ No newline at end of file
diff --git a/docs/user-guide/best_practices/index.html b/docs/user-guide/best_practices/index.html
index 5902bed8b..2ad0258d8 100644
--- a/docs/user-guide/best_practices/index.html
+++ b/docs/user-guide/best_practices/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Best Practices | Zealot
-
+
@@ -14,6 +14,6 @@
a configured web hook is triggered to send a notification to the third-party service that a new version has been received,
and for mobile clients that integrate with the Zealot SDK, they will receive a new version installation alert each time they open the app for the first time.
-
+
\ No newline at end of file
diff --git a/docs/user-guide/changelog/index.html b/docs/user-guide/changelog/index.html
index 4726bbdc6..a915b1300 100644
--- a/docs/user-guide/changelog/index.html
+++ b/docs/user-guide/changelog/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Change Log | Zealot
-
+
@@ -13,6 +13,6 @@
It used to undertake many functions, but now it has been separated to focus on providing
application hosting and distribution services
-
+
\ No newline at end of file
diff --git a/docs/user-guide/credits/index.html b/docs/user-guide/credits/index.html
index 3b219c1c4..37512ad95 100644
--- a/docs/user-guide/credits/index.html
+++ b/docs/user-guide/credits/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Credits | Zealot
-
+
@@ -13,6 +13,6 @@
later changed to their own design icons, if there are enthusiastic designers can help design better icons,
I represent this project to express my sincere gratitude.
License Zealot is an open source project released under the MIT distribution protocol (MIT), which can be found at LICENSE file 。
-
+
\ No newline at end of file
diff --git a/docs/user-guide/dashboard/index.html b/docs/user-guide/dashboard/index.html
index 62f8e51f8..0f39e8200 100644
--- a/docs/user-guide/dashboard/index.html
+++ b/docs/user-guide/dashboard/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Dashboard | Zealot
-
+
Version: 5.0.0 Dashboard
-
+
\ No newline at end of file
diff --git a/docs/user-guide/debug-files/index.html b/docs/user-guide/debug-files/index.html
index e62388e20..f7b442465 100644
--- a/docs/user-guide/debug-files/index.html
+++ b/docs/user-guide/debug-files/index.html
@@ -1,16 +1,16 @@
-
+
-
+
List debug files | Zealot
-
+
Version: 5.0.0 List debug files List all uploaded debug files oragiazed by app.
-
+
\ No newline at end of file
diff --git a/docs/user-guide/debug-files/review/index.html b/docs/user-guide/debug-files/review/index.html
index 1f4ee1a27..d13a0b4d0 100644
--- a/docs/user-guide/debug-files/review/index.html
+++ b/docs/user-guide/debug-files/review/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Review metadata | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/user-guide/debug-files/upload/index.html b/docs/user-guide/debug-files/upload/index.html
index 8e731c30a..f32a61695 100644
--- a/docs/user-guide/debug-files/upload/index.html
+++ b/docs/user-guide/debug-files/upload/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Create a Debug File | Zealot
-
+
Version: 5.0.0 Create a Debug File
-
+
\ No newline at end of file
diff --git a/docs/user-guide/index.html b/docs/user-guide/index.html
index acc4a41a4..4c0d2fc95 100644
--- a/docs/user-guide/index.html
+++ b/docs/user-guide/index.html
@@ -1,11 +1,11 @@
-
+
-
+
User Guide | Zealot
-
+
@@ -15,6 +15,6 @@
Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps.
Continuous everything. Automate the lifecycle of your apps. Connect your CI to build in the cloud, test on thousands of real devices, distribute to beta testers and app stores. All in one place.
Features 🌏 Cross-platform hosting : supports macOS, iOS, Android (apk/aab ), Windows, Linux extensive platforms. 📱 iOS device in control : automatically synchronizes iOS test device information and allows for one-click registration of new devices with Apple developers. 🧑💻 Full developer toolkit : provides REST API, [iOS][zealot-ios-sdk], [Android][android-android-sdk] SDKs and [fastlane][fastlane-plugin-zealot] automation plugins for building. 💥 Analyze secrets within applications : interpret metadata for iOS or Android applications or describe files. 🚨 Multiple notification built-in : customizable data income WebHook to any notification service. 🗄 Multi-channel classification management : freely divide application channel management into different scenarios and product forms. 🎳 Multiple Architectures amd86/arm64/armv7 architectures deployment ready. 🔑 Third-party Auth : Google, Gitlab, LDAP, OIDC and Lark suppotted. 🌑 Dark mode : Feel free to switch between day and night. Demo Simplified Chinese by default, change the language in Settings page.
Notification : There is instability run on a free resource cloud service and RESET ALL DATA daily.
About the translation The translation powered by DeepL and it inevitably have some defects, please provide feedback in time, thanks!
-
+
\ No newline at end of file
diff --git a/docs/user-guide/qa/index.html b/docs/user-guide/qa/index.html
index 39030537f..ab7bf1b79 100644
--- a/docs/user-guide/qa/index.html
+++ b/docs/user-guide/qa/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Q&A | Zealot
-
+
-
+
\ No newline at end of file
diff --git a/docs/user-guide/toolkits/fetch-udid/index.html b/docs/user-guide/toolkits/fetch-udid/index.html
index 4318c3c12..107ae85ca 100644
--- a/docs/user-guide/toolkits/fetch-udid/index.html
+++ b/docs/user-guide/toolkits/fetch-udid/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Fetch iOS Device UDID | Zealot
-
+
@@ -16,6 +16,6 @@
corresponding Ad-Hoc certificate, then install and repackage it before
allowing the device to install the application.
Registered Device For a registered test device, the list of installable applications will be displayed. If the service administrator has added Apple Developer, it will also display the registration of the test device to the corresponding developer account.
-
+
\ No newline at end of file
diff --git a/docs/user-guide/toolkits/teardown/index.html b/docs/user-guide/toolkits/teardown/index.html
index bd5108d5c..52a3b94ca 100644
--- a/docs/user-guide/toolkits/teardown/index.html
+++ b/docs/user-guide/toolkits/teardown/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Teardown App view itself metadata | Zealot
-
+
Version: 5.0.0 On this page
-
+
\ No newline at end of file
diff --git a/docs/user-guide/webhooks/dingtalk/index.html b/docs/user-guide/webhooks/dingtalk/index.html
index 928a5017b..d0a47f88c 100644
--- a/docs/user-guide/webhooks/dingtalk/index.html
+++ b/docs/user-guide/webhooks/dingtalk/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Dingtalk (Dingding) | Zealot
-
+
Version: 5.0.0 On this page
Dingtalk (Dingding) 钉钉 use Incoming Webhooks whose constructs
typically support both text and markdown, and can be configured as follows:
Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.
Text format { "msgtype" : "text" , "text" : { "content" : " #{ @title } \n\n安装地址: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
The title field is only displayed in the dialog list, the text field is displayed for the chat content entering the dialog.
{ "msgtype" : "markdown" , "markdown" : { "title" : @title , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" } }
-
+
\ No newline at end of file
diff --git a/docs/user-guide/webhooks/discord/index.html b/docs/user-guide/webhooks/discord/index.html
index 2e1383093..946462b84 100644
--- a/docs/user-guide/webhooks/discord/index.html
+++ b/docs/user-guide/webhooks/discord/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Discord | Zealot
-
+
Version: 5.0.0 On this page
Discord Discord should use Slack-Compatible Webhook whose constructs
typically support both text and block rich text, and can be configured as follows:
Text format { "text" : "# #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } " }
Block rich text format A simple block with markdown support
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } \nInstal QRcode:\n![qrcode]( #{ @qrcode_url } )" } } ] }
Better look at some of the structures shown in the block
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : @title , } } , { "type" : "section" , "fields" : [ { "type" : "mrkdwn" , "text" : "*Platform:*\n #{ @device_type } " } , { "type" : "mrkdwn" , "text" : "*Upload at:*\n #{ @uploaded_at } " } ] } , "accessory" : { "type" : "image" , "image_url" : @qrcode_url , "alt_text" : "install qrcode" } ] }
-
+
\ No newline at end of file
diff --git a/docs/user-guide/webhooks/feishu/index.html b/docs/user-guide/webhooks/feishu/index.html
index 563b8523f..606e28d29 100644
--- a/docs/user-guide/webhooks/feishu/index.html
+++ b/docs/user-guide/webhooks/feishu/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Lark (Feishu) | Zealot
-
+
Version: 5.0.0 On this page
Lark (Feishu) 飞书 use Incoming Webhooks whose constructs
typically support both text and interactive card, and can be configured as follows:
Due to system limitations try to use keyword or IP address whitelist mechanism to receive messages.
Text format { "msg_type" : "text" , "text" : { "content" : " #{ @title } \n\n安装地址: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
Use card format could use partly of markdown syntax:
{ "msg_type" : "interactive" , "card" : { "config" : { "wide_screen_mode" : true , "enable_forward" : true } , "elements" : [ { "tag" : "div" , "text" : { "content" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" , "tag" : "lark_md" } } , { "actions" : [ { "tag" : "button" , "text" : { "content" : "Install" , "tag" : "lark_md" } , "url" : @install_url , "type" : "default" , "value" : { } } ] , "tag" : "action" } ] } }
-
+
\ No newline at end of file
diff --git a/docs/user-guide/webhooks/index.html b/docs/user-guide/webhooks/index.html
index 776e11531..c51ec4494 100644
--- a/docs/user-guide/webhooks/index.html
+++ b/docs/user-guide/webhooks/index.html
@@ -1,11 +1,11 @@
-
+
-
+
Webhooks | Zealot
-
+
@@ -14,6 +14,6 @@
and each variable starts with
@
, the default structure will be used if the custom structure is left empty when creating the webhook.
The following variables are all provided.
{ event : @event , title : @title , app_name : @name , device_type : @device_type , release_version : @release_version , build_version : @build_version , size : @file_size , changelog : @changelog , install_url : @install_url , icon_url : @icon_url , qrcode_url : @qrcode_url , uploaded_at : @uploaded_at }
Output:
{ "event" : "upload_events" , "title" : "Zealot upload 1.0.0 version" , "app_name" : "Zealot" , "device_type" : "iOS" , "release_version" : "1.0.0" , "build_version" : "1" , "size" : "30 MB" , "install_url" : "https://zealot.test/api/apps/download/12354" , "icon_url" : "https://zealot.test/api/apps/icon.png" , "qrcode_url" : "https://zealot.test/api/apps/354/qrcode" , "uploaded_at" : "2019-12-30 11:33:00" , "changelog" : "- Add feture A\n- Fix issue B\n- Release v1.0.0" , }
-
+
\ No newline at end of file
diff --git a/docs/user-guide/webhooks/slack/index.html b/docs/user-guide/webhooks/slack/index.html
index 92b047003..e10f9c64b 100644
--- a/docs/user-guide/webhooks/slack/index.html
+++ b/docs/user-guide/webhooks/slack/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Slack | Zealot
-
+
Version: 5.0.0 On this page
Slack Slack use Incoming Webhooks whose constructs
typically support both text and block rich text, and can be configured as follows:
Text format { "text" : " #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } " }
Block rich text format A simple block with markdown support
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "## #{ @title } \nPlatform: #{ @device_type } \nUpload at: #{ @uploaded_at } \nInstal QRcode:\n![qrcode]( #{ @qrcode_url } )" } } ] }
Better look at some of the structures shown in the block
{ "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : @title , } } , { "type" : "section" , "fields" : [ { "type" : "mrkdwn" , "text" : "*Platform:*\n #{ @device_type } " } , { "type" : "mrkdwn" , "text" : "*Upload at:*\n #{ @uploaded_at } " } ] } , "accessory" : { "type" : "image" , "image_url" : @qrcode_url , "alt_text" : "install qrcode" } ] }
-
+
\ No newline at end of file
diff --git a/docs/user-guide/webhooks/wecom/index.html b/docs/user-guide/webhooks/wecom/index.html
index 798d2415f..40ef07097 100644
--- a/docs/user-guide/webhooks/wecom/index.html
+++ b/docs/user-guide/webhooks/wecom/index.html
@@ -1,17 +1,17 @@
-
+
-
+
Wecom (Wechat Work) | Zealot
-
+
Version: 5.0.0 On this page
Wecom (Wechat Work) 企业微信 use Incoming Webhooks whose constructs
typically support both text and markdown, and can be configured as follows:
Text format { "msgtype" : "text" , "text" : { "content" : " #{ @title } \n\nInstall url: #{ @install_url } \nUplaod at: #{ @uploaded_at } " } }
{ "msgtype" : "markdown" , "markdown" : { "content" : "## #{ @title } \nPlatform: #{ @device_type } \nUplaod at: #{ @uploaded_at } \nInstall QRcode:\n![qrcode]( #{ @qrcode_url } )" } }
-
+
\ No newline at end of file
diff --git a/index.html b/index.html
index 4c7e0d0d2..a965d3921 100644
--- a/index.html
+++ b/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Self-hosted Beta App Distribution for Android, iOS, macOS, Windows and Linux apps. | Zealot
-
+
Easy to Use Zealot was designed from the ground up to be easily installed and running quickly.
Focus on What Matters Zealot lets you focus on your app, and we'll do the chores. Go ahead and upload your apps.
Open Source 100% Zealot is an open source project, Everyone could easy self hosted on own servers.
-
+
\ No newline at end of file
diff --git a/markdown-page/index.html b/markdown-page/index.html
index ed331d749..6ef83eb6a 100644
--- a/markdown-page/index.html
+++ b/markdown-page/index.html
@@ -1,16 +1,16 @@
-
+
-
+
Markdown page example | Zealot
-
+
Markdown page example You don't need React to write simple standalone pages.
-
+
\ No newline at end of file
diff --git a/zh-Hans/404.html b/zh-Hans/404.html
index 411383270..f7e30043c 100644
--- a/zh-Hans/404.html
+++ b/zh-Hans/404.html
@@ -1,16 +1,16 @@
-
+
-
+
找不到页面 | Zealot
-
+
找不到页面 我们找不到您要找的页面。
请联系原始链接来源网站的所有者,并告知他们链接已损坏。
-
+
\ No newline at end of file
diff --git a/zh-Hans/assets/js/main.3ea01847.js b/zh-Hans/assets/js/main.3ea01847.js
deleted file mode 100644
index a505f218d..000000000
--- a/zh-Hans/assets/js/main.3ea01847.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! For license information please see main.3ea01847.js.LICENSE.txt */
-(self.webpackChunkzealot_new_docs=self.webpackChunkzealot_new_docs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(7462),a=n(8356),s=n.n(a),i=n(6887);const l={"000e92dd":[()=>Promise.all([n.e(532),n.e(4123)]).then(n.bind(n,7766)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/android.md",7766],"00f34551":[()=>n.e(144).then(n.bind(n,6898)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/slack.md",6898],"0376ac8d":[()=>n.e(2171).then(n.t.bind(n,3526,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u8c03\u8bd5\u6587\u4ef6-144.json",3526],"0409ce86":[()=>n.e(4529).then(n.bind(n,1910)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/qa.md",1910],"04af2ec6":[()=>n.e(4219).then(n.bind(n,3464)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/storage.md",3464],"05c34111":[()=>n.e(3262).then(n.bind(n,8149)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/toolkits/teardown.md",8149],"0659cada":[()=>n.e(1854).then(n.bind(n,7810)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/feishu.md",7810],"06a7ce3e":[()=>n.e(1013).then(n.bind(n,6275)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/index.md",6275],"07e94b94":[()=>n.e(959).then(n.bind(n,8038)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_sync_devices.md",8038],"08927acb":[()=>n.e(7347).then(n.bind(n,4317)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_debug_file.md",4317],"089c33a0":[()=>n.e(7493).then(n.bind(n,4206)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/apple-team.mdx",4206],"097ad104":[()=>n.e(726).then(n.bind(n,3691)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/index.mdx",3691],"0b2dde68":[()=>n.e(7166).then(n.bind(n,9878)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/kubernetes.md",9878],"0b5c90e4":[()=>n.e(9555).then(n.bind(n,6035)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot.md",6035],"0c22aff4":[()=>Promise.all([n.e(532),n.e(3194)]).then(n.bind(n,400)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/source-code.md",400],"0da09c0c":[()=>n.e(8390).then(n.bind(n,3478)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/feishu.md",3478],"0ef4ad01":[()=>n.e(3313).then(n.bind(n,4572)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/index.md",4572],"0f991629":[()=>n.e(2254).then(n.bind(n,5571)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/create.mdx",5571],10743099:[()=>n.e(2571).then(n.bind(n,6028)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/storage.md",6028],"10ab72a2":[()=>n.e(8206).then(n.bind(n,6864)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/detail.mdx",6864],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(9455),n.e(7918)]).then(n.bind(n,230)),"@theme/DocItem",230],"1ab1b8b6":[()=>n.e(6447).then(n.bind(n,4740)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks.md",4740],"1ab7b698":[()=>n.e(7759).then(n.bind(n,1167)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/dashboard.md",1167],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1c821441":[()=>n.e(9506).then(n.bind(n,1287)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/docker.md",1287],"1d59b05a":[()=>n.e(7181).then(n.bind(n,4109)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks.md",4109],"1ec5d4b5":[()=>n.e(8202).then(n.bind(n,4)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/nomad.md",4],"1f391b9e":[()=>Promise.all([n.e(532),n.e(9455),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"20570c26":[()=>n.e(639).then(n.bind(n,1749)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/requirements.md",1749],"20cbbbee":[()=>n.e(5405).then(n.bind(n,4510)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/toolkits/teardown.mdx",4510],"210ec931":[()=>n.e(2247).then(n.bind(n,3276)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/backup.mdx",3276],"23b09800":[()=>n.e(7817).then(n.bind(n,368)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/render.md",368],"23e1330d":[()=>n.e(3032).then(n.bind(n,8950)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/qa.md",8950],"247783bb":[()=>n.e(9334).then(n.t.bind(n,3769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"26cfe7d9":[()=>n.e(3091).then(n.bind(n,7626)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/system-info.mdx",7626],"28463b1d":[()=>n.e(4620).then(n.bind(n,7459)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/review.mdx",7459],"2a1b2070":[()=>n.e(2141).then(n.bind(n,1512)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/settings.mdx",1512],"2ac37e2a":[()=>n.e(5238).then(n.bind(n,9986)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/dingtalk.md",9986],"2ba4a649":[()=>n.e(5476).then(n.bind(n,2962)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/system-info.mdx",2962],"2da1a83d":[()=>n.e(7169).then(n.bind(n,7664)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/upload.mdx",7664],"2de1c1b9":[()=>n.e(105).then(n.t.bind(n,8148,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u8c03\u8bd5\u6587\u4ef6-25b.json",8148],"2ff16664":[()=>n.e(9327).then(n.bind(n,5997)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/background-jobs.mdx",5997],"30738da4":[()=>n.e(8170).then(n.bind(n,462)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/environment-variables.md",462],"320c81fa":[()=>n.e(6463).then(n.t.bind(n,1222,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u4e91\u670d\u52a1\u5546-459.json",1222],"3384f4b5":[()=>n.e(7772).then(n.bind(n,5812)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api/debug_files.md",5812],"33ad4946":[()=>n.e(5215).then(n.bind(n,6820)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/render.md",6820],"36ff01e5":[()=>n.e(2515).then(n.bind(n,5245)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/index.mdx",5245],"3731d319":[()=>n.e(3137).then(n.bind(n,7056)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/kubernetes.md",7056],"380655f7":[()=>Promise.all([n.e(532),n.e(9213)]).then(n.bind(n,7504)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/sdk/ios.md",7504],"381e4cde":[()=>n.e(8740).then(n.bind(n,7157)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/apple-team.mdx",7157],"393be207":[()=>n.e(7414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],"3b925495":[()=>n.e(2745).then(n.bind(n,2073)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane.md",2073],"3d079836":[()=>Promise.all([n.e(532),n.e(2922)]).then(n.bind(n,364)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/android.md",364],"3d648c75":[()=>n.e(7950).then(n.bind(n,6225)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/index.mdx",6225],"3e64385b":[()=>n.e(8307).then(n.bind(n,2418)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/index.mdx",2418],"3f7af0f1":[()=>n.e(9316).then(n.bind(n,3829)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/discord.md",3829],"405e4d0a":[()=>n.e(1233).then(n.bind(n,6590)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/apps/create.md",6590],40622858:[()=>n.e(9411).then(n.bind(n,955)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/requirements.md",955],42055627:[()=>n.e(6833).then(n.bind(n,8300)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/requirements.md",8300],"422bbee2":[()=>n.e(6082).then(n.bind(n,2451)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/background-jobs.mdx",2451],"46458cf8":[()=>n.e(4641).then(n.bind(n,9061)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/toolkits/fetch-udid.mdx",9061],"47c1865a":[()=>n.e(7755).then(n.t.bind(n,7724,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u5e94\u7528-2af.json",7724],"492fa892":[()=>n.e(7298).then(n.t.bind(n,8016,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u90e8\u7f72-a8b.json",8016],"493ecea9":[()=>n.e(6500).then(n.bind(n,2811)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/discord.md",2811],"4960790f":[()=>n.e(5185).then(n.bind(n,9788)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/index.md",9788],"498392b4":[()=>n.e(9164).then(n.bind(n,6373)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/index.md",6373],"4a0f0e0c":[()=>n.e(2986).then(n.bind(n,4520)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/railway.md",4520],"4aeacf08":[()=>n.e(6184).then(n.bind(n,9071)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/docker.md",9071],"4aefe824":[()=>n.e(6276).then(n.t.bind(n,2955,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u7ba1\u7406\u9762\u677f-802.json",2955],"4b5eb73a":[()=>n.e(8037).then(n.bind(n,4473)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/database-analytics.mdx",4473],"4b6154ab":[()=>n.e(8228).then(n.bind(n,1106)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/schedule-jobs.md",1106],"4bc9e19e":[()=>Promise.all([n.e(532),n.e(5342)]).then(n.bind(n,9543)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/reverse-proxies.mdx",9543],"4daa79cc":[()=>n.e(7030).then(n.bind(n,2052)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_version_check.md",2052],"500b40a2":[()=>n.e(6735).then(n.bind(n,2423)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/environment-variables.md",2423],"5171b55b":[()=>n.e(1075).then(n.bind(n,918)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/backup.md",918],"533b3bff":[()=>n.e(9882).then(n.bind(n,7177)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/docker.md",7177],"53ae73f2":[()=>n.e(9390).then(n.t.bind(n,5565,19)),"~docs/default/category-zh-hansdocsnext-contributingguide-category-\u672c\u5730\u5f00\u53d1-ac6.json",5565],"546445a3":[()=>n.e(7190).then(n.bind(n,2576)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api.md",2576],"56786dcf":[()=>Promise.all([n.e(532),n.e(6788)]).then(n.bind(n,9186)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/devcontainer.md",9186],"575c49fd":[()=>n.e(1821).then(n.bind(n,6232)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/best_practices.md",6232],"580231d5":[()=>n.e(5745).then(n.bind(n,2547)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/upload.mdx",2547],"5914602b":[()=>Promise.all([n.e(532),n.e(8797)]).then(n.bind(n,6406)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/reverse-proxies.mdx",6406],"5b48482c":[()=>n.e(7355).then(n.t.bind(n,6521,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u76d1\u63a7-bbd.json",6521],"5e69b000":[()=>n.e(9557).then(n.bind(n,1960)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/database-analytics.md",1960],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5f6e077b":[()=>n.e(1300).then(n.bind(n,8527)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/logging.mdx",8527],"5fe54c51":[()=>n.e(1042).then(n.bind(n,3275)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/docker/step-by-step.md",3275],"6025cfa3":[()=>n.e(859).then(n.bind(n,3034)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/third-party-authentication.md",3034],"61b3b8ce":[()=>n.e(4343).then(n.bind(n,7895)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/index.md",7895],"63d75c88":[()=>n.e(6519).then(n.bind(n,9847)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/wecom.md",9847],"65f8d4cd":[()=>n.e(5632).then(n.bind(n,1771)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/best_practices.md",1771],"66a79633":[()=>n.e(7121).then(n.bind(n,1701)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/apple-team.mdx",1701],"67d72155":[()=>n.e(3434).then(n.bind(n,2043)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/credits.md",2043],"6821510c":[()=>n.e(5732).then(n.bind(n,5808)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/feishu.md",5808],"68518edc":[()=>n.e(3144).then(n.t.bind(n,8734,19)),"~docs/default/category-zh-hansdocsnext-developerguide-category-\u79fb\u52a8-sdk-c0b.json",8734],"68604c4e":[()=>n.e(6442).then(n.bind(n,194)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/webhooks/dingtalk.md",194],"6988bd10":[()=>n.e(4061).then(n.bind(n,9704)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api.md",9704],"6a6b352a":[()=>n.e(652).then(n.t.bind(n,9024,19)),"~docs/default/category-zh-hansdocs-4-x-developerguide-category-\u79fb\u52a8-sdk-ba3.json",9024],"6aeebc73":[()=>n.e(3165).then(n.bind(n,1672)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_sync_devices.md",1672],"6c1f465d":[()=>n.e(6766).then(n.bind(n,5252)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/schedule-jobs.md",5252],"6de0a3bc":[()=>n.e(3369).then(n.bind(n,6224)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot.md",6224],"6fa94343":[()=>n.e(8832).then(n.bind(n,8922)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/toolkits/fetch-udid.mdx",8922],"709f7e27":[()=>n.e(6170).then(n.t.bind(n,5199,19)),"~docs/default/category-zh-hansdocs-developerguide-category-\u79fb\u52a8-sdk-401.json",5199],"70a2637b":[()=>n.e(8007).then(n.t.bind(n,3319,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u5de5\u5177\u7bb1-f53.json",3319],"71cdea68":[()=>n.e(8552).then(n.bind(n,1464)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api/apps.md",1464],"731441ba":[()=>n.e(6432).then(n.bind(n,2683)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/index.md",2683],"756ae957":[()=>n.e(6751).then(n.bind(n,6292)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/docker/step-by-step.md",6292],"77ad6583":[()=>n.e(6988).then(n.bind(n,4104)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/index.md",4104],"77ba73fa":[()=>n.e(4085).then(n.bind(n,7784)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_version_check.md",7784],"78d3bc26":[()=>n.e(2347).then(n.bind(n,362)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/configuration/environment-variables.md",362],"78f6b461":[()=>n.e(7531).then(n.bind(n,3258)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/toolkits/teardown.mdx",3258],"797c3697":[()=>n.e(7053).then(n.bind(n,6745)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api.md",6745],"7a31e8eb":[()=>n.e(39).then(n.t.bind(n,7772,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u7ba1\u7406\u9762\u677f-f40.json",7772],"7b50d085":[()=>n.e(7299).then(n.bind(n,4419)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/index.md",4419],"7e2cd3a9":[()=>n.e(9347).then(n.bind(n,7401)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/project-settings.md",7401],"7e84284a":[()=>n.e(7700).then(n.t.bind(n,6817,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u4e91\u670d\u52a1\u5546-4e2.json",6817],"7f084e8e":[()=>n.e(6801).then(n.t.bind(n,5092,19)),"~docs/default/category-zh-hansdocs-4-x-selfhosted-category-\u914d\u7f6e-680.json",5092],"808d5cf9":[()=>n.e(4552).then(n.bind(n,6667)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/qa.md",6667],"88e109fd":[()=>n.e(3975).then(n.bind(n,1866)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/schedule-jobs.md",1866],"89a1149b":[()=>n.e(9697).then(n.bind(n,6895)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/changelog.md",6895],"8c755c24":[()=>n.e(6543).then(n.bind(n,6883)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/slack.md",6883],"8c7fed4d":[()=>n.e(7207).then(n.bind(n,5057)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/system-info.md",5057],"8dbd9405":[()=>n.e(536).then(n.bind(n,7794)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/debug-files/upload.md",7794],"8e4c1cdf":[()=>n.e(4069).then(n.bind(n,9842)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_debug_file.md",9842],"927828a2":[()=>n.e(5086).then(n.bind(n,3715)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/settings.mdx",3715],"92f17503":[()=>n.e(7704).then(n.bind(n,3465)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane.md",3465],"93332d63":[()=>n.e(7754).then(n.bind(n,1713)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/railway.md",1713],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9387e8f1":[()=>n.e(6620).then(n.bind(n,5085)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/api/debug_files.md",5085],"93e83d03":[()=>n.e(270).then(n.bind(n,4658)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/fly.md",4658],"94a70f3c":[()=>n.e(9902).then(n.bind(n,7396)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/nomad.md",7396],"980d6c79":[()=>n.e(5100).then(n.bind(n,3304)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/wecom.md",3304],"986b83c2":[()=>n.e(7659).then(n.bind(n,2178)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/debug-files/upload.mdx",2178],"9a46955c":[()=>n.e(2300).then(n.bind(n,5515)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/dashboard.md",5515],"9aa09611":[()=>n.e(6031).then(n.bind(n,6552)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/credits.md",6552],"9c76208a":[()=>n.e(7925).then(n.bind(n,9179)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/permissions.md",9179],"9d0a861d":[()=>n.e(3868).then(n.t.bind(n,8818,19)),"~docs/default/category-zh-hansdocs-contributingguide-category-\u672c\u5730\u5f00\u53d1-474.json",8818],"9d0b921d":[()=>Promise.all([n.e(532),n.e(2239)]).then(n.bind(n,3664)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/contributing-guide/local-development/devcontainer.md",3664],"9d7c6944":[()=>n.e(8189).then(n.t.bind(n,4812,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u8c03\u8bd5\u6587\u4ef6-521.json",4812],"9eed9fa1":[()=>n.e(6346).then(n.bind(n,5147)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/changelog.md",5147],a06cc266:[()=>n.e(4288).then(n.bind(n,9988)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/index.mdx",9988],a21619df:[()=>n.e(3020).then(n.bind(n,3764)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/index.mdx",3764],a73dab33:[()=>n.e(7781).then(n.bind(n,5293)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/api/apps.md",5293],a7434565:[()=>n.e(7645).then(n.t.bind(n,5745,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],a9736a03:[()=>n.e(3240).then(n.t.bind(n,3786,19)),"~docs/default/category-zh-hansdocs-4-x-contributingguide-category-\u672c\u5730\u5f00\u53d1-0f1.json",3786],aa45ed72:[()=>n.e(713).then(n.bind(n,120)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/dingtalk.md",120],ab09b93d:[()=>n.e(1839).then(n.t.bind(n,6721,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u90e8\u7f72-7eb.json",6721],abf33808:[()=>n.e(3705).then(n.bind(n,8129)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/nomad.md",8129],ac20dd04:[()=>n.e(4114).then(n.bind(n,1659)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/apps/detail.mdx",1659],ad5e89b7:[()=>n.e(3946).then(n.bind(n,3119)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/changelog.md",3119],ae0b00ed:[()=>n.e(131).then(n.bind(n,9468)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot.md",9468],b0190f04:[()=>n.e(5497).then(n.bind(n,3294)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/wecom.md",3294],b0b6b74b:[()=>n.e(2608).then(n.t.bind(n,7324,19)),"~docs/default/category-zh-hansdocs-4-x-userguide-category-\u5de5\u5177\u7bb1-eff.json",7324],b0d48a44:[()=>n.e(184).then(n.bind(n,4067)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/permissions.md",4067],b155671d:[()=>n.e(5924).then(n.bind(n,6490)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/fastlane/zealot_debug_file.md",6490],b168d81c:[()=>n.e(7284).then(n.bind(n,1278)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/fly.md",1278],b2ef10a5:[()=>n.e(2406).then(n.bind(n,4692)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks/slack.md",4692],b38b46a9:[()=>Promise.all([n.e(532),n.e(8782)]).then(n.bind(n,4020)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/sdk/ios.md",4020],b43ef384:[()=>Promise.all([n.e(532),n.e(6043)]).then(n.bind(n,6684)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/android.md",6684],b51b060c:[()=>n.e(8447).then(n.bind(n,8442)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/fly.md",8442],b572cb1f:[()=>Promise.all([n.e(532),n.e(6981)]).then(n.bind(n,7183)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/reverse-proxies.mdx",7183],b667b6c3:[()=>n.e(4259).then(n.bind(n,9589)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/backup.mdx",9589],b6e49d05:[()=>n.e(1224).then(n.bind(n,4929)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/index.md",4929],b8ca8336:[()=>n.e(4127).then(n.bind(n,7248)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/source-code.md",7248],bbb0fa6e:[()=>n.e(2570).then(n.bind(n,3557)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/webhooks/discord.md",3557],bc4a1c03:[()=>n.e(1147).then(n.t.bind(n,2985,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u7ba1\u7406\u9762\u677f-841.json",2985],c1af49ed:[()=>n.e(80).then(n.t.bind(n,5460,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u76d1\u63a7-654.json",5460],c3412635:[()=>n.e(5929).then(n.bind(n,1060)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane.md",1060],c3697579:[()=>n.e(631).then(n.bind(n,1300)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/source-code.md",1300],c38ecdbc:[()=>n.e(4360).then(n.bind(n,921)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/permissions.md",921],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261],c5a4c00b:[()=>n.e(2208).then(n.bind(n,1957)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/logging.md",1957],c6bdf690:[()=>n.e(2705).then(n.bind(n,6114)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/upload.mdx",6114],c6fb1e3c:[()=>n.e(8876).then(n.bind(n,2873)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api/apps.md",2873],c704004d:[()=>Promise.all([n.e(532),n.e(4156)]).then(n.bind(n,4681)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/sdk/ios.md",4681],c7c3383a:[()=>n.e(5343).then(n.t.bind(n,8885,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u5de5\u5177\u7bb1-615.json",8885],c869843a:[()=>n.e(2170).then(n.bind(n,6602)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/user-guide/administrator/monitoring/background-jobs.md",6602],c89e1d41:[()=>n.e(2559).then(n.bind(n,8623)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/administrator/monitoring/logging.mdx",8623],c941fb92:[()=>Promise.all([n.e(532),n.e(7551)]).then(n.bind(n,3317)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/source-code.md",3317],c9b278a8:[()=>n.e(9181).then(n.t.bind(n,5e3,19)),"~docs/default/version-5-0-0-metadata-prop-0b8.json",5e3],cae0f04b:[()=>n.e(5709).then(n.t.bind(n,4166,19)),"~docs/default/version-4-x-metadata-prop-21f.json",4166],cbffe0ba:[()=>Promise.all([n.e(532),n.e(594)]).then(n.bind(n,5517)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/contributing-guide/local-development/source-code.md",5517],cc8d1b20:[()=>Promise.all([n.e(532),n.e(721)]).then(n.bind(n,2897)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/contributing-guide/local-development/devcontainer.md",2897],cd05e63c:[()=>n.e(4775).then(n.bind(n,1343)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/docker/step-by-step.md",1343],cf72ee6a:[()=>n.e(324).then(n.bind(n,2948)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/render.md",2948],d02aa106:[()=>n.e(4590).then(n.bind(n,5421)),"@site/versioned_docs/version-5.0.0/user-guide/administrator/project-settings.md",5421],d0f9f7b0:[()=>n.e(1931).then(n.bind(n,2446)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/toolkits/fetch-udid.mdx",2446],d75d92bc:[()=>n.e(8450).then(n.bind(n,9750)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/webhooks.md",9750],d7c763e8:[()=>n.e(1297).then(n.bind(n,7331)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/administrator/monitoring/database-analytics.mdx",7331],dc9db4d6:[()=>n.e(8794).then(n.bind(n,3175)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/developer-guide/fastlane/zealot_sync_devices.md",3175],dd90aca1:[()=>n.e(7679).then(n.bind(n,8501)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/developer-guide/fastlane/zealot_version_check.md",8501],de6e37e2:[()=>n.e(6222).then(n.bind(n,5880)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/architecture.mdx",5880],e177b72e:[()=>n.e(847).then(n.bind(n,4938)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/debug-files/review.mdx",4938],e25c1561:[()=>n.e(3775).then(n.bind(n,3863)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/credits.md",3863],e471e2c1:[()=>n.e(2238).then(n.bind(n,1631)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/railway.md",1631],e649ac20:[()=>n.e(8650).then(n.t.bind(n,3542,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u914d\u7f6e-4ad.json",3542],e676557f:[()=>n.e(3082).then(n.t.bind(n,9411,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u5e94\u7528-297.json",9411],e74b89a8:[()=>n.e(5256).then(n.bind(n,6977)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/create.mdx",6977],e84771ae:[()=>n.e(5468).then(n.bind(n,2833)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/storage.md",2833],eb842df6:[()=>n.e(5855).then(n.bind(n,3618)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/architecture.mdx",3618],eb89accb:[()=>n.e(2390).then(n.bind(n,1786)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/best_practices.md",1786],ec4538ed:[()=>n.e(4328).then(n.bind(n,6109)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/user-guide/dashboard.md",6109],ef9024f9:[()=>n.e(7452).then(n.bind(n,3410)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/developer-guide/api/debug_files.md",3410],f057e2be:[()=>n.e(6164).then(n.t.bind(n,2780,19)),"~docs/default/category-zh-hansdocsnext-userguide-category-\u5e94\u7528-129.json",2780],f25fc619:[()=>n.e(2353).then(n.t.bind(n,1161,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u914d\u7f6e-e07.json",1161],f3b6e326:[()=>n.e(1717).then(n.bind(n,4990)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/deployment/architecture.mdx",4990],f3e148a8:[()=>n.e(4938).then(n.bind(n,3244)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-4.x/self-hosted/deployment/source-code.md",3244],f3ecbbb7:[()=>n.e(861).then(n.t.bind(n,5098,19)),"~docs/default/category-zh-hansdocsnext-selfhosted-category-\u4e91\u670d\u52a1\u5546-0ff.json",5098],f500fe2a:[()=>n.e(7575).then(n.t.bind(n,7063,19)),"~docs/default/category-zh-hansdocs-selfhosted-category-\u90e8\u7f72-bbf.json",7063],f576f290:[()=>n.e(1290).then(n.t.bind(n,85,19)),"~docs/default/category-zh-hansdocs-userguide-category-\u76d1\u63a7-5d6.json",85],fa6a7c71:[()=>n.e(1125).then(n.bind(n,7283)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/user-guide/apps/index.mdx",7283],faaf8c96:[()=>n.e(2994).then(n.bind(n,1471)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/configuration/third-party-authentication.md",1471],fe394c5b:[()=>n.e(6229).then(n.bind(n,4234)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/version-5.0.0/self-hosted/deployment/kubernetes.md",4234],ffe0e092:[()=>n.e(8810).then(n.bind(n,1649)),"@site/i18n/zh-Hans/docusaurus-plugin-content-docs/current/self-hosted/configuration/third-party-authentication.md",1649]};function u(e){let{error:t,retry:n,pastDelay:o}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):o?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function p(e,t){if("*"===e)return s()({loading:u,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const a=i[`${e}-${t}`],p={},f=[],h=[],g=(0,c.Z)(a);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),h.push(r[2]))})),s().Map({loading:u,loader:p,modules:f,webpack:()=>h,render(t,n){const s=JSON.parse(JSON.stringify(a));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let a=s;const i=n.split(".");i.slice(0,-1).forEach((e=>{a=a[e]})),a[i[i.length-1]]=o}));const i=s.__comp;delete s.__comp;const l=s.__context;return delete s.__context,r.createElement(d.z,{value:l},r.createElement(i,(0,o.Z)({},s,n)))}})}const f=[{path:"/zh-Hans/markdown-page",component:p("/zh-Hans/markdown-page","75e"),exact:!0},{path:"/zh-Hans/docs/4.x",component:p("/zh-Hans/docs/4.x","da2"),routes:[{path:"/zh-Hans/docs/4.x/category/administrator",component:p("/zh-Hans/docs/4.x/category/administrator","d7f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/apps",component:p("/zh-Hans/docs/4.x/category/apps","2ef"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/cloud-provider-guides",component:p("/zh-Hans/docs/4.x/category/cloud-provider-guides","3e0"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/configuration",component:p("/zh-Hans/docs/4.x/category/configuration","139"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/debug-files",component:p("/zh-Hans/docs/4.x/category/debug-files","bfa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/deployment",component:p("/zh-Hans/docs/4.x/category/deployment","518"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/category/local-development",component:p("/zh-Hans/docs/4.x/category/local-development","c2c"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/category/monitoring",component:p("/zh-Hans/docs/4.x/category/monitoring","066"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/category/sdks",component:p("/zh-Hans/docs/4.x/category/sdks","cd7"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/category/toolkits",component:p("/zh-Hans/docs/4.x/category/toolkits","9b1"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/",component:p("/zh-Hans/docs/4.x/contributing-guide/","0bd"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer","7b7"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/4.x/contributing-guide/local-development/source-code","314"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/",component:p("/zh-Hans/docs/4.x/developer-guide/","396"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api",component:p("/zh-Hans/docs/4.x/developer-guide/api","d53"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api/apps",component:p("/zh-Hans/docs/4.x/developer-guide/api/apps","b1c"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/api/debug_files",component:p("/zh-Hans/docs/4.x/developer-guide/api/debug_files","ae9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane","baa"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot","684"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file","8bd"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices","1c5"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check","55a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/sdk/android",component:p("/zh-Hans/docs/4.x/developer-guide/sdk/android","57e"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/developer-guide/sdk/ios",component:p("/zh-Hans/docs/4.x/developer-guide/sdk/ios","e20"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/4.x/self-hosted/",component:p("/zh-Hans/docs/4.x/self-hosted/","518"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables","3c6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs","a07"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication","586"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/architecture","ea9"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/docker",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/docker","143"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step","4fe"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/fly",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/fly","b4e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes","779"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/nomad","902"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/railway",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/railway","548"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/render",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/render","db8"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/requirements","4df"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/4.x/self-hosted/deployment/source-code","4c4"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/4.x/self-hosted/reverse-proxies","9ee"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/self-hosted/storage",component:p("/zh-Hans/docs/4.x/self-hosted/storage","380"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/4.x/user-guide/",component:p("/zh-Hans/docs/4.x/user-guide/","f14"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/4.x/user-guide/administrator/apple-team","2b0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/backup",component:p("/zh-Hans/docs/4.x/user-guide/administrator/backup","f68"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs","a4d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics","462"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging","3aa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info","8f2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/permissions",component:p("/zh-Hans/docs/4.x/user-guide/administrator/permissions","cbb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/administrator/project-settings",component:p("/zh-Hans/docs/4.x/user-guide/administrator/project-settings","bbb"),exact:!0},{path:"/zh-Hans/docs/4.x/user-guide/apps/create",component:p("/zh-Hans/docs/4.x/user-guide/apps/create","574"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/best_practices",component:p("/zh-Hans/docs/4.x/user-guide/best_practices","9f7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/changelog",component:p("/zh-Hans/docs/4.x/user-guide/changelog","af2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/credits",component:p("/zh-Hans/docs/4.x/user-guide/credits","672"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/dashboard",component:p("/zh-Hans/docs/4.x/user-guide/dashboard","2c7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/debug-files/upload",component:p("/zh-Hans/docs/4.x/user-guide/debug-files/upload","f8f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/qa",component:p("/zh-Hans/docs/4.x/user-guide/qa","a9f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid","31b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/4.x/user-guide/toolkits/teardown","915"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks",component:p("/zh-Hans/docs/4.x/user-guide/webhooks","d21"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk","078"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/discord",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/discord","0f6"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/feishu","c9c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/slack",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/slack","4ac"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/4.x/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/4.x/user-guide/webhooks/wecom","f3a"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/docs/next",component:p("/zh-Hans/docs/next","e3e"),routes:[{path:"/zh-Hans/docs/next/category/administrator",component:p("/zh-Hans/docs/next/category/administrator","72c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/apps",component:p("/zh-Hans/docs/next/category/apps","260"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/cloud-provider-guides",component:p("/zh-Hans/docs/next/category/cloud-provider-guides","ddb"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/configuration",component:p("/zh-Hans/docs/next/category/configuration","e3d"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/debug-files",component:p("/zh-Hans/docs/next/category/debug-files","1e7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/deployment",component:p("/zh-Hans/docs/next/category/deployment","730"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/category/local-development",component:p("/zh-Hans/docs/next/category/local-development","3a2"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/category/monitoring",component:p("/zh-Hans/docs/next/category/monitoring","5fb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/category/sdks",component:p("/zh-Hans/docs/next/category/sdks","dd4"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/category/toolkits",component:p("/zh-Hans/docs/next/category/toolkits","dcc"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/contributing-guide/",component:p("/zh-Hans/docs/next/contributing-guide/","24b"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/next/contributing-guide/local-development/devcontainer","033"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/next/contributing-guide/local-development/source-code","d9f"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/next/developer-guide/",component:p("/zh-Hans/docs/next/developer-guide/","81a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api",component:p("/zh-Hans/docs/next/developer-guide/api","d7a"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api/apps",component:p("/zh-Hans/docs/next/developer-guide/api/apps","8f3"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/api/debug_files",component:p("/zh-Hans/docs/next/developer-guide/api/debug_files","0f2"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane",component:p("/zh-Hans/docs/next/developer-guide/fastlane","637"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot","8f6"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file","e8c"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices","ae9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check","ff2"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/sdk/android",component:p("/zh-Hans/docs/next/developer-guide/sdk/android","6e9"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/developer-guide/sdk/ios",component:p("/zh-Hans/docs/next/developer-guide/sdk/ios","27f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/next/self-hosted/",component:p("/zh-Hans/docs/next/self-hosted/","5e5"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/next/self-hosted/configuration/environment-variables","9da"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs","043"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication","357"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/next/self-hosted/deployment/architecture","751"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/docker",component:p("/zh-Hans/docs/next/self-hosted/deployment/docker","a4f"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step","d7b"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/fly",component:p("/zh-Hans/docs/next/self-hosted/deployment/fly","17c"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/next/self-hosted/deployment/kubernetes","11d"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/next/self-hosted/deployment/nomad","f41"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/railway",component:p("/zh-Hans/docs/next/self-hosted/deployment/railway","ca6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/render",component:p("/zh-Hans/docs/next/self-hosted/deployment/render","4ce"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/next/self-hosted/deployment/requirements","f08"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/next/self-hosted/deployment/source-code","ded"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/next/self-hosted/reverse-proxies","49a"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/self-hosted/storage",component:p("/zh-Hans/docs/next/self-hosted/storage","0ff"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/next/user-guide/",component:p("/zh-Hans/docs/next/user-guide/","1fb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/next/user-guide/administrator/apple-team","383"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/backup",component:p("/zh-Hans/docs/next/user-guide/administrator/backup","4ae"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs","b4c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics","847"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/logging","b1a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info","056"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/permissions",component:p("/zh-Hans/docs/next/user-guide/administrator/permissions","bfc"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/administrator/settings",component:p("/zh-Hans/docs/next/user-guide/administrator/settings","a7e"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/",component:p("/zh-Hans/docs/next/user-guide/apps/","7fe"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/create",component:p("/zh-Hans/docs/next/user-guide/apps/create","faa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/detail",component:p("/zh-Hans/docs/next/user-guide/apps/detail","78f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/apps/upload",component:p("/zh-Hans/docs/next/user-guide/apps/upload","d44"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/best_practices",component:p("/zh-Hans/docs/next/user-guide/best_practices","49f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/changelog",component:p("/zh-Hans/docs/next/user-guide/changelog","f9a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/credits",component:p("/zh-Hans/docs/next/user-guide/credits","054"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/dashboard",component:p("/zh-Hans/docs/next/user-guide/dashboard","581"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/",component:p("/zh-Hans/docs/next/user-guide/debug-files/","d57"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/review",component:p("/zh-Hans/docs/next/user-guide/debug-files/review","6df"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/debug-files/upload",component:p("/zh-Hans/docs/next/user-guide/debug-files/upload","99a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/qa",component:p("/zh-Hans/docs/next/user-guide/qa","f7a"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/next/user-guide/toolkits/fetch-udid","204"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/next/user-guide/toolkits/teardown","a6c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks",component:p("/zh-Hans/docs/next/user-guide/webhooks","66b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/next/user-guide/webhooks/dingtalk","784"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/discord",component:p("/zh-Hans/docs/next/user-guide/webhooks/discord","946"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/next/user-guide/webhooks/feishu","42f"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/slack",component:p("/zh-Hans/docs/next/user-guide/webhooks/slack","7cb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/next/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/next/user-guide/webhooks/wecom","644"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/docs",component:p("/zh-Hans/docs","a28"),routes:[{path:"/zh-Hans/docs/category/administrator",component:p("/zh-Hans/docs/category/administrator","097"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/apps",component:p("/zh-Hans/docs/category/apps","8cd"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/cloud-provider-guides",component:p("/zh-Hans/docs/category/cloud-provider-guides","fbc"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/configuration",component:p("/zh-Hans/docs/category/configuration","346"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/debug-files",component:p("/zh-Hans/docs/category/debug-files","ea0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/deployment",component:p("/zh-Hans/docs/category/deployment","1b8"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/category/local-development",component:p("/zh-Hans/docs/category/local-development","34b"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/category/monitoring",component:p("/zh-Hans/docs/category/monitoring","adb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/category/sdks",component:p("/zh-Hans/docs/category/sdks","38f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/category/toolkits",component:p("/zh-Hans/docs/category/toolkits","a3c"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/contributing-guide/",component:p("/zh-Hans/docs/contributing-guide/","73c"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/contributing-guide/local-development/devcontainer",component:p("/zh-Hans/docs/contributing-guide/local-development/devcontainer","862"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/contributing-guide/local-development/source-code",component:p("/zh-Hans/docs/contributing-guide/local-development/source-code","ad0"),exact:!0,sidebar:"contributingGuide"},{path:"/zh-Hans/docs/developer-guide/",component:p("/zh-Hans/docs/developer-guide/","274"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api",component:p("/zh-Hans/docs/developer-guide/api","722"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api/apps",component:p("/zh-Hans/docs/developer-guide/api/apps","40f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/api/debug_files",component:p("/zh-Hans/docs/developer-guide/api/debug_files","869"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane",component:p("/zh-Hans/docs/developer-guide/fastlane","73d"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot","3fc"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file","4df"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices","d4f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check",component:p("/zh-Hans/docs/developer-guide/fastlane/zealot_version_check","ac5"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/sdk/android",component:p("/zh-Hans/docs/developer-guide/sdk/android","cf3"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/developer-guide/sdk/ios",component:p("/zh-Hans/docs/developer-guide/sdk/ios","e8f"),exact:!0,sidebar:"developerGuide"},{path:"/zh-Hans/docs/self-hosted/",component:p("/zh-Hans/docs/self-hosted/","78e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/environment-variables",component:p("/zh-Hans/docs/self-hosted/configuration/environment-variables","d54"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/schedule-jobs",component:p("/zh-Hans/docs/self-hosted/configuration/schedule-jobs","bb1"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/configuration/third-party-authentication",component:p("/zh-Hans/docs/self-hosted/configuration/third-party-authentication","0c6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/architecture",component:p("/zh-Hans/docs/self-hosted/deployment/architecture","91f"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/docker",component:p("/zh-Hans/docs/self-hosted/deployment/docker","189"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step",component:p("/zh-Hans/docs/self-hosted/deployment/docker/step-by-step","57b"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/fly",component:p("/zh-Hans/docs/self-hosted/deployment/fly","fc2"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/kubernetes",component:p("/zh-Hans/docs/self-hosted/deployment/kubernetes","6b6"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/nomad",component:p("/zh-Hans/docs/self-hosted/deployment/nomad","719"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/railway",component:p("/zh-Hans/docs/self-hosted/deployment/railway","9ef"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/render",component:p("/zh-Hans/docs/self-hosted/deployment/render","934"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/requirements",component:p("/zh-Hans/docs/self-hosted/deployment/requirements","5d9"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/deployment/source-code",component:p("/zh-Hans/docs/self-hosted/deployment/source-code","415"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/reverse-proxies",component:p("/zh-Hans/docs/self-hosted/reverse-proxies","a9e"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/self-hosted/storage",component:p("/zh-Hans/docs/self-hosted/storage","969"),exact:!0,sidebar:"selfHosted"},{path:"/zh-Hans/docs/user-guide/",component:p("/zh-Hans/docs/user-guide/","859"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/apple-team",component:p("/zh-Hans/docs/user-guide/administrator/apple-team","38b"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/backup",component:p("/zh-Hans/docs/user-guide/administrator/backup","84e"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs","497"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics","4bd"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/logging",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/logging","f50"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/monitoring/system-info",component:p("/zh-Hans/docs/user-guide/administrator/monitoring/system-info","bd8"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/permissions",component:p("/zh-Hans/docs/user-guide/administrator/permissions","ac0"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/administrator/project-settings",component:p("/zh-Hans/docs/user-guide/administrator/project-settings","aec"),exact:!0},{path:"/zh-Hans/docs/user-guide/administrator/settings",component:p("/zh-Hans/docs/user-guide/administrator/settings","408"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/",component:p("/zh-Hans/docs/user-guide/apps/","243"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/create",component:p("/zh-Hans/docs/user-guide/apps/create","27d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/detail",component:p("/zh-Hans/docs/user-guide/apps/detail","ce1"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/apps/upload",component:p("/zh-Hans/docs/user-guide/apps/upload","0e8"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/best_practices",component:p("/zh-Hans/docs/user-guide/best_practices","7a2"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/changelog",component:p("/zh-Hans/docs/user-guide/changelog","6e5"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/credits",component:p("/zh-Hans/docs/user-guide/credits","6de"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/dashboard",component:p("/zh-Hans/docs/user-guide/dashboard","5aa"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/",component:p("/zh-Hans/docs/user-guide/debug-files/","8d4"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/review",component:p("/zh-Hans/docs/user-guide/debug-files/review","24d"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/debug-files/upload",component:p("/zh-Hans/docs/user-guide/debug-files/upload","503"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/qa",component:p("/zh-Hans/docs/user-guide/qa","8b7"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/toolkits/fetch-udid",component:p("/zh-Hans/docs/user-guide/toolkits/fetch-udid","847"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/toolkits/teardown",component:p("/zh-Hans/docs/user-guide/toolkits/teardown","8ee"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks",component:p("/zh-Hans/docs/user-guide/webhooks","936"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/dingtalk",component:p("/zh-Hans/docs/user-guide/webhooks/dingtalk","e82"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/discord",component:p("/zh-Hans/docs/user-guide/webhooks/discord","f58"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/feishu",component:p("/zh-Hans/docs/user-guide/webhooks/feishu","5bb"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/slack",component:p("/zh-Hans/docs/user-guide/webhooks/slack","4b3"),exact:!0,sidebar:"userGuide"},{path:"/zh-Hans/docs/user-guide/webhooks/wecom",component:p("/zh-Hans/docs/user-guide/webhooks/wecom","82b"),exact:!0,sidebar:"userGuide"}]},{path:"/zh-Hans/",component:p("/zh-Hans/","df2"),exact:!0},{path:"*",component:p("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>a});var r=n(7294);const o=r.createContext(!1);function a(e){let{children:t}=e;const[n,a]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{a(!0)}),[]),r.createElement(o.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),o=n(3935),a=n(3727),s=n(405),i=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),h=n(5742),g=n(2263),m=n(4996),b=n(6668),v=n(1944),y=n(4711),x=n(9727),w=n(3320),k=n(197);function z(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(h.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:o}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:o})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),o=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,c.TH)();return e+(0,m.Z)(t)}(),a=t?`${n}${t}`:o;return r.createElement(h.Z,null,r.createElement("meta",{property:"og:url",content:a}),r.createElement("link",{rel:"canonical",href:a}))}function E(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(h.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:x.h})),n&&r.createElement(v.d,{image:n}),r.createElement(_,null),r.createElement(z,null),r.createElement(k.Z,{tag:w.HX,locale:e}),r.createElement(h.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const H=new Map;function S(e){if(H.has(e.pathname))return{...e,pathname:H.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return H.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return H.set(e.pathname,t),{...e,pathname:t}}var C=n(8934),T=n(8940);function L(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const A=function(e){let{children:t,location:n,previousLocation:o}=e;return(0,r.useLayoutEffect)((()=>{o!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:s}=t;if(s){const e=decodeURIComponent(s.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:o}),L("onRouteDidUpdate",{previousLocation:o,location:n}))}),[o,n]),t};function N(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class P extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=i.Z.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(A,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const O=P,I="__docusaurus-base-url-issue-banner-container",R="__docusaurus-base-url-issue-banner",D="__docusaurus-base-url-issue-banner-suggestion-container",M="__DOCUSAURUS_INSERT_BASEURL_BANNER";function G(e){return`\nwindow['${M}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${M}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${I}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n\n
Your Docusaurus site did not load properly.
\n
A very common reason is a wrong site baseUrl configuration .
\n
Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\n
We suggest trying baseUrl =
\n
\n`}(e)).replace(/{window[M]=!1}),[]),r.createElement(r.Fragment,null,!i.Z.canUseDOM&&r.createElement(h.Z,null,r.createElement("script",null,G(e))),r.createElement("div",{id:I}))}function B(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(F,null):null}function j(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:o,localeConfigs:a}}=(0,g.Z)(),s=(0,m.Z)(e),{htmlLang:i,direction:l}=a[o];return r.createElement(h.Z,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:s}))}var $=n(4763);function U(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement($.Z,null,r.createElement(T.M,null,r.createElement(C.t,null,r.createElement(p,null,r.createElement(j,null),r.createElement(E,null),r.createElement(B,null),r.createElement(O,{location:S(t)},e)))))}var Z=n(6887);const V=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var q=n(9670);const W=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(Z).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?V(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),N(e))},Q=Object.freeze(X);if(i.Z.canUseDOM){window.docusaurus=Q;const e=o.hydrate;N(window.location.pathname).then((()=>{e(r.createElement(s.B6,null,r.createElement(a.VK,null,r.createElement(U,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/zh-Hans/docs","versions":[{"name":"current","label":"\u5f00\u53d1\u7248\u672c \ud83d\udea7","isLast":false,"path":"/zh-Hans/docs/next","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/next/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/next/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/next/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/next/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/next/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/next/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/next/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/next/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/next/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/next/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/next/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/next/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/next/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/next/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/next/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/next/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/next/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/next/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/next/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/next/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/next/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/next/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/next/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/next/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/next/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/next/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/next/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/next/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/next/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/next/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/next/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/settings","path":"/zh-Hans/docs/next/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/next/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/zh-Hans/docs/next/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/zh-Hans/docs/next/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/zh-Hans/docs/next/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/next/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/next/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/next/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/next/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/zh-Hans/docs/next/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/zh-Hans/docs/next/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/next/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/next/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/next/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/next/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/next/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/next/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/next/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/next/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/next/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/next/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/next/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/next/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/next/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/next/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/next/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/next/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/next/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/next/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/next/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/next/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/next/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/next/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/next/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/next/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/next/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}},{"name":"5.0.0","label":"5.0.0","isLast":true,"path":"/zh-Hans/docs","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/zh-Hans/docs/user-guide/administrator/project-settings"},{"id":"user-guide/administrator/settings","path":"/zh-Hans/docs/user-guide/administrator/settings","sidebar":"userGuide"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/apps/detail","path":"/zh-Hans/docs/user-guide/apps/detail","sidebar":"userGuide"},{"id":"user-guide/apps/index","path":"/zh-Hans/docs/user-guide/apps/","sidebar":"userGuide"},{"id":"user-guide/apps/upload","path":"/zh-Hans/docs/user-guide/apps/upload","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/index","path":"/zh-Hans/docs/user-guide/debug-files/","sidebar":"userGuide"},{"id":"user-guide/debug-files/review","path":"/zh-Hans/docs/user-guide/debug-files/review","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}},{"name":"4.x","label":"4.x","isLast":false,"path":"/zh-Hans/docs/4.x","mainDocId":"self-hosted/index","docs":[{"id":"contributing-guide/index","path":"/zh-Hans/docs/4.x/contributing-guide/","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/devcontainer","path":"/zh-Hans/docs/4.x/contributing-guide/local-development/devcontainer","sidebar":"contributingGuide"},{"id":"contributing-guide/local-development/source-code","path":"/zh-Hans/docs/4.x/contributing-guide/local-development/source-code","sidebar":"contributingGuide"},{"id":"developer-guide/api","path":"/zh-Hans/docs/4.x/developer-guide/api","sidebar":"developerGuide"},{"id":"developer-guide/api/apps","path":"/zh-Hans/docs/4.x/developer-guide/api/apps","sidebar":"developerGuide"},{"id":"developer-guide/api/debug_files","path":"/zh-Hans/docs/4.x/developer-guide/api/debug_files","sidebar":"developerGuide"},{"id":"developer-guide/fastlane","path":"/zh-Hans/docs/4.x/developer-guide/fastlane","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_debug_file","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_debug_file","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_sync_devices","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_sync_devices","sidebar":"developerGuide"},{"id":"developer-guide/fastlane/zealot_version_check","path":"/zh-Hans/docs/4.x/developer-guide/fastlane/zealot_version_check","sidebar":"developerGuide"},{"id":"developer-guide/index","path":"/zh-Hans/docs/4.x/developer-guide/","sidebar":"developerGuide"},{"id":"developer-guide/sdk/android","path":"/zh-Hans/docs/4.x/developer-guide/sdk/android","sidebar":"developerGuide"},{"id":"developer-guide/sdk/ios","path":"/zh-Hans/docs/4.x/developer-guide/sdk/ios","sidebar":"developerGuide"},{"id":"self-hosted/configuration/environment-variables","path":"/zh-Hans/docs/4.x/self-hosted/configuration/environment-variables","sidebar":"selfHosted"},{"id":"self-hosted/configuration/schedule-jobs","path":"/zh-Hans/docs/4.x/self-hosted/configuration/schedule-jobs","sidebar":"selfHosted"},{"id":"self-hosted/configuration/third-party-authentication","path":"/zh-Hans/docs/4.x/self-hosted/configuration/third-party-authentication","sidebar":"selfHosted"},{"id":"self-hosted/deployment/architecture","path":"/zh-Hans/docs/4.x/self-hosted/deployment/architecture","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker","path":"/zh-Hans/docs/4.x/self-hosted/deployment/docker","sidebar":"selfHosted"},{"id":"self-hosted/deployment/docker/step-by-step","path":"/zh-Hans/docs/4.x/self-hosted/deployment/docker/step-by-step","sidebar":"selfHosted"},{"id":"self-hosted/deployment/fly","path":"/zh-Hans/docs/4.x/self-hosted/deployment/fly","sidebar":"selfHosted"},{"id":"self-hosted/deployment/kubernetes","path":"/zh-Hans/docs/4.x/self-hosted/deployment/kubernetes","sidebar":"selfHosted"},{"id":"self-hosted/deployment/nomad","path":"/zh-Hans/docs/4.x/self-hosted/deployment/nomad","sidebar":"selfHosted"},{"id":"self-hosted/deployment/railway","path":"/zh-Hans/docs/4.x/self-hosted/deployment/railway","sidebar":"selfHosted"},{"id":"self-hosted/deployment/render","path":"/zh-Hans/docs/4.x/self-hosted/deployment/render","sidebar":"selfHosted"},{"id":"self-hosted/deployment/requirements","path":"/zh-Hans/docs/4.x/self-hosted/deployment/requirements","sidebar":"selfHosted"},{"id":"self-hosted/deployment/source-code","path":"/zh-Hans/docs/4.x/self-hosted/deployment/source-code","sidebar":"selfHosted"},{"id":"self-hosted/index","path":"/zh-Hans/docs/4.x/self-hosted/","sidebar":"selfHosted"},{"id":"self-hosted/reverse-proxies","path":"/zh-Hans/docs/4.x/self-hosted/reverse-proxies","sidebar":"selfHosted"},{"id":"self-hosted/storage","path":"/zh-Hans/docs/4.x/self-hosted/storage","sidebar":"selfHosted"},{"id":"user-guide/administrator/apple-team","path":"/zh-Hans/docs/4.x/user-guide/administrator/apple-team","sidebar":"userGuide"},{"id":"user-guide/administrator/backup","path":"/zh-Hans/docs/4.x/user-guide/administrator/backup","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/background-jobs","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/background-jobs","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/database-analytics","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/database-analytics","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/logging","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/logging","sidebar":"userGuide"},{"id":"user-guide/administrator/monitoring/system-info","path":"/zh-Hans/docs/4.x/user-guide/administrator/monitoring/system-info","sidebar":"userGuide"},{"id":"user-guide/administrator/permissions","path":"/zh-Hans/docs/4.x/user-guide/administrator/permissions","sidebar":"userGuide"},{"id":"user-guide/administrator/project-settings","path":"/zh-Hans/docs/4.x/user-guide/administrator/project-settings"},{"id":"user-guide/apps/create","path":"/zh-Hans/docs/4.x/user-guide/apps/create","sidebar":"userGuide"},{"id":"user-guide/best_practices","path":"/zh-Hans/docs/4.x/user-guide/best_practices","sidebar":"userGuide"},{"id":"user-guide/changelog","path":"/zh-Hans/docs/4.x/user-guide/changelog","sidebar":"userGuide"},{"id":"user-guide/credits","path":"/zh-Hans/docs/4.x/user-guide/credits","sidebar":"userGuide"},{"id":"user-guide/dashboard","path":"/zh-Hans/docs/4.x/user-guide/dashboard","sidebar":"userGuide"},{"id":"user-guide/debug-files/upload","path":"/zh-Hans/docs/4.x/user-guide/debug-files/upload","sidebar":"userGuide"},{"id":"user-guide/index","path":"/zh-Hans/docs/4.x/user-guide/","sidebar":"userGuide"},{"id":"user-guide/qa","path":"/zh-Hans/docs/4.x/user-guide/qa","sidebar":"userGuide"},{"id":"user-guide/toolkits/fetch-udid","path":"/zh-Hans/docs/4.x/user-guide/toolkits/fetch-udid","sidebar":"userGuide"},{"id":"user-guide/toolkits/teardown","path":"/zh-Hans/docs/4.x/user-guide/toolkits/teardown","sidebar":"userGuide"},{"id":"user-guide/webhooks","path":"/zh-Hans/docs/4.x/user-guide/webhooks","sidebar":"userGuide"},{"id":"user-guide/webhooks/dingtalk","path":"/zh-Hans/docs/4.x/user-guide/webhooks/dingtalk","sidebar":"userGuide"},{"id":"user-guide/webhooks/discord","path":"/zh-Hans/docs/4.x/user-guide/webhooks/discord","sidebar":"userGuide"},{"id":"user-guide/webhooks/feishu","path":"/zh-Hans/docs/4.x/user-guide/webhooks/feishu","sidebar":"userGuide"},{"id":"user-guide/webhooks/slack","path":"/zh-Hans/docs/4.x/user-guide/webhooks/slack","sidebar":"userGuide"},{"id":"user-guide/webhooks/wecom","path":"/zh-Hans/docs/4.x/user-guide/webhooks/wecom","sidebar":"userGuide"},{"id":"/category/deployment","path":"/zh-Hans/docs/4.x/category/deployment","sidebar":"selfHosted"},{"id":"/category/cloud-provider-guides","path":"/zh-Hans/docs/4.x/category/cloud-provider-guides","sidebar":"selfHosted"},{"id":"/category/configuration","path":"/zh-Hans/docs/4.x/category/configuration","sidebar":"selfHosted"},{"id":"/category/apps","path":"/zh-Hans/docs/4.x/category/apps","sidebar":"userGuide"},{"id":"/category/debug-files","path":"/zh-Hans/docs/4.x/category/debug-files","sidebar":"userGuide"},{"id":"/category/toolkits","path":"/zh-Hans/docs/4.x/category/toolkits","sidebar":"userGuide"},{"id":"/category/administrator","path":"/zh-Hans/docs/4.x/category/administrator","sidebar":"userGuide"},{"id":"/category/monitoring","path":"/zh-Hans/docs/4.x/category/monitoring","sidebar":"userGuide"},{"id":"/category/sdks","path":"/zh-Hans/docs/4.x/category/sdks","sidebar":"developerGuide"},{"id":"/category/local-development","path":"/zh-Hans/docs/4.x/category/local-development","sidebar":"contributingGuide"}],"draftIds":[],"sidebars":{"selfHosted":{"link":{"path":"/zh-Hans/docs/4.x/self-hosted/","label":"\u51c6\u5907\u5f00\u59cb"}},"userGuide":{"link":{"path":"/zh-Hans/docs/4.x/user-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"developerGuide":{"link":{"path":"/zh-Hans/docs/4.x/developer-guide/","label":"\u51c6\u5907\u5f00\u59cb"}},"contributingGuide":{"link":{"path":"/zh-Hans/docs/4.x/contributing-guide/","label":"\u51c6\u5907\u5f00\u59cb"}}}}],"breadcrumbs":true}}}'),s=JSON.parse('{"defaultLocale":"en","locales":["en","zh-Hans"],"path":"i18n","currentLocale":"zh-Hans","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"zh-Hans":{"label":"\u7b80\u4f53\u4e2d\u6587","direction":"ltr","htmlLang":"zh-Hans","calendar":"gregory","path":"zh-Hans"}}}');var i=n(7529);const l=JSON.parse('{"docusaurusVersion":"2.4.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"}}}'),u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:s,codeTranslations:i},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),o=n(412),a=n(5742),s=n(8780),i=n(7961);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,s.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(a.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(405);function a(e){return r.createElement(o.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7462),o=n(7294),a=n(3727),s=n(8780),i=n(2263),l=n(3919),u=n(412);const c=o.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:x}}=(0,i.Z)(),{withBaseUrl:w}=(0,d.C)(),k=(0,o.useContext)(c),z=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(()=>z.current));const _=p||f;const E=(0,l.Z)(_),H=_?.replace("pathname://","");let S=void 0!==H?(C=H,b&&(e=>e.startsWith("/"))(C)?w(C):C):void 0;var C;S&&E&&(S=(0,s.applyTrailingSlash)(S,{trailingSlash:y,baseUrl:x}));const T=(0,o.useRef)(!1),L=n?a.OL:a.rU,A=u.Z.canUseIntersectionObserver,N=(0,o.useRef)(),P=()=>{T.current||null==S||(window.docusaurus.preload(S),T.current=!0)};(0,o.useEffect)((()=>(!A&&E&&null!=S&&window.docusaurus.prefetch(S),()=>{A&&N.current&&N.current.disconnect()})),[N,S,A,E]);const O=S?.startsWith("#")??!1,I=!S||!E||O;return I||m||k.collectLink(S),I?o.createElement("a",(0,r.Z)({ref:z,href:S},_&&!E&&{target:"_blank",rel:"noopener noreferrer"},v)):o.createElement(L,(0,r.Z)({},v,{onMouseEnter:P,onTouchStart:P,innerRef:e=>{z.current=e,A&&e&&E&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=S&&window.docusaurus.prefetch(S))}))})),N.current.observe(e))},to:S},n&&{isActive:g,activeClassName:h}))}const f=o.forwardRef(p)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>i});var r=n(7294);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var a=n(7529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return a[t??n]??n??t}function i(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function l(e){let{children:t,id:n,values:a}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return r.createElement(r.Fragment,null,o(i,a))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>s,Z:()=>i});var r=n(7294),o=n(2263),a=n(3919);function s(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:s=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const i=n.startsWith(t)?n:t+n.replace(/^\//,"");return s?e+i:i}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=s();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8940);function a(){return(0,r.useContext)(o._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8934);function a(){return(0,r.useContext)(o._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,s]=n;const i=o?`${o}.${a}`:a;r(s)?e(s,i):t[i]=s}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>a});var r=n(7294);const o=r.createContext(null);function a(e){let{children:t,value:n}=e;const a=r.useContext(o),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:a,value:n})),[a,n]);return r.createElement(o.Provider,{value:s},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>p,_r:()=>c,Jo:()=>m,zh:()=>d,yW:()=>h,gB:()=>f});var r=n(6550),o=n(2263),a=n(9935);function s(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const i=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=i(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},c=()=>s("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=s(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function f(e){return d(e).versions}function h(e){const t=d(e);return i(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return l(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=i(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(1472)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);const o={iconExternalLink:"iconExternalLink_nPIU"};function a(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:o.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>dt});var r=n(7294),o=n(6010),a=n(4763),s=n(1944),i=n(7462),l=n(6550),u=n(5999),c=n(5936);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,u.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??h,{containerRef:n,onClick:o}=f();return r.createElement("div",{ref:n,role:"region","aria-label":h},r.createElement("a",(0,i.Z)({},e,{href:`#${d}`,onClick:o}),t))}var m=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var x=n(6668),w=n(9689);function k(e){let{width:t=21,height:n=21,color:o="currentColor",strokeWidth:a=1.2,className:s,...l}=e;return r.createElement("svg",(0,i.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:o,strokeWidth:a},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const z={closeButton:"closeButton_CVFx"};function _(e){return r.createElement("button",(0,i.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,o.Z)("clean-btn close",z.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const E={content:"content_knG7"};function H(e){const{announcementBar:t}=(0,x.L)(),{content:n}=t;return r.createElement("div",(0,i.Z)({},e,{className:(0,o.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const S={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function C(){const{announcementBar:e}=(0,x.L)(),{isActive:t,close:n}=(0,w.nT)();if(!t)return null;const{backgroundColor:o,textColor:a,isCloseable:s}=e;return r.createElement("div",{className:S.announcementBar,style:{backgroundColor:o,color:a},role:"banner"},s&&r.createElement("div",{className:S.announcementBarPlaceholder}),r.createElement(H,{className:S.announcementBarContent}),s&&r.createElement(_,{onClick:n,className:S.announcementBarClose}))}var T=n(3163),L=n(2466);var A=n(902),N=n(3102);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,T.e)(),t=(0,N.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,s=(0,A.D9)(a);return(0,r.useEffect)((()=>{a&&!s&&o(!0)}),[a,s]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return r.createElement(P.Provider,{value:n},t)}function I(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function R(){const e=(0,r.useContext)(P);if(!e)throw new A.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:a}=e;const{shown:s}=R();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":s})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},a)))}var M=n(2949),G=n(2389);function F(e){return r.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function B(e){return r.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const j={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,buttonClassName:n,value:a,onChange:s}=e;const i=(0,G.Z)(),l=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===a?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,o.Z)(j.toggle,t)},r.createElement("button",{className:(0,o.Z)("clean-btn",j.toggleButton,!i&&j.toggleButtonDisabled,n),type:"button",onClick:()=>s("dark"===a?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(F,{className:(0,o.Z)(j.toggleIcon,j.lightToggleIcon)}),r.createElement(B,{className:(0,o.Z)(j.toggleIcon,j.darkToggleIcon)})))}const U=r.memo($),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,x.L)().navbar.style,o=(0,x.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:s}=(0,M.I)();return o?null:r.createElement(U,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:a,onChange:s})}var q=n(1327);function W(){return r.createElement(q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,T.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:o,href:a,label:s,html:l,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const p=(0,Q.Z)(o),f=(0,Q.Z)(t),h=(0,Q.Z)(a,{forcePrependBaseUrl:!0}),g=s&&a&&!(0,J.Z)(a),m=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,s,g&&r.createElement(te.Z,u&&{width:12,height:12}))};return a?r.createElement(X.Z,(0,i.Z)({href:c?h:a},d,m)):r.createElement(X.Z,(0,i.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},d,m))}function re(e){let{className:t,isDropdownItem:n=!1,...a}=e;const s=r.createElement(ne,(0,i.Z)({className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},a));return n?r.createElement("li",null,s):s}function oe(e){let{className:t,isDropdownItem:n,...a}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,i.Z)({className:(0,o.Z)("menu__link",t)},a)))}function ae(e){let{mobile:t=!1,position:n,...o}=e;const a=t?oe:re;return r.createElement(a,(0,i.Z)({},o,{activeClassName:o.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var se=n(6043),ie=n(8596),le=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:a,onClick:s,...l}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,i.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,o.Z)("navbar__link",a)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(_e,(0,i.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:a,onClick:s,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,se.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),r.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,i.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),f()}}),u.children??u.label),r.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(_e,(0,i.Z)({mobile:!0,isDropdownItem:!0,onClick:s,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const o=t?de:ce;return r.createElement(o,n)}var fe=n(4711);function he(e){let{width:t=20,height:n=20,...o}=e;return r.createElement("svg",(0,i.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},o),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ge="iconLanguage_nlXk";var me=n(1875);const be={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,o.Z)(n,be.searchBox)},t)}var ye=n(143),xe=n(3438);var we=n(373);const ke=e=>e.docs.find((t=>t.id===e.mainDocId));const ze={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:o,...a}=e;const{i18n:{currentLocale:s,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:h}=(0,l.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===s?t?"menu__link--active":"dropdown__link--active":""}})),...o],m=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[s].label;return r.createElement(pe,(0,i.Z)({},a,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(he,{className:ge}),m),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(me.Z,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:a=!1,isDropdownItem:s=!1}=e;const i=s?"li":"div";return r.createElement(i,{className:(0,o.Z)({navbar__item:!a&&!s,"menu__list-item":a},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:s}=(0,ye.Iw)(o),l=(0,xe.vY)(t,o);return null===l?null:r.createElement(ae,(0,i.Z)({exact:!0},a,{isActive:()=>s?.path===l.path||!!s?.sidebar&&s.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:o,...a}=e;const{activeDoc:s}=(0,ye.Iw)(o),l=(0,xe.oz)(t,o).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,i.Z)({exact:!0},a,{isActive:()=>s?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:o,...a}=e;const s=(0,xe.lO)(o)[0],l=t??s.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(s).path;return r.createElement(ae,(0,i.Z)({},a,{label:l,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:o,dropdownItemsBefore:a,dropdownItemsAfter:s,...c}=e;const{search:d,hash:p}=(0,l.TH)(),f=(0,ye.Iw)(n),h=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,we.J)(n),m=[...a,...h.map((e=>{const t=f.alternateDocVersions[e.name]??ke(e);return{label:e.label,to:`${t.path}${d}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...s],b=(0,xe.lO)(n)[0],v=t&&m.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&m.length>1?void 0:ke(b).path;return m.length<=1?r.createElement(ae,(0,i.Z)({},c,{mobile:t,label:v,to:y,isActive:o?()=>!1:void 0})):r.createElement(pe,(0,i.Z)({},c,{mobile:t,label:v,to:y,items:m,isActive:o?()=>!1:void 0}))}};function _e(e){let{type:t,...n}=e;const o=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=ze[o];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(a,n)}function Ee(){const e=(0,T.e)(),t=(0,x.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(_e,(0,i.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function He(e){return r.createElement("button",(0,i.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Se(){const e=0===(0,x.L)().navbar.items.length,t=R();return r.createElement(r.Fragment,null,!e&&r.createElement(He,{onClick:()=>t.hide()}),t.content)}function Ce(){const e=(0,T.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(D,{header:r.createElement(K,null),primaryMenu:r.createElement(Ee,null),secondaryMenu:r.createElement(Se,null)}):null}const Te={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return r.createElement("div",(0,i.Z)({role:"presentation"},e,{className:(0,o.Z)("navbar-sidebar__backdrop",e.className)}))}function Ae(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,x.L)(),s=(0,T.e)(),{navbarRef:i,isNavbarVisible:l}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),s=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)(((t,r)=>{let{scrollY:s}=t;if(!e)return;if(s=i?n(!1):s+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:s,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:i,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Te.navbarHideable,!l&&Te.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":s.shown})},t,r.createElement(Le,{onClick:s.toggle}),r.createElement(Ce,null))}var Ne=n(8780);const Pe={errorBoundaryError:"errorBoundaryError_a6uf"};function Oe(e){return r.createElement("button",(0,i.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function Ie(e){let{error:t}=e;const n=(0,Ne.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Pe.errorBoundaryError},n)}class Re extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const De="right";function Me(e){let{width:t=30,height:n=30,className:o,...a}=e;return r.createElement("svg",(0,i.Z)({className:o,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},a),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Ge(){const{toggle:e,shown:t}=(0,T.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(Me,null))}const Fe={colorModeToggle:"colorModeToggle_DEke"};function Be(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Re,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(_e,e)))))}function je(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function $e(){const e=(0,T.e)(),t=(0,x.L)().navbar.items,[n,o]=function(e){function t(e){return"left"===(e.position??De)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return r.createElement(je,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Ge,null),r.createElement(W,null),r.createElement(Be,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Be,{items:o}),r.createElement(V,{className:Fe.colorModeToggle}),!a&&r.createElement(ve,null,r.createElement(me.Z,null)))})}function Ue(){return r.createElement(Ae,null,r.createElement($e,null))}function Ze(e){let{item:t}=e;const{to:n,href:o,label:a,prependBaseUrlToHref:s,...l}=t,u=(0,Q.Z)(n),c=(0,Q.Z)(o,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,i.Z)({className:"footer__link-item"},o?{href:s?c:o}:{to:u},l),a,o&&!(0,J.Z)(o)&&r.createElement(te.Z,null))}function Ve(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Ze,{item:t}))}function qe(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Ve,{key:t,item:e})))))}function We(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(qe,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ze,{item:t})}function Xe(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Qe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(We,{columns:t}):r.createElement(Xe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),a={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:a,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:a,copyright:s}=e;return r.createElement("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(a||s)&&r.createElement("div",{className:"footer__bottom text--center"},a&&r.createElement("div",{className:"margin-bottom--sm"},a),s)))}function at(){const{footer:e}=(0,x.L)();if(!e)return null;const{copyright:t,links:n,logo:o,style:a}=e;return r.createElement(ot,{style:a,links:n&&n.length>0&&r.createElement(Qe,{links:n}),logo:o&&r.createElement(nt,{logo:o}),copyright:t&&r.createElement(rt,{copyright:t})})}const st=r.memo(at),it=(0,A.Qc)([M.S,w.pl,L.OC,we.L5,s.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(T.M,null,r.createElement(O,null,t)))}]);function lt(e){let{children:t}=e;return r.createElement(it,null,t)}function ut(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Oe,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Ie,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function dt(e){const{children:t,noFooter:n,wrapperClassName:i,title:l,description:u}=e;return(0,b.t)(),r.createElement(lt,null,r.createElement(s.d,{title:l,description:u}),r.createElement(y,null),r.createElement(C,null),r.createElement(Ue,null),r.createElement("div",{id:d,className:(0,o.Z)(m.k.wrapper.main,ct.mainWrapper,i)},r.createElement(a.Z,{fallback:e=>r.createElement(ut,e)},t)),!n&&r.createElement(st,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),o=n(7294),a=n(9960),s=n(4996),i=n(2263),l=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,s.Z)(t.src),dark:(0,s.Z)(t.srcDark||t.src)},i=o.createElement(u.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},i):i}function d(e){const{siteConfig:{title:t}}=(0,i.Z)(),{navbar:{title:n,logo:u}}=(0,l.L)(),{imageClassName:d,titleClassName:p,...f}=e,h=(0,s.Z)(u?.href||"/"),g=n?"":t,m=u?.alt??g;return o.createElement(a.Z,(0,r.Z)({to:h},f,u?.target&&{target:u.target}),u&&o.createElement(c,{logo:u,alt:m,imageClassName:d}),null!=n&&o.createElement("b",{className:p},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(5742);function a(e){let{locale:t,version:n,tag:a}=e;const s=t;return r.createElement(o.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),a&&r.createElement("meta",{name:"docusaurus_tag",content:a}),s&&r.createElement("meta",{name:"docsearch:language",content:s}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),a&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:a}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),o=n(7294),a=n(6010),s=n(2389),i=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,s.Z)(),{colorMode:n}=(0,i.I)(),{sources:u,className:c,alt:d,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return o.createElement(o.Fragment,null,f.map((e=>o.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,a.Z)(l.themedImage,l[`themedImage--${e}`],c)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>m});var r=n(7462),o=n(7294),a=n(412),s=n(1442);const i="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,o.useState)(t??!1),a=(0,o.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const a=(0,o.useRef)(!1);(0,o.useEffect)((()=>{const e=t.current;function o(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,s.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??i}`,height:`${t}px`}}function l(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return d(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!a.Z.canUseDOM)return e?u:c}function h(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:s,className:i,disableSSRStyle:l}=e;const u=(0,o.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:a}),o.createElement(t,{ref:u,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),s?.(n))},className:i},r)}function g(e){let{collapsed:t,...n}=e;const[a,s]=(0,o.useState)(!t),[i,l]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{t||s(!0)}),[t]),(0,o.useLayoutEffect)((()=>{a&&l(t)}),[a,t]),a?o.createElement(h,(0,r.Z)({},n,{collapsed:i})):null}function m(e){let{lazy:t,...n}=e;const r=t?g:h;return o.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>h,pl:()=>f});var r=n(7294),o=n(2389),a=n(12),s=n(902),i=n(6668);const l=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),c=()=>"true"===l.get(),d=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,i.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{a(c())}),[]);const s=(0,r.useCallback)((()=>{d(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:s})),[e,n,s])}();return r.createElement(p.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>m,S:()=>g});var r=n(7294),o=n(412),a=n(902),s=n(12),i=n(6668);const l=r.createContext(void 0),u="theme",c=(0,s.WA)(u),d={light:"light",dark:"dark"},p=e=>e===d.dark?d.dark:d.light,f=e=>o.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),h=e=>{c.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,i.L)(),[o,a]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&h(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===d.dark},setLightTheme(){s(d.light)},setDarkTheme(){s(d.dark)}})),[o,s])}();return r.createElement(l.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(l);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>m});var r=n(7294),o=n(143),a=n(9935),s=n(6668),i=n(3438),l=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function h(){const e=(0,o._r)(),t=(0,s.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,i]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{i(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),i((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return r.createElement(f.Provider,{value:n},t)}function m(e){let{children:t}=e;return i.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,s]=b(),{preferredVersionName:i}=n[e];return{preferredVersion:t.versions.find((e=>e.name===i))??null,savePreferredVersionName:(0,r.useCallback)((t=>{s.savePreferredVersion(e,t)}),[s,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>i});var r=n(7294),o=n(902);const a=Symbol("EmptyContext"),s=r.createContext(a);function i(e){let{children:t,name:n,items:o}=e;const a=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return r.createElement(s.Provider,{value:a},t)}function l(){const e=(0,r.useContext)(s);if(e===a)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>i,q:()=>s});var r=n(7294),o=n(902);const a=r.createContext(null);function s(e){let{children:t,version:n}=e;return r.createElement(a.Provider,{value:n},t)}function i(){const e=(0,r.useContext)(a);if(null===e)throw new o.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>p});var r=n(7294),o=n(3102),a=n(7524),s=n(1980),i=n(6668),l=n(902);const u=r.createContext(void 0);function c(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,i.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,u]=(0,r.useState)(!1);(0,s.Rb)((()=>{if(l)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function d(e){let{children:t}=e;const n=c();return r.createElement(u.Provider,{value:n},t)}function p(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>i,Zo:()=>l,n2:()=>s});var r=n(7294),o=n(902);const a=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(a.Provider,{value:n},t)}function i(){const e=(0,r.useContext)(a);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const s=(0,r.useContext)(a);if(!s)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,i]=s,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{i({component:t,props:l})}),[i,t,l]),(0,r.useEffect)((()=>()=>i({component:null,props:null})),[i]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(7294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},s=996;function i(){return o.Z.canUseDOM?window.innerWidth>s?a.desktop:a.mobile:a.ssr}const l=!1;function u(){const[e,t]=(0,r.useState)((()=>l?"ssr":i()));return(0,r.useEffect)((()=>{function e(){t(i())}const n=l?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>E,Wl:()=>h,_F:()=>v,cE:()=>p,hI:()=>_,jA:()=>g,lO:()=>w,oz:()=>k,s1:()=>x,vY:()=>z,xz:()=>f});var r=n(7294),o=n(6550),a=n(8790),s=n(143),i=n(373),l=n(4477),u=n(1116),c=n(7392),d=n(8596);const p=!!s._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function h(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=h(t);if(e)return e}}}function g(){const{pathname:e}=(0,o.TH)(),t=(0,u.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||b(e.items,t))}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,u.V)(),{pathname:t}=(0,o.TH)(),n=(0,s.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,s.Iw)(e),{preferredVersion:n}=(0,i.J)(e),o=(0,s.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([t,n,o].filter(Boolean))),[t,n,o])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function z(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const r=(0,o.TH)(),s=t.routes,i=s.find((e=>(0,o.LX)(r.pathname,e)));if(!i)return null;const l=i.sidebar,u=l?n.docsSidebars[l]:void 0;return{docElement:(0,a.H)(s),sidebarName:l,sidebarItems:u}}function E(e){return e.filter((e=>"category"!==e.type||!!h(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>l});var r=n(7294),o=n(6550),a=n(1688),s=n(902);function i(e){!function(e){const t=(0,o.k6)(),n=(0,s.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,o.k6)();return(0,a.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{j:()=>o,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>c,VC:()=>f});var r=n(7294),o=n(6010),a=n(5742),s=n(226);function i(){const e=r.useContext(s._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:o,image:s,children:i}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),p=s?d(s,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),o&&r.createElement("meta",{name:"keywords",content:Array.isArray(o)?o.join(","):o}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),i)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const s=r.useContext(d),i=(0,o.Z)(s,t);return r.createElement(d.Provider,{value:i},r.createElement(a.Z,null,r.createElement("html",{className:i})),n)}function f(e){let{children:t}=e;const n=i(),a=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const s=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,o.Z)(a,s)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>l,i6:()=>i,zX:()=>a});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function a(e){const t=(0,r.useRef)(e);return o((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return o((()=>{t.current=e})),t.current}class i extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>s,Ns:()=>i});var r=n(7294),o=n(723),a=n(2263);function s(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function i(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>l,RF:()=>d,o5:()=>p});var r=n(7294),o=n(412),a=n(2389),s=n(902);const i=r.createContext(void 0);function l(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(i.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(i);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const c=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(c()),a=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function p(){const e=u(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function f(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>o});n(2263);const r="default";function o(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>c});var r=n(7294),o=n(1688);const a="localStorage";function s(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const u={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=i(t?.persistence);return null===n?u:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),s({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),s({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?u:c(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,o.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>a});var r=n(2263),o=n(6550);function a(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:a}}=(0,r.Z)(),{pathname:s}=(0,o.TH)(),i=a===n?e:e.replace(`/${a}/`,"/"),l=s.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:o}=e;return`${o?t:""}${function(e){return e===n?`${i}`:`${i}${e}/`}(r)}${l}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>s});var r=n(7294),o=n(6550),a=n(902);function s(e){const t=(0,o.TH)(),n=(0,a.D9)(t),s=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&s({location:t,previousLocation:n})}),[s,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(s=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(s):function(e){return e.endsWith("/")?e.slice(0,-1):e}(s));var s;return e.replace(o,a)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;to});const o=function(){for(var e,t,n=0,o="";n{"use strict";n.d(t,{lX:()=>x,q_:()=>H,ob:()=>f,PP:()=>C,Ep:()=>p});var r=n(7462);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=s[p];"."===f?a(s,p):".."===f?(a(s,p),d++):d&&(a(s,p),d--)}if(!u)for(;d--;d)s.unshift("..");!u||""===s[0]||s[0]&&o(s[0])||s.unshift("");var h=s.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var i=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=s(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,g(),x.location);c.confirmTransitionTo(o,r,n,(function(e){e&&(x.entries[x.index]=o,d({action:r,location:o}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=x.index+e;return t>=0&&t{"use strict";var r=n(9864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function l(e){return r.isMemo(e)?s:i[e.$$typeof]||o}i[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[r.Memo]=s;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var s=c(n);d&&(s=s.concat(d(n)));for(var i=l(t),g=l(n),m=0;m{"use strict";e.exports=function(e,t,n,r,o,a,s,i){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,a,s,i],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:''};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function s(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),u=a.querySelector(r.barSelector),c=r.speed,d=r.easing;return a.offsetWidth,i((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,s(e,c,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,s=t.querySelector(r.barSelector),i=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return l(s,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(e,o){for(var a,s,i=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l{"use strict";n.d(t,{Z:()=>a});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);z+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof o)){var E,H=1;if(v){if(!(E=a(w,z,e,b))||E.index>=e.length)break;var S=E.index,C=E.index+E[0].length,T=z;for(T+=k.value.length;S>=T;)T+=(k=k.next).value.length;if(z=T-=k.value.length,k.value instanceof o)continue;for(var L=k;L!==t.tail&&(Td.reach&&(d.reach=O);var I=k.prev;if(N&&(I=l(t,I,N),z+=N.length),u(t,I,H),k=l(t,I,new o(p,m?r.tokenize(A,m):A,y,A)),P&&l(t,k,P),H>1){var R={cause:p+","+h,reach:O};s(e,t,n,k.prev,z,R),d&&R.reach>d.reach&&(d.reach=R.reach)}}}}}}function i(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function u(e,t,n){for(var r=t.next,o=0;o"+a.content+""+a.tag+">"},r}(),o=r;r.default=r,o.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},o.languages.markup.tag.inside["attr-value"].inside.entity=o.languages.markup.entity,o.languages.markup.doctype.inside["internal-subset"].inside=o.languages.markup,o.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(o.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:o.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:o.languages[t]};var a={};a[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},o.languages.insertBefore("markup","cdata",a)}}),Object.defineProperty(o.languages.markup.tag,"addAttribute",{value:function(e,t){o.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:o.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),o.languages.html=o.languages.markup,o.languages.mathml=o.languages.markup,o.languages.svg=o.languages.markup,o.languages.xml=o.languages.extend("markup",{}),o.languages.ssml=o.languages.xml,o.languages.atom=o.languages.xml,o.languages.rss=o.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,s=0;s]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},o.languages.c=o.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),o.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),o.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},o.languages.c.string],char:o.languages.c.char,comment:o.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:o.languages.c}}}}),o.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete o.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(o),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(o),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},o={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:o,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:o})}(o),o.languages.javascript=o.languages.extend("clike",{"class-name":[o.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),o.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,o.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:o.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:o.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:o.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:o.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:o.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),o.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:o.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),o.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),o.languages.markup&&(o.languages.markup.tag.addInlined("script","javascript"),o.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),o.languages.js=o.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(o),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function s(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<