diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index b2a047d82..4816e1d74 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,16 +1,27 @@
+
name: Bug 报告
description: 创建 Bug 报告以帮助开发者改进
title: "以简单的一段字概括你所遇到的问题"
+labels: ["bug"]
body:
- - type: markdown
+ - type: checkboxes
+ id: confirmation
attributes:
- value: |
- ## 反馈须知
- - 请务必完整填写下面的内容,如果缺少必要的信息,将无法解决任何问题
- - 一个 issue 请只反馈一个 bug 或功能建议,一次性反馈多个不同的问题或建议或将会被直接关闭
- - 注意你的标题,以简单的一段字概括你所遇到的问题。不要使用无意义内容或全部复制粘贴
- - 该项目不为任何旧版本提供维护支持,请务必确认已更新到最新版本
- - 应用仅支持系统硬件解码,如遇到播放卡顿或无法播放,请先检查设备芯片性能以及编码支持情况
+ label: 反馈须知确认
+ description: 在提交前请确认以下事项
+ options:
+ - label: 请务必完整填写下面的内容,如果缺少必要的信息,将无法解决任何问题
+ required: true
+ - label: 一个 issue 请只反馈一个 bug 或功能建议,一次性反馈多个不同的问题或建议将会被直接关闭
+ required: true
+ - label: 注意你的标题,以简单的一段字概括你所遇到的问题。不要使用无意义内容或全部复制粘贴
+ required: true
+ - label: 该项目不为除了 legacy support 的所有旧版本提供维护支持,请务必确认已更新到最新版本
+ required: true
+ - label: 应用仅支持系统硬件解码,如遇到播放卡顿或无法播放,请先检查设备芯片性能以及编码支持情况
+ required: true
+ - label: 我绝非未曾意识到,自己并非没有不敷衍了事的意图,也就是说,我无法否认我确实是抱着并非认真检查的态度,去执行了那个不取消全部勾选的操作。因此,我并非不同意这个 issue 不应该不被关闭。
+ required: false
- type: textarea
id: description
@@ -19,6 +30,7 @@ body:
attributes:
label: Bug 描述
description: 请简短地描述你遇到的问题
+
- type: textarea
id: steps
validations:
@@ -33,6 +45,7 @@ body:
2. 点击 '....'
3. 滚动到 '....'
4. 出现问题
+
- type: textarea
id: expected-behavior
validations:
@@ -40,11 +53,13 @@ body:
attributes:
label: 预期行为
description: 简要描述你希望看到什么样的结果
+
- type: textarea
id: screenshots
attributes:
label: 截图
description: 如果可以,提交截图更有助于我们分析问题
+
- type: dropdown
id: app-version-confirm-use-latest
validations:
@@ -54,8 +69,9 @@ body:
description: |

options:
- - '我正在使用旧版本'
- - '已更新到当前最新 Alpha 版'
+ - '我正在使用旧版本(不包括Legacy Support For Android5)'
+ - '已更新到当前最新 Alpha 版或者Legacy Support For Android5'
+
- type: input
id: app-version
validations:
@@ -63,6 +79,7 @@ body:
attributes:
label: 当前版本号
placeholder: 0.0.1.r29.a6d7ecb.release (或使用缩写例如 r29)
+
- type: input
id: android-version
validations:
@@ -70,16 +87,19 @@ body:
attributes:
label: Android 版本
placeholder: Android 13
+
- type: input
id: device-info
attributes:
label: 设备厂商及型号
placeholder: Sony - BRAVIA XR MASTER SERIES Z9K
+
- type: input
id: video
attributes:
label: 遇到问题的视频 avid 或 bvid
placeholder: av170001
+
- type: textarea
id: additional-logs
attributes:
@@ -88,6 +108,7 @@ body:
你可以在 `设置` > `更多设置` > `查看日志` 中查看已保存的日志,扫码即可下载获取(在同一网络环境下)
在日志列表中可找到自动生成的崩溃日志,或可在功能遇到问题(例如加载失败)后手动创建日志文件
上传文件时请务必等待文件上传完成后再提交 issue
+
- type: textarea
id: additional-content
attributes:
diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml
index 1926a94cc..e34075905 100644
--- a/.github/workflows/alpha.yml
+++ b/.github/workflows/alpha.yml
@@ -8,8 +8,8 @@ on:
jobs:
build-alpha:
name: Build Alpha Apk
- runs-on: macos-latest
- if: github.repository == 'aaa1115910/bv'
+ runs-on: ubuntu-latest
+ if: github.repository == 'Colorful-glassblock/bvcn'
steps:
- name: Checkout
@@ -19,10 +19,10 @@ jobs:
fetch-depth: 0
submodules: 'true'
- - name: Set up JDK 17
- uses: actions/setup-java@v4
+ - name: Set up JDK 21
+ uses: actions/setup-java@v5
with:
- java-version: '17'
+ java-version: '21'
distribution: 'temurin'
- name: Setup Gradle to generate and submit dependency graphs
@@ -43,12 +43,12 @@ jobs:
SIGNING_PROPERTIES: ${{ secrets.SIGNING_PROPERTIES }}
run: |
echo ${{ secrets.SIGNING_PROPERTIES }} > encoded_signing_properties
- base64 -Dd -i encoded_signing_properties > signing.properties
+ base64 -d -i encoded_signing_properties > signing.properties
- name: Add jks file
run: |
echo ${{ secrets.SIGN_KEY }} > ./encoded_key
- base64 -Dd -i encoded_key > key.jks
+ base64 -d -i encoded_key > key.jks
- name: Build apk
run: ./gradlew assembleDefaultAlpha assembleDefaultDebug
diff --git a/.github/workflows/alpha_build_manually_without_sign.yml b/.github/workflows/alpha_build_manually_without_sign.yml
index 2edbab218..097d8f355 100644
--- a/.github/workflows/alpha_build_manually_without_sign.yml
+++ b/.github/workflows/alpha_build_manually_without_sign.yml
@@ -9,7 +9,7 @@ on:
jobs:
build-alpha:
- runs-on: macos-latest
+ runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -19,10 +19,10 @@ jobs:
fetch-depth: 0
submodules: 'true'
- - name: Set up JDK 17
- uses: actions/setup-java@v4
+ - name: Set up JDK 21
+ uses: actions/setup-java@v5
with:
- java-version: '17'
+ java-version: '21'
distribution: 'temurin'
- name: Write google-services.json
diff --git a/.github/workflows/auto_close_issues.yml b/.github/workflows/auto_close_issues.yml
index 216b61c91..79cc4a62d 100644
--- a/.github/workflows/auto_close_issues.yml
+++ b/.github/workflows/auto_close_issues.yml
@@ -1,30 +1,339 @@
-name: Check Issues
+name: Check Bug Reports
on:
issues:
- types: [ opened ]
+ types: [opened, edited]
+
+permissions:
+ contents: read
+ issues: write
+ pull-requests: read
+
jobs:
- check:
+ check-bug-report:
+ # 只检查 Bug 报告模板
+ if: contains(github.event.issue.labels.*.name, 'bug') || contains(github.event.issue.body, 'Bug 报告')
runs-on: ubuntu-latest
+ outputs:
+ violations: ${{ steps.collect-violations.outputs.violations }}
+ should_close: ${{ steps.collect-violations.outputs.should_close }}
steps:
- - if: contains(github.event.issue.title, '以简单的一段字概括' )
- id: close-invalid-title
- name: Close Issue (invalid title)
- uses: actions-cool/issues-helper@v3
+ - uses: actions/checkout@v3
with:
- actions: 'add-labels,close-issue'
- token: ${{ secrets.GITHUB_TOKEN }}
- issue-number: ${{ github.event.issue.number }}
- labels: '无效'
- close-reason: 'not_planned'
-
- - if: contains(github.event.issue.body, '我正在使用旧版本' )
- id: close-old-version
- name: Close Issue (old version)
- uses: actions-cool/issues-helper@v3
+ persist-credentials: false
+
+ # 第一步:收集所有违规点
+ - name: Collect all violations
+ id: collect-violations
+ uses: actions/github-script@v6
+ with:
+ github-token: ${{ secrets.ISSUE_CHECKER_PAT }}
+ script: |
+ const body = context.payload.issue.body;
+ const title = context.payload.issue.title;
+
+ // 存储所有违规
+ const violations = [];
+
+ // 辅助函数:提取字段内容
+ function extractField(pattern) {
+ const match = body.match(pattern);
+ if (!match) return '';
+ return match[1] ? match[1].trim() : '';
+ }
+
+ // 辅助函数:检查字段长度
+ function checkFieldLength(content, fieldName, minLength = 25) {
+ if (!content || content === '' || content.length < minLength) {
+ violations.push({
+ type: fieldName,
+ message: `❌ **${fieldName} 不详细**:当前内容 ${content.length} 字,需要至少 ${minLength} 字的具体描述`
+ });
+ return false;
+ }
+ return true;
+ }
+
+ // 1. 检查标题
+ if (title.includes('以简单的一段字概括')) {
+ violations.push({
+ type: '标题',
+ message: '❌ **标题违规**:使用默认标题,未修改为具体问题描述'
+ });
+ } else if (title.length < 10) {
+ violations.push({
+ type: '标题',
+ message: '❌ **标题太短**:请使用更具体的描述(至少10字)'
+ });
+ }
+
+ // 2. 检查复选框
+ const checkboxLines = body.split('\n').filter(line => line.trim().startsWith('- [') || line.trim().startsWith('- [x]'));
+ console.log(`找到 ${checkboxLines.length} 个复选框行`);
+
+ if (checkboxLines.length >= 6) {
+ // 分别检查每个复选框的状态
+ for (let i = 0; i < checkboxLines.length; i++) {
+ const line = checkboxLines[i];
+ const isChecked = line.includes('- [x]');
+ const text = line.replace(/-\s\[[x\s]\]\s/, '').trim();
+
+ console.log(`复选框 ${i+1}: checked=${isChecked}, text="${text.substring(0, 30)}..."`);
+
+ // 前5项必须勾选
+ if (i < 5) {
+ if (!isChecked) {
+ violations.push({
+ type: '复选框',
+ message: `❌ **必选项未勾选**:第 ${i+1} 项未确认 - "${text.substring(0, 30)}..."`
+ });
+ }
+ }
+
+ // 最后一项(文字游戏)必须不勾选
+ if (i === 5) {
+ // 检查是否包含文字游戏的关键词
+ const isTrickQuestion = text.includes('绝非未曾意识到') ||
+ text.includes('并非没有不敷衍') ||
+ text.includes('无法否认') ||
+ text.includes('不取消全部勾选') ||
+ text.includes('不应该不被关闭');
+
+ if (isTrickQuestion) {
+ if (isChecked) {
+ violations.push({
+ type: '筛选项',
+ message: '❌ **筛选项被误勾**:最后一项本不应勾选,说明您没有认真阅读'
+ });
+ }
+ }
+ }
+ }
+ } else {
+ violations.push({
+ type: '模板',
+ message: '❌ **模板不完整**:未使用完整的 Bug 报告模板'
+ });
+ }
+
+ // 3. 检查 Bug 描述 (至少25字)
+ const description = extractField(/### Bug 描述\n\n([\s\S]*?)(?=\n### |\n$)/);
+ checkFieldLength(description, 'Bug 描述', 25);
+
+ // 4. 检查复现步骤 (至少25字)
+ const steps = extractField(/### 复现问题的步骤\n\n([\s\S]*?)(?=\n### |\n$)/);
+ if (!checkFieldLength(steps, '复现步骤', 25)) {
+ // 额外检查是否包含示例步骤
+ if (steps.includes('示例步骤') || steps.includes('1. 进入')) {
+ violations.push({
+ type: '复现步骤',
+ message: '❌ **复现步骤未修改**:请删除示例步骤,填写真实的操作步骤'
+ });
+ }
+ }
+
+ // 5. 检查预期行为 (至少15字)
+ const expected = extractField(/### 预期行为\n\n([\s\S]*?)(?=\n### |\n$)/);
+ checkFieldLength(expected, '预期行为', 15);
+
+ // 6. 检查截图 - 如果有图片链接就算有
+ const screenshots = extractField(/### 截图\n\n([\s\S]*?)(?=\n### |\n$)/);
+ const hasScreenshots = screenshots &&
+ screenshots !== '' &&
+ !screenshots.includes('No response') &&
+ (screenshots.includes('http') || screenshots.includes('![') || screenshots.length > 10);
+
+ if (!hasScreenshots) {
+ violations.push({
+ type: '截图',
+ message: '⚠️ **建议添加截图**:添加截图有助于更快定位问题'
+ });
+ }
+
+ // 7. 检查版本选择
+ if (body.includes('我正在使用旧版本')) {
+ violations.push({
+ type: '旧版本',
+ message: '❌ **使用旧版本**:本项目不为旧版本提供维护支持,请更新到最新版'
+ });
+ }
+
+ // 8. 检查版本号 - 支持 r114 格式
+ const version = extractField(/### 当前版本号\n\n([\s\S]*?)(?=\n### |\n$)/);
+ // 版本号有效格式:r114、r29、1.2.3、v1.2.3、或任何长度>=2的非默认内容
+ const isValidVersion = version &&
+ version !== '' &&
+ !version.includes('0.0.1') && // 不是默认值
+ !version.includes('r29') && // 排除示例
+ version !== '1' && // 不是无意义的1
+ version.length >= 2 && // 至少2个字符
+ (
+ version.match(/^r\d+$/i) || // r114, r29
+ version.match(/^\d+\.\d+\.\d+/) || // 1.2.3
+ version.match(/^v?\d+\.\d+\.\d+/) || // v1.2.3
+ version.length > 3 // 其他有效格式(如 r114-test)
+ );
+
+ if (!isValidVersion) {
+ violations.push({
+ type: '版本号',
+ message: '❌ **版本号无效**:请提供具体的版本号(如 r114、r29、1.2.3 等)'
+ });
+ }
+
+ // 9. 检查 Android 版本 - 支持直接填数字
+ const android = extractField(/### Android 版本\n\n([\s\S]*?)(?=\n### |\n$)/);
+ // Android版本有效格式:14、Android 14、14.0、14.0.0 等
+ const isValidAndroid = android &&
+ android !== '' &&
+ !android.includes('Android 13') && // 不是默认值
+ !android.includes('安卓') && // 不是敷衍
+ android !== '1' && // 不是无意义的1
+ android.length >= 1 && // 至少1个字符
+ (
+ android.match(/^\d+$/) || // 纯数字:14
+ android.match(/^Android\s*\d+/i) || // Android 14
+ android.match(/^\d+\.\d+$/) || // 14.0
+ android.match(/^\d+\.\d+\.\d+$/) || // 14.0.0
+ (android.length >= 2 && android !== 'No response') // 其他有效格式
+ );
+
+ if (!isValidAndroid) {
+ violations.push({
+ type: 'Android 版本',
+ message: '❌ **Android 版本无效**:请提供具体的系统版本(如 14、Android 14、14.0)'
+ });
+ }
+
+ // 10. 检查设备信息
+ const device = extractField(/### 设备厂商及型号\n\n([\s\S]*?)(?=\n### |\n$)/);
+ const isValidDevice = device &&
+ device !== '' &&
+ !device.includes('Sony') && // 不是默认示例
+ !device.includes('BRAVIA') && // 不是默认示例
+ device !== '手机' && // 不是敷衍
+ device !== 'No response' && // 不是未填写
+ device.length >= 5; // 至少5个字符
+
+ if (!isValidDevice) {
+ violations.push({
+ type: '设备信息',
+ message: '❌ **设备信息缺失**:请提供具体的设备厂商和型号(如 Xiaomi 14 Pro、Samsung S24)'
+ });
+ }
+
+ // 11. 检查日志
+ const logsMatch = body.match(/### 相关日志\n\n([\s\S]*?)(?=\n### |\n$)/);
+ const logsContent = logsMatch ? logsMatch[1].trim() : '';
+
+ const hasLogs = logsContent &&
+ logsContent !== '' &&
+ !logsContent.includes('No response') &&
+ !logsContent.includes('你可以在 `设置` 中查看') &&
+ !logsContent.includes('在同一网络环境下') &&
+ logsContent.length > 20;
+
+ if (!hasLogs) {
+ violations.push({
+ type: '日志',
+ message: '❌ **缺少日志**:没有日志如同闭眼开车,无法诊断问题。请从「设置 > 更多设置 > 查看日志」中获取日志'
+ });
+ }
+
+ // 12. 检查视频 ID(可选,但如果有应该格式正确)
+ const video = extractField(/### 遇到问题的视频 avid 或 bvid\n\n([\s\S]*?)(?=\n### |\n$)/);
+ if (video && video !== '' && !video.includes('No response')) {
+ if (!video.match(/^(av|BV)\w+/)) {
+ violations.push({
+ type: '视频ID',
+ message: '⚠️ **视频ID格式错误**:请使用正确的 av 号(如 av170001)或 BV 号'
+ });
+ }
+ }
+
+ // 输出所有违规
+ const violationsJson = JSON.stringify(violations);
+ const shouldClose = violations.some(v => v.message.startsWith('❌'));
+
+ console.log(`发现 ${violations.length} 项违规(${violations.filter(v => v.message.startsWith('❌')).length} 项错误,${violations.filter(v => v.message.startsWith('⚠️')).length} 项警告)`);
+
+ // 设置输出
+ core.setOutput('violations', violationsJson);
+ core.setOutput('should_close', shouldClose.toString());
+ core.setOutput('violation_count', violations.length.toString());
+
+ // 如果没有违规,发送感谢
+ if (!shouldClose && violations.length === 0) {
+ await github.rest.issues.createComment({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ body: '✅ **完美通过检查**!感谢您认真填写 Bug 报告,我们会尽快处理。'
+ });
+ }
+
+ # 第二步:如果有违规,统一处理
+ - name: Process violations
+ if: steps.collect-violations.outputs.should_close == 'true'
+ uses: actions/github-script@v6
with:
- actions: 'create-comment,close-issue'
- token: ${{ secrets.GITHUB_TOKEN }}
- issue-number: ${{ github.event.issue.number }}
- close-reason: 'not_planned'
- body: 请先尝试使用当前最新 alpha 版本,如果问题依然存在再提交 issue
+ github-token: ${{ secrets.ISSUE_CHECKER_PAT }}
+ script: |
+ const violations = JSON.parse('${{ steps.collect-violations.outputs.violations }}');
+ const violationCount = '${{ steps.collect-violations.outputs.violation_count }}';
+
+ // 分离错误和警告
+ const errors = violations.filter(v => v.message.startsWith('❌'));
+ const warnings = violations.filter(v => v.message.startsWith('⚠️'));
+
+ // 构建回复内容
+ let commentBody = '## 📋 **Bug 报告检查结果**\n\n';
+
+ if (errors.length > 0) {
+ commentBody += `### 🚫 **发现 ${errors.length} 项必须修正的问题**\n\n`;
+ errors.forEach((v, index) => {
+ commentBody += `${index + 1}. ${v.message}\n`;
+ });
+ commentBody += '\n';
+ }
+
+ if (warnings.length > 0) {
+ commentBody += `### ⚠️ **${warnings.length} 项建议改进**\n\n`;
+ warnings.forEach((v, index) => {
+ commentBody += `${index + 1}. ${v.message}\n`;
+ });
+ commentBody += '\n';
+ }
+
+ commentBody += '---\n';
+ commentBody += '🔄 **此 Issue 已被自动关闭,请修正后重新创建**';
+
+ // 添加标签
+ const labels = ['无效'];
+ if (errors.some(v => v.type === '日志')) labels.push('缺少日志');
+ if (errors.some(v => v.type === '旧版本')) labels.push('使用旧版本');
+ if (errors.some(v => v.type === '筛选项')) labels.push('未认真阅读');
+
+ await github.rest.issues.addLabels({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ labels: labels
+ });
+
+ // 发送评论
+ await github.rest.issues.createComment({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ body: commentBody
+ });
+
+ // 关闭 Issue
+ await github.rest.issues.update({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ state: 'closed',
+ state_reason: 'not_planned'
+ });
diff --git a/.github/workflows/features.yml b/.github/workflows/features.yml
index e52d70646..865690d68 100644
--- a/.github/workflows/features.yml
+++ b/.github/workflows/features.yml
@@ -8,8 +8,8 @@ on:
jobs:
build-alpha:
name: Build Feature Apk
- runs-on: macos-latest
- if: github.repository == 'aaa1115910/bv'
+ runs-on: ubuntu-latest
+ if: github.repository == 'Colorful-glassblock/bvcn'
steps:
- name: Checkout
@@ -19,10 +19,10 @@ jobs:
fetch-depth: 0
submodules: 'true'
- - name: Set up JDK 17
- uses: actions/setup-java@v4
+ - name: Set up JDK 21
+ uses: actions/setup-java@v5
with:
- java-version: '17'
+ java-version: '21'
distribution: 'temurin'
- name: Write google-services.json
@@ -38,12 +38,12 @@ jobs:
SIGNING_PROPERTIES: ${{ secrets.SIGNING_PROPERTIES }}
run: |
echo ${{ secrets.SIGNING_PROPERTIES }} > encoded_signing_properties
- base64 -Dd -i encoded_signing_properties > signing.properties
+ base64 -d -i encoded_signing_properties > signing.properties
- name: Add jks file
run: |
echo ${{ secrets.SIGN_KEY }} > ./encoded_key
- base64 -Dd -i encoded_key > key.jks
+ base64 -d -i encoded_key > key.jks
- name: Build apk
run: ./gradlew assembleDefaultAlpha assembleDefaultDebug
diff --git a/.github/workflows/lastAndroid5.yml b/.github/workflows/lastAndroid5.yml
index 14ff7c842..ce2d25384 100644
--- a/.github/workflows/lastAndroid5.yml
+++ b/.github/workflows/lastAndroid5.yml
@@ -123,7 +123,14 @@ jobs:
app/build/outputs/apk/default/alpha/BV_${{ env.alpha_info_version_code }}_${{ env.alpha_info_version_name }}_default_universal.apk
mapping.zip
tag_name: ${{ env.tag_name }}
+<<<<<<< HEAD
name: ${{ env.alpha_info_version_name }} (Legacy Support For Android 5)
prerelease: true
body: ${{ env.changelog }}
target_commitish: ${{ github.sha }}
+=======
+ name: ${{ env.alpha_info_version_name }}
+ prerelease: true
+ body: ${{ env.changelog }}
+ target_commitish: ${{ github.sha }}
+>>>>>>> develop
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 34f84bb33..bb99b703c 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -9,8 +9,8 @@ on:
jobs:
build-release:
name: Build Release Apk
- runs-on: macos-latest
- if: github.repository == 'aaa1115910/bv'
+ runs-on: ubuntu-latest
+ if: github.repository == 'Colorful-glassblock/bvcn'
steps:
- name: Checkout
@@ -20,10 +20,10 @@ jobs:
fetch-depth: 0
submodules: 'true'
- - name: Set up JDK 17
- uses: actions/setup-java@v4
+ - name: Set up JDK 21
+ uses: actions/setup-java@v5
with:
- java-version: '17'
+ java-version: '21'
distribution: 'temurin'
- name: Write google-services.json
@@ -39,12 +39,12 @@ jobs:
SIGNING_PROPERTIES: ${{ secrets.SIGNING_PROPERTIES }}
run: |
echo ${{ secrets.SIGNING_PROPERTIES }} > encoded_signing_properties
- base64 -Dd -i encoded_signing_properties > signing.properties
+ base64 -d -i encoded_signing_properties > signing.properties
- name: Add jks file
run: |
echo ${{ secrets.SIGN_KEY }} > ./encoded_key
- base64 -Dd -i encoded_key > key.jks
+ base64 -d -i encoded_key > key.jks
- name: Build apk
run: ./gradlew assembleDefaultRelease assembleDefaultDebug
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index 1e16934f6..03fcfb7be 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/README.md b/README.md
index ece721340..e0edcff6c 100644
--- a/README.md
+++ b/README.md
@@ -9,20 +9,30 @@
[](https://github.com/aaa1115910/bv/releases?q=prerelease%3Afalse)
[](https://github.com/aaa1115910/bv/releases?q=prerelease%3Atrue)
-[](https://github.com/aaa1115910/bv/actions/workflows/release.yml)
-[](https://github.com/aaa1115910/bv/actions/workflows/alpha.yml)
-[](https://apilevels.com/#:~:text=Jetpack%20Compose%20requires%20a%20minSdk%20of%2021%20or%20higher)
-[](https://github.com/aaa1115910/bv)
+[](https://github.com/aaa1115910/bv/actions/workflows/release.yml)
+[](https://github.com/aaa1115910/bv/actions/workflows/alpha.yml)
+[](https://developer.android.com/jetpack/androidx/versions#version-table)
+[](https://github.com/Colorful-glassblock/bvcn)
+<<<<<<< HEAD
**BV ~~无法~~可以在中国大陆地区内的智能电视上使用,如有相关使用需求请使用 [云视听小电视](https://app.bilibili.com)**
**~~禁止~~允许在中国境内传播、宣传、分发 BV**
+=======
+**BVCN ~~无法~~可以在中国大陆地区内的智能电视上使用,如有相关使用需求请使用 [云视听小电视(不是哥们你真用啊)](https://app.bilibili.com)**
+
+**~~禁止~~允许在中国境内传播、宣传、分发 BVCN**
+
+**由于fucking又stupid的bilibili官方对BAC大打出手 本项目以后可能不再可用 目前评论区功能已经不正常**
+**R.I.P. Bilibili-API-collect 感谢此项目对bilibili接口的收集 否则非官方bilibili client开发将十分艰难**
+**愿bilibili不会变质 可惜已经变了**
+>>>>>>> develop
---
-BV ~~(Bug Video)~~ 是一款 [哔哩哔哩](https://www.bilibili.com) 的第三方应用,适配 `Android 移动端`
-和 `Android TV`,使用 `Jetpack Compose` 开发,支持 `Android 5.0+`
+BVCN ~~(Bug Video For CN)~~ 是一款 [哔哩哔哩](https://www.bilibili.com) 的第三方应用,适配 `Android 移动端`
+和 `Android TV`,使用 `Jetpack Compose` 开发
**都是随心乱写的代码,能跑就行。**
@@ -38,12 +48,12 @@ BV ~~(Bug Video)~~ 是一款 [哔哩哔哩](https://www.bilibili.com) 的第三
### Release
-- [Github Release](https://github.com/aaa1115910/bv/releases?q=prerelease%3Afalse)
+- [Github Release](https://github.com/Colorful-glassblock/bvcn/releases?q=prerelease%3Afalse)
### Alpha
-- [Github Release](https://github.com/aaa1115910/bv/releases?q=prerelease%3Atrue)
+- [Github Release](https://github.com/Colorful-glassblock/bvcn/releases?q=prerelease%3Atrue)
## License
-[MIT](LICENSE) © aaa1115910
\ No newline at end of file
+[MIT](LICENSE) © aaa1115910
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 3d27f52f3..f16ddbcae 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -109,15 +109,12 @@ android {
}
}
}
- // https://issuetracker.google.com/issues/260059413
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
+
buildFeatures {
compose = true
//buildConfig = true
}
+
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
@@ -167,7 +164,7 @@ composeCompiler {
java {
toolchain {
- languageVersion.set(JavaLanguageVersion.of(17))
+ languageVersion.set(JavaLanguageVersion.of(AppConfiguration.jdk))
}
}
diff --git a/app/mobile/build.gradle.kts b/app/mobile/build.gradle.kts
index 5f57ed890..b2870e49e 100644
--- a/app/mobile/build.gradle.kts
+++ b/app/mobile/build.gradle.kts
@@ -1,7 +1,6 @@
plugins {
alias(gradleLibs.plugins.android.library)
alias(gradleLibs.plugins.compose.compiler)
- alias(gradleLibs.plugins.firebase.crashlytics)
alias(gradleLibs.plugins.google.ksp)
alias(gradleLibs.plugins.google.services) apply false
alias(gradleLibs.plugins.kotlin.android)
@@ -43,11 +42,6 @@ android {
}
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
-
buildFeatures {
compose = true
}
@@ -63,7 +57,7 @@ android {
java {
toolchain {
- languageVersion.set(JavaLanguageVersion.of(17))
+ languageVersion.set(JavaLanguageVersion.of(AppConfiguration.jdk))
}
}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/activities/SettingsActivity.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/activities/SettingsActivity.kt
index 04ef269ad..e67f49d6b 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/activities/SettingsActivity.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/activities/SettingsActivity.kt
@@ -3,20 +3,8 @@ package dev.aaa1115910.bv.mobile.activities
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material3.ExperimentalMaterial3Api
-import androidx.compose.material3.LargeTopAppBar
-import androidx.compose.material3.Scaffold
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import dev.aaa1115910.bv.mobile.component.preferences.SwitchPreferenceItem
import dev.aaa1115910.bv.mobile.screen.settings.SettingsScreen
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
-import dev.aaa1115910.bv.util.PrefKeys
-import dev.aaa1115910.bv.util.Prefs
class SettingsActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -28,31 +16,3 @@ class SettingsActivity : ComponentActivity() {
}
}
}
-
-@OptIn(ExperimentalMaterial3Api::class)
-@Composable
-fun SettingsScreen1() {
- Scaffold(
- topBar = {
- LargeTopAppBar(title = {
- Text(text = "Settings")
- })
- }
- ) { innerPadding ->
- Column(
- modifier = Modifier
- .padding(innerPadding)
- .fillMaxSize()
- ) {
- Text(text = "Settings")
- SwitchPreferenceItem(title = "UseOld", prefReq = PrefKeys.prefShowFpsRequest)
- SwitchPreferenceItem(
- title = "UseOld",
- summary = "sssssss",
- prefReq = PrefKeys.prefShowFpsRequest,
- enabled = false
- )
- Text(text = "${Prefs.showFps}")
- }
- }
-}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/PreferenceGroup.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/PreferenceGroup.kt
new file mode 100644
index 000000000..5a0f09c29
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/PreferenceGroup.kt
@@ -0,0 +1,107 @@
+package dev.aaa1115910.bv.mobile.component.preferences
+
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyListScope
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+fun LazyListScope.preferenceGroups(
+ vararg groupContents: Pair Unit>,
+ groupSpacing: Dp = 12.dp
+) {
+ var isFirstGroup = true
+ groupContents.forEachIndexed { index, (title, content) ->
+ val scope = PreferenceGroupScope(title, index)
+ scope.content()
+ if (scope.preferences.isNotEmpty()) {
+ if (!isFirstGroup) {
+ item(
+ key = "preference_group_spacing_$index"
+ ) { Spacer(modifier = Modifier.height(groupSpacing)) }
+ }
+ scope.build(this)
+ isFirstGroup = false
+ }
+ }
+}
+
+fun LazyListScope.preferenceGroup(
+ title: String? = null,
+ index: Int = 0,
+ content: PreferenceGroupScope.() -> Unit
+) {
+ val scope = PreferenceGroupScope(title, index)
+ scope.content()
+ if (scope.preferences.isEmpty()) return
+ scope.build(this)
+}
+
+@DslMarker
+annotation class PreferenceGroupScopeMarker
+
+@PreferenceGroupScopeMarker
+class PreferenceGroupScope internal constructor(
+ private val title: String? = null,
+ private val index: Int
+) {
+ val preferences = mutableListOf<@Composable (shape: Shape, modifier: Modifier) -> Unit>()
+
+ companion object {
+ private val LARGE_CORNER_RADIUS = 16.dp
+ private val SMALL_CORNER_RADIUS = 4.dp
+ }
+
+ internal fun build(listScope: LazyListScope) {
+ if (title != null) {
+ listScope.item(
+ key = "preference_group_title_${this.index}_${title}"
+ ) {
+ Text(
+ text = title,
+ style = MaterialTheme.typography.labelMedium,
+ modifier = Modifier
+ .padding(vertical = 8.dp, horizontal = 4.dp)
+ .animateItem()
+ )
+ }
+ }
+
+ preferences.forEachIndexed { index, itemContent ->
+ val isFirst = index == 0
+ val isLast = index == preferences.lastIndex
+ val shape = when {
+ isFirst && isLast -> RoundedCornerShape(LARGE_CORNER_RADIUS)
+ isFirst -> RoundedCornerShape(
+ topStart = LARGE_CORNER_RADIUS,
+ topEnd = LARGE_CORNER_RADIUS,
+ bottomStart = SMALL_CORNER_RADIUS,
+ bottomEnd = SMALL_CORNER_RADIUS
+ )
+
+ isLast -> RoundedCornerShape(
+ bottomStart = LARGE_CORNER_RADIUS,
+ bottomEnd = LARGE_CORNER_RADIUS,
+ topStart = SMALL_CORNER_RADIUS,
+ topEnd = SMALL_CORNER_RADIUS
+ )
+
+ else -> RoundedCornerShape(SMALL_CORNER_RADIUS)
+ }
+ val modifier = if (!isFirst) Modifier.padding(top = 2.dp) else Modifier
+
+ listScope.item(
+ key = "preference_group_${this.index}_${title}_${index}"
+ ) {
+ itemContent(shape, modifier.animateItem())
+ }
+ }
+ }
+}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/PreferencesPreview.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/PreferencesPreview.kt
new file mode 100644
index 000000000..cefe931ce
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/PreferencesPreview.kt
@@ -0,0 +1,105 @@
+package dev.aaa1115910.bv.mobile.component.preferences
+
+import android.content.res.Configuration
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.PlayCircleOutline
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.mobile.component.preferences.items.switchPreference
+import dev.aaa1115910.bv.mobile.component.preferences.items.textPreference
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun PreferencesPreview() {
+ BVMobileTheme {
+ var showHiddenPreference by remember { mutableStateOf(false) }
+ Surface(
+ color = MaterialTheme.colorScheme.surfaceContainerLow
+ ) {
+ LazyColumn(
+ modifier = Modifier.padding(12.dp),
+ ) {
+ item {
+ Text(
+ modifier = Modifier.animateItem(),
+ text = "Preferences Preview",
+ style = MaterialTheme.typography.headlineSmall
+ )
+ }
+ preferenceGroups(
+ "Group 1" to {
+ textPreference(
+ title = "Text Preference",
+ summary = "This is a summary",
+ )
+ textPreference(
+ title = "Selected Text Preference",
+ summary = "This is another summary",
+ selected = true
+ )
+ textPreference(
+ title = "No Summary",
+ )
+ textPreference(
+ title = "Clickable Text Preference",
+ summary = "This preference is clickable",
+ onClick = { /* Handle click */ }
+ )
+ textPreference(
+ title = "Disabled Text Preference",
+ summary = "This preference is disabled",
+ enabled = false
+ )
+ textPreference(
+ title = "Icon Text Preference",
+ summary = "This preference has an icon",
+ icon = Icons.Default.PlayCircleOutline,
+ )
+ },
+ "Group 2" to {
+ textPreference(
+ title = "Text Preference",
+ summary = "This is a summary",
+ )
+ switchPreference(
+ title = "Switch Preference",
+ summary = "This is a summary",
+ leadingContent = {
+ Icon(
+ imageVector = Icons.Default.PlayCircleOutline,
+ contentDescription = null
+ )
+ },
+ onClick = { showHiddenPreference = !showHiddenPreference },
+ checked = showHiddenPreference,
+ onCheckedChange = { showHiddenPreference = !showHiddenPreference }
+ )
+ if (showHiddenPreference) {
+ textPreference(title = "Hidden Preference")
+ }
+ },
+ null to {
+ textPreference(
+ title = "Text Preference",
+ summary = "This is a summary",
+ )
+ }
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/RadioPreferenceItem.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/RadioPreferenceItem.kt
deleted file mode 100644
index 5327cd941..000000000
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/RadioPreferenceItem.kt
+++ /dev/null
@@ -1,159 +0,0 @@
-package dev.aaa1115910.bv.mobile.component.preferences
-
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.heightIn
-import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.items
-import androidx.compose.material3.AlertDialog
-import androidx.compose.material3.ListItem
-import androidx.compose.material3.ListItemDefaults
-import androidx.compose.material3.RadioButton
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.unit.dp
-import de.schnettler.datastore.manager.DataStoreManager
-import de.schnettler.datastore.manager.PreferenceRequest
-import dev.aaa1115910.bv.dataStore
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-
-@Composable
-fun RadioPreferenceItem(
- modifier: Modifier = Modifier,
- title: String,
- summary: String? = null,
- leadingContent: @Composable (() -> Unit)? = null,
- enabled: Boolean = true,
- singleLineTitle: Boolean = false,
- singleLineSummary: Boolean = false,
- onSelectedChange: (T) -> Unit,
- items: Map,
- selectedValue: T
-) {
- var showRadioDialog by remember { mutableStateOf(false) }
-
- TextPreferenceItem(
- modifier = modifier,
- title = title,
- summary = summary,
- leadingContent = leadingContent,
- enabled = enabled,
- singleLineTitle = singleLineTitle,
- singleLineSummary = singleLineSummary,
- onClick = { showRadioDialog = true }
- )
-
- RadioListDialog(
- show = showRadioDialog,
- onHideDialog = { showRadioDialog = false },
- title = title,
- values = items,
- selectedValue = selectedValue,
- onSelectValue = { onSelectedChange(it) }
- )
-}
-
-@Composable
-fun RadioPreferenceItem(
- modifier: Modifier = Modifier,
- title: String,
- summary: String? = null,
- leadingContent: @Composable (() -> Unit)? = null,
- enabled: Boolean = true,
- singleLineTitle: Boolean = false,
- singleLineSummary: Boolean = false,
- items: Map,
- prefReq: PreferenceRequest
-) {
- val dataStoreManager = DataStoreManager(LocalContext.current.dataStore)
- val prefs by dataStoreManager.preferenceFlow.collectAsState(initial = null)
- val scope = rememberCoroutineScope()
-
- RadioPreferenceItem(
- modifier = modifier,
- title = title,
- summary = summary,
- leadingContent = leadingContent,
- enabled = enabled,
- singleLineTitle = singleLineTitle,
- singleLineSummary = singleLineSummary,
- onSelectedChange = { newValue ->
- println("set ${prefReq.key} to $newValue")
- scope.launch(Dispatchers.IO) {
- dataStoreManager.editPreference(prefReq.key, newValue)
- }
- },
- items = items,
- selectedValue = prefs.getOrDefault(prefReq)
- )
-}
-
-@Composable
-private fun RadioListDialog(
- modifier: Modifier = Modifier,
- show: Boolean,
- onHideDialog: () -> Unit,
- title: String,
- values: Map,
- selectedValue: T,
- onSelectValue: (T) -> Unit,
-) {
- if (show) {
- AlertDialog(
- modifier = modifier,
- onDismissRequest = onHideDialog,
- confirmButton = { },
- title = { Text(text = title) },
- text = {
- LazyColumn(
- modifier = Modifier.heightIn(max = 300.dp)
- ) {
- items(values.toList()) { (value, name) ->
- RadioListItem(
- text = name,
- onClick = {
- onSelectValue(value)
- onHideDialog()
- },
- selected = value == selectedValue
- )
- }
- }
- }
- )
- }
-}
-
-@Composable
-fun RadioListItem(
- modifier: Modifier = Modifier,
- text: String,
- onClick: (() -> Unit),
- selected: Boolean,
-) {
- ListItem(
- modifier = modifier
- .fillMaxWidth()
- .clickable { onClick() },
- headlineContent = { Text(text = text) },
- leadingContent = {
- RadioButton(
- selected = selected,
- onClick = onClick
- )
- },
- colors =ListItemDefaults.colors(
- containerColor = Color.Transparent
- )
- )
-}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/SwitchPreferenceItem.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/SwitchPreferenceItem.kt
deleted file mode 100644
index ccbfaa9cd..000000000
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/SwitchPreferenceItem.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-package dev.aaa1115910.bv.mobile.component.preferences
-
-import androidx.compose.material3.Switch
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
-import androidx.datastore.preferences.core.Preferences
-import de.schnettler.datastore.manager.DataStoreManager
-import de.schnettler.datastore.manager.PreferenceRequest
-import dev.aaa1115910.bv.dataStore
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-
-@Composable
-fun SwitchPreferenceItem(
- modifier: Modifier = Modifier,
- title: String,
- summary: String? = null,
- leadingContent: @Composable (() -> Unit)? = null,
- enabled: Boolean = true,
- singleLineTitle: Boolean = false,
- singleLineSummary: Boolean = false,
- onClick: (() -> Unit)? = null,
- checked: Boolean,
- onCheckedChange: (Boolean) -> Unit
-) {
- TextPreferenceItem(
- modifier = modifier,
- title = title,
- summary = summary,
- leadingContent = leadingContent,
- trailingContent = {
- Switch(
- enabled = enabled,
- checked = checked,
- onCheckedChange = { newValue ->
- onCheckedChange(newValue)
- onClick?.invoke()
- }
- )
- },
- enabled = enabled,
- singleLineTitle = singleLineTitle,
- singleLineSummary = singleLineSummary,
- onClick = {
- println("clicked listitem, checked: $checked")
- onCheckedChange(!checked)
- onClick?.invoke()
- }
- )
-}
-
-@Composable
-fun SwitchPreferenceItem(
- modifier: Modifier = Modifier,
- title: String,
- summary: String? = null,
- leadingContent: @Composable (() -> Unit)? = null,
- enabled: Boolean = true,
- singleLineTitle: Boolean = false,
- singleLineSummary: Boolean = false,
- onClick: (() -> Unit)? = null,
- prefReq: PreferenceRequest
-) {
- val dataStoreManager = DataStoreManager(LocalContext.current.dataStore)
- val prefs by dataStoreManager.preferenceFlow.collectAsState(initial = null)
- val scope = rememberCoroutineScope()
-
- SwitchPreferenceItem(
- modifier = modifier,
- title = title,
- summary = summary,
- leadingContent = leadingContent,
- enabled = enabled,
- singleLineTitle = singleLineTitle,
- singleLineSummary = singleLineSummary,
- onClick = { onClick?.invoke() },
- checked = prefs.getOrDefault(prefReq),
- onCheckedChange = { newValue ->
- println("set ${prefReq.key} to $newValue")
- scope.launch(Dispatchers.IO) {
- dataStoreManager.editPreference(prefReq.key, newValue)
- }
- }
- )
-}
-
-fun Preferences?.getOrDefault(prefReq: PreferenceRequest): T {
- return this?.get(prefReq.key) ?: prefReq.defaultValue
-}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/TextPreferenceItem.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/TextPreferenceItem.kt
deleted file mode 100644
index 489729ce2..000000000
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/TextPreferenceItem.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-package dev.aaa1115910.bv.mobile.component.preferences
-
-import androidx.compose.foundation.clickable
-import androidx.compose.material3.ListItem
-import androidx.compose.material3.LocalContentColor
-import androidx.compose.material3.Surface
-import androidx.compose.material3.Switch
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.text.style.TextOverflow
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.tooling.preview.PreviewParameter
-import androidx.compose.ui.tooling.preview.PreviewParameterProvider
-import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
-
-@Composable
-fun TextPreferenceItem(
- modifier: Modifier = Modifier,
- title: String,
- summary: String? = null,
- leadingContent: @Composable (() -> Unit)? = null,
- trailingContent: @Composable (() -> Unit)? = null,
- enabled: Boolean = true,
- singleLineTitle: Boolean = false,
- singleLineSummary: Boolean = false,
- onClick: (() -> Unit)? = null,
-) {
- ListItem(
- modifier = modifier
- .clickable(enabled) { onClick?.invoke() },
- headlineContent = {
- StatusWrapper(enabled) {
- Text(
- text = title,
- maxLines = if (singleLineTitle) 1 else Int.MAX_VALUE,
- overflow = TextOverflow.Ellipsis
- )
- }
- },
- supportingContent = (@Composable {
- StatusWrapper(enabled) {
- Text(
- text = summary!!,
- maxLines = if (singleLineSummary) 1 else Int.MAX_VALUE,
- overflow = TextOverflow.Ellipsis
- )
- }
- }).takeIf { summary != null },
- leadingContent = (@Composable {
- StatusWrapper(enabled) {
- leadingContent?.invoke()
- }
- }).takeIf { leadingContent != null },
- trailingContent = (@Composable {
- StatusWrapper(enabled) {
- trailingContent?.invoke()
- }
- }).takeIf { trailingContent != null },
- )
-}
-
-@Composable
-fun StatusWrapper(enabled: Boolean = true, content: @Composable () -> Unit) {
- CompositionLocalProvider(
- LocalContentColor provides if (enabled) LocalContentColor.current
- else LocalContentColor.current.copy(alpha = 0.38f)
- ) {
- content()
- }
-}
-
-private class TextPreferenceItemPreviewParameterProvider :
- PreviewParameterProvider {
- override val values = sequenceOf(
- TextPreferenceItemPreviewData("text preference item", "enabled", true),
- TextPreferenceItemPreviewData("text preference item", "disabled", false),
- TextPreferenceItemPreviewData("text preference item", null, true),
- TextPreferenceItemPreviewData(
- title = "long title long title long title long title long title long title ",
- summary = "long summary long summary long summary long summary long summary ",
- enabled = false,
- setTrainingContent = true
- ),
- TextPreferenceItemPreviewData(
- title = "long title long title long title long title long title long title ",
- summary = "long summary long summary long summary long summary long summary ",
- enabled = true,
- singleLineTitle = true,
- singleLineSummary = true,
- setTrainingContent = true
- ),
- )
-}
-
-private data class TextPreferenceItemPreviewData(
- val title: String,
- val summary: String?,
- val enabled: Boolean,
- val singleLineTitle: Boolean = false,
- val singleLineSummary: Boolean = false,
- val setTrainingContent: Boolean = false,
-)
-
-@Preview
-@Composable
-private fun TextPreferenceItemPreview(
- @PreviewParameter(TextPreferenceItemPreviewParameterProvider::class) data: TextPreferenceItemPreviewData
-) {
- BVMobileTheme {
- Surface {
- TextPreferenceItem(
- title = data.title,
- summary = data.summary,
- enabled = data.enabled,
- singleLineTitle = data.singleLineTitle,
- singleLineSummary = data.singleLineSummary,
- trailingContent = (@Composable {
- Switch(checked = false, onCheckedChange = {})
- }).takeIf { data.setTrainingContent }
- )
- }
- }
-}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/BaseListItem.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/BaseListItem.kt
new file mode 100644
index 000000000..83305570c
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/BaseListItem.kt
@@ -0,0 +1,61 @@
+package dev.aaa1115910.bv.mobile.component.preferences.items
+
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.heightIn
+import androidx.compose.material3.ListItem
+import androidx.compose.material3.ListItemColors
+import androidx.compose.material3.ListItemDefaults
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+@Composable
+fun BaseListItem(
+ headlineContent: @Composable () -> Unit,
+ modifier: Modifier = Modifier,
+ overlineContent: @Composable (() -> Unit)? = null,
+ supportingContent: @Composable (() -> Unit)? = null,
+ leadingContent: @Composable (() -> Unit)? = null,
+ trailingContent: @Composable (() -> Unit)? = null,
+ colors: ListItemColors = ListItemDefaults.colors().copy(
+ containerColor = MaterialTheme.colorScheme.surfaceBright,
+ supportingTextColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.8f),
+ ),
+ tonalElevation: Dp = ListItemDefaults.Elevation,
+ shadowElevation: Dp = ListItemDefaults.Elevation,
+ selected: Boolean = false,
+ enabled: Boolean = true,
+ shape: Shape = MaterialTheme.shapes.medium,
+ onClick: (() -> Unit)? = null,
+) {
+ ListItem(
+ modifier = modifier
+ .clip(shape)
+ .heightIn(min = 72.dp)
+ .clickable(
+ enabled = enabled,
+ onClick = { onClick?.invoke() }
+ ),
+ headlineContent = headlineContent,
+ overlineContent = overlineContent,
+ supportingContent = supportingContent,
+ leadingContent = leadingContent,
+ trailingContent = trailingContent,
+ colors = if (!enabled) colors.copy(
+ //containerColor = MaterialTheme.colorScheme.surface.copy(alpha = 0.38f),
+ headlineColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f),
+ leadingIconColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f),
+ overlineColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.38f),
+ supportingTextColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.38f),
+ ) else if (selected) colors.copy(
+ containerColor = MaterialTheme.colorScheme.secondaryContainer
+ ) else colors,
+ tonalElevation = tonalElevation,
+ shadowElevation = shadowElevation
+ )
+}
+
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/ListItemPreference.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/ListItemPreference.kt
new file mode 100644
index 000000000..ece761244
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/ListItemPreference.kt
@@ -0,0 +1,119 @@
+package dev.aaa1115910.bv.mobile.component.preferences.items
+
+import android.content.res.Configuration
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
+import androidx.compose.material.icons.filled.PlayCircleOutline
+import androidx.compose.material3.Icon
+import androidx.compose.material3.ListItem
+import androidx.compose.material3.ListItemColors
+import androidx.compose.material3.ListItemDefaults
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.mobile.component.preferences.PreferenceGroupScope
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+
+@Composable
+private fun ListItemPreference(
+ modifier: Modifier = Modifier,
+ headlineContent: @Composable () -> Unit,
+ overlineContent: @Composable (() -> Unit)? = null,
+ supportingContent: @Composable (() -> Unit)? = null,
+ leadingContent: @Composable (() -> Unit)? = null,
+ trailingContent: @Composable (() -> Unit)? = null,
+ colors: ListItemColors = ListItemDefaults.colors(),
+ shape: Shape = RoundedCornerShape(0.dp),
+ tonalElevation: Dp = ListItemDefaults.Elevation,
+ shadowElevation: Dp = ListItemDefaults.Elevation,
+ onClick: (() -> Unit)? = null
+) {
+ ListItem(
+ modifier = modifier
+ .clip(shape)
+ .clickable { onClick?.invoke() },
+ headlineContent = headlineContent,
+ overlineContent = overlineContent,
+ supportingContent = supportingContent,
+ leadingContent = leadingContent,
+ trailingContent = trailingContent,
+ colors = colors,
+ tonalElevation = tonalElevation,
+ shadowElevation = shadowElevation
+ )
+}
+
+fun PreferenceGroupScope.listItemPreference(
+ headlineContent: @Composable () -> Unit,
+ overlineContent: @Composable (() -> Unit)? = null,
+ supportingContent: @Composable (() -> Unit)? = null,
+ leadingContent: @Composable (() -> Unit)? = null,
+ trailingContent: @Composable (() -> Unit)? = null,
+ colors: ListItemColors? = null,
+ onClick: (() -> Unit)? = null,
+) {
+ preferences += { shape, modifier ->
+ ListItemPreference(
+ modifier = modifier,
+ headlineContent = headlineContent,
+ overlineContent = overlineContent,
+ supportingContent = supportingContent,
+ leadingContent = leadingContent,
+ trailingContent = trailingContent,
+ colors = colors ?: ListItemDefaults.colors(),
+ shape = shape,
+ onClick = onClick
+ )
+ }
+}
+
+fun PreferenceGroupScope.listItemPreference(
+ title: String,
+ summary: String? = null,
+ icon: ImageVector? = null,
+ onClick: (() -> Unit)? = null,
+) = listItemPreference(
+ headlineContent = @Composable { Text(text = title) },
+ supportingContent = if (summary != null) (@Composable { Text(text = summary) }) else null,
+ leadingContent = if (icon != null) (@Composable {
+ Icon(
+ imageVector = icon,
+ contentDescription = null
+ )
+ }) else null,
+ onClick = onClick,
+)
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun ListItemPreferencePreview() {
+ BVMobileTheme {
+ ListItemPreference(
+ headlineContent = { Text("Text Preference") },
+ //supportingContent = { Text("This is a summary") },
+ leadingContent = {
+ Icon(
+ imageVector = Icons.Default.PlayCircleOutline,
+ contentDescription = null
+ )
+ },
+ trailingContent = {
+ Icon(
+ imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight,
+ contentDescription = null
+ )
+ },
+ onClick = { /* Handle click */ },
+ shape = RoundedCornerShape(8.dp),
+ )
+ }
+}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/RadioPreference.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/RadioPreference.kt
new file mode 100644
index 000000000..8d78f9bbd
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/RadioPreference.kt
@@ -0,0 +1,229 @@
+package dev.aaa1115910.bv.mobile.component.preferences.items
+
+import android.content.res.Configuration
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.PlayCircleOutline
+import androidx.compose.material3.AlertDialog
+import androidx.compose.material3.Icon
+import androidx.compose.material3.ListItem
+import androidx.compose.material3.ListItemDefaults
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.RadioButton
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import de.schnettler.datastore.manager.DataStoreManager
+import de.schnettler.datastore.manager.PreferenceRequest
+import dev.aaa1115910.bv.dataStore
+import dev.aaa1115910.bv.mobile.component.preferences.PreferenceGroupScope
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+@Composable
+private fun RadioPreference(
+ modifier: Modifier = Modifier,
+ title: String,
+ summary: String?,
+ selected: Boolean = false,
+ shape: Shape = RoundedCornerShape(0.dp),
+ enabled: Boolean = true,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ value: T,
+ values: Map,
+ onValueChange: ((T) -> Unit)
+) {
+ var showDialog by remember { mutableStateOf(false) }
+
+ BaseListItem(
+ modifier = modifier,
+ headlineContent = { Text(text = title) },
+ supportingContent = { Text(text = summary ?: "unknown") },
+ selected = selected,
+ enabled = enabled,
+ leadingContent = leadingContent,
+ onClick = { showDialog = true },
+ shape = shape
+ )
+
+ if (showDialog) {
+ RadioDialog(
+ modifier = Modifier.fillMaxWidth(),
+ title = title,
+ value = value,
+ values = values,
+ onValueChange = { newValue ->
+ onValueChange(newValue)
+ showDialog = false
+ },
+ onDismissRequest = { showDialog = false }
+ )
+ }
+}
+
+@Composable
+private fun RadioDialog(
+ modifier: Modifier = Modifier,
+ title: String,
+ value: T,
+ values: Map,
+ onValueChange: (T) -> Unit,
+ onDismissRequest: () -> Unit
+) {
+ AlertDialog(
+ modifier = modifier,
+ onDismissRequest = onDismissRequest,
+ title = { Text(text = title) },
+ text = {
+ LazyColumn {
+ items(values.toList()) { (itemValue, label) ->
+ ListItem(
+ modifier = Modifier
+ .clip(MaterialTheme.shapes.large)
+ .clickable { onValueChange(itemValue) },
+ headlineContent = { Text(text = label) },
+ leadingContent = {
+ RadioButton(
+ selected = itemValue == value,
+ onClick = { onValueChange(itemValue) }
+ )
+ },
+ colors = ListItemDefaults.colors(
+ containerColor = Color.Transparent,
+ )
+ )
+ }
+ }
+ },
+ confirmButton = {},
+ )
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun RadioPreferencePreview() {
+ BVMobileTheme {
+ RadioPreference(
+ title = "Radio Preference",
+ summary = "value",
+ leadingContent = {
+ Icon(
+ imageVector = Icons.Default.PlayCircleOutline,
+ contentDescription = null
+ )
+ },
+ selected = false,
+ shape = RoundedCornerShape(8.dp),
+ enabled = true,
+ value = 123,
+ values = mapOf(
+ 123 to "Option 1",
+ 456 to "Option 2",
+ 789 to "Option 3"
+ ),
+ onValueChange = { /* Handle checked change */ }
+ )
+ }
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun RadioDialogPreview() {
+ BVMobileTheme {
+ var value by remember { mutableIntStateOf(123) }
+ RadioDialog(
+ title = "Select Option",
+ value = value,
+ values = mapOf(
+ 123 to "Option 1",
+ 456 to "Option 2",
+ 789 to "Option 3"
+ ),
+ onValueChange = { value = it },
+ onDismissRequest = { /* Handle dismiss */ }
+ )
+ }
+}
+
+fun PreferenceGroupScope.radioPreference(
+ title: String,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ onSelected: Boolean = false,
+ enabled: Boolean = true,
+ value: T,
+ values: Map,
+ onValueChange: (T) -> Unit
+) {
+ preferences += { shape, modifier ->
+ RadioPreference(
+ modifier = modifier,
+ title = title,
+ summary = values[value],
+ leadingContent = leadingContent,
+ selected = onSelected,
+ shape = shape,
+ enabled = enabled,
+ value = value,
+ values = values,
+ onValueChange = onValueChange
+ )
+ }
+}
+
+fun PreferenceGroupScope.radioPreference(
+ title: String,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ onSelected: Boolean = false,
+ enabled: Boolean = true,
+ prefReq: PreferenceRequest,
+ values: Map,
+ onValueChange: (T) -> Boolean = { true }
+) {
+ preferences += { shape, modifier ->
+ val scope = rememberCoroutineScope()
+ val dataStoreManager = DataStoreManager(LocalContext.current.dataStore)
+
+ val value by dataStoreManager.getPreferenceState(prefReq)
+ val setValue = { newValue: T ->
+ scope.launch(Dispatchers.IO) {
+ dataStoreManager.editPreference(prefReq.key, newValue)
+ }
+ onValueChange(newValue)
+ }
+
+ RadioPreference(
+ modifier = modifier,
+ title = title,
+ summary = values[value],
+ leadingContent = leadingContent,
+ selected = onSelected,
+ shape = shape,
+ enabled = enabled,
+ value = value,
+ values = values,
+ onValueChange = {
+ if (onValueChange(it)) setValue(it)
+ }
+ )
+ }
+}
+
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/SwitchPreference.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/SwitchPreference.kt
new file mode 100644
index 000000000..378351480
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/SwitchPreference.kt
@@ -0,0 +1,145 @@
+package dev.aaa1115910.bv.mobile.component.preferences.items
+
+import android.content.res.Configuration
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.PlayCircleOutline
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Switch
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import de.schnettler.datastore.manager.DataStoreManager
+import de.schnettler.datastore.manager.PreferenceRequest
+import dev.aaa1115910.bv.dataStore
+import dev.aaa1115910.bv.mobile.component.preferences.PreferenceGroupScope
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+@Composable
+private fun SwitchPreference(
+ modifier: Modifier = Modifier,
+ title: String,
+ summary: String? = null,
+ onClick: (() -> Unit)? = null,
+ selected: Boolean = false,
+ shape: Shape = RoundedCornerShape(0.dp),
+ enabled: Boolean = true,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ checked: Boolean,
+ onCheckedChange: ((Boolean) -> Unit)
+) {
+ BaseListItem(
+ modifier = modifier,
+ headlineContent = { Text(text = title) },
+ supportingContent = summary?.let { { Text(text = it) } },
+ selected = selected,
+ enabled = enabled,
+ leadingContent = leadingContent,
+ trailingContent = {
+ Switch(
+ checked = checked,
+ onCheckedChange = onCheckedChange
+ )
+ },
+ onClick = onClick,
+ shape = shape
+ )
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun SwitchPreferencePreview() {
+ BVMobileTheme {
+ SwitchPreference(
+ title = "Switch Preference",
+ summary = "This is a summary",
+ leadingContent = {
+ Icon(
+ imageVector = Icons.Default.PlayCircleOutline,
+ contentDescription = null
+ )
+ },
+ onClick = { /* Handle click */ },
+ selected = false,
+ shape = RoundedCornerShape(8.dp),
+ enabled = true,
+ checked = false,
+ onCheckedChange = { /* Handle checked change */ }
+ )
+ }
+}
+
+fun PreferenceGroupScope.switchPreference(
+ title: String,
+ summary: String? = null,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ onClick: (() -> Unit)? = null,
+ onSelected: Boolean = false,
+ enabled: Boolean = true,
+ checked: Boolean,
+ onCheckedChange: (Boolean) -> Unit
+) {
+ preferences += { shape, modifier ->
+ SwitchPreference(
+ modifier = modifier,
+ title = title,
+ summary = summary,
+ leadingContent = leadingContent,
+ onClick = onClick,
+ selected = onSelected,
+ shape = shape,
+ enabled = enabled,
+ checked = checked,
+ onCheckedChange = onCheckedChange
+ )
+ }
+}
+
+fun PreferenceGroupScope.switchPreference(
+ title: String,
+ summary: String? = null,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ onClick: (() -> Unit)? = null,
+ onSelected: Boolean = false,
+ enabled: Boolean = true,
+ prefReq: PreferenceRequest,
+ onCheckedChange: (Boolean) -> Boolean
+) {
+ preferences += { shape, modifier ->
+ val scope = rememberCoroutineScope()
+ val dataStoreManager = DataStoreManager(LocalContext.current.dataStore)
+
+ val checked by dataStoreManager.getPreferenceState(prefReq)
+ val setChecked = { newValue: Boolean ->
+ scope.launch(Dispatchers.IO) {
+ dataStoreManager.editPreference(prefReq.key, newValue)
+ }
+ onCheckedChange(newValue)
+ }
+
+ SwitchPreference(
+ modifier = modifier,
+ title = title,
+ summary = summary,
+ leadingContent = leadingContent,
+ onClick = onClick,
+ selected = onSelected,
+ shape = shape,
+ enabled = enabled,
+ checked = checked,
+ onCheckedChange = {
+ if (onCheckedChange(it)) setChecked(it)
+ }
+ )
+ }
+}
+
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/TextPreference.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/TextPreference.kt
new file mode 100644
index 000000000..2bff02806
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/preferences/items/TextPreference.kt
@@ -0,0 +1,115 @@
+package dev.aaa1115910.bv.mobile.component.preferences.items
+
+import android.content.res.Configuration
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
+import androidx.compose.material.icons.filled.PlayCircleOutline
+import androidx.compose.material3.Icon
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.mobile.component.preferences.PreferenceGroupScope
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+
+@Composable
+private fun TextPreference(
+ modifier: Modifier = Modifier,
+ title: String,
+ summary: String? = null,
+ onClick: (() -> Unit)? = null,
+ selected: Boolean = false,
+ shape: Shape = RoundedCornerShape(0.dp),
+ enabled: Boolean = true,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ trailingContent: @Composable() (() -> Unit)? = null,
+) {
+ BaseListItem(
+ modifier = modifier,
+ headlineContent = { Text(text = title) },
+ supportingContent = summary?.let { { Text(text = it) } },
+ selected = selected,
+ enabled = enabled,
+ leadingContent = leadingContent,
+ trailingContent = trailingContent,
+ onClick = onClick,
+ shape = shape
+ )
+}
+
+fun PreferenceGroupScope.textPreference(
+ title: String,
+ summary: String? = null,
+ leadingContent: @Composable() (() -> Unit)? = null,
+ trailingContent: @Composable() (() -> Unit)? = null,
+ onClick: (() -> Unit)? = null,
+ onSelected: Boolean = false,
+ enabled: Boolean = true
+) {
+ preferences += { shape, modifier ->
+ TextPreference(
+ modifier = modifier,
+ title = title,
+ summary = summary,
+ leadingContent = leadingContent,
+ trailingContent = trailingContent,
+ onClick = onClick,
+ selected = onSelected,
+ shape = shape,
+ enabled = enabled
+ )
+ }
+}
+
+fun PreferenceGroupScope.textPreference(
+ title: String,
+ summary: String? = null,
+ icon: ImageVector? = null,
+ onClick: (() -> Unit)? = null,
+ selected: Boolean = false,
+ enabled: Boolean = true
+) = textPreference(
+ title = title,
+ summary = summary,
+ leadingContent = if (icon != null) (@Composable {
+ Icon(
+ imageVector = icon,
+ contentDescription = null
+ )
+ }) else null,
+ onClick = onClick,
+ onSelected = selected,
+ enabled = enabled
+)
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun TextPreferencePreview() {
+ BVMobileTheme {
+ TextPreference(
+ title = "Text Preference",
+ summary = "This is a summary",
+ leadingContent = {
+ Icon(
+ imageVector = Icons.Default.PlayCircleOutline,
+ contentDescription = null
+ )
+ },
+ trailingContent = {
+ Icon(
+ imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight,
+ contentDescription = null
+ )
+ },
+ onClick = { /* Handle click */ },
+ selected = false,
+ shape = RoundedCornerShape(8.dp),
+ enabled = true
+ )
+ }
+}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/PgcCard.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/PgcCard.kt
new file mode 100644
index 000000000..c86c0a09e
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/PgcCard.kt
@@ -0,0 +1,2 @@
+package dev.aaa1115910.bv.mobile.component.search
+
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/UgcCard.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/UgcCard.kt
new file mode 100644
index 000000000..06d374d7c
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/UgcCard.kt
@@ -0,0 +1,166 @@
+package dev.aaa1115910.bv.mobile.component.search
+
+import android.content.res.Configuration
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.Icon
+import androidx.compose.material3.LocalTextStyle
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import coil.compose.AsyncImage
+import dev.aaa1115910.bv.R
+import dev.aaa1115910.bv.entity.carddata.VideoCardData
+import dev.aaa1115910.bv.mobile.component.videocard.SmallVideoCard
+import dev.aaa1115910.bv.mobile.component.videocard.UpIcon
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+import dev.aaa1115910.bv.util.ImageSize
+import dev.aaa1115910.bv.util.resizedImageUrl
+
+@Composable
+fun UgcCard(
+ modifier: Modifier = Modifier,
+ data: VideoCardData,
+ onClick: () -> Unit = {}
+) = SmallVideoCard(
+ modifier = modifier,
+ data = data,
+ onClick = onClick
+)
+
+@Composable
+fun UgcListItem(
+ modifier: Modifier = Modifier,
+ data: VideoCardData,
+ onClick: () -> Unit = {}
+) {
+ Surface(
+ onClick = onClick
+ ) {
+ Row(
+ modifier = modifier
+ .fillMaxWidth()
+ .height(94.dp)
+ .padding(4.dp),
+ horizontalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ Box {
+ AsyncImage(
+ modifier = Modifier
+ .fillMaxHeight()
+ .aspectRatio(1.8f)
+ .clip(MaterialTheme.shapes.small)
+ .background(MaterialTheme.colorScheme.surfaceVariant),
+ model = data.cover.resizedImageUrl(ImageSize.SmallVideoCardCover),
+ contentDescription = null,
+ contentScale = ContentScale.FillBounds
+ )
+ Text(
+ modifier = Modifier
+ .align(Alignment.BottomEnd)
+ .padding(4.dp)
+ .clip(MaterialTheme.shapes.extraSmall)
+ .background(Color.Black.copy(alpha = 0.6f))
+ .padding(horizontal = 2.dp, vertical = 0.dp),
+ text = data.timeString,
+ color = Color.White,
+ style = MaterialTheme.typography.bodySmall
+ )
+ }
+
+ Column(
+ modifier = Modifier.fillMaxHeight(),
+ verticalArrangement = Arrangement.SpaceBetween
+ ) {
+ Text(
+ text = data.title,
+ maxLines = 2,
+ overflow = TextOverflow.Ellipsis,
+ style = MaterialTheme.typography.titleSmall
+ )
+ CompositionLocalProvider(
+ LocalTextStyle provides MaterialTheme.typography.bodySmall
+ ) {
+ Column {
+ Row(
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ UpIcon(modifier = Modifier.size(16.dp))
+ Text(text = "bishi")
+ }
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(2.dp)
+ ) {
+ Icon(
+ modifier = Modifier,
+ painter = painterResource(id = R.drawable.ic_play_count),
+ contentDescription = null,
+ )
+ Text(text = data.playString)
+ }
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.spacedBy(2.dp)
+ ) {
+ Icon(
+ modifier = Modifier,
+ painter = painterResource(id = R.drawable.ic_danmaku_count),
+ contentDescription = null,
+ )
+ Text(text = data.danmakuString)
+ }
+ Text(text = data.pubTimeString)
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun UgcListItemPreview() {
+ BVMobileTheme {
+ UgcListItem(
+ data = previewData
+ )
+ }
+}
+
+private val previewData = VideoCardData(
+ avid = 0,
+ title = "震惊!太震惊了!真的是太震惊了!我的天呐!真TMD震惊!",
+ cover = "http://i2.hdslb.com/bfs/archive/af17fc07b8f735e822563cc45b7b5607a491dfff.jpg",
+ upName = "bishi",
+ play = 2333,
+ danmaku = 66666,
+ time = 2333 * 1000,
+ pubTime = 1234567890
+)
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/UserCard.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/UserCard.kt
new file mode 100644
index 000000000..c86c0a09e
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/component/search/UserCard.kt
@@ -0,0 +1,2 @@
+package dev.aaa1115910.bv.mobile.component.search
+
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/LoginScreen.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/LoginScreen.kt
index 6601b8d39..088d35991 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/LoginScreen.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/LoginScreen.kt
@@ -60,13 +60,13 @@ import com.geetest.sdk.GT3Listener
import dev.aaa1115910.biliapi.entity.login.QrLoginState
import dev.aaa1115910.biliapi.repositories.SendSmsState
import dev.aaa1115910.bv.R
-import dev.aaa1115910.bv.component.QrImage
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
import dev.aaa1115910.bv.util.calculateWindowSizeClassInPreview
import dev.aaa1115910.bv.util.toast
import dev.aaa1115910.bv.viewmodel.login.AppQrLoginViewModel
import dev.aaa1115910.bv.viewmodel.login.GeetestResult
import dev.aaa1115910.bv.viewmodel.login.SmsLoginViewModel
+import dev.aaa1115910.m3qrcode.MaterialShapeQr
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -306,11 +306,11 @@ fun LoginContentCompact(
onLogin = onLogin
)
AnimatedVisibility(showQrCode) {
- QrImage(
- modifier = Modifier
+ MaterialShapeQr(
+ Modifier
.padding(top = 36.dp)
.size(240.dp),
- content = qrLoginUrl
+ qrLoginUrl
)
}
}
@@ -477,7 +477,7 @@ fun QrLogin(
Box(
modifier = modifier
) {
- QrImage(
+ MaterialShapeQr(
modifier = Modifier.size(240.dp),
content = qrLoginUrl
)
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt
index 47317a583..6590efd7c 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/MobileMainScreen.kt
@@ -93,6 +93,7 @@ import dev.aaa1115910.bv.mobile.activities.SettingsActivity
import dev.aaa1115910.bv.mobile.component.home.UserDialog
import dev.aaa1115910.bv.mobile.screen.home.DynamicScreen
import dev.aaa1115910.bv.mobile.screen.home.HomeScreen
+import dev.aaa1115910.bv.mobile.screen.home.SearchScreen
import dev.aaa1115910.bv.util.fInfo
import dev.aaa1115910.bv.util.swapList
import dev.aaa1115910.bv.viewmodel.UserSwitchViewModel
@@ -263,7 +264,7 @@ fun MobileMainScreen(
}
composable(MobileMainScreenNav.Search.name) {
- DevelopingTipContent()
+ SearchScreen()
}
composable(MobileMainScreenNav.Zone.name) {
DevelopingTipContent()
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/VideoPlayerScreen.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/VideoPlayerScreen.kt
index da33b39d7..3f0ac14c4 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/VideoPlayerScreen.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/VideoPlayerScreen.kt
@@ -272,6 +272,7 @@ fun VideoPlayerScreen(
currentSubtitleFontSize = playerViewModel.currentSubtitleFontSize,
currentSubtitleBackgroundOpacity = playerViewModel.currentSubtitleBackgroundOpacity,
currentSubtitleBottomPadding = playerViewModel.currentSubtitleBottomPadding,
+ currentPlayMode = playerViewModel.currentPlayMode,
incognitoMode = Prefs.incognitoMode,
),
LocalVideoPlayerDanmakuMasksData provides VideoPlayerDanmakuMasksData(
@@ -349,9 +350,11 @@ fun VideoPlayerScreen(
playerViewModel.currentDanmakuArea = area
Prefs.defaultDanmakuArea = area
},
- onLoadNextVideo = {
-
+ onPlayModeChange = { playMode ->
+ playerViewModel.currentPlayMode = playMode
+ Prefs.defaultPlayMode = playMode
},
+ onLoadNextVideo = playerViewModel::playNextVideo,
onLoadNewVideo = { videoListItem ->
logger.fInfo { "on load new video: $videoListItem" }
var aid = 0L
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/DynamicScreen.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/DynamicScreen.kt
index a8c0b3103..3fd0924e4 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/DynamicScreen.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/DynamicScreen.kt
@@ -72,6 +72,7 @@ fun DynamicScreen(
context = context,
aid = dynamicItem.video!!.aid,
fromSeason = dynamicItem.video!!.seasonId != null
+ && dynamicItem.video!!.seasonId != 0,
)
}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/SearchScreen.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/SearchScreen.kt
new file mode 100644
index 000000000..414393272
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/SearchScreen.kt
@@ -0,0 +1,414 @@
+package dev.aaa1115910.bv.mobile.screen.home
+
+import android.app.Activity
+import android.content.res.Configuration
+import androidx.compose.animation.ExperimentalSharedTransitionApi
+import androidx.compose.animation.SharedTransitionLayout
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.text.input.rememberTextFieldState
+import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.AccessTime
+import androidx.compose.material.icons.filled.Search
+import androidx.compose.material3.DockedSearchBar
+import androidx.compose.material3.ExpandedFullScreenSearchBar
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.ListItemDefaults
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.SearchBarDefaults
+import androidx.compose.material3.SearchBarValue
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.material3.rememberSearchBarState
+import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
+import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
+import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.focus.onFocusChanged
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.rememberNavController
+import dev.aaa1115910.biliapi.repositories.SearchTypeResult
+import dev.aaa1115910.bv.mobile.activities.VideoPlayerActivity
+import dev.aaa1115910.bv.mobile.component.preferences.items.listItemPreference
+import dev.aaa1115910.bv.mobile.component.preferences.preferenceGroups
+import dev.aaa1115910.bv.mobile.screen.home.search.SearchInputContent
+import dev.aaa1115910.bv.mobile.screen.home.search.SearchResultContent
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+import dev.aaa1115910.bv.viewmodel.search.SearchInputViewModel
+import dev.aaa1115910.bv.viewmodel.search.SearchResultViewModel
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import org.koin.androidx.compose.koinViewModel
+
+@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
+@Composable
+fun SearchScreen(
+ modifier: Modifier = Modifier,
+ searchInputViewModel: SearchInputViewModel = koinViewModel(),
+ searchResultViewModel: SearchResultViewModel = koinViewModel()
+) {
+ val context = LocalContext.current
+ val windowSizeClass = calculateWindowSizeClass(context as Activity)
+ val windowSize = windowSizeClass.widthSizeClass
+
+ val updateKeyword: (String) -> Unit = { newKeyword ->
+ if (newKeyword != searchInputViewModel.keyword) {
+ searchInputViewModel.keyword = newKeyword
+ searchInputViewModel.updateSuggests()
+ }
+ }
+
+ val onSearch: (String) -> Unit = {
+ searchResultViewModel.keyword = it
+ searchResultViewModel.update()
+ searchInputViewModel.addSearchHistory(it)
+ }
+
+ val onOpenUgc: (Long) -> Unit = { aid ->
+ VideoPlayerActivity.actionStart(context = context, aid = aid)
+ }
+
+ SearchContent(
+ modifier = modifier,
+ windowSize = windowSize,
+ keywordSuggestions = searchInputViewModel.suggests,
+ historyKeywords = searchInputViewModel.searchHistories.map { it.keyword },
+ matchedHistory = searchInputViewModel.matchedSearchHistories.map { it.keyword },
+ updateKeyword = updateKeyword,
+ onSearch = onSearch,
+ onOpenUgc = onOpenUgc,
+ videoSearchResult = searchResultViewModel.videoSearchResult.videos,
+ mediaBangumiSearchResult = searchResultViewModel.mediaBangumiSearchResult.mediaBangumis,
+ mediaFtSearchResult = searchResultViewModel.mediaFtSearchResult.mediaFts,
+ biliUserSearchResult = searchResultViewModel.biliUserSearchResult.biliUsers
+ )
+}
+
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class)
+@Composable
+fun SearchContent(
+ modifier: Modifier = Modifier,
+ windowSize: WindowWidthSizeClass,
+ keywordSuggestions: List = emptyList(),
+ historyKeywords: List,
+ matchedHistory: List,
+ updateKeyword: (String) -> Unit = {},
+ onSearch: (String) -> Unit = {},
+ onOpenUgc: (Long) -> Unit = {},
+ videoSearchResult: List,
+ mediaBangumiSearchResult: List,
+ mediaFtSearchResult: List,
+ biliUserSearchResult: List
+) {
+ val scope = rememberCoroutineScope()
+ val searchBarState = rememberSearchBarState()
+ val textFieldState = rememberTextFieldState()
+ val navController = rememberNavController()
+
+ var searchBarExpanded by remember { mutableStateOf(false) }
+ var textFieldFocused by remember { mutableStateOf(false) }
+
+ LaunchedEffect(textFieldState.text, textFieldFocused) {
+ println("Text field state: $textFieldState")
+ searchBarExpanded = textFieldState.text != "" && textFieldFocused
+ updateKeyword(textFieldState.text.toString())
+ }
+
+ val onSearchKeyword: (String) -> Unit = {
+ onSearch(it)
+ if (navController.currentDestination?.route != "searchResult") navController.navigate("searchResult")
+ textFieldState.setTextAndPlaceCursorAtEnd(it)
+ scope.launch {
+ // 等到 searchBar 移动到顶部再收起
+ delay(500)
+ searchBarState.animateToCollapsed()
+ }
+ }
+
+ val inputField = @Composable {
+ SearchBarDefaults.InputField(
+ modifier = Modifier.onFocusChanged { textFieldFocused = it.isFocused },
+ searchBarState = searchBarState,
+ textFieldState = textFieldState,
+ onSearch = onSearchKeyword,
+ placeholder = { Text(text = "在此处输入文字") },
+ )
+ }
+
+ SharedTransitionLayout(
+ modifier = modifier
+ ) {
+ NavHost(
+ navController = navController,
+ startDestination = "searchInput"
+ ) {
+ composable("searchInput") {
+ SearchInputContent(
+ windowSize = windowSize,
+ keywordSuggestions = keywordSuggestions,
+ keywordHistories = historyKeywords,
+ matchedKeyworkHistories = matchedHistory,
+ searchBarState = searchBarState,
+ textFieldState = textFieldState,
+ searchBarExpanded = searchBarExpanded,
+ onSearchBarExpandedChange = { searchBarExpanded = it },
+ sharedTransitionScope = this@SharedTransitionLayout,
+ animatedVisibilityScope = this@composable,
+ inputField = inputField,
+ onSearch = onSearchKeyword
+ )
+ }
+ composable("searchResult") {
+ SearchResultContent(
+ modifier = Modifier.fillMaxSize(),
+ searchBarState = searchBarState,
+ textFieldState = textFieldState,
+ keywordSuggestions = keywordSuggestions,
+ historyKeywords = historyKeywords,
+ matchedHistory = matchedHistory,
+ sharedTransitionScope = this@SharedTransitionLayout,
+ animatedVisibilityScope = this@composable,
+ inputField = inputField,
+ videoSearchResult = videoSearchResult,
+ mediaBangumiSearchResult = mediaBangumiSearchResult,
+ mediaFtSearchResult = mediaFtSearchResult,
+ biliUserSearchResult = biliUserSearchResult,
+ onSearch = onSearchKeyword,
+ onOpenUgc = onOpenUgc
+ )
+ }
+ }
+ }
+
+ if (windowSize == WindowWidthSizeClass.Compact) {
+ ExpandedFullScreenSearchBar(
+ state = searchBarState,
+ inputField = inputField
+ ) {
+ SearchBarResultContent(
+ modifier = Modifier.fillMaxSize(),
+ keyword = textFieldState.text.toString(),
+ recentHistory = historyKeywords,
+ matchedHistory = matchedHistory,
+ suggestions = keywordSuggestions,
+ onSearch = onSearchKeyword,
+ onDeleteHistory = {}
+ )
+ }
+ }
+}
+
+
+@Composable
+fun SearchBarResultContent(
+ modifier: Modifier = Modifier,
+ keyword: String,
+ recentHistory: List,
+ matchedHistory: List,
+ suggestions: List,
+ onSearch: (String) -> Unit,
+ onDeleteHistory: (String) -> Unit
+) {
+ val listItemColors = ListItemDefaults.colors().copy(
+ containerColor = MaterialTheme.colorScheme.surfaceContainerHighest,
+ )
+
+ Surface(
+ modifier = modifier,
+ color = MaterialTheme.colorScheme.surfaceContainer
+ ) {
+ LazyColumn(
+ modifier = Modifier,
+ contentPadding = PaddingValues(12.dp)
+ ) {
+ preferenceGroups(
+ "历史记录" to {
+ if (keyword.isNotEmpty()) {
+ matchedHistory.take(10).map {
+ listItemPreference(
+ headlineContent = { Text(text = it) },
+ leadingContent = {
+ Box(
+ modifier = Modifier
+ .clip(CircleShape)
+ .background(MaterialTheme.colorScheme.surface),
+ ) {
+ Icon(
+ modifier = Modifier.padding(3.dp),
+ imageVector = Icons.Default.AccessTime,
+ contentDescription = "search history icon",
+ )
+ }
+ },
+ colors = listItemColors,
+ onClick = { onSearch(it) }
+ )
+ }
+ } else {
+ recentHistory.take(10).map {
+ listItemPreference(
+ headlineContent = { Text(text = it) },
+ leadingContent = {
+ Box(
+ modifier = Modifier
+ .clip(CircleShape)
+ .background(MaterialTheme.colorScheme.surface),
+ ) {
+ Icon(
+ modifier = Modifier.padding(3.dp),
+ imageVector = Icons.Default.AccessTime,
+ contentDescription = "search history icon",
+ )
+ }
+ },
+ colors = listItemColors,
+ onClick = { onSearch(it) }
+ )
+ }
+ }
+ },
+ "搜索建议" to {
+ if (keyword.isNotEmpty()) {
+ suggestions.map {
+ listItemPreference(
+ headlineContent = { Text(text = it) },
+ leadingContent = {
+ Box(
+ modifier = Modifier
+ .clip(CircleShape)
+ .background(MaterialTheme.colorScheme.surface),
+ ) {
+ Icon(
+ modifier = Modifier.padding(3.dp),
+ imageVector = Icons.Default.Search,
+ contentDescription = "search suggestion icon",
+ )
+ }
+ },
+ colors = listItemColors,
+ onClick = { onSearch(it) }
+ )
+ }
+ }
+ }
+ )
+ }
+ }
+}
+
+@Preview
+@Composable
+private fun SearchScreenMobilePreview() {
+ BVMobileTheme {
+ SearchContent(
+ windowSize = WindowWidthSizeClass.Compact,
+ videoSearchResult = emptyList(),
+ mediaBangumiSearchResult = emptyList(),
+ mediaFtSearchResult = emptyList(),
+ biliUserSearchResult = emptyList(),
+ historyKeywords = emptyList(),
+ matchedHistory = emptyList()
+ )
+ }
+}
+
+@Preview(device = "spec:width=1280dp,height=800dp,dpi=240")
+@Composable
+private fun SearchScreenTablePreview() {
+ BVMobileTheme {
+ SearchContent(
+ windowSize = WindowWidthSizeClass.Expanded,
+ videoSearchResult = emptyList(),
+ mediaBangumiSearchResult = emptyList(),
+ mediaFtSearchResult = emptyList(),
+ biliUserSearchResult = emptyList(),
+ historyKeywords = emptyList(),
+ matchedHistory = emptyList()
+ )
+ }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun SearchBarResultCompatPreview() {
+ val inputField = @Composable {
+ SearchBarDefaults.InputField(
+ searchBarState = rememberSearchBarState(),
+ textFieldState = rememberTextFieldState(),
+ onSearch = {},
+ placeholder = { Text(text = "在此处输入文字") },
+ )
+ }
+
+ BVMobileTheme {
+ ExpandedFullScreenSearchBar(
+ state = rememberSearchBarState(
+ initialValue = SearchBarValue.Expanded
+ ),
+ inputField = inputField
+ ) {
+ SearchBarResultContent(
+ modifier = Modifier.fillMaxSize(),
+ keyword = "123",
+ recentHistory = listOf("123", "456", "789"),
+ matchedHistory = listOf("123", "456", "789"),
+ suggestions = listOf("123", "456", "789"),
+ onSearch = {},
+ onDeleteHistory = {}
+ )
+ }
+ }
+}
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun SearchBarResultDockedPreview() {
+ val inputField = @Composable {
+ SearchBarDefaults.InputField(
+ searchBarState = rememberSearchBarState(),
+ textFieldState = rememberTextFieldState(),
+ onSearch = {},
+ placeholder = { Text(text = "在此处输入文字") },
+ )
+ }
+
+ BVMobileTheme {
+ DockedSearchBar(
+ expanded = true,
+ onExpandedChange = {},
+ inputField = inputField,
+ ) {
+ SearchBarResultContent(
+ keyword = "123",
+ recentHistory = listOf("123", "456", "789"),
+ matchedHistory = listOf("123", "456", "789"),
+ suggestions = listOf("123", "456", "789"),
+ onSearch = {},
+ onDeleteHistory = {}
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/search/SearchInput.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/search/SearchInput.kt
new file mode 100644
index 000000000..1bc06a908
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/search/SearchInput.kt
@@ -0,0 +1,135 @@
+package dev.aaa1115910.bv.mobile.screen.home.search
+
+import androidx.compose.animation.AnimatedVisibilityScope
+import androidx.compose.animation.ExperimentalSharedTransitionApi
+import androidx.compose.animation.SharedTransitionScope
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.imePadding
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.input.TextFieldState
+import androidx.compose.foundation.text.input.rememberTextFieldState
+import androidx.compose.material3.DockedSearchBar
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.SearchBar
+import androidx.compose.material3.SearchBarState
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBar
+import androidx.compose.material3.TopAppBarDefaults
+import androidx.compose.material3.rememberSearchBarState
+import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.mobile.screen.home.SearchBarResultContent
+
+
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalSharedTransitionApi::class)
+@Composable
+fun SearchInputContent(
+ modifier: Modifier = Modifier,
+ windowSize: WindowWidthSizeClass,
+ keywordSuggestions: List = emptyList(),
+ keywordHistories: List = emptyList(),
+ matchedKeyworkHistories: List = emptyList(),
+ searchBarState: SearchBarState = rememberSearchBarState(),
+ textFieldState: TextFieldState = rememberTextFieldState(),
+ searchBarExpanded: Boolean,
+ onSearchBarExpandedChange: (Boolean) -> Unit,
+ sharedTransitionScope: SharedTransitionScope,
+ animatedVisibilityScope: AnimatedVisibilityScope,
+ inputField: @Composable () -> Unit = {},
+ onSearch: (String) -> Unit
+) {
+ Scaffold(
+ modifier = modifier,
+ topBar = {
+ when (windowSize) {
+ WindowWidthSizeClass.Compact -> {
+
+ }
+
+ else -> {
+ TopAppBar(
+ title = {},
+ colors = TopAppBarDefaults.topAppBarColors(
+ containerColor = MaterialTheme.colorScheme.surfaceContainer,
+ )
+ )
+ }
+ }
+ },
+ containerColor = MaterialTheme.colorScheme.surfaceContainer
+ ) { innerPadding ->
+ Surface(
+ modifier = Modifier
+ .padding(top = innerPadding.calculateTopPadding())
+ .fillMaxSize(),
+ color = MaterialTheme.colorScheme.surface,
+ shape = if (windowSize == WindowWidthSizeClass.Compact) RoundedCornerShape(0.dp) else MaterialTheme.shapes.large,
+ ) {
+ Box(
+ modifier = Modifier.fillMaxSize(),
+ contentAlignment = Alignment.Center
+ ) {
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(32.dp)
+ ) {
+ Text(
+ text = "搜索",
+ style = MaterialTheme.typography.displaySmall
+ )
+
+ when (windowSize) {
+ WindowWidthSizeClass.Compact -> {
+ with(sharedTransitionScope) {
+ SearchBar(
+ modifier = Modifier
+ .sharedElement(
+ sharedContentState = rememberSharedContentState("searchBar"),
+ animatedVisibilityScope = animatedVisibilityScope
+ ),
+ state = searchBarState,
+ inputField = inputField
+ )
+ }
+ }
+
+ else -> {
+ with(sharedTransitionScope) {
+ DockedSearchBar(
+ modifier = Modifier
+ .imePadding()
+ .sharedElement(
+ sharedContentState = rememberSharedContentState("dockedSearchBar"),
+ animatedVisibilityScope = animatedVisibilityScope
+ ),
+ inputField = inputField,
+ expanded = searchBarExpanded,
+ onExpandedChange = onSearchBarExpandedChange,
+ ) {
+ SearchBarResultContent(
+ keyword = textFieldState.text.toString(),
+ recentHistory = keywordHistories,
+ matchedHistory = matchedKeyworkHistories,
+ suggestions = keywordSuggestions,
+ onSearch = onSearch,
+ onDeleteHistory = {}
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/search/SearchResult.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/search/SearchResult.kt
new file mode 100644
index 000000000..54944d1bc
--- /dev/null
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/home/search/SearchResult.kt
@@ -0,0 +1,292 @@
+package dev.aaa1115910.bv.mobile.screen.home.search
+
+import android.app.Activity
+import androidx.compose.animation.AnimatedVisibilityScope
+import androidx.compose.animation.ExperimentalSharedTransitionApi
+import androidx.compose.animation.SharedTransitionScope
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.statusBarsPadding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.grid.GridCells
+import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
+import androidx.compose.foundation.lazy.grid.items
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.input.TextFieldState
+import androidx.compose.foundation.text.input.rememberTextFieldState
+import androidx.compose.material3.ExpandedDockedSearchBar
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.PrimaryScrollableTabRow
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.SearchBar
+import androidx.compose.material3.SearchBarState
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Tab
+import androidx.compose.material3.Text
+import androidx.compose.material3.rememberSearchBarState
+import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
+import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
+import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.biliapi.repositories.SearchType
+import dev.aaa1115910.biliapi.repositories.SearchTypeResult
+import dev.aaa1115910.bv.entity.carddata.VideoCardData
+import dev.aaa1115910.bv.mobile.component.search.UgcListItem
+import dev.aaa1115910.bv.mobile.component.videocard.SmallVideoCard
+import dev.aaa1115910.bv.mobile.screen.home.SearchBarResultContent
+import dev.aaa1115910.bv.util.removeHtmlTags
+
+
+@OptIn(
+ ExperimentalSharedTransitionApi::class,
+ ExperimentalMaterial3Api::class,
+ ExperimentalMaterial3WindowSizeClassApi::class
+)
+@Composable
+fun SearchResultContent(
+ modifier: Modifier = Modifier,
+ searchBarState: SearchBarState = rememberSearchBarState(),
+ textFieldState: TextFieldState = rememberTextFieldState(),
+ keywordSuggestions: List,
+ historyKeywords: List,
+ matchedHistory: List,
+ sharedTransitionScope: SharedTransitionScope,
+ animatedVisibilityScope: AnimatedVisibilityScope,
+ inputField: @Composable () -> Unit = {},
+ videoSearchResult: List,
+ mediaBangumiSearchResult: List,
+ mediaFtSearchResult: List,
+ biliUserSearchResult: List,
+ onSearch: (String) -> Unit,
+ onOpenUgc: (Long) -> Unit
+) {
+ val context = LocalContext.current
+ val windowSize = calculateWindowSizeClass(context as Activity).widthSizeClass
+ var searchType by remember { mutableStateOf(SearchType.Video) }
+
+ Scaffold(
+ modifier = modifier,
+ topBar = {
+ when (windowSize) {
+ WindowWidthSizeClass.Compact -> {
+ Column(
+ modifier = Modifier
+ .statusBarsPadding()
+ ) {
+ Row(
+ modifier = Modifier.fillMaxWidth(),
+ horizontalArrangement = Arrangement.Center
+ ) {
+ with(sharedTransitionScope) {
+ SearchBar(
+ modifier = Modifier
+ .padding(vertical = 4.dp)
+ .sharedElement(
+ sharedContentState = rememberSharedContentState("searchBar"),
+ animatedVisibilityScope = animatedVisibilityScope
+ ),
+ state = searchBarState,
+ inputField = inputField
+ )
+ }
+ }
+ PrimaryScrollableTabRow(
+ selectedTabIndex = searchType.ordinal,
+ ) {
+ SearchType.entries.forEachIndexed { index, title ->
+ Tab(
+ selected = searchType.ordinal == index,
+ onClick = { searchType = title },
+ text = { Text(text = title.name) },
+ )
+ }
+ }
+ }
+ }
+
+ else -> {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ .background(MaterialTheme.colorScheme.surfaceContainer)
+ .statusBarsPadding()
+ ) {
+ with(sharedTransitionScope) {
+ Box(
+ modifier = Modifier
+ .padding(vertical = 4.dp, horizontal = 36.dp)
+ .sharedElement(
+ sharedContentState = rememberSharedContentState("dockedSearchBar"),
+ animatedVisibilityScope = animatedVisibilityScope
+ )
+ ) {
+ SearchBar(
+ modifier = Modifier,
+ state = searchBarState,
+ inputField = inputField
+ )
+ ExpandedDockedSearchBar(
+ state = searchBarState,
+ inputField = inputField
+ ) {
+ SearchBarResultContent(
+ keyword = textFieldState.text.toString(),
+ recentHistory = historyKeywords,
+ matchedHistory = matchedHistory,
+ suggestions = keywordSuggestions,
+ onSearch = onSearch,
+ onDeleteHistory = {}
+ )
+ }
+ }
+ }
+
+ PrimaryScrollableTabRow(
+ modifier = Modifier
+ .align(Alignment.Bottom),
+ selectedTabIndex = searchType.ordinal,
+ containerColor = MaterialTheme.colorScheme.surfaceContainer
+ ) {
+ SearchType.entries.forEachIndexed { index, title ->
+ Tab(
+ selected = searchType.ordinal == index,
+ onClick = { searchType = title },
+ text = { Text(text = title.name) },
+ )
+ }
+ }
+ }
+ }
+ }
+ },
+ containerColor = MaterialTheme.colorScheme.surfaceContainer
+ ) { innerPadding ->
+ Surface(
+ modifier = Modifier
+ .padding(top = innerPadding.calculateTopPadding())
+ .fillMaxSize(),
+ color = MaterialTheme.colorScheme.surface,
+ shape = if (windowSize == WindowWidthSizeClass.Compact) RoundedCornerShape(0.dp) else MaterialTheme.shapes.large,
+ ) {
+ when (searchType) {
+ SearchType.Video -> VideoSearchResult(
+ videoList = videoSearchResult,
+ onClickVideo = onOpenUgc
+ )
+
+ SearchType.MediaBangumi -> MediaBangumiSearchResult(
+ mediaBangumiList = mediaBangumiSearchResult
+ )
+
+ SearchType.MediaFt -> MediaFtSearchResult(
+ mediaFtList = mediaFtSearchResult
+ )
+
+ SearchType.BiliUser -> BiliUserSearchResult(
+ biliUserList = biliUserSearchResult
+ )
+ }
+ }
+ }
+}
+
+@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
+@Composable
+private fun VideoSearchResult(
+ modifier: Modifier = Modifier,
+ videoList: List,
+ onClickVideo: (aid: Long) -> Unit
+) {
+ val context = LocalContext.current
+ val windowSize = calculateWindowSizeClass(context as Activity).widthSizeClass
+
+ when (windowSize) {
+ WindowWidthSizeClass.Compact -> LazyColumn(
+ modifier = modifier
+ ) {
+ items(videoList) { video ->
+ UgcListItem(
+ data = VideoCardData(
+ avid = video.aid,
+ title = video.title.removeHtmlTags(),
+ cover = video.cover,
+ play = video.play,
+ danmaku = video.danmaku,
+ upName = video.author,
+ time = video.duration * 1000L,
+ pubTime = video.pubDate
+ ),
+ onClick = { onClickVideo(video.aid) }
+ )
+ }
+ }
+
+ else -> LazyVerticalGrid(
+ modifier = modifier,
+ columns = GridCells.Adaptive(220.dp),
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ verticalArrangement = Arrangement.spacedBy(8.dp),
+ contentPadding = PaddingValues(8.dp)
+ ) {
+ items(videoList) { video ->
+ SmallVideoCard(
+ data = VideoCardData(
+ avid = video.aid,
+ title = video.title.removeHtmlTags(),
+ cover = video.cover,
+ play = video.play,
+ danmaku = video.danmaku,
+ upName = video.author,
+ time = video.duration * 1000L,
+ pubTime = video.pubDate
+ ),
+ onClick = { onClickVideo(video.aid) }
+ )
+ }
+ }
+ }
+}
+
+
+@Composable
+private fun MediaBangumiSearchResult(
+ modifier: Modifier = Modifier,
+ mediaBangumiList: List,
+) {
+
+}
+
+
+@Composable
+private fun MediaFtSearchResult(
+ modifier: Modifier = Modifier,
+ mediaFtList: List,
+) {
+
+}
+
+
+@Composable
+private fun BiliUserSearchResult(
+ modifier: Modifier = Modifier,
+ biliUserList: List,
+) {
+
+}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsCategories.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsCategories.kt
index 6eac0dcca..2952e3601 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsCategories.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsCategories.kt
@@ -1,32 +1,25 @@
package dev.aaa1115910.bv.mobile.screen.settings
-import android.content.res.Configuration
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LargeTopAppBar
-import androidx.compose.material3.ListItem
-import androidx.compose.material3.ListItemDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
-import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.mobile.component.preferences.items.textPreference
+import dev.aaa1115910.bv.mobile.component.preferences.preferenceGroups
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
@OptIn(ExperimentalMaterial3Api::class)
@@ -36,12 +29,8 @@ fun SettingsCategories(
selectedSettings: MobileSettings?,
onSelectedSettings: (MobileSettings) -> Unit,
showNavBack: Boolean,
- onBack: () -> Unit,
- singleList: Boolean
+ onBack: () -> Unit
) {
- val containerColor =
- if (singleList) MaterialTheme.colorScheme.surface else MaterialTheme.colorScheme.surfaceContainer
-
Scaffold(
modifier = modifier,
topBar = {
@@ -55,94 +44,63 @@ fun SettingsCategories(
)
}.takeIf { showNavBack }
},
- colors = TopAppBarDefaults.largeTopAppBarColors(
- containerColor = containerColor
+ colors = TopAppBarDefaults.topAppBarColors(
+ containerColor = MaterialTheme.colorScheme.surfaceContainerLow
)
)
},
- containerColor = containerColor
+ containerColor = MaterialTheme.colorScheme.surfaceContainerLow
) { innerPadding ->
LazyColumn(
modifier = Modifier.padding(innerPadding),
- contentPadding = PaddingValues(horizontal = 12.dp)
+ contentPadding = PaddingValues(horizontal = 18.dp)
) {
- val settings = listOf(
- MobileSettings.Play,
- MobileSettings.Advance,
- MobileSettings.About,
- MobileSettings.Debug
+ preferenceGroups(
+ null to {
+ listOf(
+ MobileSettings.Play,
+ MobileSettings.Advance
+ ).forEach { item ->
+ textPreference(
+ title = item.title,
+ summary = item.summary,
+ onClick = { onSelectedSettings(item) },
+ selected = selectedSettings == item
+ )
+ }
+ },
+ null to {
+ textPreference(
+ title = MobileSettings.About.title,
+ summary = MobileSettings.About.summary,
+ onClick = { onSelectedSettings(MobileSettings.About) },
+ selected = selectedSettings == MobileSettings.About
+ )
+ },
+ null to {
+ textPreference(
+ title = MobileSettings.Debug.title,
+ summary = MobileSettings.Debug.summary,
+ onClick = { onSelectedSettings(MobileSettings.Debug) },
+ selected = selectedSettings == MobileSettings.Debug
+ )
+ }
)
- items(settings) { item ->
- SettingItem(
- modifier = Modifier,
- text = item.displayName,
- selected = selectedSettings == item,
- onClick = {
- onSelectedSettings(item)
- },
- defaultContainerColor = containerColor
- )
- }
}
}
}
-@Composable
-private fun SettingItem(
- modifier: Modifier = Modifier,
- text: String,
- selected: Boolean,
- onClick: () -> Unit = {},
- defaultContainerColor: Color = MaterialTheme.colorScheme.surface
-) {
- val containerColor = if (selected) MaterialTheme.colorScheme.primary else defaultContainerColor
- val listItemColors = ListItemDefaults.colors(
- containerColor = containerColor,
- headlineColor = contentColorFor(containerColor)
- )
-
- ListItem(
- modifier = modifier
- .clip(MaterialTheme.shapes.medium)
- .clickable { onClick() },
- headlineContent = {
- Text(
- text = text,
- //style = MaterialTheme.typography.titleLarge
- )
- },
- colors = listItemColors
- )
-}
-
@Preview
-@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
-private fun SettingItemPreview() {
+private fun SettingsCategoriesPreview() {
BVMobileTheme {
Surface {
- Box(modifier = Modifier.padding(20.dp)) {
- SettingItem(
- text = "Play",
- selected = false
- )
- }
+ SettingsCategories(
+ selectedSettings = MobileSettings.Play,
+ onSelectedSettings = {},
+ showNavBack = false,
+ onBack = {},
+ )
}
}
}
-
-@Preview
-@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
-@Composable
-private fun SelectedSettingItemPreview() {
- BVMobileTheme {
- Surface {
- Box(modifier = Modifier.padding(20.dp)) {
- SettingItem(
- text = "Play",
- selected = true
- )
- }
- }
- }
-}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsDetails.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsDetails.kt
index da9f4f0a3..ada432d01 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsDetails.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsDetails.kt
@@ -8,8 +8,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LargeTopAppBar
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import dev.aaa1115910.bv.mobile.screen.settings.details.AboutContent
@@ -30,7 +32,7 @@ fun SettingsDetails(
topBar = {
LargeTopAppBar(
title = {
- Text(text = selectedSettings?.displayName ?: "NaN")
+ Text(text = selectedSettings?.title ?: "NaN")
},
navigationIcon = {
if (showNavBack) {
@@ -41,9 +43,13 @@ fun SettingsDetails(
)
}
}
- }
+ },
+ colors = TopAppBarDefaults.topAppBarColors(
+ containerColor = MaterialTheme.colorScheme.surfaceContainerLow
+ )
)
},
+ containerColor = MaterialTheme.colorScheme.surfaceContainerLow
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding))
val contentModifier = Modifier.padding(top = innerPadding.calculateTopPadding())
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsScreen.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsScreen.kt
index ac2bde4d4..08274e845 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsScreen.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/SettingsScreen.kt
@@ -2,15 +2,29 @@ package dev.aaa1115910.bv.mobile.screen.settings
import android.app.Activity
import androidx.activity.compose.BackHandler
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.slideInHorizontally
+import androidx.compose.animation.slideOutHorizontally
+import androidx.compose.foundation.background
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.material3.LocalMinimumInteractiveComponentSize
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.VerticalDragHandle
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.material3.adaptive.layout.AnimatedPane
import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffold
import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole
+import androidx.compose.material3.adaptive.layout.PaneExpansionAnchor
+import androidx.compose.material3.adaptive.layout.PaneExpansionState
+import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldScope
+import androidx.compose.material3.adaptive.layout.rememberPaneExpansionState
import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
@@ -36,11 +50,15 @@ fun SettingsScreen() {
}
ListDetailPaneScaffold(
+ modifier = Modifier
+ .background(MaterialTheme.colorScheme.surfaceContainerLow),
directive = scaffoldNavigator.scaffoldDirective,
value = scaffoldNavigator.scaffoldValue,
listPane = {
AnimatedPane(
- modifier = Modifier.preferredWidth(300.dp),
+ modifier = Modifier.preferredWidth(360.dp),
+ enterTransition = fadeIn() + slideInHorizontally(),
+ exitTransition = fadeOut() + slideOutHorizontally()
) {
SettingsCategories(
selectedSettings = if (singlePart) null else selectedSettings
@@ -53,22 +71,59 @@ fun SettingsScreen() {
},
showNavBack = !scaffoldNavigator.canNavigateBack(),
onBack = { (context as Activity).finish() },
- singleList = singlePart
)
}
},
detailPane = {
- AnimatedPane(modifier = Modifier) {
+ AnimatedPane(
+ modifier = Modifier,
+ enterTransition = fadeIn() + slideInHorizontally { it / 2 },
+ exitTransition = fadeOut() + slideOutHorizontally { it / 2 }
+ ) {
SettingsDetails(
selectedSettings = selectedSettings ?: MobileSettings.Play,
showNavBack = scaffoldNavigator.canNavigateBack(),
onBack = { scope.launch { scaffoldNavigator.navigateBack() } }
)
}
- }
+ },
+ paneExpansionDragHandle = { state -> PaneExpansionDragHandle(state) },
+ paneExpansionState = rememberPaneExpansionState(
+ keyProvider = scaffoldNavigator.scaffoldValue,
+ anchors = PaneExpansionAnchors,
+ )
)
}
-enum class MobileSettings(val displayName: String) {
- Play("播放设置"), About("关于"), Advance("更多设置"), Debug("调试")
+@OptIn(ExperimentalMaterial3AdaptiveApi::class)
+@Composable
+fun ThreePaneScaffoldScope.PaneExpansionDragHandle(
+ state: PaneExpansionState = rememberPaneExpansionState()
+) {
+ val interactionSource = remember { MutableInteractionSource() }
+ VerticalDragHandle(
+ modifier = Modifier
+ .paneExpansionDraggable(
+ state,
+ LocalMinimumInteractiveComponentSize.current,
+ interactionSource,
+ ),
+ interactionSource = interactionSource
+ )
+}
+
+enum class MobileSettings(
+ val title: String,
+ val summary: String? = null
+) {
+ Play(title = "播放设置", summary = "画质编码、音频、循环模式"),
+ About(title = "关于", summary = "一般不会有人点"),
+ Advance(title = "更多设置", summary = "接口"),
+ Debug(title = "调试", "瞅啥瞅");
}
+
+private val PaneExpansionAnchors = listOf(
+ PaneExpansionAnchor.Offset.fromStart(360.dp),
+ PaneExpansionAnchor.Proportion(0.5f),
+ PaneExpansionAnchor.Offset.fromEnd(360.dp),
+)
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AboutContent.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AboutContent.kt
index 7cd79c751..4fb77b084 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AboutContent.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AboutContent.kt
@@ -1,17 +1,18 @@
package dev.aaa1115910.bv.mobile.screen.settings.details
import android.content.Intent
+import android.content.res.Configuration
import androidx.compose.foundation.Image
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
-import androidx.compose.material3.ListItem
+import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -26,8 +27,9 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.net.toUri
-import androidx.tv.material3.Surface
import dev.aaa1115910.bv.BuildConfig
+import dev.aaa1115910.bv.mobile.component.preferences.items.textPreference
+import dev.aaa1115910.bv.mobile.component.preferences.preferenceGroup
import dev.aaa1115910.bv.mobile.component.settings.UpdateDialog
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
@@ -38,40 +40,33 @@ fun AboutContent(
val context = LocalContext.current
var showUpdateDialog by remember { mutableStateOf(false) }
- Column(
+ LazyColumn(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally,
- verticalArrangement = Arrangement.SpaceBetween
+ contentPadding = PaddingValues(horizontal = 18.dp)
) {
- Column {
+ item {
AppIcon(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 24.dp)
)
- ListItem(
- modifier = Modifier
- .clickable { showUpdateDialog = true },
- headlineContent = {
- Text("当前版本")
- },
- supportingContent = {
- Text(text = "${BuildConfig.VERSION_NAME}.${BuildConfig.BUILD_TYPE}")
- }
+ }
+
+ preferenceGroup {
+ textPreference(
+ title = "当前版本",
+ summary = "${BuildConfig.VERSION_NAME}.${BuildConfig.BUILD_TYPE}",
+ onClick = { showUpdateDialog = true }
)
- ListItem(
- modifier = Modifier
- .clickable {
- val url = "https://github.com/aaa1115910/bv"
- val intent = Intent(Intent.ACTION_VIEW, url.toUri())
- context.startActivity(intent)
- },
- headlineContent = {
- Text("项目地址")
- },
- supportingContent = {
- Text(text = "https://github.com/aaa1115910/bv")
- },
+ textPreference(
+ title = "项目地址",
+ summary = "https://github.com/aaa1115910/bv",
+ onClick = {
+ val url = "https://github.com/aaa1115910/bv"
+ val intent = Intent(Intent.ACTION_VIEW, url.toUri())
+ context.startActivity(intent)
+ }
)
}
}
@@ -83,7 +78,7 @@ fun AboutContent(
}
@Composable
-fun AppIcon(modifier: Modifier = Modifier) {
+private fun AppIcon(modifier: Modifier = Modifier) {
Column(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally,
@@ -104,19 +99,29 @@ fun AppIcon(modifier: Modifier = Modifier) {
}
@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
private fun AppIconPreview() {
BVMobileTheme {
- AppIcon()
+ Surface {
+ AppIcon()
+ }
}
}
@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
@Preview(device = "spec:width=1280dp,height=800dp,dpi=240")
+@Preview(
+ device = "spec:width=1280dp,height=800dp,dpi=240",
+ uiMode = Configuration.UI_MODE_NIGHT_YES
+)
@Composable
private fun AboutContentPreview() {
BVMobileTheme {
- Surface {
+ Surface(
+ color = MaterialTheme.colorScheme.surfaceContainerLow
+ ) {
AboutContent(
modifier = Modifier.fillMaxSize()
)
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AdvanceContent.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AdvanceContent.kt
index cf22b4b59..924decfe8 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AdvanceContent.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/AdvanceContent.kt
@@ -1,32 +1,53 @@
package dev.aaa1115910.bv.mobile.screen.settings.details
-import androidx.compose.foundation.layout.Column
+import android.content.res.Configuration
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.LocalContext
-import de.schnettler.datastore.manager.DataStoreManager
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
import dev.aaa1115910.biliapi.entity.ApiType
-import dev.aaa1115910.bv.dataStore
-import dev.aaa1115910.bv.mobile.component.preferences.RadioPreferenceItem
-import dev.aaa1115910.bv.mobile.component.preferences.getOrDefault
+import dev.aaa1115910.bv.mobile.component.preferences.items.radioPreference
+import dev.aaa1115910.bv.mobile.component.preferences.preferenceGroups
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
import dev.aaa1115910.bv.util.PrefKeys
@Composable
fun AdvanceContent(
modifier: Modifier = Modifier
) {
- val context = LocalContext.current
- val dataStoreManager = DataStoreManager(LocalContext.current.dataStore)
- val prefs by dataStoreManager.preferenceFlow.collectAsState(initial = null)
-
- Column(modifier = modifier) {
- RadioPreferenceItem(
- title = "接口偏好",
- items = ApiType.entries.associate { it.ordinal to it.name },
- prefReq = PrefKeys.prefApiTypeRequest,
- summary = ApiType.entries[prefs.getOrDefault(PrefKeys.prefApiTypeRequest)].name
+ LazyColumn(
+ modifier = modifier,
+ contentPadding = PaddingValues(horizontal = 18.dp)
+ ) {
+ preferenceGroups(
+ null to {
+ radioPreference(
+ title = "接口偏好",
+ prefReq = PrefKeys.prefApiTypeRequest,
+ values = ApiType.entries.associate { it.ordinal to it.name }
+ .toSortedMap { a, b -> a.compareTo(b) }
+ )
+ }
)
}
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun AdvanceContentPreview() {
+ BVMobileTheme {
+ Surface(
+ color = MaterialTheme.colorScheme.surfaceContainerLow
+ ) {
+ AdvanceContent(
+ modifier = Modifier.padding(8.dp)
+ )
+ }
+ }
}
\ No newline at end of file
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/DebugContent.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/DebugContent.kt
index b1368caeb..8404c98d9 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/DebugContent.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/DebugContent.kt
@@ -1,11 +1,33 @@
package dev.aaa1115910.bv.mobile.screen.settings.details
+import android.content.res.Configuration
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
@Composable
fun DebugContent(
modifier: Modifier = Modifier
) {
-}
\ No newline at end of file
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun DebugContentPreview() {
+ BVMobileTheme {
+ Surface(
+ color = MaterialTheme.colorScheme.surfaceContainerLow
+ ) {
+ DebugContent(
+ modifier = Modifier.padding(8.dp)
+ )
+ }
+ }
+}
diff --git a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/PlayContent.kt b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/PlayContent.kt
index e00731989..bf6444c12 100644
--- a/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/PlayContent.kt
+++ b/app/mobile/src/main/kotlin/dev/aaa1115910/bv/mobile/screen/settings/details/PlayContent.kt
@@ -1,16 +1,28 @@
package dev.aaa1115910.bv.mobile.screen.settings.details
-import androidx.compose.foundation.layout.Column
+import android.content.res.Configuration
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+<<<<<<< HEAD
import de.schnettler.datastore.manager.DataStoreManager
import dev.aaa1115910.bv.dataStore
import dev.aaa1115910.bv.mobile.component.preferences.RadioPreferenceItem
import dev.aaa1115910.bv.mobile.component.preferences.SwitchPreferenceItem
import dev.aaa1115910.bv.mobile.component.preferences.getOrDefault
+=======
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import dev.aaa1115910.bv.mobile.component.preferences.items.radioPreference
+import dev.aaa1115910.bv.mobile.component.preferences.items.switchPreference
+import dev.aaa1115910.bv.mobile.component.preferences.preferenceGroups
+import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
+>>>>>>> develop
import dev.aaa1115910.bv.player.entity.Audio
import dev.aaa1115910.bv.player.entity.Resolution
import dev.aaa1115910.bv.player.entity.VideoCodec
@@ -21,33 +33,42 @@ fun PlayContent(
modifier: Modifier = Modifier
) {
val context = LocalContext.current
- val dataStoreManager = DataStoreManager(LocalContext.current.dataStore)
- val prefs by dataStoreManager.preferenceFlow.collectAsState(initial = null)
- Column(
- modifier = modifier
+ LazyColumn(
+ modifier = modifier,
+ contentPadding = PaddingValues(horizontal = 18.dp)
) {
- RadioPreferenceItem(
- title = "默认画质",
- items = Resolution.entries.associate { it.code to it.getDisplayName(context) },
- prefReq = PrefKeys.prefDefaultQualityRequest,
- summary = Resolution.fromCode(prefs.getOrDefault(PrefKeys.prefDefaultQualityRequest))
- ?.getDisplayName(context) ?: ""
- )
- RadioPreferenceItem(
- title = "默认视频编码",
- items = listOf(VideoCodec.AVC, VideoCodec.HEVC, VideoCodec.AV1)
- .associate { it.codecId to it.getDisplayName(context) },
- prefReq = PrefKeys.prefDefaultVideoCodecRequest,
- summary = VideoCodec.fromCode(prefs.getOrDefault(PrefKeys.prefDefaultVideoCodecRequest))
- ?.getDisplayName(context) ?: ""
- )
- RadioPreferenceItem(
- title = "默认音频",
- items = Audio.entries.associate { it.code to it.getDisplayName(context) },
- prefReq = PrefKeys.prefDefaultAudioRequest,
- summary = Audio.fromCode(prefs.getOrDefault(PrefKeys.prefDefaultAudioRequest))
- ?.getDisplayName(context) ?: ""
+ preferenceGroups(
+ "画面" to {
+ radioPreference(
+ title = "默认画质",
+ prefReq = PrefKeys.prefDefaultQualityRequest,
+ values = Resolution.entries.associate { it.code to it.getDisplayName(context) }
+ .toSortedMap { a, b -> a.compareTo(b) }
+ )
+ radioPreference(
+ title = "默认视频编码",
+ prefReq = PrefKeys.prefDefaultVideoCodecRequest,
+ values = VideoCodec.entries.associate { it.codecId to it.getDisplayName(context) }
+ .toSortedMap { a, b -> a.compareTo(b) }
+ )
+ },
+ "音频" to {
+ radioPreference(
+ title = "默认音频",
+ prefReq = PrefKeys.prefDefaultAudioRequest,
+ values = Audio.entries.associate { it.code to it.getDisplayName(context) }
+ .toSortedMap { a, b -> a.compareTo(b) }
+ )
+ },
+ "解码器" to {
+ switchPreference(
+ title = "启用视频软解",
+ summary = "使用软件解码器播放视频,可能解决硬解兼容性问题",
+ prefReq = PrefKeys.prefEnableSoftwareVideoRendererRequest,
+ onCheckedChange = { true }
+ )
+ }
)
SwitchPreferenceItem(
title = "启用视频软解",
@@ -55,4 +76,19 @@ fun PlayContent(
prefReq = PrefKeys.prefEnableSoftwareVideoRendererRequest
)
}
-}
\ No newline at end of file
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun PlayContentPreview() {
+ BVMobileTheme {
+ Surface(
+ color = MaterialTheme.colorScheme.surfaceContainerLow
+ ) {
+ PlayContent(
+ modifier = Modifier.padding(8.dp)
+ )
+ }
+ }
+}
diff --git a/app/shared/build.gradle.kts b/app/shared/build.gradle.kts
index 28deba75b..f15aca327 100644
--- a/app/shared/build.gradle.kts
+++ b/app/shared/build.gradle.kts
@@ -3,7 +3,6 @@ import java.net.URI
plugins {
alias(gradleLibs.plugins.android.library)
alias(gradleLibs.plugins.compose.compiler)
- alias(gradleLibs.plugins.firebase.crashlytics)
alias(gradleLibs.plugins.google.ksp)
alias(gradleLibs.plugins.google.protobuf)
alias(gradleLibs.plugins.google.services) apply false
@@ -69,11 +68,6 @@ android {
}
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
-
buildFeatures {
compose = true
buildConfig = true
@@ -94,7 +88,7 @@ ksp {
java {
toolchain {
- languageVersion.set(JavaLanguageVersion.of(17))
+ languageVersion.set(JavaLanguageVersion.of(AppConfiguration.jdk))
}
}
@@ -136,8 +130,8 @@ dependencies {
api(libs.coil.compose)
api(libs.coil.gif)
api(libs.coil.svg)
- api(libs.firebase.analytics.ktx)
- api(libs.firebase.crashlytics.ktx)
+ api(libs.firebase.analytics)
+ api(libs.firebase.crashlytics)
api(libs.geetest.sensebot)
api(libs.koin.android)
api(libs.koin.annotations)
@@ -160,10 +154,12 @@ dependencies {
api(libs.qrcode)
api(libs.rememberPreference)
api(libs.slf4j.android.mvysny)
+ api(libs.zxing)
api(project(mapOf("path" to ":bili-api")))
api(project(mapOf("path" to ":bili-subtitle")))
api(project(mapOf("path" to ":player")))
api(project(mapOf("path" to ":utils")))
+ api(project(mapOf("path" to ":symbols")))
testImplementation(androidx.room.testing)
testImplementation(libs.kotlin.test)
androidTestImplementation(androidx.compose.ui.test.junit4)
diff --git a/app/shared/src/main/kotlin/de/schnettler/datastore/manager/DataStoreManager.kt b/app/shared/src/main/kotlin/de/schnettler/datastore/manager/DataStoreManager.kt
index 3acc2b646..fe2cf7187 100644
--- a/app/shared/src/main/kotlin/de/schnettler/datastore/manager/DataStoreManager.kt
+++ b/app/shared/src/main/kotlin/de/schnettler/datastore/manager/DataStoreManager.kt
@@ -1,5 +1,7 @@
package de.schnettler.datastore.manager
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
@@ -17,6 +19,12 @@ class DataStoreManager(val dataStore: DataStore) {
it[request.key] ?: request.defaultValue
}
+ @Composable
+ fun getPreferenceState(request: PreferenceRequest) =
+ getPreferenceFlow(request).collectAsState(
+ initial = request.defaultValue
+ )
+
suspend fun editPreference(key: Preferences.Key, newValue: T) {
dataStore.edit { preferences ->
preferences[key] = newValue
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/component/QrImage.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/component/QrImage.kt
deleted file mode 100644
index d57a22ea8..000000000
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/component/QrImage.kt
+++ /dev/null
@@ -1,166 +0,0 @@
-package dev.aaa1115910.bv.component
-
-import android.graphics.BitmapFactory
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
-import androidx.compose.material3.LoadingIndicator
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableIntStateOf
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberCoroutineScope
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.graphics.ImageBitmapConfig
-import androidx.compose.ui.graphics.Shape
-import androidx.compose.ui.graphics.asImageBitmap
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
-import dev.aaa1115910.bv.util.countDownTimer
-import io.github.g0dkar.qrcode.QRCode
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
-import java.io.ByteArrayInputStream
-import java.io.ByteArrayOutputStream
-
-@OptIn(ExperimentalMaterial3ExpressiveApi::class)
-@Composable
-fun QrImage(
- modifier: Modifier = Modifier,
- content: String,
- borderWidth: Dp = 24.dp,
- shape: Shape = MaterialTheme.shapes.large,
- showLoadingWhenContentChanged: Boolean = true
-) {
- val scope = rememberCoroutineScope()
- var qrImage by remember { mutableStateOf(ImageBitmap(1, 1, ImageBitmapConfig.Argb8888)) }
- var qrGenerated by remember { mutableStateOf(false) }
- var qrJob by remember { mutableStateOf(null) }
-
- val createQr: suspend () -> Unit = {
- val output = ByteArrayOutputStream()
- QRCode(content).render().writeImage(output)
- val input = ByteArrayInputStream(output.toByteArray())
- val image = BitmapFactory.decodeStream(input).asImageBitmap()
- withContext(Dispatchers.Main) { qrImage = image }
- //delay(2000)
- qrGenerated = true
- }
-
- LaunchedEffect(content) {
- qrJob?.cancel()
- qrJob = scope.launch(Dispatchers.Default) {
- if (showLoadingWhenContentChanged) qrGenerated = false
- if (content.isNotBlank()) createQr()
- }
- }
-
- Box(
- modifier = modifier
- .clip(shape)
- .background(Color.White),
- contentAlignment = Alignment.Center,
- ) {
- if (qrGenerated) {
- Image(
- modifier = Modifier
- .fillMaxSize()
- .padding(borderWidth),
- bitmap = qrImage,
- contentDescription = null
- )
- } else {
- LoadingIndicator(
- modifier = Modifier.fillMaxSize(0.5f)
- )
- }
- }
-}
-
-@Preview
-@Composable
-private fun QrImagePreview() {
- MaterialTheme {
- QrImage(
- modifier = Modifier.size(240.dp),
- content = "https://www.example.com"
- )
- }
-}
-
-
-@Preview
-@Composable
-private fun QrImageWithContentsPreview() {
- val contents = listOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
- var currentContent by remember { mutableStateOf("") }
- var index by remember { mutableIntStateOf(0) }
-
- LaunchedEffect(Unit) {
- countDownTimer(
- millisInFuture = 1000L * 10,
- countDownInterval = 1000L,
- tag = "",
- onTick = { _ ->
- currentContent = contents[index++]
- println("Current content: $currentContent")
- },
- )
- }
-
- MaterialTheme {
- Column {
- QrImage(
- modifier = Modifier.size(240.dp),
- content = currentContent
- )
- }
- }
-}
-
-
-@Preview
-@Composable
-private fun QrImageDifferentSizesPreview() {
- MaterialTheme {
- Column(
- modifier = Modifier.verticalScroll(rememberScrollState())
- ) {
- QrImage(
- modifier = Modifier.size(100.dp),
- content = "https://www.example.com",
- borderWidth = 16.dp
- )
- QrImage(
- modifier = Modifier.size(200.dp),
- content = "https://www.example.com"
- )
- QrImage(
- modifier = Modifier.size(300.dp),
- content = "https://www.example.com"
- )
- QrImage(
- modifier = Modifier.size(400.dp),
- content = "https://www.example.com"
- )
- }
- }
-}
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/dao/SearchHistoryDao.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/dao/SearchHistoryDao.kt
index 6563c320b..acdb88ab7 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/dao/SearchHistoryDao.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/dao/SearchHistoryDao.kt
@@ -18,6 +18,9 @@ interface SearchHistoryDao {
@Query("SELECT * FROM search_history WHERE keyword = :keyword LIMIT 1")
suspend fun findHistory(keyword: String): SearchHistoryDB?
+ @Query("SELECT * FROM search_history WHERE keyword LIKE '%' || :keyword || '%' LIMIT :count")
+ suspend fun findHistories(keyword: String, count: Int): List
+
@Insert
suspend fun insert(vararg searchHistoryDB: SearchHistoryDB)
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/entity/carddata/VideoCardData.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/entity/carddata/VideoCardData.kt
index a742b0bb3..66bbffb98 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/entity/carddata/VideoCardData.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/entity/carddata/VideoCardData.kt
@@ -1,6 +1,7 @@
package dev.aaa1115910.bv.entity.carddata
import dev.aaa1115910.bv.util.formatHourMinSec
+import java.text.SimpleDateFormat
data class VideoCardData(
val avid: Long,
@@ -15,7 +16,9 @@ data class VideoCardData(
val time: Long? = null,
var timeString: String = "",
val jumpToSeason: Boolean = false,
- val epId: Int? = null
+ val epId: Int? = null,
+ val pubTime: Int? = null,
+ var pubTimeString: String = "",
) {
init {
play?.let {
@@ -27,5 +30,9 @@ data class VideoCardData(
time?.let {
timeString = if (it > 0) it.formatHourMinSec() else ""
}
+ pubTime?.let {
+ pubTimeString =
+ if (it > 0) SimpleDateFormat("yyyy-MM-dd").format(java.util.Date(it * 1000L)) else ""
+ }
}
}
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/network/GithubApi.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/network/GithubApi.kt
index 278be1dec..958adb020 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/network/GithubApi.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/network/GithubApi.kt
@@ -29,8 +29,20 @@ import java.io.File
object GithubApi {
private var endPoint = "api.github.com"
- private const val OWNER = "aaa1115910"
- private const val REPO = "bv"
+ private const val OWNER = "Colorful-glassblock"
+ private const val REPO = "bvcn"
+ // 当前分支名称,用于过滤对应分支的 release
+ private const val CURRENT_BRANCH = "lastAndroid5"
+ // 电视端特殊处理:如果在 TV 上运行,允许获取所有 release(因为 TV 可能需要更多版本)
+ private val isTvDevice: Boolean
+ get() {
+ return try {
+ val uiModeManager = LocalContext.current.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
+ uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION
+ } catch (e: Exception) {
+ false
+ }
+
private lateinit var client: HttpClient
private val json = Json {
coerceInputValues = true
@@ -74,16 +86,26 @@ object GithubApi {
parameter("page", page)
}.bodyAsText()
checkErrorMessage(response)
- return json.decodeFromString>(response)
+ val allReleases = json.decodeFromString>(response)
+<<<<<<< HEAD
+ // 电视端特殊处理:如果在 TV 上运行,允许获取所有 release
+ if (isTvDevice) {
+ return allReleases
+ }
+ // 其他设备:过滤只匹配当前分支的 release
+=======
+ // 过滤只匹配当前分支的 release
+>>>>>>> develop
+ return allReleases.filter { it.targetCommitish == CURRENT_BRANCH }
}
private suspend fun getLatestRelease(
owner: String = OWNER,
repo: String = REPO
): Release {
- val response = client.get("repos/$owner/$repo/releases/latest").bodyAsText()
- checkErrorMessage(response)
- return json.decodeFromString(response)
+ val releases = getReleases(owner = owner, repo = repo, pageSize = 1)
+ return releases.firstOrNull { !it.isPreRelease }
+ ?: throw IllegalStateException("No release found for branch $CURRENT_BRANCH")
}
suspend fun getLatestPreReleaseBuild(): Release {
@@ -95,7 +117,7 @@ object GithubApi {
release = releases.firstOrNull { it.isPreRelease }
page++
}
- return release ?: throw IllegalStateException("No pre-release found")
+ return release ?: throw IllegalStateException("No pre-release found for branch $CURRENT_BRANCH")
}
suspend fun getLatestReleaseBuild(): Release = getLatestRelease()
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/NetworkUtil.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/NetworkUtil.kt
index 5f972940b..4cc80bcf0 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/NetworkUtil.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/NetworkUtil.kt
@@ -4,19 +4,9 @@ import io.github.oshai.kotlinlogging.KotlinLogging
import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp
import io.ktor.client.plugins.HttpRequestRetry
-import io.ktor.client.request.get
-import io.ktor.client.statement.bodyAsText
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.selects.select
-import kotlinx.coroutines.withContext
object NetworkUtil {
private lateinit var client: HttpClient
- private val locCheckUrls = listOf(
- "https://www.cloudflare.com/cdn-cgi/trace",
- "https://1.1.1.1/cdn-cgi/trace"
- )
private val logger = KotlinLogging.logger { }
init {
@@ -30,31 +20,4 @@ object NetworkUtil {
}
}
}
-
- suspend fun isMainlandChina() = withContext(Dispatchers.IO) {
- val deferreds = locCheckUrls.map { locCheckUrl ->
- async {
- runCatching {
- val result = client.get(locCheckUrl).bodyAsText()
- logger.info { "Network result:\n$result" }
-
- val networkCheckResult = result
- .lines()
- .filter { it.isNotBlank() }
- .associate { with(it.split("=")) { this[0] to this[1] } }
-
- require(networkCheckResult["loc"] != "CN") { "BV doesn't support use in mainland China" }
- false
- }.getOrDefault(true)
- }
- }
-
- select {
- deferreds.forEach { deferred ->
- deferred.onAwait { it }
- }
- }.also {
- deferreds.forEach { it.cancel() }
- }
- }
}
\ No newline at end of file
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/Prefs.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/Prefs.kt
index 4f2a3e809..9240ffb41 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/Prefs.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/util/Prefs.kt
@@ -20,6 +20,7 @@ import dev.aaa1115910.bv.entity.PlayerType
import dev.aaa1115910.bv.entity.ThemeType
import dev.aaa1115910.bv.player.entity.Audio
import dev.aaa1115910.bv.player.entity.DanmakuType
+import dev.aaa1115910.bv.player.entity.PlayMode
import dev.aaa1115910.bv.player.entity.Resolution
import dev.aaa1115910.bv.player.entity.VideoCodec
import io.github.oshai.kotlinlogging.KotlinLogging
@@ -319,9 +320,16 @@ object Prefs {
ThemeType.entries[dsm.getPreferenceFlow(PrefKeys.prefThemeTypeRequest).first()]
}
set(value) = runBlocking { dsm.editPreference(PrefKeys.prefThemeTypeKey, value.ordinal) }
+
val themeTypeFlow: Flow
get() = dsm.getPreferenceFlow(PrefKeys.prefThemeTypeRequest)
.transform { ordinal -> emit(ThemeType.entries[ordinal]) }
+
+ var defaultPlayMode: PlayMode
+ get() = runBlocking {
+ PlayMode.entries[dsm.getPreferenceFlow(PrefKeys.prefPlayModeRequest).first()]
+ }
+ set(value) = runBlocking { dsm.editPreference(PrefKeys.prefPlayModeKey, value.ordinal) }
}
object PrefKeys {
@@ -368,6 +376,7 @@ object PrefKeys {
val prefEnableSoftwareVideoRenderer = booleanPreferencesKey("enable_software_video_renderer")
val prefBlacklistUserKey = booleanPreferencesKey("blacklist_user")
val prefThemeTypeKey = intPreferencesKey("theme_type")
+ val prefPlayModeKey = intPreferencesKey("play_mode")
val prefIsLoginRequest = PreferenceRequest(prefIsLoginKey, false)
val prefUidRequest = PreferenceRequest(prefUidKey, 0)
@@ -403,7 +412,11 @@ object PrefKeys {
val prefBuvid3Request = PreferenceRequest(prefBuvid3Key, "")
val prefPlayerTypeRequest = PreferenceRequest(prefPlayerTypeKey, PlayerType.Media3.ordinal)
val prefDensityRequest =
- PreferenceRequest(prefDensityKey, BVApp.context.resources.displayMetrics.widthPixels / 960f)
+ PreferenceRequest(
+ prefDensityKey,
+ runCatching { BVApp.context.resources.displayMetrics.widthPixels / 960f }
+ .getOrDefault(2f)
+ )
@Suppress("KotlinConstantConditions")
val prefAlphaRequest = PreferenceRequest(prefAlphaKey, BuildConfig.BUILD_TYPE == "alpha")
@@ -422,4 +435,5 @@ object PrefKeys {
val prefEnableSoftwareVideoRendererRequest = PreferenceRequest(prefEnableSoftwareVideoRenderer, false)
val prefBlacklistUserRequest = PreferenceRequest(prefBlacklistUserKey, false)
val prefThemeTypeRequest = PreferenceRequest(prefThemeTypeKey, ThemeType.Auto.ordinal)
+ val prefPlayModeRequest = PreferenceRequest(prefPlayModeKey, PlayMode.Sequential.ordinal)
}
\ No newline at end of file
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/VideoPlayerV3ViewModel.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/VideoPlayerV3ViewModel.kt
index 8c85b8231..19e4d6d53 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/VideoPlayerV3ViewModel.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/VideoPlayerV3ViewModel.kt
@@ -33,10 +33,12 @@ import dev.aaa1115910.bv.entity.proxy.ProxyArea
import dev.aaa1115910.bv.player.AbstractVideoPlayer
import dev.aaa1115910.bv.player.entity.Audio
import dev.aaa1115910.bv.player.entity.DanmakuType
+import dev.aaa1115910.bv.player.entity.PlayMode
import dev.aaa1115910.bv.player.entity.RequestState
import dev.aaa1115910.bv.player.entity.Resolution
import dev.aaa1115910.bv.player.entity.VideoAspectRatio
import dev.aaa1115910.bv.player.entity.VideoCodec
+import dev.aaa1115910.bv.player.entity.VideoListItemData
import dev.aaa1115910.bv.repository.VideoInfoRepository
import dev.aaa1115910.bv.util.Prefs
import dev.aaa1115910.bv.util.fException
@@ -102,6 +104,8 @@ class VideoPlayerV3ViewModel(
var currentSubtitleBackgroundOpacity by mutableFloatStateOf(Prefs.defaultSubtitleBackgroundOpacity)
var currentSubtitleBottomPadding by mutableStateOf(Prefs.defaultSubtitleBottomPadding)
+ var currentPlayMode by mutableStateOf(Prefs.defaultPlayMode)
+
var title by mutableStateOf("")
var partTitle by mutableStateOf("")
var lastPlayed by mutableIntStateOf(0)
@@ -399,7 +403,11 @@ class VideoPlayerV3ViewModel(
currentVideoWidth = videoItem?.width ?: 0
logger.info { "Video url: $videoUrl" }
logger.info { "Audio url: $audioUrl" }
+<<<<<<< HEAD
// 将 playUrl 移到 IO 线程,避免主线程卡顿
+=======
+ // 将 playUrl 移到 IO 线程,避免主线程阻塞
+>>>>>>> develop
withContext(Dispatchers.IO) {
videoPlayer!!.playUrl(videoUrl, audioUrl)
}
@@ -672,4 +680,70 @@ class VideoPlayerV3ViewModel(
logger.fWarn { "Load video shot failed: ${it.stackTraceToString()}" }
}
}
+
+ fun playNextVideo() {
+ logger.fInfo { "Video finished" }
+ when (currentPlayMode) {
+ PlayMode.Single -> {
+ logger.info { "Play mode: $currentPlayMode, do nothing" }
+ }
+
+ PlayMode.Sequential -> {
+ logger.info { "Play mode: $currentPlayMode, play next video in list" }
+ playNextVideoInList()
+ }
+
+ PlayMode.SingleLoop -> {
+ logger.info { "Play mode: $currentPlayMode, replay current video" }
+ danmakuPlayer?.seekTo(0L)
+ danmakuPlayer?.pause()
+ videoPlayer?.seekTo(0L)
+ }
+
+ PlayMode.ListLoop -> {
+ logger.info { "Play mode: $currentPlayMode, play next video in list or loop to first" }
+ playNextVideoInList(loop = true)
+ }
+ }
+ }
+
+ private fun playNextVideoInList(loop: Boolean = false) {
+ val currentIndex = availableVideoList
+ .indexOfFirst {
+ when (it) {
+ is VideoListItemData -> it.cid == currentCid
+ else -> false
+ }
+ }
+ if (currentIndex + 1 < availableVideoList.size) {
+ val nextVideos = availableVideoList.subList(
+ currentIndex + 1,
+ availableVideoList.size
+ )
+ val nextVideo =
+ nextVideos.firstOrNull { it is VideoListItemData }!! as VideoListItemData
+ logger.info { "Play next video: $nextVideo" }
+ partTitle = nextVideo.title
+ loadPlayUrl(
+ avid = nextVideo.aid,
+ cid = nextVideo.cid,
+ epid = nextVideo.epid,
+ seasonId = nextVideo.seasonId,
+ continuePlayNext = true
+ )
+ } else if (loop) {
+ //loop to first
+ val firstVideo =
+ availableVideoList.firstOrNull { it is VideoListItemData }!! as VideoListItemData
+ logger.info { "Loop to first video: $firstVideo" }
+ partTitle = firstVideo.title
+ loadPlayUrl(
+ avid = firstVideo.aid,
+ cid = firstVideo.cid,
+ epid = firstVideo.epid,
+ seasonId = firstVideo.seasonId,
+ continuePlayNext = true
+ )
+ }
+ }
}
\ No newline at end of file
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/login/AppQrLoginViewModel.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/login/AppQrLoginViewModel.kt
index 0136aba14..c98174380 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/login/AppQrLoginViewModel.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/login/AppQrLoginViewModel.kt
@@ -1,12 +1,8 @@
package dev.aaa1115910.bv.viewmodel.login
-import android.graphics.BitmapFactory
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
-import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.graphics.ImageBitmapConfig
-import androidx.compose.ui.graphics.asImageBitmap
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dev.aaa1115910.biliapi.entity.login.QrLoginState
@@ -20,15 +16,12 @@ import dev.aaa1115910.bv.util.fError
import dev.aaa1115910.bv.util.fInfo
import dev.aaa1115910.bv.util.timeTask
import dev.aaa1115910.bv.util.toast
-import io.github.g0dkar.qrcode.QRCode
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.koin.android.annotation.KoinViewModel
-import java.io.ByteArrayInputStream
-import java.io.ByteArrayOutputStream
import java.util.Timer
@KoinViewModel
@@ -39,7 +32,6 @@ class AppQrLoginViewModel(
var state by mutableStateOf(QrLoginState.Ready)
private val logger = KotlinLogging.logger { }
var loginUrl by mutableStateOf("")
- var qrImage by mutableStateOf(ImageBitmap(1, 1, ImageBitmapConfig.Argb8888))
private var key = ""
private var timer = Timer()
@@ -55,10 +47,9 @@ class AppQrLoginViewModel(
key = qrLoginData.key
logger.fInfo { "Get login request code url" }
logger.info { qrLoginData.url }
- withContext(Dispatchers.Main) { generateQRImage() }
runCatching { timer.cancel() }
timer = timeTask(1000, 1000, "check qr login result") {
- viewModelScope.launch {
+ viewModelScope.launch(Dispatchers.IO) {
checkLoginResult()
}
}
@@ -131,12 +122,4 @@ class AppQrLoginViewModel(
logger.fError { "Check qr state failed: ${it.stackTraceToString()}" }
}
}
-
- private fun generateQRImage() {
- val output = ByteArrayOutputStream()
- QRCode(loginUrl).render().writeImage(output)
- val input = ByteArrayInputStream(output.toByteArray())
- qrImage = BitmapFactory.decodeStream(input).asImageBitmap()
- logger.fInfo { "Generated qr image" }
- }
}
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchInputViewModel.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchInputViewModel.kt
index 7e16dd481..b158394b6 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchInputViewModel.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchInputViewModel.kt
@@ -33,6 +33,7 @@ class SearchInputViewModel(
val hotwords = mutableStateListOf()
val suggests = mutableStateListOf()
val searchHistories = mutableStateListOf()
+ val matchedSearchHistories = mutableStateListOf()
init {
updateHotwords()
@@ -75,6 +76,7 @@ class SearchInputViewModel(
logger.info { it.stackTraceToString() }
}
}
+ updateMatchedSearchHistories()
}
private fun loadSearchHistories() {
@@ -87,6 +89,21 @@ class SearchInputViewModel(
}
}
+ private fun updateMatchedSearchHistories() {
+ logger.fInfo { "Update matched search histories with '$keyword'" }
+ viewModelScope.launch(Dispatchers.IO) {
+ runCatching {
+ if (keyword.isEmpty()) {
+ matchedSearchHistories.clear()
+ } else {
+ val matchedHistories = db.searchHistoryDao().findHistories(keyword, 20)
+ matchedSearchHistories.swapListWithMainContext(matchedHistories)
+ }
+ logger.fInfo { "Update matched search histories finish, size: ${matchedSearchHistories.size}" }
+ }
+ }
+ }
+
fun addSearchHistory(keyword: String) {
logger.fInfo { "Add search history: $keyword" }
viewModelScope.launch(Dispatchers.IO) {
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchResultViewModel.kt b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchResultViewModel.kt
index 0f86af8c9..bc51f0e32 100644
--- a/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchResultViewModel.kt
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/bv/viewmodel/search/SearchResultViewModel.kt
@@ -15,6 +15,7 @@ import dev.aaa1115910.biliapi.repositories.SearchTypeResult
import dev.aaa1115910.bv.R
import dev.aaa1115910.bv.util.Partition
import dev.aaa1115910.bv.util.Prefs
+import dev.aaa1115910.bv.util.fException
import dev.aaa1115910.bv.util.fInfo
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.Dispatchers
@@ -45,7 +46,6 @@ class SearchResultViewModel(
private var updating = false
val hasMore = true
- private var page = SearchTypePage()
var enableProxySearchResult = false
@@ -78,6 +78,12 @@ class SearchResultViewModel(
updating = true
viewModelScope.launch(Dispatchers.IO) {
+ val page = when (searchType) {
+ SearchType.Video -> videoSearchResult.page
+ SearchType.MediaBangumi -> mediaBangumiSearchResult.page
+ SearchType.MediaFt -> mediaFtSearchResult.page
+ SearchType.BiliUser -> biliUserSearchResult.page
+ }
logger.fInfo { "Load search result: [keyword=$keyword, type=$searchType, page=${page}]" }
runCatching {
val searchResultResponse = searchRepository.searchType(
@@ -92,21 +98,33 @@ class SearchResultViewModel(
)
withContext(Dispatchers.Main) {
when (searchType) {
- SearchType.Video -> videoSearchResult =
- videoSearchResult.appendSearchResultData(searchResultResponse)
-
- SearchType.MediaBangumi -> mediaBangumiSearchResult =
- mediaBangumiSearchResult.appendSearchResultData(searchResultResponse)
-
- SearchType.MediaFt -> mediaFtSearchResult =
- mediaFtSearchResult.appendSearchResultData(searchResultResponse)
-
- SearchType.BiliUser -> biliUserSearchResult =
- biliUserSearchResult.appendSearchResultData(searchResultResponse)
+ SearchType.Video -> {
+ videoSearchResult =
+ videoSearchResult.appendSearchResultData(searchResultResponse)
+ videoSearchResult.page = searchResultResponse.page
+ }
+
+ SearchType.MediaBangumi -> {
+ mediaBangumiSearchResult =
+ mediaBangumiSearchResult.appendSearchResultData(searchResultResponse)
+ mediaBangumiSearchResult.page = searchResultResponse.page
+ }
+
+ SearchType.MediaFt -> {
+ mediaFtSearchResult =
+ mediaFtSearchResult.appendSearchResultData(searchResultResponse)
+ mediaFtSearchResult.page = searchResultResponse.page
+ }
+
+ SearchType.BiliUser -> {
+ biliUserSearchResult =
+ biliUserSearchResult.appendSearchResultData(searchResultResponse)
+ biliUserSearchResult.page = searchResultResponse.page
+ }
}
}
-
- page = searchResultResponse.page
+ }.onFailure {
+ logger.fException(it) { "Load search result failed [searchType=$searchType, keyword=$keyword, page=$page]" }
}
updating = false
}
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/DampedString.kt b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/DampedString.kt
new file mode 100644
index 000000000..874a1deff
--- /dev/null
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/DampedString.kt
@@ -0,0 +1,29 @@
+package dev.aaa1115910.m3qrcode
+
+import kotlin.math.abs
+import kotlin.math.cos
+import kotlin.math.exp
+import kotlin.math.pow
+import kotlin.math.sin
+import kotlin.math.sqrt
+
+class DampedString(period: Int, private val dampingRatio: Float) {
+ private val dampedNaturalFrequency: Float
+ private val stiffness: Float
+ private val undampedNaturalFrequency: Float
+
+ init {
+ stiffness = ((6.2831855f / period).toDouble().pow(2.0).toFloat()) * 1.0f
+ val sqrt = sqrt((stiffness / 1.0f).toDouble()).toFloat()
+ undampedNaturalFrequency = sqrt
+ dampedNaturalFrequency = sqrt * (sqrt(abs(1 - dampingRatio.pow(2f))))
+ }
+
+ fun calculatePosition(i: Int): Float {
+ val f = undampedNaturalFrequency * dampingRatio
+ val f2 = dampedNaturalFrequency
+ val f3 = ((f * (-1.0f)) + 0.0f) / f2
+ val d = (f2 * i).toDouble()
+ return ((exp(((-f) * i))) * ((f3 * (sin(d).toFloat())) + ((cos(d).toFloat()) * (-1.0f)))) + 1.0f
+ }
+}
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/EmphasizedInterpolator.kt b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/EmphasizedInterpolator.kt
new file mode 100644
index 000000000..700270568
--- /dev/null
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/EmphasizedInterpolator.kt
@@ -0,0 +1,19 @@
+package dev.aaa1115910.m3qrcode
+
+import android.graphics.Path;
+import android.view.animation.PathInterpolator;
+
+object EmphasizedInterpolator {
+ private val interpolator: PathInterpolator
+
+ init {
+ val path = Path().apply {
+ moveTo(0.0f, 0.0f)
+ cubicTo(0.05f, 0.0f, 0.133333f, 0.06f, 0.166666f, 0.4f)
+ cubicTo(0.208333f, 0.82f, 0.25f, 1.0f, 1.0f, 1.0f)
+ }
+ interpolator = PathInterpolator(path)
+ }
+
+ fun getInterpolation(input: Float): Float = interpolator.getInterpolation(input)
+}
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/EntryAnimationStyle.kt b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/EntryAnimationStyle.kt
new file mode 100644
index 000000000..7383e7615
--- /dev/null
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/EntryAnimationStyle.kt
@@ -0,0 +1,9 @@
+package dev.aaa1115910.m3qrcode
+
+enum class EntryAnimationStyle {
+ None,
+ ZoomIn,
+ EmphasizedZoomIn,
+ SpringZoomIn,
+ RotateEmphasizedZoomIn;
+}
\ No newline at end of file
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQr.kt b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQr.kt
new file mode 100644
index 000000000..926c26030
--- /dev/null
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQr.kt
@@ -0,0 +1,236 @@
+package dev.aaa1115910.m3qrcode
+
+import android.graphics.Canvas
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffColorFilter
+import android.os.Build
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material3.ColorScheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.withFrameMillis
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.scale
+import androidx.compose.ui.graphics.nativeCanvas
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalView
+import androidx.core.graphics.withTranslation
+import com.airbnb.lottie.LottieProperty
+import com.airbnb.lottie.compose.LottieAnimation
+import com.airbnb.lottie.compose.LottieCompositionSpec
+import com.airbnb.lottie.compose.LottieConstants
+import com.airbnb.lottie.compose.animateLottieCompositionAsState
+import com.airbnb.lottie.compose.rememberLottieComposition
+import com.airbnb.lottie.compose.rememberLottieDynamicProperties
+import com.airbnb.lottie.compose.rememberLottieDynamicProperty
+import dev.aaa1115910.bv.R
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.isActive
+import kotlin.math.min
+
+@Composable
+fun MaterialShapeQr(
+ modifier: Modifier = Modifier,
+ content: String,
+ ecLevel: MaterialShapeQrErrorCorrectionLevel = MaterialShapeQrErrorCorrectionLevel.M,
+ colorScheme: ColorScheme? = null
+) {
+ val context = LocalContext.current
+ val view = LocalView.current
+ val state = rememberMaterialShapeQrState(
+ colorScheme = colorScheme ?: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ androidx.compose.material3.dynamicLightColorScheme(context)
+ } else {
+ androidx.compose.material3.lightColorScheme()
+ }
+ )
+ val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.lottie_qrcode_background))
+ val progress by animateLottieCompositionAsState(
+ composition = composition,
+ iterations = LottieConstants.IterateForever
+ )
+
+ val lottieDynamicProperties = rememberMaterialShapeQrLottieDynamicProperties(state.colorMap)
+
+ LaunchedEffect(content, ecLevel) {
+ state.updateContent(content, ecLevel.level)
+ }
+
+ // 每 16ms 更新一次(近似 60fps),当还未生成 QR 时降低频率为 50ms
+ LaunchedEffect(Unit) {
+ while (isActive) {
+ if (state.qrcodeLineCount == 0) {
+ delay(50)
+ continue
+ }
+ withFrameMillis {
+ state.frameElapsed = System.currentTimeMillis() - state.qrStartTime
+ }
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S && state.hasFinalDataImage) {
+ break
+ }
+ }
+ }
+
+ Box(
+ modifier = modifier
+ .aspectRatio(1f),
+ contentAlignment = Alignment.Center
+ ) {
+ LottieAnimation(
+ modifier = Modifier.scale(state.lottieScale),
+ composition = composition,
+ progress = { progress },
+ dynamicProperties = lottieDynamicProperties
+ )
+ if (view.isInEditMode) {
+ LottieAnimation(
+ composition = composition,
+ progress = { progress },
+ dynamicProperties = lottieDynamicProperties
+ )
+ }
+ Box(
+ modifier = Modifier
+ .fillMaxSize(0.8f)
+ ) {
+
+ val nonFinderFrameElapsed by remember {
+ derivedStateOf {
+ if (state.hasFinalDataImage) 3000L else state.frameElapsed
+ }
+ }
+
+ NonFinderPatternsCanvas(
+ qrcodeLineCount = state.qrcodeLineCount,
+ qrcodeSize = state.qrcodeSize,
+ frameElapsed = nonFinderFrameElapsed,
+ dataModuleShapeList = state.dataModuleShapeList,
+ backgroundModuleShapeList = state.backgroundModuleShapeList,
+ hasFinalDataImage = state.hasFinalDataImage,
+ onHasFinalDataImageChange = { state.hasFinalDataImage = it },
+ onDrawAnimationBackground = { elapsedMs ->
+ state.drawAnimationBackground(elapsedMs)
+ }
+ )
+ FinderPatternsCanvas(
+ qrcodeLineCount = state.qrcodeLineCount,
+ qrcodeSize = state.qrcodeSize,
+ frameElapsed = state.frameElapsed,
+ finderPatternShapeList = state.finderPatternShapeList
+ )
+ }
+ }
+}
+
+@Composable
+fun NonFinderPatternsCanvas(
+ modifier: Modifier = Modifier,
+ qrcodeLineCount: Int,
+ qrcodeSize: Int,
+ frameElapsed: Long,
+ dataModuleShapeList: List,
+ backgroundModuleShapeList: List,
+ hasFinalDataImage: Boolean = false,
+ onHasFinalDataImageChange: (Boolean) -> Unit,
+ onDrawAnimationBackground: (Long) -> Unit
+) {
+ Canvas(
+ modifier = modifier.fillMaxSize()
+ ) {
+ val native = drawContext.canvas.nativeCanvas
+
+ if (qrcodeLineCount == 0) return@Canvas
+
+ val canvasWidth = size.width
+ val canvasHeight = size.height
+
+ val scale = min(canvasWidth / qrcodeSize.toFloat(), canvasHeight / qrcodeSize.toFloat())
+ val scaledWidth = qrcodeSize * scale
+ val scaledHeight = qrcodeSize * scale
+
+ val tx = (canvasWidth - scaledWidth) / 2f
+ val ty = (canvasHeight - scaledHeight) / 2f
+
+ val elapsed = frameElapsed
+ if (elapsed > 3000L && !hasFinalDataImage) {
+ onHasFinalDataImageChange(true)
+ }
+ val drawElapsed = if (hasFinalDataImage) 3000L else elapsed
+
+ native.withTranslation(tx, ty) {
+ scale(scale, scale)
+ drawShapeListOnCanvas(dataModuleShapeList, this, drawElapsed)
+ drawShapeListOnCanvas(backgroundModuleShapeList, this, drawElapsed)
+ }
+
+ if (!hasFinalDataImage) {
+ onDrawAnimationBackground(drawElapsed)
+ }
+ }
+}
+
+@Composable
+fun FinderPatternsCanvas(
+ modifier: Modifier = Modifier,
+ qrcodeLineCount: Int,
+ qrcodeSize: Int,
+ frameElapsed: Long,
+ finderPatternShapeList: List
+) {
+ Canvas(
+ modifier = modifier.fillMaxSize()
+ ) {
+ val native = drawContext.canvas.nativeCanvas
+
+ if (qrcodeLineCount == 0) return@Canvas
+
+ val canvasWidth = size.width
+ val canvasHeight = size.height
+
+ val scale = min(canvasWidth / qrcodeSize.toFloat(), canvasHeight / qrcodeSize.toFloat())
+ val scaledWidth = qrcodeSize * scale
+ val scaledHeight = qrcodeSize * scale
+
+ val tx = (canvasWidth - scaledWidth) / 2f
+ val ty = (canvasHeight - scaledHeight) / 2f
+
+ val elapsed = frameElapsed
+
+ native.withTranslation(tx, ty) {
+ scale(scale, scale)
+ drawShapeListOnCanvas(finderPatternShapeList, this, elapsed)
+ }
+ }
+}
+
+@Composable
+private fun rememberMaterialShapeQrLottieDynamicProperties(
+ colorMap: Map
+): com.airbnb.lottie.compose.LottieDynamicProperties {
+ val properties = colorMap.map { (key, color) ->
+ val filter = remember(color) { PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) }
+ rememberLottieDynamicProperty(
+ property = LottieProperty.COLOR_FILTER,
+ keyPath = arrayOf("**", key, "**"),
+ ) {
+ filter
+ }
+ }.toTypedArray()
+ return rememberLottieDynamicProperties(*properties)
+}
+
+private fun drawShapeListOnCanvas(
+ list: List,
+ canvas: Canvas,
+ elapsedMs: Long
+) {
+ list.forEach { it.draw(canvas, elapsedMs) }
+}
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQrErrorCorrectionLevel.kt b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQrErrorCorrectionLevel.kt
new file mode 100644
index 000000000..bc252f7d8
--- /dev/null
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQrErrorCorrectionLevel.kt
@@ -0,0 +1,10 @@
+package dev.aaa1115910.m3qrcode
+
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
+
+enum class MaterialShapeQrErrorCorrectionLevel(val level: ErrorCorrectionLevel) {
+ L(ErrorCorrectionLevel.L),
+ M(ErrorCorrectionLevel.M),
+ Q(ErrorCorrectionLevel.Q),
+ H(ErrorCorrectionLevel.H)
+}
\ No newline at end of file
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQrState.kt b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQrState.kt
new file mode 100644
index 000000000..adba9bdcd
--- /dev/null
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeQrState.kt
@@ -0,0 +1,728 @@
+package dev.aaa1115910.m3qrcode
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffColorFilter
+import android.graphics.RectF
+import android.graphics.drawable.Drawable
+import androidx.appcompat.content.res.AppCompatResources
+import androidx.compose.material3.ColorScheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableFloatStateOf
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableLongStateOf
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateMapOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.runtime.snapshots.SnapshotStateList
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.LocalContext
+import androidx.core.graphics.ColorUtils
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
+import com.google.zxing.qrcode.encoder.Encoder
+import com.google.zxing.qrcode.encoder.QRCode
+import dev.aaa1115910.bv.R
+import kotlin.math.ceil
+import kotlin.math.min
+import kotlin.math.sqrt
+import kotlin.random.Random
+
+
+internal data class MaterialShapeQrState(
+ private val context: Context,
+ private val arrayOf1x1Shapes: List,
+ private val arrayOf1x1SemiCircleShapes: List,
+ private val arrayOf2x2Shapes: List,
+ private val arrayOf3x3Shapes: List,
+ private val arrayOf7x7Shapes: List,
+ private val arrayOfHorizontalBarShapes: List,
+ private val arrayOfHorizontalHalfCapsuleBarShapes: List,
+ private val arrayOfVerticalBarShapes: List,
+ private val arrayOfFinderPatternCenterShapes: List,
+ private val foregroundColorPrimary: Int,
+ private val foregroundColorSecondary: Int,
+ private val foregroundColorAccent: Int,
+ private val backgroundShapeColor: Int,
+ private val backgroundDotColor1: Int,
+ private val backgroundDotColor2: Int,
+ private val backgroundDotColor3: Int,
+ private val mainForegroundColorArray: List,
+ private val mainBackgroundColorArray: List,
+ val colorMap: MutableMap
+
+) {
+ val finderPatternShapeList = mutableStateListOf()
+ val dataModuleShapeList = mutableStateListOf()
+ val backgroundModuleShapeList = mutableStateListOf()
+ val hasCreated: SnapshotStateList> = mutableStateListOf()
+
+ var finderPatternCenterShapeIndex by mutableIntStateOf(0)
+
+ var hasFinalDataImage by mutableStateOf(false)
+ var qrStartTime by mutableLongStateOf(0L)
+ var qrcode by mutableStateOf(null)
+ var qrcodeSize by mutableIntStateOf(0)
+ var qrcodeLineCount by mutableIntStateOf(0)
+ var moduleSize by mutableIntStateOf(29)
+
+
+ var frameElapsed by mutableLongStateOf(0L)
+ var lottieScale by mutableFloatStateOf(0f)
+
+
+ fun getColorForFinderPattern(): Int {
+ return foregroundColorPrimary
+ }
+
+ fun calculateAnimationBackgroundAlpha(elapsedMs: Long): Float {
+ return when {
+ elapsedMs < 250 -> 0.0f
+ elapsedMs < 583 -> (elapsedMs - 250).toFloat() / 333
+ else -> 1.0f
+ }
+ }
+
+ fun calculateAnimationBackgroundScale(elapsedMs: Long): Float {
+ // 根据时间 elapsedMs 计算背景动画的缩放比例
+ if (elapsedMs < 250L) return 0.0f
+ if (elapsedMs >= 1083L) return 1.0f
+ val t = (elapsedMs - 250L).toFloat() / 833f
+ return (EmphasizedInterpolator.getInterpolation(t) * 0.19999999f) + 0.8f
+ }
+
+ fun drawAnimationBackground(elapsedMs: Long) {
+ // 当动画时间小于 1100ms 时,根据时间计算并设置背景动画的缩放
+ if (elapsedMs < 1100L) {
+ lottieScale = calculateAnimationBackgroundScale(elapsedMs)
+ }
+
+ // 在前 600ms 内根据计算的 alpha 值更新 Lottie 动画的背景颜色滤镜
+ if (elapsedMs <= 600L) {
+ val alphaFraction = calculateAnimationBackgroundAlpha(elapsedMs)
+ // 将浮点 alpha 转为 0..255 的整型并应用到 backgroundShapeColor
+ val alphaColor = ColorUtils.setAlphaComponent(
+ backgroundShapeColor,
+ (alphaFraction * 255).toInt()
+ )
+
+ colorMap[".bg"] = alphaColor
+ }
+ }
+
+ fun randomSquare(shapeSize: Int): Drawable {
+ return when (shapeSize) {
+ 1 -> arrayOf1x1Shapes.random()
+ 2 -> arrayOf2x2Shapes.random()
+ 3 -> arrayOf3x3Shapes.random()
+ 7 -> arrayOf7x7Shapes.first()
+ else -> throw IllegalArgumentException("Unsupported square shape: $shapeSize")
+ }
+ }
+
+ fun randomHorizontalBar(barWidth: Int): Drawable {
+ return arrayOfHorizontalBarShapes[barWidth - 2]
+ }
+
+ fun randomHorizontalHalfCapsuleBar(barWidth: Int): Drawable {
+ return arrayOfHorizontalHalfCapsuleBarShapes[barWidth - 2]
+ }
+
+ fun randomVerticalBar(barHeight: Int): Drawable {
+ return arrayOfVerticalBarShapes[barHeight - 2]
+ }
+
+ fun getSemiCircle(): Drawable {
+ return arrayOf1x1SemiCircleShapes.first()
+ }
+
+ fun nextFinderPatternCenter(): Drawable {
+ val vectorDrawableArr = arrayOfFinderPatternCenterShapes
+ val index = finderPatternCenterShapeIndex
+ finderPatternCenterShapeIndex = index + 1
+ return vectorDrawableArr[index % vectorDrawableArr.size]
+ }
+
+ fun drawShapeListOnCanvas(list: List, canvas: Canvas, elapsedMs: Long) {
+ list.forEach { it.draw(canvas, elapsedMs) }
+ }
+
+ fun randomRotationForSquareShape(): Int {
+ return Random.nextInt() % 4
+ }
+
+ fun randomForegroundColor(width: Int, height: Int): Int {
+ if (height == 1) {
+ val probs = listOf(0.2f, 0.04f, 0.01f, 0.0f)
+ val prob = probs.getOrNull(width - 1) ?: 0f
+ if (Random.nextFloat() <= prob) return foregroundColorAccent
+ }
+ return mainForegroundColorArray.random()
+ }
+
+ fun randomBackgroundColor(): Int {
+ return mainBackgroundColorArray.random()
+ }
+
+ fun calculateRatioToCenter(x: Int, y: Int, width: Int, height: Int): Float {
+ val halfLineCount = qrcodeLineCount / 2.0f
+ val dx = (x + (width / 2.0f)) - halfLineCount
+ val dy = (y + (height / 2.0f)) - halfLineCount
+ val distance = sqrt((dx * dx) + (dy * dy))
+ val maxDistance = 1.414f * halfLineCount
+ return distance / maxDistance
+ }
+
+ fun calculateStartDelay(x: Int, y: Int, width: Int, height: Int): Long {
+ val base = (calculateRatioToCenter(x, y, width, height) * 1000f).toLong()
+ val extra = if (width == 1 && height == 1) 0L else Random.Default.nextLong(400L)
+ return base + extra
+ }
+
+ fun markAsCreated(x: Int, y: Int, width: Int, height: Int) {
+ for (dx in 0 until width) {
+ for (dy in 0 until height) {
+ hasCreated[x + dx][y + dy] = true
+ }
+ }
+ }
+
+ fun isForeground(x: Int, y: Int): Boolean {
+ return (qrcode?.matrix?.get(x, y)?.toInt()?.and(15)) == 1
+ }
+
+ fun updateContent(
+ content: String,
+ errorCorrectionLevel: ErrorCorrectionLevel = ErrorCorrectionLevel.L
+ ) {
+ val encode = Encoder.encode(content, errorCorrectionLevel, null)
+ qrcode = encode
+ qrStartTime = System.currentTimeMillis()
+ hasFinalDataImage = false
+
+ // 获取矩阵宽度
+ qrcodeLineCount = qrcode?.matrix?.width ?: 0
+
+ // 计算 moduleSize(模块尺寸),上限 29
+ val displayMetrics = context.resources.displayMetrics
+ val screenMin = min(displayMetrics.widthPixels, displayMetrics.heightPixels)
+ .coerceAtMost(1200)
+ val candidate =
+ ceil(screenMin.toDouble() / qrcodeLineCount.toDouble()).toInt()
+ moduleSize = min(candidate, 29)
+
+ // 计算最终位图尺寸
+ qrcodeSize = moduleSize * qrcodeLineCount
+
+ hasCreated.clear()
+ for (i in 0 until qrcodeLineCount) {
+ val row = mutableStateListOf()
+ for (j in 0 until qrcodeLineCount) {
+ row.add(false)
+ }
+ hasCreated.add(row)
+ }
+
+ // 清空渲染器列表
+ finderPatternShapeList.clear()
+ dataModuleShapeList.clear()
+ backgroundModuleShapeList.clear()
+
+ val colorForFinderPattern = getColorForFinderPattern()
+
+ // 创建 3 个 finder patterns(左上、右上、左下)
+ createRendererForShape(
+ 0, 0, 7, 7,
+ finderPatternShapeList, randomSquare(7), colorForFinderPattern
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.EmphasizedZoomIn
+ renderer.startDelay = 833
+ renderer.duration = 834
+ }
+ createRendererForShape(
+ qrcodeLineCount - 7, 0, 7, 7,
+ finderPatternShapeList, randomSquare(7), colorForFinderPattern
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.EmphasizedZoomIn
+ renderer.startDelay = 833
+ renderer.duration = 834
+ }
+ createRendererForShape(
+ 0, qrcodeLineCount - 7, 7, 7,
+ finderPatternShapeList, randomSquare(7), colorForFinderPattern
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.EmphasizedZoomIn
+ renderer.startDelay = 833
+ renderer.duration = 834
+ }
+
+ finderPatternCenterShapeIndex = 0
+
+ // Finder pattern centers (3x3 centers inside finder)
+ createRendererForShape(
+ 2, 2, 3, 3,
+ finderPatternShapeList, nextFinderPatternCenter(), colorForFinderPattern
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.RotateEmphasizedZoomIn
+ renderer.startDelay = 1167
+ renderer.duration = 1667
+ }
+ createRendererForShape(
+ qrcodeLineCount - 5, 2, 3, 3,
+ finderPatternShapeList, nextFinderPatternCenter(), colorForFinderPattern
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.RotateEmphasizedZoomIn
+ renderer.startDelay = 1167
+ renderer.duration = 1667
+ }
+ createRendererForShape(
+ 2, qrcodeLineCount - 5, 3, 3,
+ finderPatternShapeList, nextFinderPatternCenter(), colorForFinderPattern
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.RotateEmphasizedZoomIn
+ renderer.startDelay = 1167
+ renderer.duration = 1667
+ }
+
+ // 扫描并创建不同尺寸的前景/背景形状
+ searchAndCreateLargeSquareShapes(3, dataModuleShapeList)
+ searchAndCreateLargeSquareShapes(2, dataModuleShapeList)
+ searchAndCreateHorizontalBars(4, dataModuleShapeList)
+ searchAndCreateBars(3, dataModuleShapeList)
+ searchAndCreateBars(2, dataModuleShapeList)
+ searchAndCreateSmallForegroundSquareShapes(dataModuleShapeList)
+ searchAndCreateSmallBackgroundSquareShapes(backgroundModuleShapeList)
+ }
+
+
+ // 缓存 Paint 对象,避免重复创建
+ private val paintCache = mutableMapOf()
+
+ private fun getOrCreatePaint(color: Int): Paint {
+ return paintCache.getOrPut(color) {
+ Paint().apply {
+ colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
+ }
+ }
+ }
+
+ fun createRendererForShape(
+ x: Int,
+ y: Int,
+ width: Int,
+ height: Int,
+ list: MutableList,
+ vectorDrawable: Drawable,
+ foregroundColor: Int,
+ rendererConfigs: (MaterialShapeRenderer) -> Unit
+ ) {
+ val rectF = RectF(
+ (x * moduleSize).toFloat(),
+ (y * moduleSize).toFloat(),
+ ((x + width) * moduleSize).toFloat(),
+ ((y + height) * moduleSize).toFloat()
+ )
+ val paint = getOrCreatePaint(foregroundColor)
+ val materialShapeRenderer = MaterialShapeRenderer(vectorDrawable, rectF, paint)
+ materialShapeRenderer.startDelay = calculateStartDelay(x, y, width, height)
+ rendererConfigs(materialShapeRenderer)
+ list.add(materialShapeRenderer)
+ markAsCreated(x, y, width, height)
+ }
+
+ fun createRendererForShape(
+ x: Int,
+ y: Int,
+ width: Int,
+ height: Int,
+ list: MutableList,
+ vectorDrawable: Drawable,
+ rendererConfigs: (MaterialShapeRenderer) -> Unit
+ ) {
+ createRendererForShape(
+ x = x,
+ y = y,
+ width = width,
+ height = height,
+ list = list,
+ vectorDrawable = vectorDrawable,
+ foregroundColor = randomForegroundColor(width, height),
+ rendererConfigs = rendererConfigs
+ )
+ }
+
+ fun createSingleVerticalBar(
+ x: Int,
+ y: Int,
+ height: Int,
+ list: MutableList
+ ) {
+ createRendererForShape(
+ x = x,
+ y = y,
+ width = 1,
+ height = height,
+ list = list,
+ vectorDrawable = randomVerticalBar(height)
+ ) { renderer: MaterialShapeRenderer ->
+ renderer.animationStyle = EntryAnimationStyle.SpringZoomIn
+ renderer.startDelay = calculateStartDelay(x, y, 1, height)
+ }
+ }
+
+ fun createHorizontalBar(
+ x: Int,
+ y: Int,
+ width: Int,
+ list: MutableList
+ ) {
+ if (width > 4) {
+ throw IllegalArgumentException("barLen must be <= 4")
+ }
+ if (width <= 2 || (width == 3 && Random.Default.nextFloat() < 0.5f)) {
+ createRendererForShape(
+ x, y, width, 1, list, randomHorizontalBar(width)
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.SpringZoomIn
+ renderer.startDelay = calculateStartDelay(x, y, width, 1)
+ }
+ return
+ }
+ if (Random.Default.nextFloat() > 0.5f) {
+ createRendererForShape(
+ x, y, 1, 1, list, getSemiCircle()
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.SpringZoomIn
+ renderer.startDelay = calculateStartDelay(x, y, 1, 1)
+ renderer.skipStartProgress = 0.3f
+ }
+ val longWidth = width - 1
+ createRendererForShape(
+ x + 1, y, longWidth, 1, list, randomHorizontalHalfCapsuleBar(longWidth)
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.SpringZoomIn
+ renderer.startDelay = calculateStartDelay(x + 1, y, width - 1, 1)
+ }
+ } else {
+ val longWidth = width - 1
+ createRendererForShape(
+ x, y, longWidth, 1, list, randomHorizontalHalfCapsuleBar(longWidth)
+ ) { renderer ->
+ renderer.initialRotation = 2
+ renderer.animationStyle = EntryAnimationStyle.SpringZoomIn
+ renderer.startDelay = calculateStartDelay(x, y, width - 1, 1)
+ }
+ createRendererForShape(
+ (x + width) - 1, y, 1, 1, list, getSemiCircle(), randomForegroundColor(1, 1)
+ ) { renderer ->
+ renderer.initialRotation = 2
+ renderer.animationStyle = EntryAnimationStyle.SpringZoomIn
+ renderer.startDelay = calculateStartDelay((x + y) - 1, width, 1, 1)
+ renderer.skipStartProgress = 0.3f
+ }
+ }
+ }
+
+ fun tryFindingHorizontalBar(
+ startX: Int,
+ startY: Int,
+ width: Int,
+ list: MutableList
+ ) {
+ if (width > 4) throw IllegalArgumentException("barLen must be <= 4")
+ val endX = startX + width
+ val n = qrcodeLineCount
+ if (endX > n || startY + 1 > n) return
+ for (k in 0 until width) {
+ val x = startX + k
+ if (hasCreated[x][startY] || !isForeground(x, startY)) return
+ }
+ createHorizontalBar(startX, startY, width, list)
+ }
+
+ fun tryFindingVerticalBar(
+ startX: Int,
+ startY: Int,
+ height: Int,
+ list: MutableList
+ ) {
+ val endY = startY + height
+ val n = qrcodeLineCount
+ if (endY > n || startX + 1 > n) return
+
+ for (dy in 0 until height) {
+ val y = startY + dy
+ if (!isForeground(startX, y) || hasCreated[startX][y]) return
+ }
+
+ createSingleVerticalBar(startX, startY, height, list)
+ }
+
+ fun searchAndCreateSmallBackgroundSquareShapes(list: MutableList) {
+ for (y in 0 until qrcodeLineCount) {
+ for (x in 0 until qrcodeLineCount) {
+ // 如果已经创建或是前景则跳过;否则为背景模块创建 1x1 方形渲染器
+ if (!hasCreated[x][y] && !isForeground(x, y)) {
+ createRendererForShape(
+ x, y, 1, 1, list, randomSquare(1)
+ ) { renderer ->
+ renderer.startDelay = calculateStartDelay(x, y, 1, 1)
+ renderer.animationStyle = EntryAnimationStyle.EmphasizedZoomIn
+ renderer.startDelay =
+ 83 + (1250 * calculateRatioToCenter(x, y, 1, 1)).toLong()
+ renderer.skipStartProgress = 0.3f
+ val randomBackgroundColor = randomBackgroundColor()
+ val paint = Paint()
+ paint.colorFilter =
+ PorterDuffColorFilter(randomBackgroundColor, PorterDuff.Mode.SRC_IN)
+ renderer.paint = paint
+ }
+ }
+ }
+ }
+ }
+
+ fun searchAndCreateSmallForegroundSquareShapes(list: MutableList) {
+ for (y in 0 until qrcodeLineCount) {
+ for (x in 0 until qrcodeLineCount) {
+ if (!hasCreated[x][y] && isForeground(x, y)) {
+ createRendererForShape(
+ x, y, 1, 1, list, randomSquare(1)
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.ZoomIn
+ renderer.startDelay = calculateStartDelay(x, y, 1, 1)
+ renderer.skipStartProgress = 0.3f
+ }
+ }
+ }
+ }
+ }
+
+ fun searchAndCreateLargeSquareShapes(
+ len: Int,
+ list: MutableList
+ ) {
+ val max = (qrcodeLineCount - len) + 1
+ for (y in 0 until max) {
+ for (x in 0 until max) {
+ if (!hasCreated[x][y] && isForeground(x, y)) {
+ var ok = true
+ for (dy in 0 until len) {
+ for (dx in 0 until len) {
+ val nx = x + dx
+ val ny = y + dy
+ if (hasCreated[nx][ny] || !isForeground(nx, ny)) {
+ ok = false
+ break
+ }
+ }
+ if (!ok) break
+ }
+ if (ok) {
+ createRendererForShape(
+ x, y, len, len, list, randomSquare(len)
+ ) { renderer ->
+ renderer.animationStyle = EntryAnimationStyle.SpringZoomIn
+ renderer.startDelay = calculateStartDelay(x, y, len, len)
+ renderer.initialRotation = randomRotationForSquareShape()
+ }
+ }
+ }
+ }
+ }
+ }
+
+ fun searchAndCreateBars(len: Int, list: MutableList) {
+ val funcs: List<(Int, Int, Int, MutableList) -> Unit> =
+ listOf(
+ { x, y, l, lst -> tryFindingHorizontalBar(x, y, l, lst) },
+ { x, y, l, lst -> tryFindingVerticalBar(x, y, l, lst) }
+ )
+ val reversed = funcs.reversed()
+ val n = qrcodeLineCount
+ for (y in 0 until n) {
+ for (x in 0 until n) {
+ if (!hasCreated[x][y] && isForeground(x, y)) {
+ val order = if (Random.Default.nextFloat() < 0.5f) funcs else reversed
+ for (f in order) f(x, y, len, list)
+ }
+ }
+ }
+ }
+
+ fun searchAndCreateHorizontalBars(len: Int, list: MutableList) {
+ if (len > 4) throw IllegalArgumentException("barLen must be <= 4")
+ for (y in 0 until qrcodeLineCount) {
+ val maxX = (qrcodeLineCount - len) + 1
+ for (x in 0 until maxX) {
+ if (!hasCreated[x][y] && isForeground(x, y)) {
+ var ok = true
+ for (dx in 1 until len) {
+ val nx = x + dx
+ if (hasCreated[nx][y] || !isForeground(nx, y)) {
+ ok = false
+ break
+ }
+ }
+ if (ok) {
+ createHorizontalBar(x, y, len, list)
+ }
+ }
+ }
+ }
+ }
+}
+
+@Composable
+internal fun rememberMaterialShapeQrState(
+ context: Context = LocalContext.current,
+ colorScheme: ColorScheme
+): MaterialShapeQrState {
+ val foregroundColorPrimary = colorScheme.primary.toArgb()
+ val foregroundColorSecondary = colorScheme.secondary.toArgb()
+ val foregroundColorAccent = colorScheme.tertiary.toArgb()
+
+ val backgroundShapeColor = colorScheme.surfaceContainerHighest.toArgb()
+ val backgroundDotColor1 = colorScheme.primary.copy(38 / 255f).toArgb()
+ val backgroundDotColor2 = colorScheme.onSurface.copy(25 / 255f).toArgb()
+ val backgroundDotColor3 = colorScheme.tertiaryContainer.copy(76 / 255f).toArgb()
+
+ val mainForegroundColorArray by remember {
+ derivedStateOf {
+ listOf(foregroundColorPrimary, foregroundColorSecondary)
+ }
+ }
+ val mainBackgroundColorArray by remember {
+ derivedStateOf {
+ listOf(backgroundDotColor1, backgroundDotColor2, backgroundDotColor3)
+ }
+ }
+
+ val arrayOf1x1Shapes = remember { mutableStateListOf() }
+ val arrayOf1x1SemiCircleShapes = remember { mutableStateListOf() }
+ val arrayOf2x2Shapes = remember { mutableStateListOf() }
+ val arrayOf3x3Shapes = remember { mutableStateListOf() }
+ val arrayOf7x7Shapes = remember { mutableStateListOf() }
+
+ val arrayOfHorizontalBarShapes = remember { mutableStateListOf() }
+ val arrayOfHorizontalHalfCapsuleBarShapes = remember { mutableStateListOf() }
+ val arrayOfVerticalBarShapes = remember { mutableStateListOf() }
+ val arrayOfFinderPatternCenterShapes = remember { mutableStateListOf() }
+
+ val colorMap = remember { mutableStateMapOf() }
+
+ fun loadVectorDrawable(resId: Int): Drawable {
+ return AppCompatResources.getDrawable(context, resId)!!
+ }
+
+ fun loadDrawables() {
+ val s1Circle = loadVectorDrawable(R.drawable.qrcode_square_s1_circle)
+ val s1Drop = loadVectorDrawable(R.drawable.qrcode_square_s1_drop)
+ val s1SemiCircle = loadVectorDrawable(R.drawable.qrcode_square_s1_semi_circle)
+ val s1Square = loadVectorDrawable(R.drawable.qrcode_square_s1_square)
+
+ arrayOf1x1Shapes.addAll(listOf(s1Circle, s1Drop, s1Square))
+ arrayOf1x1SemiCircleShapes.addAll(listOf(s1SemiCircle))
+
+ arrayOf2x2Shapes.addAll(
+ listOf(
+ loadVectorDrawable(R.drawable.qrcode_square_s2_circle),
+ loadVectorDrawable(R.drawable.qrcode_square_s2_clover),
+ loadVectorDrawable(R.drawable.qrcode_square_s2_hexagonal),
+ loadVectorDrawable(R.drawable.qrcode_square_s2_meteroid),
+ loadVectorDrawable(R.drawable.qrcode_square_s2_wiggle_star)
+ )
+ )
+
+ val s3Circle = loadVectorDrawable(R.drawable.qrcode_square_s3_circle)
+ val s3Clover = loadVectorDrawable(R.drawable.qrcode_square_s3_clover)
+ val s3Hexagonal = loadVectorDrawable(R.drawable.qrcode_square_s3_hexagonal)
+ val s3Meteroid = loadVectorDrawable(R.drawable.qrcode_square_s3_meteroid)
+ val s3WiggleStar = loadVectorDrawable(R.drawable.qrcode_square_s3_wiggle_star)
+
+ arrayOf3x3Shapes.addAll(
+ listOf(s3Circle, s3Clover, s3Hexagonal, s3Meteroid, s3WiggleStar)
+ )
+ arrayOfFinderPatternCenterShapes.addAll(
+ listOf(s3Hexagonal, s3Meteroid, s3WiggleStar).shuffled()
+ )
+
+ arrayOf7x7Shapes.addAll(
+ listOf(loadVectorDrawable(R.drawable.qrcode_square_s7_ring))
+ )
+
+ val horBarS2Capsule = loadVectorDrawable(R.drawable.qrcode_hor_bar_s2_capsule)
+ val horBarS3Capsule = loadVectorDrawable(R.drawable.qrcode_hor_bar_s3_capsule)
+ val horBarS2HalfCapsule = loadVectorDrawable(R.drawable.qrcode_hor_bar_s2_half_capsule)
+ val horBarS3HalfCapsule = loadVectorDrawable(R.drawable.qrcode_hor_bar_s3_half_capsule)
+ val verBarS2Capsule = loadVectorDrawable(R.drawable.qrcode_ver_bar_s2_capsule)
+ val verBarS3Capsule = loadVectorDrawable(R.drawable.qrcode_ver_bar_s3_capsule)
+
+ arrayOfHorizontalBarShapes.addAll(
+ listOf(horBarS2Capsule, horBarS3Capsule)
+ )
+ arrayOfHorizontalHalfCapsuleBarShapes.addAll(
+ listOf(horBarS2HalfCapsule, horBarS3HalfCapsule)
+ )
+ arrayOfVerticalBarShapes.addAll(
+ listOf(verBarS2Capsule, verBarS3Capsule)
+ )
+ }
+
+ fun applyLottieDynamicColor() {
+ colorMap.clear()
+ colorMap[".bg"] = backgroundShapeColor
+ colorMap[".dot1"] = backgroundDotColor1
+ colorMap[".dot2"] = backgroundDotColor2
+ colorMap[".dot3"] = backgroundDotColor3
+ }
+
+ LaunchedEffect(colorScheme) {
+ // 清理旧的 Drawable 引用
+ arrayOf1x1Shapes.clear()
+ arrayOf1x1SemiCircleShapes.clear()
+ arrayOf2x2Shapes.clear()
+ arrayOf3x3Shapes.clear()
+ arrayOf7x7Shapes.clear()
+ arrayOfHorizontalBarShapes.clear()
+ arrayOfHorizontalHalfCapsuleBarShapes.clear()
+ arrayOfVerticalBarShapes.clear()
+ arrayOfFinderPatternCenterShapes.clear()
+
+ loadDrawables()
+ applyLottieDynamicColor()
+ }
+
+ return remember(
+ context,
+ ) {
+ MaterialShapeQrState(
+ context = context,
+ foregroundColorPrimary = foregroundColorPrimary,
+ foregroundColorSecondary = foregroundColorSecondary,
+ foregroundColorAccent = foregroundColorAccent,
+ backgroundShapeColor = backgroundShapeColor,
+ backgroundDotColor1 = backgroundDotColor1,
+ backgroundDotColor2 = backgroundDotColor2,
+ backgroundDotColor3 = backgroundDotColor3,
+ mainForegroundColorArray = mainForegroundColorArray,
+ mainBackgroundColorArray = mainBackgroundColorArray,
+ arrayOf1x1Shapes = arrayOf1x1Shapes,
+ arrayOf1x1SemiCircleShapes = arrayOf1x1SemiCircleShapes,
+ arrayOf2x2Shapes = arrayOf2x2Shapes,
+ arrayOf3x3Shapes = arrayOf3x3Shapes,
+ arrayOf7x7Shapes = arrayOf7x7Shapes,
+ arrayOfHorizontalBarShapes = arrayOfHorizontalBarShapes,
+ arrayOfHorizontalHalfCapsuleBarShapes = arrayOfHorizontalHalfCapsuleBarShapes,
+ arrayOfVerticalBarShapes = arrayOfVerticalBarShapes,
+ arrayOfFinderPatternCenterShapes = arrayOfFinderPatternCenterShapes,
+ colorMap = colorMap
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeRenderer.kt b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeRenderer.kt
new file mode 100644
index 000000000..c75b978ed
--- /dev/null
+++ b/app/shared/src/main/kotlin/dev/aaa1115910/m3qrcode/MaterialShapeRenderer.kt
@@ -0,0 +1,170 @@
+package dev.aaa1115910.m3qrcode
+
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.Rect
+import android.graphics.RectF
+import android.graphics.drawable.Drawable
+import android.os.Build
+import androidx.core.graphics.withRotation
+import androidx.core.graphics.withSave
+import kotlin.math.cos
+
+class MaterialShapeRenderer {
+ var animationStyle: EntryAnimationStyle
+ var destRect: RectF
+ var duration: Long = 0
+ var initialRotation: Int = 0
+ var isMotionPaused: Boolean = false
+ var paint: Paint
+ var skipStartProgress: Float = 0f
+ var srcImgSvg: Drawable
+ var startDelay: Long = 0
+
+ companion object {
+ private var springScaleCache: LinkedHashMap = linkedMapOf()
+ private var dampedString: DampedString = DampedString(60, 0.63f)
+ fun calculateSpringScale(j: Long): Float {
+ val i = (j / 16).toInt()
+ if (springScaleCache.containsKey(i)) {
+ return springScaleCache[i]!!
+ }
+ val calculatePosition = dampedString.calculatePosition(i)
+ springScaleCache[i] = calculatePosition
+ return calculatePosition
+ }
+ }
+
+ constructor(srcImgSvg: Drawable, destRect: RectF, paint: Paint) {
+ this.srcImgSvg = srcImgSvg
+ this.destRect = destRect
+ this.paint = paint
+ this.animationStyle = EntryAnimationStyle.None
+ }
+
+ fun draw(canvas: Canvas, elapsedMs: Long) {
+ val delay = startDelay
+ if (elapsedMs < delay) return
+ val adjustedMs = elapsedMs - delay
+ when (animationStyle) {
+ EntryAnimationStyle.None -> drawForNone(canvas, adjustedMs)
+ EntryAnimationStyle.ZoomIn -> drawForZoomIn(canvas, adjustedMs)
+ EntryAnimationStyle.SpringZoomIn -> drawForSpringZoomIn(canvas, adjustedMs)
+ EntryAnimationStyle.RotateEmphasizedZoomIn -> drawForRotateEmphasizedZoomIn(
+ canvas,
+ adjustedMs
+ )
+
+ EntryAnimationStyle.EmphasizedZoomIn -> drawForEmphasizedZoomIn(canvas, adjustedMs)
+ }
+ }
+
+ private fun draw(canvas: Canvas, rectF: RectF, paint: Paint) {
+ canvas.withRotation(initialRotation * 90.0f, rectF.centerX(), rectF.centerY()) {
+ val vectorDrawable = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
+ runCatching { srcImgSvg.constantState!!.newDrawable().mutate() }
+ .getOrDefault(srcImgSvg)
+ } else srcImgSvg
+ val rect = Rect()
+ rectF.round(rect)
+ vectorDrawable.bounds = rect
+ vectorDrawable.colorFilter = paint.colorFilter
+ vectorDrawable.draw(this)
+ }
+ }
+
+ private fun drawForNone(canvas: Canvas, j: Long) {
+ draw(canvas, destRect, paint)
+ }
+
+ private fun drawForZoomIn(canvas: Canvas, j: Long) {
+ val j2 = duration
+ val f = if (j2 > 0) j2.toFloat() else 1000f
+ val f2 = j.toFloat()
+ if (f2 / f < skipStartProgress) {
+ return
+ }
+ if (f2 <= f) {
+ val cos = (cos(((f2 - 1000.0f) / 1000.0f) * 3.1415927f) + 1.0f) / 2.0f
+ draw(
+ canvas,
+ RectF(
+ destRect.centerX() - ((destRect.width() / 2.0f) * cos),
+ destRect.centerY() - ((destRect.height() / 2.0f) * cos),
+ destRect.centerX() + ((destRect.width() / 2.0f) * cos),
+ destRect.centerY() + ((destRect.height() / 2.0f) * cos)
+ ),
+ paint
+ )
+ } else {
+ drawForNone(canvas, j)
+ }
+ }
+
+ private fun drawForEmphasizedZoomIn(canvas: Canvas, j: Long) {
+ val j2 = duration
+ val f = if (j2 > 0) j2.toFloat() else 1000f
+ val f2 = j.toFloat()
+ if (f2 <= f) {
+ val interpolation = EmphasizedInterpolator.getInterpolation(f2 / f)
+ draw(
+ canvas,
+ RectF(
+ destRect.centerX() - ((destRect.width() / 2.0f) * interpolation),
+ destRect.centerY() - ((destRect.height() / 2.0f) * interpolation),
+ destRect.centerX() + ((destRect.width() / 2.0f) * interpolation),
+ destRect.centerY() + ((destRect.height() / 2.0f) * interpolation)
+ ), paint
+ )
+ } else {
+ drawForNone(canvas, j)
+ }
+ }
+
+ private fun drawForSpringZoomIn(canvas: Canvas, j: Long) {
+ if (j <= 1500) {
+ val springScale = calculateSpringScale(j)
+ draw(
+ canvas,
+ RectF(
+ destRect.centerX() - ((destRect.width() / 2.0f) * springScale),
+ destRect.centerY() - ((destRect.height() / 2.0f) * springScale),
+ destRect.centerX() + ((destRect.width() / 2.0f) * springScale),
+ destRect.centerY() + ((destRect.height() / 2.0f) * springScale)
+ ), paint
+ )
+ } else {
+ drawForNone(canvas, j)
+ }
+ }
+
+ private fun drawForRotateEmphasizedZoomIn(canvas: Canvas, j: Long) {
+ canvas.withSave {
+ val j2 = duration
+ val f = if (j2 > 0) j2.toFloat() else 1000f
+ val f2 = j.toFloat()
+ var f3 = ((f2 - f) * 360.0f) / 4410.0f
+ if (f2 <= f) {
+ val interpolation = EmphasizedInterpolator.getInterpolation(f2 / f)
+ val rectF = RectF(
+ destRect.centerX() - ((destRect.width() / 2.0f) * interpolation),
+ destRect.centerY() - ((destRect.height() / 2.0f) * interpolation),
+ destRect.centerX() + ((destRect.width() / 2.0f) * interpolation),
+ destRect.centerY() + ((destRect.height() / 2.0f) * interpolation)
+ )
+ rotate(
+ (interpolation * 180.0f) + f3,
+ destRect.centerX(),
+ destRect.centerY()
+ )
+ draw(this, rectF, paint)
+ } else {
+ if (isMotionPaused) {
+ f3 = 0.0f
+ }
+ rotate(f3, destRect.centerX(), destRect.centerY())
+ draw(this, destRect, paint)
+ }
+ }
+ }
+}
diff --git a/app/shared/src/main/res/drawable/qrcode_hor_bar_s2_capsule.xml b/app/shared/src/main/res/drawable/qrcode_hor_bar_s2_capsule.xml
new file mode 100644
index 000000000..73099b635
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_hor_bar_s2_capsule.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_hor_bar_s2_half_capsule.xml b/app/shared/src/main/res/drawable/qrcode_hor_bar_s2_half_capsule.xml
new file mode 100644
index 000000000..57e559b46
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_hor_bar_s2_half_capsule.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_hor_bar_s3_capsule.xml b/app/shared/src/main/res/drawable/qrcode_hor_bar_s3_capsule.xml
new file mode 100644
index 000000000..7db5eeb6b
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_hor_bar_s3_capsule.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_hor_bar_s3_half_capsule.xml b/app/shared/src/main/res/drawable/qrcode_hor_bar_s3_half_capsule.xml
new file mode 100644
index 000000000..1997fa0b5
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_hor_bar_s3_half_capsule.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s1_circle.xml b/app/shared/src/main/res/drawable/qrcode_square_s1_circle.xml
new file mode 100644
index 000000000..5357bfcb3
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s1_circle.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s1_drop.xml b/app/shared/src/main/res/drawable/qrcode_square_s1_drop.xml
new file mode 100644
index 000000000..0bfe43396
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s1_drop.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s1_semi_circle.xml b/app/shared/src/main/res/drawable/qrcode_square_s1_semi_circle.xml
new file mode 100644
index 000000000..114c76789
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s1_semi_circle.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s1_square.xml b/app/shared/src/main/res/drawable/qrcode_square_s1_square.xml
new file mode 100644
index 000000000..60a9b2ca3
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s1_square.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s2_circle.xml b/app/shared/src/main/res/drawable/qrcode_square_s2_circle.xml
new file mode 100644
index 000000000..2c926e8ad
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s2_circle.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s2_clover.xml b/app/shared/src/main/res/drawable/qrcode_square_s2_clover.xml
new file mode 100644
index 000000000..257662231
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s2_clover.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s2_hexagonal.xml b/app/shared/src/main/res/drawable/qrcode_square_s2_hexagonal.xml
new file mode 100644
index 000000000..72266ce1a
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s2_hexagonal.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s2_meteroid.xml b/app/shared/src/main/res/drawable/qrcode_square_s2_meteroid.xml
new file mode 100644
index 000000000..f1fbb7a3f
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s2_meteroid.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s2_wiggle_star.xml b/app/shared/src/main/res/drawable/qrcode_square_s2_wiggle_star.xml
new file mode 100644
index 000000000..e3ba85c65
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s2_wiggle_star.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s3_circle.xml b/app/shared/src/main/res/drawable/qrcode_square_s3_circle.xml
new file mode 100644
index 000000000..ae08c55de
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s3_circle.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s3_clover.xml b/app/shared/src/main/res/drawable/qrcode_square_s3_clover.xml
new file mode 100644
index 000000000..64eb8312a
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s3_clover.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s3_hexagonal.xml b/app/shared/src/main/res/drawable/qrcode_square_s3_hexagonal.xml
new file mode 100644
index 000000000..770cc4707
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s3_hexagonal.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s3_meteroid.xml b/app/shared/src/main/res/drawable/qrcode_square_s3_meteroid.xml
new file mode 100644
index 000000000..a8ce0110e
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s3_meteroid.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s3_wiggle_star.xml b/app/shared/src/main/res/drawable/qrcode_square_s3_wiggle_star.xml
new file mode 100644
index 000000000..66c9885d0
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s3_wiggle_star.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_square_s7_ring.xml b/app/shared/src/main/res/drawable/qrcode_square_s7_ring.xml
new file mode 100644
index 000000000..75786074f
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_square_s7_ring.xml
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_ver_bar_s2_capsule.xml b/app/shared/src/main/res/drawable/qrcode_ver_bar_s2_capsule.xml
new file mode 100644
index 000000000..57fcda5ed
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_ver_bar_s2_capsule.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/drawable/qrcode_ver_bar_s3_capsule.xml b/app/shared/src/main/res/drawable/qrcode_ver_bar_s3_capsule.xml
new file mode 100644
index 000000000..878e9cb68
--- /dev/null
+++ b/app/shared/src/main/res/drawable/qrcode_ver_bar_s3_capsule.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/shared/src/main/res/raw/lottie_qrcode_background.json b/app/shared/src/main/res/raw/lottie_qrcode_background.json
new file mode 100644
index 000000000..e5a038e02
--- /dev/null
+++ b/app/shared/src/main/res/raw/lottie_qrcode_background.json
@@ -0,0 +1 @@
+{"v":"5.12.1","fr":30,"ip":0,"op":91,"w":724,"h":724,"nm":"SUW_QR_Ambient_Background_export","ddd":0,"assets":[{"id":"comp_0","nm":"Extra_Orbit_Shapes_dup_dup","fr":30,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Wiggle_Control","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[409.829,1025.829,0],"ix":2,"l":2},"a":{"a":0,"k":[331.829,335.829,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"freq","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":0.5,"ix":1}}]},{"ty":5,"nm":"amp","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1}}]},{"ty":5,"nm":"loop","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":3,"ix":1}}]}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[641.875,72.355,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.368,72.243,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.841,72.177,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.289,72.158,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.71,72.188,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.099,72.267,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.453,72.397,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.772,72.572,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.076,72.769,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.367,72.984,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.641,73.217,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.897,73.466,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.132,73.73,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.345,74.01,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.534,74.305,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.698,74.613,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.834,74.934,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.943,75.268,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.022,75.614,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.07,75.971,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.087,76.339,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.072,76.717,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.024,77.105,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.942,77.503,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.826,77.91,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.674,78.326,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.487,78.75,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.263,79.183,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.002,79.625,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.704,80.075,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.368,80.534,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.993,81.002,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.578,81.479,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.124,81.965,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.629,82.461,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.093,82.968,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.515,83.487,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.895,84.013,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.246,84.528,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.572,85.028,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.876,85.511,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.162,85.975,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.434,86.417,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.697,86.837,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.953,87.232,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.208,87.601,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.466,87.942,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.73,88.253,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.005,88.533,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.296,88.781,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.605,88.995,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.938,89.173,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.299,89.316,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.691,89.421,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.117,89.489,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.583,89.517,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.091,89.506,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.644,89.456,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.247,89.364,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.9,89.233,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.608,89.06,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.373,88.847,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.196,88.594,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.08,88.301,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.026,87.968,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.035,87.597,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.108,87.188,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.245,86.745,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.445,86.278,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.705,85.789,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.021,85.277,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.393,84.743,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.816,84.188,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.288,83.612,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.806,83.016,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.367,82.402,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.969,81.77,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.609,81.123,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.284,80.461,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.991,79.788,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.727,79.105,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.487,78.415,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.27,77.719,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.072,77.022,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.889,76.325,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.717,75.632,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.551,74.947,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.389,74.273,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.225,73.614,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.056,72.973,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.875,72.355,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"412","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[630.903,113.415,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.719,114.007,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.494,114.635,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.227,115.296,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.919,115.988,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.569,116.71,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.177,117.459,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.744,118.232,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.27,119.027,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.757,119.841,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.207,120.67,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.621,121.512,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.003,122.363,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.354,123.22,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.678,124.078,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.979,124.935,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.259,125.786,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.522,126.628,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.772,127.456,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.013,128.268,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.25,129.058,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.486,129.824,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.726,130.561,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.975,131.266,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.238,131.934,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.518,132.562,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.82,133.147,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.149,133.685,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.511,134.172,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.908,134.606,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.346,134.983,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.829,135.3,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.362,135.555,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.948,135.745,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.592,135.868,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.069,135.904,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.916,135.837,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.836,135.724,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.827,135.567,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.884,135.366,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.004,135.12,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.182,134.829,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.415,134.496,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.7,134.12,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.033,133.704,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.411,133.247,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.832,132.753,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.292,132.223,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.788,131.659,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.317,131.063,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.877,130.439,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.465,129.79,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.077,129.117,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.711,128.426,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.364,127.72,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.033,127.003,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.715,126.28,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.407,125.554,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.106,124.832,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.809,124.117,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.512,123.417,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.212,122.737,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.905,122.082,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.588,121.46,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.256,120.878,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.906,120.339,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.542,119.81,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.163,119.283,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.767,118.759,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.349,118.243,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.907,117.736,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.437,117.242,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.937,116.764,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.405,116.305,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.837,115.867,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.232,115.454,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.586,115.067,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.899,114.71,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.167,114.385,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.391,114.093,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.567,113.837,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.695,113.62,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.774,113.442,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.803,113.305,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.781,113.211,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.18,113.282,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.903,113.415,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"533","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[627.897,218.612,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.613,219.518,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.329,220.357,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.047,221.122,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.77,221.806,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.503,222.404,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.272,222.921,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.095,223.365,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.967,223.737,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.887,224.037,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.85,224.266,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.853,224.426,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.372,224.211,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.56,223.977,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.77,223.684,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.001,223.334,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.25,222.931,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.516,222.476,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.798,221.972,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.093,221.424,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.4,220.835,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.718,220.208,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.045,219.549,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.38,218.86,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.721,218.147,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.067,217.416,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.417,216.67,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.77,215.916,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.124,215.16,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.478,214.409,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.83,213.668,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.181,212.944,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.529,212.222,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.878,211.488,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.223,210.745,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.566,209.996,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.902,209.245,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.232,208.496,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.553,207.753,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.864,207.019,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.163,206.299,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.45,205.596,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.722,204.913,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.978,204.255,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.216,203.625,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.437,203.026,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.637,202.463,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.817,201.938,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.975,201.454,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.11,201.015,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.221,200.624,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.307,200.283,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.367,199.995,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.402,199.763,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.41,199.587,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.039,199.624,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.882,199.821,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.698,200.082,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.493,200.397,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.273,200.755,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.037,201.158,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.786,201.604,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.52,202.092,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.239,202.623,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.944,203.196,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.634,203.809,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.311,204.463,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.974,205.154,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.625,205.883,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.263,206.648,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.889,207.446,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.505,208.276,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.11,209.136,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.707,210.022,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.295,210.933,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.877,211.864,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.453,212.812,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.025,213.773,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.596,214.743,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.166,215.718,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.738,216.691,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.314,217.658,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.897,218.612,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"409","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[590.12,59.91,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.605,59.289,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.086,58.644,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.561,57.979,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.03,57.299,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.49,56.607,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.94,55.902,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.381,55.187,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.81,54.465,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.226,53.736,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.629,53.005,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.016,52.273,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.388,51.545,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.743,50.822,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.079,50.107,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.396,49.405,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.692,48.719,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.966,48.05,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.218,47.404,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.446,46.784,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.649,46.192,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.826,45.632,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.977,45.108,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.099,44.622,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.194,44.179,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.259,43.781,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.294,43.431,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.298,43.132,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.27,42.888,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.211,42.701,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.119,42.573,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.994,42.507,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.836,42.504,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.644,42.569,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.418,42.7,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.167,42.893,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.909,43.127,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.644,43.399,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.374,43.707,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.098,44.051,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.817,44.429,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.531,44.838,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.239,45.277,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.942,45.744,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.641,46.238,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.335,46.758,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.024,47.301,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.708,47.866,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.388,48.451,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.063,49.053,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.734,49.672,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.401,50.304,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.064,50.947,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.722,51.599,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.376,52.256,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.027,52.917,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.674,53.578,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.317,54.234,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.957,54.884,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.594,55.522,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.229,56.144,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.861,56.747,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.492,57.324,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.121,57.87,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.749,58.381,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.387,58.854,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.06,59.296,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.769,59.706,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.515,60.085,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.297,60.431,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.116,60.744,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.973,61.024,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.867,61.269,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.799,61.48,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.769,61.657,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.777,61.799,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.822,61.907,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.905,61.98,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.372,61.993,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.6,61.93,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.863,61.833,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.16,61.703,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.491,61.54,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.854,61.345,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.248,61.118,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.673,60.861,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.128,60.573,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.611,60.256,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.12,59.91,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"413","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[562.672,20.631,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.601,20.434,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.466,20.265,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.265,20.128,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.006,20.026,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.731,19.967,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.447,19.949,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.155,19.967,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.855,20.021,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.546,20.107,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.229,20.223,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.905,20.366,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.573,20.534,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.233,20.725,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[558.887,20.937,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[558.533,21.168,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[558.172,21.416,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[557.806,21.679,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[557.433,21.955,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[557.054,22.242,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[556.671,22.539,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[556.282,22.844,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[555.889,23.154,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[555.492,23.469,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[555.092,23.785,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[554.689,24.102,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[554.284,24.418,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[553.877,24.73,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[553.47,25.036,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[553.063,25.334,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[552.657,25.622,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[552.252,25.898,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[551.851,26.158,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[551.453,26.401,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[551.062,26.625,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[550.687,26.839,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[550.331,27.041,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.996,27.233,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.683,27.412,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.392,27.579,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.124,27.733,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.881,27.873,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.664,27.999,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.472,28.111,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.307,28.208,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.169,28.29,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.059,28.356,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.977,28.406,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.924,28.441,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.938,28.448,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.002,28.418,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.094,28.372,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.216,28.31,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.366,28.232,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.545,28.138,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.752,28.029,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.987,27.905,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.248,27.766,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.536,27.612,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.85,27.445,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[550.188,27.264,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[550.549,27.071,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[550.934,26.866,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[551.344,26.656,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[551.777,26.439,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[552.231,26.217,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[552.705,25.988,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[553.196,25.753,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[553.701,25.512,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[554.219,25.265,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[554.748,25.012,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[555.284,24.753,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[555.825,24.49,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[556.368,24.222,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[556.911,23.951,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[557.451,23.678,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[557.984,23.403,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[558.508,23.129,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.019,22.856,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.515,22.586,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.992,22.321,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.446,22.062,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.873,21.812,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.271,21.573,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.635,21.347,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.961,21.137,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.245,20.946,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.484,20.776,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.672,20.631,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"534","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[492.02,5.048,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.864,5.132,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.702,5.211,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.535,5.283,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.362,5.349,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.184,5.41,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.002,5.464,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.817,5.513,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.63,5.556,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.44,5.593,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.25,5.625,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.059,5.652,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.869,5.672,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.681,5.687,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.495,5.696,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.133,5.695,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.959,5.686,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.791,5.669,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.63,5.647,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.476,5.617,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.331,5.58,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.196,5.536,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.07,5.484,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.956,5.425,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.854,5.358,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.764,5.282,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.687,5.199,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.624,5.107,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.576,5.006,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.543,4.896,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.526,4.778,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.525,4.651,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.541,4.515,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.571,4.384,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.617,4.26,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.675,4.144,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.747,4.033,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.83,3.927,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.925,3.826,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.031,3.727,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.146,3.63,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.27,3.534,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.403,3.438,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.543,3.342,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.689,3.244,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.842,3.145,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489,3.043,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.162,2.938,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.327,2.83,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.495,2.718,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.664,2.602,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.833,2.482,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.001,2.357,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.168,2.229,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.331,2.096,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.49,1.959,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.643,1.818,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.788,1.674,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.925,1.527,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.052,1.377,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.166,1.226,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.267,1.075,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.352,0.924,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.431,0.792,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.506,0.685,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.578,0.603,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.646,0.546,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.71,0.513,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.771,0.505,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.828,0.52,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.88,0.559,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.928,0.622,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.972,0.707,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.011,0.815,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.046,0.944,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.077,1.095,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.103,1.267,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.124,1.458,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.14,1.669,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.152,1.899,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.16,2.147,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.162,2.412,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.16,2.693,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.154,2.99,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.143,3.301,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.127,3.627,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.107,3.965,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.082,4.315,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.053,4.676,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.02,5.048,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"34","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[639.535,558.852,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.637,558.378,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.076,557.831,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.566,557.757,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.951,557.738,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.505,557.744,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.048,557.757,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.593,557.773,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.157,557.789,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.569,557.808,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.981,557.825,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.359,557.993,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.333,558.498,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.915,558.896,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.435,559.094,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636,559.345,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.583,559.889,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.098,560.387,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.647,560.564,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.195,560.338,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.725,559.907,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.159,559.487,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1435","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[185.203,652.1,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.674,652.235,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.152,652.376,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.638,652.523,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.134,652.677,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.641,652.835,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.162,652.998,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.696,653.165,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.246,653.336,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.813,653.509,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.398,653.684,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.002,653.86,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.626,654.036,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.273,654.212,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.941,654.386,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.633,654.558,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.35,654.726,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.092,654.89,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.86,655.049,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.655,655.202,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.477,655.349,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.328,655.487,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.207,655.617,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.054,655.846,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.202,656.211,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.324,656.242,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.478,656.258,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.654,656.264,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.831,656.277,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.007,656.298,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.184,656.324,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.361,656.356,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.539,656.393,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.719,656.434,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.901,656.479,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.084,656.526,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.27,656.575,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.458,656.626,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.649,656.677,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.843,656.728,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.041,656.778,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.242,656.827,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.448,656.874,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.658,656.919,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.873,656.961,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.092,657,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.318,657.035,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.549,657.067,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.787,657.095,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.033,657.119,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.286,657.139,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.547,657.156,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.817,657.169,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.097,657.178,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.388,657.186,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.691,657.191,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.006,657.194,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.328,657.194,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.639,657.183,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.938,657.159,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.223,657.121,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.493,657.071,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.747,657.007,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.984,656.93,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.202,656.839,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.401,656.734,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.58,656.615,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.737,656.481,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.871,656.334,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.982,656.174,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.169,655.611,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.165,655.172,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.053,654.687,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.956,654.428,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.831,654.16,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.679,653.884,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.5,653.599,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.293,653.308,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.06,653.012,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.8,652.71,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.514,652.406,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.203,652.1,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1678","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[618.574,349.259,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.501,349.454,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.311,349.8,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.078,350.104,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.819,350.382,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.548,350.65,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.277,350.917,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.018,351.195,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.781,351.49,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.575,351.807,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.407,352.153,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.339,352.337,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.282,352.529,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.238,352.73,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.207,352.939,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.189,353.158,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.185,353.386,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.194,353.624,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.218,353.873,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.256,354.131,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.309,354.401,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.377,354.681,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.458,354.96,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.551,355.234,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.656,355.503,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.773,355.766,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.899,356.022,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.036,356.269,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.182,356.506,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.335,356.733,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.496,356.948,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.662,357.15,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.834,357.338,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.187,357.671,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.549,357.938,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.087,358.203,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.594,358.29,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.175,358.109,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.409,357.887,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.598,357.579,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.672,357.396,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.724,357.204,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.753,357.007,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.763,356.802,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.754,356.589,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.729,356.367,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.69,356.135,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.639,355.893,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.575,355.641,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.502,355.38,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.421,355.109,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.332,354.828,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.236,354.539,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.136,354.241,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.031,353.936,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.924,353.624,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.814,353.306,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.704,352.983,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.593,352.656,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.483,352.326,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.374,351.994,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.268,351.66,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.166,351.326,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.068,350.992,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.975,350.66,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.89,350.33,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.812,350.004,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.742,349.68,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.683,349.361,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"940","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[636.59,392.554,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.646,392.984,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.716,393.421,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.802,393.862,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.901,394.307,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.015,394.754,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.142,395.202,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.282,395.648,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.434,396.092,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.598,396.532,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.772,396.967,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.956,397.395,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.148,397.814,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.347,398.223,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.553,398.621,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.764,399.007,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.979,399.379,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.197,399.735,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.416,400.075,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.635,400.397,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.853,400.7,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.069,400.983,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.28,401.244,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.486,401.483,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.685,401.698,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.058,402.053,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.666,402.44,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.146,402.233,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.828,401.969,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.489,401.626,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.315,401.424,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.14,401.203,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.966,400.962,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.794,400.704,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.626,400.427,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.461,400.133,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.303,399.822,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.151,399.495,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.006,399.153,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.869,398.795,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.742,398.424,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.624,398.04,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.517,397.642,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.422,397.232,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.338,396.809,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.258,396.376,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.179,395.935,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.1,395.49,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.022,395.043,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.945,394.6,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.87,394.162,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.796,393.733,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.724,393.317,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.654,392.917,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.585,392.536,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.519,392.177,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.455,391.844,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.392,391.539,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.332,391.265,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.274,391.025,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.163,390.654,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.786,390.898,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.745,391.138,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.705,391.425,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.666,391.758,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.628,392.135,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.59,392.554,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1439","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[654.3,539.703,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.001,539.712,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[653.643,539.707,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[653.233,539.688,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.775,539.653,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.274,539.601,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.736,539.532,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.164,539.444,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.563,539.337,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.938,539.21,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.292,539.063,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.63,538.896,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.955,538.708,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.27,538.5,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.58,538.271,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.887,538.022,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.195,537.752,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.507,537.461,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.826,537.15,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.155,536.818,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.496,536.466,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.851,536.093,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.225,535.699,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.618,535.284,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.034,534.848,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.475,534.391,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.943,533.911,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.438,533.414,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.963,532.909,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.518,532.397,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.106,531.88,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.726,531.361,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.38,530.843,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.07,530.328,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.796,529.818,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.559,529.316,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.36,528.825,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.199,528.346,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.076,527.883,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.993,527.438,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.948,527.013,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.943,526.61,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.977,526.233,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.05,525.883,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.162,525.562,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.312,525.272,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.725,524.795,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.283,524.466,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.615,524.36,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.98,524.296,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.378,524.273,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.807,524.294,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.266,524.359,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.753,524.469,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.267,524.623,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.797,524.815,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.334,525.036,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.875,525.286,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.422,525.564,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.973,525.868,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.528,526.198,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.086,526.554,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.646,526.933,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.208,527.336,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.772,527.761,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.336,528.207,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.9,528.673,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.462,529.158,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.023,529.66,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.581,530.18,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.134,530.714,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.683,531.262,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.224,531.824,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.758,532.396,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.282,532.979,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.795,533.57,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.295,534.168,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.779,534.772,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.246,535.38,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.693,535.99,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[653.118,536.602,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[653.518,537.212,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[653.89,537.821,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.231,538.425,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.537,539.024,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.793,539.619,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1434","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[603.337,648.541,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[602.256,647.901,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[601.195,647.255,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[600.158,646.605,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[599.147,645.953,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.167,645.302,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.219,644.654,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.307,644.01,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.435,643.373,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.605,642.746,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.82,642.13,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.083,641.528,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.396,640.942,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.763,640.374,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.185,639.827,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.665,639.303,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.204,638.805,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.806,638.334,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.472,637.893,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.204,637.484,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.003,637.109,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.871,636.77,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.82,636.21,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.287,635.692,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.591,635.612,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.969,635.581,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.407,635.595,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[590.859,635.634,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.323,635.696,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[591.798,635.781,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.286,635.885,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[592.785,636.009,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.295,636.152,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[593.817,636.311,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.35,636.486,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[594.894,636.677,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[595.447,636.882,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.011,637.101,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[596.584,637.333,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.165,637.578,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[597.754,637.834,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.349,638.102,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[598.951,638.382,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[599.556,638.672,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[600.165,638.974,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[600.776,639.286,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[601.387,639.609,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[601.996,639.943,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[602.603,640.288,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[603.203,640.645,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[603.797,641.012,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[604.38,641.392,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[604.951,641.784,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[605.507,642.189,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[606.045,642.608,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[606.562,643.04,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[607.053,643.484,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[607.509,643.929,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[607.929,644.372,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[608.311,644.811,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[608.656,645.243,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[608.963,645.667,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.232,646.081,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.461,646.482,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.65,646.869,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.799,647.24,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.909,647.593,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.006,648.238,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.942,648.791,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.546,649.42,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[609.084,649.692,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[608.796,649.781,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[608.47,649.838,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[608.107,649.861,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[607.708,649.85,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[607.274,649.805,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[606.806,649.726,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[606.304,649.613,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[605.77,649.465,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[605.205,649.284,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[604.61,649.069,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[603.987,648.821,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[603.337,648.541,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1639","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[516.076,621.885,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.051,622.325,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.075,622.842,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.159,623.419,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.225,623.726,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.309,624.043,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.411,624.37,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.533,624.703,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.673,625.044,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.834,625.39,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.015,625.741,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.216,626.096,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.438,626.455,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.68,626.818,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.942,627.185,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.225,627.554,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.527,627.928,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.848,628.305,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.187,628.687,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.545,629.074,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.918,629.466,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[520.307,629.865,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[520.707,630.259,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[521.116,630.646,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[521.532,631.023,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[521.953,631.389,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[522.376,631.744,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[522.801,632.084,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[523.224,632.41,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[523.643,632.719,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[524.058,633.01,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[524.464,633.282,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[524.861,633.534,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[525.246,633.765,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[525.617,633.973,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[525.972,634.157,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[526.308,634.317,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[526.625,634.451,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[526.919,634.559,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[527.434,634.692,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[527.84,634.711,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[528.301,634.24,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[528.241,633.842,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[528.034,633.328,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[527.689,632.716,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[527.467,632.379,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[527.213,632.025,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[526.928,631.654,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[526.612,631.269,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[526.268,630.87,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[525.896,630.46,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[525.497,630.039,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[525.074,629.609,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[524.629,629.171,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[524.164,628.728,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[523.681,628.279,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[523.183,627.827,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[522.673,627.373,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[522.154,626.919,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[521.63,626.467,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[521.105,626.017,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[520.582,625.572,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[520.066,625.134,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.563,624.705,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.076,624.287,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.612,623.883,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.177,623.495,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.775,623.126,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.415,622.779,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.102,622.458,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.651,621.905,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1552","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[500.702,642.523,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.775,642.862,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.992,643.476,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.299,643.999,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.687,644.426,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.144,644.751,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.394,644.875,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.656,644.973,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.929,645.044,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.209,645.088,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.496,645.105,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.788,645.096,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[504.081,645.059,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[504.375,644.996,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[504.666,644.907,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[504.953,644.791,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[505.235,644.649,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[505.508,644.481,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[505.77,644.287,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[506.257,643.827,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[506.681,643.271,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.054,642.671,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.386,642.069,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.672,641.476,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.907,640.9,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[508.088,640.346,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[508.212,639.82,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[508.282,639.324,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[508.3,638.861,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[508.244,638.231,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[508.123,637.68,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.953,637.067,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.972,636.451,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.558,636.632,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[507.098,637.008,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[506.707,637.342,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[506.254,637.73,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[506.007,637.941,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[505.747,638.163,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[505.475,638.392,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[505.191,638.63,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[504.897,638.873,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[504.595,639.121,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[504.284,639.373,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.966,639.628,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.642,639.885,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.313,640.143,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.98,640.401,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.645,640.659,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.309,640.915,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.973,641.17,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.638,641.422,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.306,641.673,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.978,641.92,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1387","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[148.199,632.188,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.543,631.847,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.901,631.518,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.271,631.201,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.651,630.896,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[150.039,630.605,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[150.433,630.327,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[150.83,630.063,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[151.229,629.813,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[151.628,629.577,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[152.025,629.355,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[152.418,629.147,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[152.805,628.953,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[153.186,628.772,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[153.558,628.605,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[153.92,628.45,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[154.27,628.306,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[154.609,628.174,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[154.933,628.052,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[155.244,627.94,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[155.54,627.835,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[155.819,627.738,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.083,627.647,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.329,627.56,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.559,627.476,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.772,627.394,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.969,627.312,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[157.144,627.236,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[157.295,627.176,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[157.419,627.132,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[157.518,627.105,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[157.405,627.45,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[157.286,627.556,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[157.146,627.674,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.987,627.803,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.809,627.942,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.613,628.091,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.401,628.248,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[156.175,628.414,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[155.934,628.585,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[155.68,628.763,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[155.416,628.946,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[155.142,629.132,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[154.859,629.322,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[154.569,629.513,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[154.273,629.706,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[153.973,629.898,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[153.67,630.089,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[153.365,630.279,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[153.06,630.466,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[152.756,630.651,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[152.452,630.836,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[152.152,631.02,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[151.856,631.202,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[151.567,631.382,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[151.286,631.559,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[151.014,631.731,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[150.753,631.899,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[150.504,632.06,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[150.267,632.215,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[150.044,632.363,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.835,632.502,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.64,632.633,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.461,632.753,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.296,632.863,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.147,632.962,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[149.012,633.048,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.892,633.122,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.786,633.182,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.694,633.228,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.614,633.259,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.487,633.273,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.357,633.165,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.216,632.753,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1680","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[380.513,630.304,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[380.386,629.824,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[380.033,629.228,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[379.702,628.92,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[379.512,628.794,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[379.308,628.686,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[379.09,628.596,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.862,628.526,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.625,628.474,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.38,628.441,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.13,628.426,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.876,628.429,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.621,628.45,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.366,628.488,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.114,628.544,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.866,628.616,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.624,628.704,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.39,628.807,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.167,628.926,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.956,629.059,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.754,629.207,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.552,629.375,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.35,629.561,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.152,629.764,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[374.96,629.982,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[374.603,630.454,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[374.295,630.963,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[374.05,631.495,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[373.875,632.036,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[373.776,632.576,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[373.755,633.101,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[373.809,633.603,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[373.932,634.071,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[374.221,634.69,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[374.586,635.186,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[374.953,635.538,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.195,635.684,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.5,635.763,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[375.861,635.776,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.059,635.757,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.266,635.723,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.481,635.673,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.704,635.608,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[376.931,635.528,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.162,635.434,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.395,635.326,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.629,635.205,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[377.862,635.071,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.093,634.925,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.32,634.767,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.542,634.599,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.757,634.421,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[378.965,634.234,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[379.165,634.038,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[379.532,633.623,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[379.851,633.183,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[380.114,632.725,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[380.318,632.256,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[380.458,631.781,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[380.529,631.31,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1679","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[25.468,526.14,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.235,526.436,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.011,526.776,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.798,527.156,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.598,527.572,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.413,528.021,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.247,528.499,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.1,529.002,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.974,529.527,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.87,530.071,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.79,530.631,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.733,531.204,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.701,531.787,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.693,532.377,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.709,532.971,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.748,533.568,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.811,534.165,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.895,534.759,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.999,535.349,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.123,535.932,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.263,536.507,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.417,537.072,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.583,537.625,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.758,538.164,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.939,538.689,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.122,539.197,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.319,539.687,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.531,540.155,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.756,540.6,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.994,541.022,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.243,541.417,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.502,541.786,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.77,542.127,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.045,542.438,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.325,542.719,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.61,542.969,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.897,543.187,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.186,543.371,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.473,543.522,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.759,543.639,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.04,543.721,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.316,543.768,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.585,543.779,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.845,543.755,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.095,543.695,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.333,543.6,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.557,543.469,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.767,543.302,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.961,543.101,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.138,542.865,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.295,542.595,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.433,542.291,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.551,541.956,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.646,541.588,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.719,541.19,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.767,540.765,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.772,540.34,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.732,539.919,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.652,539.502,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.534,539.086,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.381,538.67,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.198,538.254,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.987,537.836,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.751,537.414,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.494,536.989,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.219,536.56,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.929,536.125,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.626,535.686,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.314,535.241,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.997,534.79,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.676,534.334,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.355,533.873,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.036,533.407,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.724,532.938,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.42,532.465,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.128,531.99,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.85,531.514,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.589,531.038,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.349,530.565,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.132,530.095,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.941,529.631,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.779,529.176,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.65,528.73,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.555,528.298,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.499,527.882,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.48,527.487,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.47,527.131,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.462,526.82,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.459,526.325,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1686","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[17.855,498.57,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.15,499.105,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.465,499.607,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.798,500.073,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.147,500.503,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.51,500.895,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.887,501.249,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.274,501.562,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.671,501.834,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.074,502.064,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.483,502.25,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.895,502.392,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.307,502.488,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.719,502.537,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.127,502.54,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.53,502.495,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.926,502.401,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.313,502.259,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.688,502.067,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.049,501.825,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.396,501.534,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.725,501.192,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.035,500.801,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.324,500.359,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.59,499.869,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.807,499.393,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.961,498.968,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.057,498.59,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.098,498.254,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.088,497.954,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.03,497.688,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.929,497.451,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.786,497.238,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.607,497.046,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.394,496.872,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.151,496.711,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.88,496.561,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.587,496.419,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.273,496.281,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.941,496.145,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.596,496.009,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.241,495.87,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.878,495.727,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.511,495.578,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.143,495.421,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.778,495.256,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.418,495.08,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.066,494.894,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.727,494.698,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.403,494.49,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.097,494.271,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.814,494.042,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.555,493.804,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.325,493.556,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.127,493.302,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.938,493.063,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.744,492.851,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.547,492.667,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.348,492.51,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.148,492.38,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.95,492.275,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.754,492.196,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.561,492.141,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.374,492.111,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.192,492.105,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.018,492.122,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.852,492.161,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.696,492.223,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.55,492.306,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.416,492.41,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.294,492.535,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.184,492.679,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.089,492.842,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.007,493.024,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.94,493.225,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.889,493.443,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.852,493.678,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.832,493.93,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.827,494.198,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.837,494.483,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.863,494.782,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.905,495.097,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.961,495.427,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.032,495.771,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.116,496.129,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.212,496.505,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.318,496.897,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.436,497.303,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.564,497.719,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.704,498.143,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.855,498.57,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1315","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[441.897,638.31,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[442.134,638.159,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[442.516,637.994,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[442.896,638.033,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[443.169,638.622,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[443.209,639.138,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[443.221,639.678,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[443.281,640.312,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[443.42,640.948,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[443.381,641.505,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[443.211,642.074,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[442.935,642.611,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[442.495,643.162,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[442.12,643.447,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[441.692,643.534,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[441.275,643.604,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.887,643.823,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.5,644.049,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.07,643.984,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.131,643.38,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.283,642.848,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.394,642.513,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.529,642.129,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.689,641.692,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[440.875,641.201,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[441.066,640.688,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[441.226,640.218,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[441.357,639.791,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[441.461,639.406,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[441.593,638.767,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1669","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[131.395,665.879,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.693,666.402,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.981,666.917,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.259,667.422,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.526,667.916,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.782,668.397,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.025,668.862,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.256,669.309,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.474,669.737,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.68,670.143,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.873,670.526,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.053,670.882,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.22,671.211,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.376,671.509,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.519,671.775,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.651,672.006,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.773,672.202,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.883,672.359,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.985,672.475,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.077,672.55,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.161,672.581,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.238,672.566,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.309,672.505,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.434,672.275,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.534,671.975,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.614,671.414,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.612,670.973,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.565,670.484,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.475,669.95,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.346,669.375,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.269,669.072,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.185,668.761,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.096,668.441,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.003,668.112,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.907,667.775,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.81,667.43,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.713,667.078,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.617,666.72,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.526,666.355,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.439,665.984,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.359,665.608,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.288,665.228,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.226,664.844,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.176,664.456,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.14,664.067,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.113,663.678,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.073,663.304,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.018,662.945,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.951,662.603,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.871,662.28,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.78,661.976,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.679,661.693,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.569,661.432,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.452,661.193,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.329,660.978,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.2,660.788,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.068,660.622,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.933,660.483,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.796,660.37,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.66,660.285,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.525,660.227,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.392,660.197,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.262,660.196,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.137,660.224,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.017,660.28,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.903,660.366,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.797,660.481,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.698,660.624,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.609,660.797,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.529,660.998,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.398,661.484,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.309,662.077,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.281,662.413,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.263,662.773,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.251,663.157,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.248,663.562,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.253,663.989,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.269,664.436,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.297,664.901,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.339,665.382,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1685","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[31.742,476.677,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.502,476.499,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.267,476.288,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.038,476.048,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.814,475.778,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.597,475.482,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.387,475.16,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.185,474.814,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.99,474.447,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.804,474.06,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.627,473.655,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.459,473.233,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.299,472.796,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.149,472.348,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.009,471.888,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.878,471.42,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.755,470.946,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.642,470.468,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.538,469.988,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.442,469.509,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.354,469.032,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.273,468.561,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.199,468.098,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.137,467.641,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.091,467.19,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.059,466.748,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.042,466.316,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.04,465.896,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.052,465.489,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.078,465.097,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.118,464.722,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.171,464.365,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.237,464.028,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.315,463.713,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.404,463.42,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.503,463.152,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.613,462.909,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.731,462.693,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.858,462.505,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.992,462.347,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.133,462.219,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.279,462.121,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.43,462.056,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.584,462.024,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.741,462.026,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.9,462.061,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.059,462.131,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.218,462.236,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.376,462.375,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.532,462.55,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.685,462.76,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.834,463.004,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.979,463.282,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.127,463.59,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.277,463.925,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.427,464.286,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.575,464.672,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.72,465.08,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.859,465.508,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.99,465.956,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.113,466.422,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.226,466.903,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.328,467.398,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.418,467.906,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.495,468.423,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.559,468.948,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.609,469.478,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.646,470.012,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.669,470.547,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.678,471.079,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.674,471.607,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.656,472.128,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.627,472.638,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.587,473.134,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.536,473.612,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.476,474.07,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.408,474.503,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.335,474.906,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.257,475.276,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.176,475.609,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.095,475.899,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.015,476.141,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.94,476.331,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.874,476.483,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.818,476.603,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.773,476.691,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.74,476.747,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1233","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[207.643,34.392,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.689,34.058,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.77,33.741,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.882,33.441,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.025,33.16,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.198,32.9,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.398,32.662,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.623,32.447,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.872,32.256,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[209.141,32.091,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[209.428,31.952,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[209.73,31.841,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[210.045,31.759,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[210.369,31.707,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[210.7,31.685,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[211.034,31.694,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[211.369,31.736,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[211.7,31.81,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.025,31.917,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.34,32.058,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.642,32.233,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.929,32.442,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.234,32.678,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.583,32.934,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.968,33.209,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.381,33.501,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.816,33.809,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.267,34.132,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.727,34.469,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.192,34.818,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.656,35.177,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.113,35.546,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.56,35.924,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.992,36.308,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.404,36.698,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.795,37.092,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.159,37.489,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.494,37.886,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.797,38.282,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.067,38.675,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.301,39.063,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.498,39.444,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.655,39.817,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.773,40.177,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.851,40.523,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.888,40.852,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.885,41.162,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.842,41.448,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.759,41.708,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.638,41.938,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.48,42.135,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.287,42.294,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.057,42.419,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.79,42.517,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.488,42.587,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.154,42.629,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.789,42.646,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.396,42.636,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.978,42.601,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.538,42.542,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.078,42.46,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.602,42.354,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.112,42.228,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.612,42.08,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.104,41.913,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.591,41.728,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.077,41.525,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.564,41.307,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.056,41.073,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.555,40.825,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.065,40.565,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[211.588,40.293,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[211.126,40.011,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[210.683,39.719,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[210.26,39.42,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[209.861,39.114,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[209.487,38.803,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[209.14,38.487,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.822,38.168,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.536,37.846,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.281,37.523,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[208.06,37.199,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.872,36.875,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.718,36.551,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.598,36.229,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.514,35.909,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.466,35.593,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.455,35.282,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.481,34.977,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.544,34.68,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[207.643,34.392,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"258","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[127.684,53.192,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[128.315,53.427,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[128.951,53.647,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.588,53.851,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.219,54.041,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.841,54.217,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.449,54.38,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.039,54.53,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.607,54.669,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.149,54.795,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.663,54.91,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.146,55.014,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.595,55.106,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.009,55.186,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.384,55.255,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.72,55.312,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.016,55.355,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.271,55.385,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.483,55.4,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.653,55.399,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.781,55.381,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.866,55.343,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.904,55.285,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.897,55.208,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.844,55.112,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.746,54.998,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.606,54.866,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.423,54.716,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.2,54.551,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.939,54.37,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.641,54.175,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.309,53.968,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.944,53.748,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.55,53.518,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.128,53.279,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.682,53.032,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.214,52.78,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.727,52.522,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.223,52.262,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.707,52,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.181,51.739,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.647,51.479,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.109,51.222,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.57,50.971,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.032,50.726,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[128.5,50.49,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.975,50.263,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.461,50.048,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.96,49.845,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.475,49.656,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.009,49.483,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.563,49.324,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.137,49.171,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.732,49.024,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.351,48.883,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.996,48.747,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.667,48.618,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.367,48.495,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.096,48.379,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.854,48.27,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.643,48.169,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.462,48.078,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.312,47.996,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.193,47.925,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.104,47.866,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.044,47.821,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.159,47.843,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.254,47.908,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.369,47.997,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.502,48.112,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.65,48.254,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.811,48.426,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.981,48.629,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.159,48.865,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.339,49.135,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.52,49.443,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.697,49.788,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.89,50.159,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.138,50.527,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.439,50.89,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.789,51.246,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.183,51.595,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.618,51.935,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.09,52.266,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.595,52.587,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.127,52.896,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.684,53.192,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1696","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[131.958,20.884,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.66,20.582,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.341,20.284,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.005,19.989,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.652,19.7,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.284,19.419,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.903,19.146,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.513,18.885,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.114,18.637,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[128.71,18.404,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[128.304,18.187,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.896,17.99,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.491,17.814,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.092,17.662,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.7,17.535,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.318,17.435,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.95,17.366,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.598,17.329,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.266,17.326,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.955,17.359,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.667,17.428,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.398,17.516,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.147,17.619,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.914,17.732,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.7,17.855,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.504,17.985,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.327,18.12,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.169,18.258,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.031,18.399,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.912,18.541,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.813,18.683,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.734,18.825,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.675,18.967,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.637,19.107,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.618,19.248,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.621,19.388,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.644,19.528,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.687,19.669,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.752,19.811,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.837,19.956,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[122.943,20.105,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.071,20.258,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.219,20.417,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.388,20.584,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.578,20.759,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.789,20.945,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.022,21.143,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.275,21.354,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.55,21.581,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.846,21.825,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.162,22.083,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.5,22.331,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.855,22.566,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.226,22.788,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.61,22.995,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.005,23.188,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.409,23.366,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.819,23.53,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[128.232,23.678,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[128.647,23.81,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.06,23.928,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.469,24.029,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.872,24.116,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.266,24.187,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[130.649,24.242,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.019,24.282,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.373,24.307,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.71,24.316,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.028,24.31,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.324,24.29,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.596,24.255,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.844,24.206,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.066,24.142,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.26,24.065,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.425,23.974,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.56,23.869,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.664,23.752,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.737,23.621,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.778,23.478,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.787,23.323,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.765,23.155,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.718,22.968,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.645,22.766,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.543,22.55,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.413,22.324,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.252,22.09,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[133.059,21.85,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.834,21.606,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.576,21.363,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.284,21.121,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[131.958,20.884,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"580","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[44.15,282.978,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.295,283.239,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.447,283.493,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.604,283.738,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.767,283.975,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.935,284.201,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.108,284.416,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.285,284.619,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.467,284.81,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.654,284.988,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.845,285.153,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.042,285.306,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.246,285.445,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.456,285.571,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.673,285.685,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.899,285.786,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.135,285.875,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.383,285.952,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.642,286.017,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.916,286.072,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.197,286.112,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.482,286.136,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.769,286.144,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.059,286.136,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.35,286.112,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.639,286.073,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.927,286.018,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.211,285.948,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.491,285.864,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.765,285.766,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.031,285.654,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.288,285.529,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.535,285.392,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.77,285.243,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.992,285.083,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.199,284.913,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.391,284.733,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.566,284.545,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.722,284.349,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.859,284.146,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.975,283.937,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.069,283.723,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.141,283.505,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.189,283.285,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.213,283.062,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.211,282.838,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.183,282.615,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.129,282.393,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.048,282.173,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.94,281.955,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.826,281.724,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.709,281.475,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.587,281.211,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.459,280.936,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.324,280.652,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.179,280.36,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.024,280.065,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.857,279.768,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.678,279.472,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.485,279.178,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.279,278.89,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.058,278.609,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.823,278.338,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.574,278.08,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.311,277.835,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.035,277.608,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.746,277.399,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.446,277.212,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.136,277.049,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.817,276.912,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.491,276.805,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.161,276.729,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.829,276.688,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.497,276.685,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.168,276.722,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.847,276.803,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.535,276.931,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.237,277.111,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.958,277.344,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.701,277.636,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.465,277.974,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.248,278.352,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.049,278.767,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.87,279.216,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.71,279.693,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.569,280.197,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.447,280.723,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.344,281.267,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.26,281.827,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.196,282.398,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.15,282.978,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1690","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[55.557,403.951,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.554,403.704,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.55,403.44,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.544,403.161,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.534,402.868,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.521,402.563,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.504,402.245,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.482,401.918,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.453,401.583,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.418,401.242,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.376,400.895,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.325,400.546,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.264,400.195,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.194,399.845,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.113,399.497,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.02,399.155,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.915,398.819,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.797,398.491,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.681,398.169,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.579,397.847,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.49,397.528,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.411,397.212,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.341,396.901,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.278,396.595,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.22,396.296,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.165,396.004,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.112,395.722,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.06,395.449,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.006,395.186,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.951,394.935,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.893,394.697,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.83,394.472,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.763,394.262,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.691,394.068,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.612,393.89,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.528,393.731,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.437,393.59,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.34,393.47,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.237,393.371,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.129,393.296,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.015,393.245,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.898,393.22,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.777,393.224,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.654,393.256,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.531,393.321,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.409,393.419,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.29,393.553,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.176,393.724,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.07,393.932,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.974,394.171,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.888,394.44,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.812,394.736,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.745,395.056,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.689,395.4,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.643,395.764,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.607,396.145,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.582,396.542,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.566,396.952,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.561,397.372,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.566,397.8,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.582,398.233,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.607,398.668,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.642,399.103,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.687,399.536,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.742,399.964,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.807,400.384,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.881,400.795,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.964,401.193,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.057,401.578,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.158,401.946,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.268,402.296,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.387,402.626,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.513,402.934,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.648,403.219,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.79,403.48,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.939,403.715,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.095,403.923,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.258,404.104,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.429,404.263,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.608,404.403,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.795,404.52,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.988,404.612,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.186,404.677,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.387,404.711,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.589,404.713,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.791,404.681,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.991,404.613,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.187,404.507,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.376,404.363,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.558,404.18,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1027","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":".dot1","cl":"dot1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[42.489,58.809,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.542,58.889,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.602,58.992,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.666,59.115,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.735,59.259,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.804,59.422,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.875,59.603,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.944,59.801,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.011,60.017,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.075,60.249,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.136,60.496,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.192,60.76,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.244,61.038,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.291,61.331,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.333,61.639,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.371,61.962,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.405,62.3,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.435,62.653,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.463,63.021,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.487,63.401,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.51,63.792,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.53,64.193,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.547,64.602,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.562,65.017,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.575,65.437,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.585,65.859,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.592,66.282,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.598,66.703,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.6,67.12,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.601,67.532,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.599,67.936,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.594,68.33,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.587,68.712,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.577,69.079,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.565,69.43,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.551,69.763,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.534,70.074,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.514,70.362,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.491,70.626,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.466,70.863,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.439,71.071,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.409,71.249,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.376,71.394,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.34,71.506,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.302,71.582,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.261,71.622,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.217,71.624,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.171,71.587,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.127,71.524,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.097,71.463,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.081,71.403,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.08,71.341,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.093,71.273,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.119,71.198,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.158,71.113,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.209,71.015,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.27,70.903,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.342,70.774,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.421,70.628,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.508,70.462,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.6,70.275,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.697,70.067,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.795,69.836,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.894,69.582,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.992,69.305,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.086,69.004,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.176,68.68,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.258,68.333,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.332,67.964,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.395,67.574,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.444,67.163,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.479,66.734,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.497,66.288,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.497,65.827,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.475,65.353,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.431,64.87,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.363,64.379,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.269,63.885,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.156,63.394,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.044,62.913,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.932,62.446,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.819,61.994,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.702,61.557,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.58,61.138,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.453,60.738,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.317,60.358,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.174,59.999,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.02,59.664,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.855,59.353,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.678,59.067,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.489,58.809,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431379795,0.89411765337,0.858823537827,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"50","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[411.369,39.06,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.456,39.712,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.518,40.345,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.552,40.955,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.56,41.539,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.54,42.095,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.492,42.617,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.417,43.104,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.315,43.551,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.185,43.956,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.027,44.315,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.841,44.625,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.627,44.882,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.387,45.084,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.118,45.228,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[409.823,45.311,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[409.5,45.33,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[409.153,45.29,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[408.799,45.235,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[408.444,45.17,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[408.092,45.094,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[407.745,45.005,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[407.406,44.904,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[407.079,44.787,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[406.764,44.655,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[406.465,44.507,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[406.182,44.342,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.917,44.159,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.67,43.957,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.443,43.737,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.236,43.499,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.05,43.241,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.883,42.966,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.737,42.672,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.611,42.361,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.504,42.033,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.416,41.689,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.345,41.331,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.291,40.96,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.253,40.577,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.229,40.185,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.219,39.787,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.22,39.383,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.231,38.978,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.252,38.574,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.279,38.174,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.312,37.782,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.353,37.402,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.42,37.026,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.517,36.656,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.641,36.293,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.79,35.939,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[404.964,35.594,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.159,35.261,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.374,34.941,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.607,34.634,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[405.856,34.344,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[406.118,34.07,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[406.391,33.814,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[406.674,33.578,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[406.963,33.362,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[407.257,33.168,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[407.554,32.997,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[407.851,32.85,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[408.146,32.728,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[408.438,32.631,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[408.724,32.561,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[409.003,32.519,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[409.273,32.504,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[409.531,32.518,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[409.778,32.561,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.01,32.633,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.228,32.735,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.429,32.866,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.614,33.027,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.78,33.217,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[410.929,33.437,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.061,33.684,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.186,33.958,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.304,34.258,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.411,34.583,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.505,34.935,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.583,35.311,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.641,35.713,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.679,36.137,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.695,36.583,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.685,37.049,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.649,37.532,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.585,38.03,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.492,38.541,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[411.369,39.06,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"25","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[25.656,84.16,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.138,84.031,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.648,83.877,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.188,83.702,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.758,83.506,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.36,83.291,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.995,83.06,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.664,82.814,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.366,82.555,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.102,82.287,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.872,82.01,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.676,81.729,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.513,81.446,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.383,81.164,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.286,80.886,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.22,80.617,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.184,80.359,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.186,80.107,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.227,79.857,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.308,79.611,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.428,79.368,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.586,79.131,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.78,78.901,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.011,78.678,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.275,78.463,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.573,78.257,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.901,78.062,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.259,77.879,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.643,77.708,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.052,77.551,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.483,77.408,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.934,77.281,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.403,77.17,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.885,77.077,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.38,77.002,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.883,76.945,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.393,76.908,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.906,76.891,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.419,76.896,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.929,76.921,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.434,76.969,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.931,77.039,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.416,77.131,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.887,77.246,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.341,77.384,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.775,77.544,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.188,77.727,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.603,77.928,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.028,78.145,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.457,78.377,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.886,78.626,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.312,78.89,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.731,79.17,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.138,79.465,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.53,79.774,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.904,80.098,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.257,80.435,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.585,80.784,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.887,81.144,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.16,81.513,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.401,81.89,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.607,82.273,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.778,82.66,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.91,83.048,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.003,83.435,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.053,83.819,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.06,84.196,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.022,84.563,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.937,84.916,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.804,85.252,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.622,85.566,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.389,85.853,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.104,86.109,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.766,86.329,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.373,86.507,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.925,86.637,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.421,86.714,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.867,86.747,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.27,86.742,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.636,86.699,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.97,86.621,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.276,86.508,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.56,86.362,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.828,86.184,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.084,85.975,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.333,85.737,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.581,85.471,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.833,85.179,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.093,84.862,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.366,84.522,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.656,84.16,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1693","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[25.733,432.397,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.286,432.552,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.842,432.728,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.4,432.924,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.957,433.141,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.508,433.379,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.051,433.637,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.582,433.917,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.098,434.219,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.596,434.541,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.07,434.884,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.519,435.247,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.937,435.632,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.323,436.037,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.671,436.461,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.978,436.906,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.258,437.36,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.527,437.812,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.783,438.261,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.026,438.706,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.255,439.147,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.469,439.583,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.667,440.014,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.848,440.438,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.011,440.856,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.155,441.267,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.28,441.671,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.385,442.068,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.469,442.456,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.531,442.836,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.571,443.207,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.588,443.569,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.58,443.92,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.549,444.261,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.492,444.59,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.409,444.906,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.3,445.208,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.164,445.495,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.001,445.765,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.809,446.017,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.589,446.248,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.339,446.456,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.06,446.64,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.75,446.796,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.409,446.921,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.037,447.012,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.637,447.063,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.212,447.07,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.766,447.035,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.301,446.957,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.821,446.841,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.327,446.685,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.823,446.494,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.312,446.267,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.796,446.008,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.278,445.719,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.762,445.4,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.251,445.056,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.747,444.687,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.253,444.297,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.771,443.887,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.306,443.46,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.859,443.018,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.433,442.564,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.031,442.1,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.655,441.628,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.307,441.151,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.989,440.671,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.703,440.19,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.451,439.709,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.236,439.233,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.057,438.761,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.916,438.296,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.815,437.84,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.754,437.395,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.733,436.962,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.751,436.537,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.806,436.116,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.897,435.703,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.026,435.302,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.191,434.914,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.393,434.544,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.632,434.193,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.907,433.865,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.216,433.561,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.56,433.285,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.936,433.039,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.343,432.825,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.78,432.646,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.244,432.503,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.733,432.397,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1149","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[42.904,186.997,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.644,187.337,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.37,187.658,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.082,187.959,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.782,188.24,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.47,188.501,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.149,188.743,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.818,188.963,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.48,189.164,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.136,189.343,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.786,189.501,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.431,189.637,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.072,189.751,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.711,189.841,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.348,189.907,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.984,189.947,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.62,189.958,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.258,189.941,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.9,189.894,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.546,189.82,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.198,189.717,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.857,189.587,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.526,189.431,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.205,189.25,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.896,189.044,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.601,188.817,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.321,188.568,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.058,188.3,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.812,188.014,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.586,187.712,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.381,187.397,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.198,187.069,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.038,186.732,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.903,186.388,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.794,186.038,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.711,185.685,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.657,185.332,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.631,184.98,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.635,184.632,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.669,184.29,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.733,183.956,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.829,183.633,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.957,183.323,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.116,183.028,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.308,182.75,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.524,182.482,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.746,182.201,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.974,181.907,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.209,181.606,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.453,181.301,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.707,180.994,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.972,180.69,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.247,180.392,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.535,180.102,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.834,179.824,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.146,179.56,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.47,179.313,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.805,179.085,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.151,178.88,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.507,178.698,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.872,178.543,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.245,178.415,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.623,178.317,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.005,178.251,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.389,178.218,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.771,178.22,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.149,178.257,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.519,178.33,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.878,178.441,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.221,178.59,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.544,178.777,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.842,179.004,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.11,179.27,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.342,179.576,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.532,179.92,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.681,180.299,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.808,180.698,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.915,181.113,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.003,181.544,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.072,181.987,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.125,182.439,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.161,182.9,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.181,183.365,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.188,183.834,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.181,184.303,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.161,184.77,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.13,185.233,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.088,185.69,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.036,186.137,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.974,186.574,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.904,186.997,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1691","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[44.84,258.096,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.844,257.861,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.853,257.618,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.867,257.371,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.886,257.12,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.911,256.868,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.943,256.618,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.983,256.371,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.03,256.13,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.085,255.897,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.149,255.675,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.222,255.465,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.305,255.271,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.392,255.089,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.442,254.877,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.45,254.633,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.421,254.362,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.357,254.068,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.262,253.756,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.139,253.431,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.991,253.098,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.821,252.759,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.632,252.419,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.426,252.081,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.207,251.749,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.976,251.426,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.736,251.114,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.488,250.816,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.235,250.534,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.978,250.271,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.719,250.027,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.458,249.806,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.196,249.607,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.935,249.432,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.675,249.283,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.415,249.158,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.155,249.06,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.897,248.987,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.637,248.94,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.376,248.918,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.112,248.92,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.844,248.946,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.57,248.994,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.288,249.064,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.012,249.162,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.745,249.288,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.488,249.442,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.243,249.622,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.011,249.827,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.794,250.054,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.592,250.304,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.407,250.573,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.24,250.86,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.093,251.164,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.965,251.483,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.858,251.813,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.772,252.155,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.709,252.505,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.669,252.862,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.653,253.223,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.661,253.586,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.692,253.951,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.749,254.313,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.83,254.672,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.936,255.026,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.067,255.372,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.222,255.709,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.401,256.035,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.604,256.349,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.83,256.648,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.077,256.932,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.347,257.198,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.636,257.446,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.944,257.675,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.264,257.889,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.594,258.088,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.932,258.269,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.279,258.428,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.633,258.565,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.993,258.676,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.359,258.762,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.73,258.821,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.105,258.852,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.485,258.856,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.869,258.832,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.256,258.781,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.647,258.703,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.041,258.6,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.438,258.472,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.839,258.322,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"576","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[33.652,139.713,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.981,139.258,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.296,138.83,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.601,138.43,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.899,138.059,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.192,137.719,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.484,137.411,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.776,137.134,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.071,136.888,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.372,136.673,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.68,136.489,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.997,136.335,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.326,136.208,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.667,136.109,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.024,136.04,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.397,136.005,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.788,136.003,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.2,136.035,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.634,136.098,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.092,136.193,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.575,136.319,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.086,136.475,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.625,136.659,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.194,136.87,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.794,137.107,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.428,137.368,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.096,137.651,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.799,137.954,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.538,138.276,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.315,138.615,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.131,138.968,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.986,139.334,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.882,139.71,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.818,140.095,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.796,140.485,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.817,140.879,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.879,141.275,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.985,141.67,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.134,142.062,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.325,142.449,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.561,142.829,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.839,143.2,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.16,143.559,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.523,143.906,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.921,144.262,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.346,144.636,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.794,145.02,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.264,145.409,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.753,145.798,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.257,146.183,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.775,146.56,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.304,146.924,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.842,147.272,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.388,147.601,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.939,147.908,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.493,148.19,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.051,148.447,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.609,148.676,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.168,148.875,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.726,149.044,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.282,149.183,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.835,149.29,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.385,149.367,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.931,149.412,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.473,149.427,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.011,149.412,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.545,149.369,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.073,149.3,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.597,149.205,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.116,149.086,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.631,148.947,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.142,148.789,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.648,148.615,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.151,148.427,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.612,148.198,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.011,147.915,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.349,147.581,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.625,147.201,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.839,146.777,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.99,146.314,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.079,145.815,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.105,145.284,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.07,144.725,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.974,144.142,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.817,143.539,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.599,142.919,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.323,142.287,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.989,141.647,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.599,141.002,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.152,140.356,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.652,139.713,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1692","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[4.962,144.774,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.736,144.983,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.552,145.225,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.412,145.497,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.316,145.797,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.266,146.125,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.263,146.477,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.307,146.852,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.4,147.248,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.542,147.662,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.733,148.092,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.976,148.536,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.269,148.991,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.606,149.476,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.975,150.012,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.371,150.592,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.792,151.211,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.232,151.862,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.691,152.539,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.163,153.236,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.647,153.949,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.14,154.671,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.64,155.399,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.144,156.128,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.65,156.853,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.158,157.571,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.664,158.278,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[12.169,158.97,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[12.671,159.644,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[13.168,160.298,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[13.66,160.928,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[14.147,161.532,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[14.627,162.107,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.101,162.652,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.568,163.164,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.029,163.642,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.483,164.084,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.931,164.489,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.373,164.856,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.809,165.183,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.242,165.471,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.67,165.718,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.095,165.925,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.504,166.081,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.879,166.179,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.217,166.218,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.518,166.199,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.782,166.124,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.009,165.993,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.197,165.81,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.346,165.575,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.457,165.292,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.529,164.961,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.563,164.585,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.558,164.167,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.515,163.71,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.435,163.215,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.317,162.687,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.163,162.128,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.973,161.541,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.748,160.929,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.489,160.295,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.197,159.642,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.873,158.974,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.519,158.293,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.135,157.603,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.722,156.907,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.283,156.208,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.818,155.508,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.33,154.812,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.82,154.122,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.289,153.44,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.739,152.77,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.174,152.113,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[14.596,151.474,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[14.006,150.853,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[13.406,150.253,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[12.797,149.675,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[12.182,149.121,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.561,148.592,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.937,148.09,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.311,147.617,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.686,147.172,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.063,146.759,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.445,146.376,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.833,146.026,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.231,145.708,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.64,145.424,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.063,145.173,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.503,144.957,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.962,144.774,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"290","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[195.36,9.184,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.865,10.085,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.361,10.989,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.847,11.893,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.324,12.792,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.791,13.684,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.248,14.567,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.695,15.435,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.131,16.287,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.558,17.118,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.976,17.926,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.385,18.706,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.783,19.456,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.163,20.172,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.524,20.852,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.864,21.492,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.182,22.092,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.477,22.65,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.748,23.163,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.994,23.631,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.213,24.052,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.407,24.426,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.573,24.752,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.713,25.028,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.824,25.256,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.907,25.434,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.963,25.564,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.99,25.644,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.961,25.658,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.906,25.593,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.823,25.482,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.714,25.325,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.578,25.123,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.417,24.878,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.232,24.591,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.023,24.263,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.791,23.896,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.537,23.491,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.263,23.051,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.969,22.577,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.656,22.071,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.329,21.536,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.993,20.975,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.65,20.391,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.301,19.788,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.947,19.168,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.587,18.535,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.224,17.892,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.857,17.242,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.489,16.588,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.12,15.933,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.751,15.279,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.384,14.629,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.02,13.986,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.66,13.353,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.306,12.731,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.959,12.123,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.621,11.531,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.295,10.958,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.981,10.405,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.681,9.874,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.399,9.367,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.136,8.885,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.894,8.43,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.677,8.004,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.486,7.608,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.324,7.242,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.194,6.907,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.1,6.605,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.044,6.337,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.029,6.101,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.053,5.901,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.096,5.744,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.156,5.629,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.231,5.556,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.32,5.526,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.423,5.537,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.536,5.59,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.66,5.685,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.793,5.819,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.934,5.993,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.082,6.206,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.234,6.457,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.391,6.745,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.551,7.069,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.713,7.428,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.876,7.82,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.039,8.244,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.201,8.699,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.36,9.184,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"11","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[136.956,36.045,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.293,36.5,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.606,36.915,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.893,37.29,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.155,37.623,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.39,37.913,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.597,38.161,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.777,38.365,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.927,38.524,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.049,38.64,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.141,38.71,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.206,38.733,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.265,38.694,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.321,38.591,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.373,38.43,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.423,38.215,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.467,37.95,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.508,37.638,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.543,37.285,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.573,36.893,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.597,36.468,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.616,36.012,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.629,35.53,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.637,35.024,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.639,34.5,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.636,33.959,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.628,33.405,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.615,32.842,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.599,32.273,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.579,31.7,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.556,31.126,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.531,30.554,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.504,29.986,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.476,29.425,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.449,28.873,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.423,28.332,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.399,27.804,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.378,27.291,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.362,26.795,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.352,26.316,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.348,25.856,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.352,25.416,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.352,24.996,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.346,24.596,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.333,24.218,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.314,23.863,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.289,23.534,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.258,23.23,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.221,22.954,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.179,22.707,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.132,22.49,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.079,22.303,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139.022,22.148,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.96,22.025,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.895,21.935,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.825,21.878,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.752,21.855,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.676,21.867,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.598,21.913,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.517,21.993,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.434,22.109,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.35,22.259,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.264,22.442,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.178,22.66,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.092,22.911,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.005,23.195,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.92,23.511,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.835,23.858,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.751,24.235,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.67,24.64,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.59,25.073,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.514,25.531,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.444,26.003,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.382,26.485,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.327,26.979,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.276,27.482,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.231,27.997,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.191,28.521,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.154,29.055,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.122,29.599,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.092,30.151,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.066,30.712,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.043,31.281,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.023,31.858,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.005,32.442,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.99,33.032,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.978,33.627,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.969,34.227,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.962,34.831,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.958,35.437,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.956,36.045,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1694","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[233.291,37.866,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.526,37.31,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.746,36.738,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.951,36.152,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.141,35.555,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.314,34.949,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.473,34.338,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.615,33.724,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.743,33.11,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.854,32.497,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.951,31.889,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.031,31.286,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.093,30.688,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.137,30.098,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.165,29.516,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.174,28.946,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.167,28.388,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.143,27.846,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.103,27.319,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[235.047,26.812,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.976,26.324,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.891,25.859,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.793,25.418,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.682,25.003,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.559,24.616,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.425,24.258,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.281,23.931,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[234.128,23.637,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.968,23.377,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.801,23.154,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.628,22.967,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.451,22.819,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.271,22.711,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.088,22.645,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.905,22.62,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.721,22.639,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.539,22.702,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.359,22.81,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.182,22.963,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.009,23.163,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.842,23.408,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.693,23.675,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.566,23.95,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.46,24.231,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.372,24.52,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.3,24.817,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.242,25.121,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.197,25.433,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.163,25.752,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.138,26.08,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.121,26.416,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.111,26.76,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.107,27.113,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.107,27.474,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.111,27.845,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.117,28.224,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.124,28.612,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.132,29.009,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.139,29.416,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.145,29.831,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.149,30.255,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.149,30.688,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.145,31.13,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.136,31.579,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.12,32.037,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.097,32.502,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.065,32.974,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.023,33.452,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.97,33.936,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.904,34.425,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.824,34.917,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.75,35.391,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.694,35.835,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.657,36.247,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.64,36.626,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.642,36.973,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.665,37.286,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.71,37.564,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.775,37.807,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.862,38.014,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[230.971,38.186,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.102,38.32,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.256,38.419,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.432,38.48,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.631,38.504,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[231.852,38.49,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.096,38.44,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.362,38.352,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.65,38.227,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[232.96,38.065,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[233.291,37.866,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"14","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[183.264,47.5,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.105,46.994,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.943,46.521,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.779,46.082,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.615,45.683,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.452,45.326,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.293,45.016,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.137,44.757,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.988,44.551,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.845,44.403,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.721,44.297,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.631,44.203,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.57,44.121,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.537,44.052,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.528,43.995,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.54,43.951,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.571,43.921,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.681,43.902,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.84,43.942,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.933,43.984,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.032,44.043,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.137,44.118,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.245,44.209,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.355,44.318,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.465,44.444,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.575,44.588,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.683,44.75,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.788,44.931,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.888,45.131,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.982,45.35,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.07,45.589,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.15,45.848,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.22,46.127,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.281,46.426,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.33,46.745,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.366,47.085,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.388,47.445,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.395,47.826,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.391,48.223,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.383,48.63,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.371,49.044,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.356,49.464,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.337,49.887,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.315,50.312,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.291,50.736,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.263,51.157,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.234,51.573,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.202,51.982,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.169,52.382,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.135,52.77,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.099,53.145,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.063,53.504,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.026,53.846,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.989,54.168,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.953,54.469,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.917,54.747,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.883,54.999,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.85,55.225,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.818,55.423,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.789,55.592,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.762,55.73,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.738,55.836,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.716,55.909,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.672,55.922,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.664,55.856,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.661,55.754,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.665,55.621,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.682,55.466,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.71,55.284,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.747,55.076,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.791,54.839,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.84,54.572,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.892,54.275,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.945,53.948,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.999,53.591,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.051,53.204,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.101,52.788,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.147,52.345,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.188,51.875,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.223,51.381,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.252,50.866,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.274,50.332,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.288,49.781,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.294,49.219,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.292,48.648,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.282,48.074,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.264,47.5,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"297","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[91.824,41.976,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.815,42.04,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.815,42.122,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.824,42.222,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.841,42.341,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.867,42.479,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.901,42.637,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.943,42.813,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.993,43.009,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.049,43.224,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.114,43.458,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.185,43.711,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.264,43.98,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.35,44.267,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.442,44.567,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.541,44.882,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.644,45.208,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.752,45.545,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.864,45.89,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.98,46.241,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.098,46.597,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.218,46.954,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.339,47.312,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.461,47.667,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.582,48.017,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.703,48.361,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.821,48.694,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.936,49.016,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.047,49.324,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.154,49.615,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.256,49.887,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.351,50.137,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.44,50.364,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.521,50.566,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.594,50.739,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.658,50.883,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.712,50.995,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.756,51.074,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.789,51.118,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.858,51.138,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.911,51.137,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.973,51.124,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.04,51.097,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.108,51.053,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.176,50.99,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.241,50.906,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.3,50.799,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.352,50.668,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.395,50.511,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.427,50.329,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.447,50.121,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.455,49.886,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.45,49.626,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.431,49.34,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.398,49.031,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.351,48.699,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.291,48.346,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.219,47.975,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.134,47.589,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.038,47.189,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.932,46.78,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.819,46.365,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.698,45.949,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.574,45.537,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.447,45.133,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.32,44.742,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.196,44.372,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.077,44.027,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.964,43.711,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.845,43.409,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.721,43.12,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.593,42.847,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.462,42.59,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.328,42.351,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.194,42.132,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.06,41.934,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.927,41.758,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.797,41.606,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.67,41.478,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.548,41.377,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.432,41.302,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.323,41.255,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.222,41.237,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.131,41.249,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.049,41.292,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.979,41.365,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.92,41.47,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.874,41.606,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.842,41.775,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.824,41.976,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1695","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[41.366,588.678,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.622,588.687,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.9,588.668,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.198,588.62,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.514,588.542,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.845,588.433,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.191,588.29,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.548,588.112,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.916,587.901,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.301,587.696,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.7,587.505,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.109,587.325,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.522,587.153,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.935,586.986,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.342,586.822,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.741,586.659,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.128,586.494,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.499,586.326,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.851,586.152,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.182,585.97,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.489,585.781,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.77,585.582,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.024,585.371,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.25,585.149,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.445,584.915,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.61,584.668,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.745,584.408,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.848,584.135,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.919,583.849,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.961,583.551,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.972,583.241,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.953,582.921,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.907,582.591,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.834,582.253,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.736,581.909,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.614,581.561,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.472,581.21,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.311,580.861,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.132,580.514,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.923,580.177,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.68,579.85,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.406,579.536,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.103,579.234,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.773,578.948,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.417,578.677,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.04,578.423,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.642,578.187,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[46.227,577.969,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.798,577.772,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.358,577.596,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.908,577.442,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.452,577.31,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.993,577.201,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.534,577.117,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.077,577.058,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.625,577.024,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.181,577.016,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.749,577.035,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.329,577.08,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.925,577.152,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.54,577.251,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.175,577.377,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.834,577.53,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.517,577.711,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.227,577.918,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.965,578.151,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.733,578.41,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.533,578.694,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.364,579.003,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.221,579.334,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.103,579.685,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.009,580.057,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.942,580.446,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.901,580.853,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.887,581.276,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.9,581.713,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.94,582.163,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.009,582.624,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.105,583.094,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.229,583.572,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.381,584.056,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.561,584.542,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.768,585.03,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.003,585.517,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.264,586,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.552,586.477,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.866,586.945,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.205,587.403,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.568,587.846,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.956,588.272,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.366,588.678,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1687","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[45.598,495.423,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.517,494.948,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.421,494.475,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.309,494.006,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.182,493.54,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.04,493.077,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.883,492.618,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.711,492.162,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.524,491.714,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.323,491.276,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.107,490.852,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.878,490.442,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.635,490.049,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.381,489.673,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.115,489.317,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.839,488.981,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.554,488.667,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.262,488.375,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.963,488.107,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.659,487.864,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.352,487.645,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.044,487.452,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.735,487.285,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.427,487.145,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.123,487.031,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.824,486.944,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.531,486.884,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.247,486.85,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.973,486.844,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.712,486.863,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.464,486.909,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.232,486.98,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.017,487.077,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.821,487.197,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.646,487.341,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.494,487.508,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.366,487.697,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.263,487.907,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.18,488.145,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.113,488.417,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.062,488.72,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.026,489.051,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.005,489.407,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.999,489.785,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.008,490.184,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.032,490.599,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.069,491.029,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.122,491.471,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.189,491.92,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.27,492.376,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.365,492.834,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.475,493.292,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.599,493.746,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.738,494.194,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.891,494.633,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.058,495.059,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.241,495.469,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.438,495.861,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.65,496.23,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.878,496.574,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.12,496.89,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.378,497.174,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.652,497.423,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.942,497.634,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.248,497.803,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.57,497.928,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.909,498.004,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.265,498.029,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.626,498.025,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.985,498.009,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.338,497.982,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.684,497.944,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.02,497.895,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.346,497.835,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.658,497.764,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.955,497.682,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.235,497.589,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.497,497.487,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.738,497.374,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.958,497.252,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.154,497.121,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.326,496.981,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.472,496.834,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.591,496.678,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.682,496.515,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.744,496.346,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.778,495.99,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.749,495.805,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.689,495.616,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.598,495.423,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1274","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[512.488,7.664,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[512.949,7.465,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[513.386,7.304,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[513.796,7.18,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[514.177,7.093,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[514.527,7.04,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[514.843,7.022,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[515.139,7.055,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[515.443,7.166,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[515.751,7.352,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.061,7.608,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.37,7.929,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.673,8.31,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.969,8.747,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.256,9.234,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.531,9.766,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.791,10.34,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.036,10.949,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.264,11.59,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.473,12.257,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.662,12.946,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.831,13.653,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.978,14.372,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.104,15.098,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.208,15.828,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.289,16.556,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.349,17.279,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.386,17.99,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.403,18.686,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.399,19.363,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.376,20.015,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.334,20.639,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.275,21.229,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.2,21.782,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.111,22.292,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[519.01,22.756,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.898,23.17,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.771,23.536,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.618,23.867,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.44,24.163,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.238,24.423,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[518.013,24.646,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.767,24.832,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.502,24.981,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[517.219,25.091,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.92,25.164,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.607,25.199,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[516.282,25.197,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[515.947,25.158,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[515.604,25.081,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[515.255,24.969,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[514.902,24.821,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[514.548,24.638,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[514.193,24.422,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[513.841,24.172,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[513.493,23.891,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[513.151,23.578,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[512.818,23.237,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[512.495,22.867,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[512.184,22.471,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[511.887,22.05,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[511.605,21.605,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[511.341,21.138,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[511.095,20.651,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.87,20.145,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.666,19.624,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.484,19.087,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.319,18.543,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.161,18,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.013,17.459,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.878,16.923,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.761,16.391,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.664,15.865,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.589,15.346,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.538,14.833,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.513,14.328,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.516,13.831,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.548,13.341,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.61,12.86,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.701,12.387,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.823,11.923,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[509.974,11.467,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.155,11.018,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.364,10.577,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.6,10.144,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[510.863,9.717,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[511.149,9.296,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[511.457,8.882,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[511.785,8.472,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[512.129,8.066,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[512.488,7.664,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"33","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[503.811,23.46,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.721,24.135,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.581,24.81,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.392,25.479,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.155,26.14,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.872,26.787,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.545,27.416,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.173,28.028,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.757,28.62,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.3,29.19,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.803,29.737,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.269,30.259,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.701,30.754,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.1,31.221,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.471,31.658,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.816,32.065,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.14,32.44,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.446,32.781,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.737,33.089,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.017,33.363,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[494.292,33.601,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[493.564,33.803,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.839,33.969,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.119,34.099,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.411,34.191,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.717,34.247,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.043,34.265,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.392,34.246,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.769,34.191,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.178,34.098,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.623,33.97,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.107,33.805,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[486.636,33.605,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[486.211,33.371,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[485.837,33.102,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[485.518,32.801,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[485.242,32.47,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[484.956,32.125,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[484.66,31.769,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[484.361,31.404,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[484.066,31.031,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[483.782,30.652,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[483.515,30.267,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[483.269,29.879,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[483.05,29.488,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.861,29.096,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.705,28.703,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.587,28.311,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.509,27.921,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.471,27.534,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.476,27.15,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.525,26.771,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.616,26.397,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.751,26.029,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[482.928,25.668,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[483.145,25.314,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[483.4,24.969,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[483.691,24.632,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[484.014,24.305,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[484.366,23.987,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[484.741,23.679,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[485.135,23.382,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[485.542,23.096,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[485.956,22.821,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[486.37,22.558,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[486.776,22.306,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.179,22.068,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[487.629,21.853,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.13,21.664,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[488.679,21.501,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.27,21.362,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.901,21.249,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.568,21.161,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.266,21.097,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.991,21.059,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.739,21.044,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[493.506,21.054,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[494.287,21.088,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.078,21.145,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.874,21.225,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.672,21.327,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.466,21.451,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.253,21.597,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.029,21.764,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.789,21.951,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.529,22.157,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.246,22.383,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.936,22.626,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[502.596,22.888,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.222,23.166,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[503.811,23.46,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"32","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[588.635,32.882,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.072,33.246,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.531,33.578,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.017,33.878,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.535,34.144,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.083,34.376,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.596,34.573,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.058,34.736,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[584.477,34.866,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[583.863,34.963,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[583.222,35.027,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[582.561,35.06,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[581.889,35.062,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[581.21,35.034,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[580.532,34.977,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.86,34.893,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.198,34.782,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.553,34.646,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.927,34.486,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.325,34.305,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.75,34.102,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.205,33.881,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.693,33.642,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.215,33.387,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.773,33.119,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.368,32.839,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.001,32.548,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.671,32.25,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.378,31.945,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.122,31.636,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.9,31.325,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.711,31.014,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.553,30.705,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.423,30.399,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.316,30.099,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.232,29.807,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.192,29.513,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.204,29.217,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.268,28.918,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.38,28.619,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.542,28.321,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.75,28.026,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.003,27.734,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.298,27.449,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.634,27.17,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.008,26.9,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.418,26.639,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.861,26.39,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.334,26.154,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.834,25.932,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.358,25.726,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.904,25.536,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.468,25.364,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.047,25.211,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.638,25.079,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.238,24.967,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.843,24.878,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[580.451,24.812,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[581.058,24.769,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[581.661,24.751,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[582.258,24.757,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[582.845,24.789,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[583.419,24.847,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[583.978,24.93,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[584.519,25.038,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.04,25.172,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[585.544,25.317,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.029,25.469,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.491,25.632,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[586.928,25.807,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.336,25.994,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[587.715,26.195,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.061,26.411,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.373,26.643,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.65,26.891,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.89,27.156,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.095,27.439,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.262,27.738,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.393,28.054,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.488,28.387,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.547,28.736,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.573,29.101,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.566,29.48,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.528,29.873,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.462,30.278,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.37,30.695,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.255,31.12,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[589.12,31.554,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.969,31.994,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.806,32.437,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[588.635,32.882,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"414","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":46,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[640.884,150.101,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.371,149.48,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.88,148.84,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.411,148.187,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.965,147.524,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.541,146.854,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.144,146.176,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.773,145.493,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.431,144.808,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.117,144.123,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.834,143.44,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.58,142.762,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.358,142.091,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.166,141.43,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.006,140.781,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.877,140.147,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.778,139.53,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.711,138.934,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.674,138.36,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.667,137.812,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.689,137.291,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.739,136.801,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.818,136.345,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.923,135.923,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.054,135.54,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.21,135.197,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.39,134.896,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.592,134.64,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.816,134.431,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.059,134.27,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.322,134.16,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.898,134.098,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.208,134.148,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.532,134.256,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.871,134.395,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.225,134.548,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.591,134.716,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.968,134.9,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.352,135.103,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.74,135.324,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.131,135.566,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.522,135.829,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.912,136.113,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.297,136.419,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.678,136.748,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.051,137.098,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.415,137.471,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.77,137.866,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.114,138.281,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.445,138.718,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.764,139.174,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.069,139.648,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.361,140.14,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.638,140.648,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.9,141.17,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.148,141.704,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.381,142.249,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.601,142.802,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.807,143.362,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.001,143.924,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.182,144.487,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.354,145.048,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.516,145.603,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.67,146.15,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.8,146.686,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.893,147.208,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.948,147.714,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.967,148.202,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.949,148.668,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.895,149.111,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.806,149.529,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.682,149.918,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.525,150.276,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.335,150.602,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.113,150.894,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.861,151.148,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.579,151.365,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.27,151.541,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.933,151.675,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.571,151.765,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.185,151.812,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.776,151.812,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.346,151.766,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.897,151.673,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.43,151.532,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.946,151.342,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.448,151.104,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.937,150.818,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.415,150.483,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.884,150.101,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"369","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":47,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[610.865,248.89,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.769,248.619,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.704,248.385,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.672,248.188,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.671,248.025,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.703,247.886,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.856,247.678,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.294,247.55,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.706,247.586,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.202,247.718,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.768,247.94,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.074,248.083,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.392,248.247,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.723,248.43,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.064,248.631,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.413,248.848,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.77,249.082,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.133,249.329,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.5,249.589,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.871,249.86,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.243,250.141,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.616,250.429,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.989,250.723,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.361,251.021,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.73,251.321,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.095,251.622,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.456,251.921,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.812,252.216,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.162,252.508,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.502,252.804,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.831,253.103,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.149,253.403,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.454,253.702,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.744,254,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.018,254.294,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.276,254.583,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.516,254.867,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.737,255.143,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.939,255.41,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.119,255.666,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.278,255.911,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.415,256.142,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.528,256.359,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.617,256.56,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.682,256.743,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.722,256.909,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.736,257.055,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.687,257.284,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.102,257.455,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.686,257.349,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.171,257.139,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.875,257.001,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.553,256.851,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.206,256.688,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.84,256.511,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.456,256.32,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.057,256.114,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.647,255.892,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.228,255.655,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.802,255.4,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.372,255.13,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.938,254.844,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.505,254.542,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.072,254.225,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.642,253.893,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.216,253.548,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.796,253.19,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.382,252.821,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.977,252.443,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.581,252.055,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.195,251.661,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.821,251.262,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.459,250.86,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.11,250.458,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.776,250.057,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.456,249.66,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.152,249.27,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[610.865,248.89,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"410","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":48,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[617.679,171.492,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.018,171.893,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.352,172.284,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.677,172.663,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.995,173.031,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.303,173.386,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.6,173.727,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.886,174.055,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.159,174.368,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.418,174.665,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.662,174.946,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.892,175.21,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.105,175.457,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.301,175.686,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.48,175.896,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.642,176.087,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.785,176.258,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.909,176.409,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.014,176.539,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.099,176.648,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.211,176.8,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.069,176.708,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.976,176.609,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.865,176.486,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.735,176.339,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.586,176.168,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.42,175.972,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.236,175.757,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.028,175.556,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.797,175.371,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.548,175.203,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.284,175.048,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.007,174.907,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.72,174.778,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.427,174.658,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.128,174.548,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.828,174.444,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.527,174.347,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.228,174.255,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.932,174.165,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.642,174.077,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.36,173.989,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.085,173.9,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.821,173.807,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.569,173.71,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.329,173.607,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.104,173.495,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.893,173.375,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.699,173.243,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.522,173.098,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.364,172.939,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.224,172.764,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.105,172.57,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.007,172.357,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.931,172.122,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.878,171.864,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.849,171.58,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.843,171.276,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.857,170.987,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.888,170.718,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.935,170.47,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.997,170.243,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.072,170.039,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.16,169.856,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.26,169.696,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.369,169.56,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.487,169.446,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.743,169.29,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.301,169.266,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.582,169.4,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.719,169.504,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.852,169.631,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.981,169.783,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.103,169.958,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.219,170.157,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.328,170.379,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.429,170.624,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.521,170.892,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.605,171.181,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.679,171.492,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"368","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":49,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[613.335,474.276,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.113,473.795,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.912,473.24,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.728,472.662,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.559,472.08,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.406,471.496,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.27,470.912,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.15,470.328,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.049,469.746,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.966,469.166,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.901,468.589,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.856,468.017,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.83,467.448,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.824,466.885,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.837,466.327,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.871,465.775,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.925,465.229,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[611.999,464.69,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.093,464.156,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.207,463.628,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.342,463.106,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.497,462.59,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.672,462.078,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[612.867,461.572,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.082,461.069,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.316,460.57,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.571,460.073,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.844,459.578,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.138,459.084,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.45,458.59,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.782,458.093,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.132,457.594,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.502,457.092,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.887,456.611,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.285,456.164,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.695,455.75,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.113,455.372,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.538,455.031,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.967,454.727,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.4,454.461,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.832,454.234,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.262,454.047,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.687,453.9,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.106,453.792,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.516,453.725,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.915,453.699,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.299,453.712,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.668,453.766,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.019,453.86,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.35,453.993,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.942,454.375,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.2,454.623,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.43,454.907,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.63,455.226,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.799,455.581,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.936,455.968,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.038,456.388,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.106,456.839,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.138,457.318,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.133,457.825,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.09,458.358,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.011,458.916,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.908,459.511,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.785,460.143,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.643,460.809,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.479,461.504,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.293,462.222,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.084,462.959,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.853,463.711,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.598,464.472,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.32,465.237,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.018,466.003,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.691,466.763,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.342,467.514,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.969,468.251,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.573,468.968,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.155,469.662,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.715,470.327,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.255,470.958,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.776,471.55,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.279,472.1,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.766,472.601,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.238,473.049,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.698,473.439,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.147,473.765,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.589,474.024,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.026,474.209,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.46,474.317,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.895,474.341,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1437","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":50,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[489.552,647.715,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.759,646.978,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.983,646.251,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.224,645.54,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.482,644.846,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.756,644.173,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.046,643.523,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.349,642.899,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.665,642.303,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.993,641.737,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.33,641.203,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.676,640.703,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[493.028,640.238,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[493.384,639.811,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[493.742,639.421,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[494.101,639.07,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[494.458,638.76,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[494.81,638.49,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.156,638.262,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.492,638.075,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.818,637.931,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.129,637.829,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.424,637.768,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.701,637.75,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.188,637.837,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.573,638.086,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.838,638.489,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.966,639.038,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.99,639.37,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.007,639.748,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.016,640.167,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.017,640.625,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.009,641.118,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.992,641.644,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.965,642.198,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.927,642.777,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.878,643.379,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.818,643.998,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.745,644.632,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.66,645.277,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.562,645.93,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.451,646.586,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.327,647.241,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.19,647.892,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.04,648.535,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.878,649.165,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.703,649.779,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.516,650.373,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.319,650.942,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.112,651.482,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.897,651.988,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.674,652.458,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.446,652.885,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[495.214,653.265,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[494.749,653.869,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[494.298,654.233,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[493.862,654.408,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[493.427,654.475,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.996,654.432,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.573,654.282,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[492.161,654.029,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.764,653.676,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.385,653.229,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[491.029,652.696,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.699,652.082,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.546,651.748,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.4,651.398,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.264,651.032,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.136,650.652,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[490.019,650.259,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.912,649.855,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.815,649.441,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.731,649.018,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.658,648.589,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[489.599,648.154,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1591","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":51,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[635.656,498.061,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.015,497.919,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.403,497.772,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.819,497.622,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.258,497.468,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.718,497.314,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.196,497.159,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.689,497.006,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.193,496.854,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.707,496.704,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.228,496.558,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.752,496.415,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.278,496.277,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.804,496.142,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.325,496.012,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.842,495.886,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.351,495.765,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.851,495.649,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.34,495.537,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.816,495.428,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.278,495.324,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.724,495.222,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.154,495.123,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.567,495.027,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.96,494.932,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.335,494.838,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.691,494.744,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.027,494.649,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.636,494.458,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.126,494.292,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.766,494.035,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.291,494.059,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.646,494.199,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.09,494.331,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.446,494.492,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.094,494.583,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.725,494.679,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.339,494.781,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.939,494.889,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.526,495.001,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.102,495.118,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.669,495.238,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.228,495.362,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.785,495.488,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.354,495.611,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.935,495.732,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.527,495.85,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.13,495.966,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.744,496.081,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.369,496.194,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.004,496.306,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.65,496.417,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.305,496.527,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.971,496.636,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.331,496.85,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.729,497.06,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.162,497.265,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.629,497.464,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.125,497.654,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.645,497.834,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.182,497.999,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.729,498.145,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.273,498.27,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1303","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":52,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[631.205,586.111,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.568,585.803,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.136,585.243,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.49,584.763,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.622,584.203,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.092,583.772,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.553,583.696,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.223,583.693,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.855,583.712,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.453,583.754,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.019,583.818,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.556,583.904,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.068,584.011,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.558,584.14,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.028,584.288,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.482,584.456,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.925,584.643,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.358,584.848,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.785,585.07,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.211,585.309,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.638,585.563,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.072,585.83,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.53,586.099,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.015,586.369,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.526,586.638,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.063,586.906,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.626,587.174,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.215,587.441,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.829,587.706,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.469,587.97,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.134,588.233,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.537,588.75,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.036,589.255,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.629,589.744,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.31,590.213,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.073,590.656,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.91,591.07,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.786,591.619,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.775,592.184,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.294,592.471,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.781,592.376,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.079,592.294,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.41,592.192,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.772,592.069,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.163,591.926,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.581,591.765,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.024,591.585,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.49,591.389,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.976,591.177,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.48,590.95,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623,590.709,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.534,590.455,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.079,590.189,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.635,589.912,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.197,589.625,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.765,589.329,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.335,589.026,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.907,588.716,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.479,588.399,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.047,588.079,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.612,587.754,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.17,587.426,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.72,587.097,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.262,586.766,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.419607847929,0.611764729023,0.407843142748,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1598","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":53,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[565.745,638.828,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[565.047,639.051,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[564.394,639.274,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[563.785,639.495,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[563.219,639.715,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.696,639.935,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.215,640.152,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.775,640.369,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.376,640.583,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.017,640.796,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.697,641.007,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.172,641.422,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.652,642.024,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.423,642.592,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.44,643.114,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[559.742,643.708,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.205,644.136,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[560.715,644.306,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.197,644.34,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.475,644.333,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[561.777,644.312,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.099,644.276,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.44,644.226,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[562.798,644.162,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[563.17,644.085,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[563.554,643.996,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[563.948,643.894,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[564.35,643.781,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[564.757,643.657,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[565.167,643.524,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[565.576,643.382,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[565.984,643.231,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[566.386,643.074,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[566.782,642.909,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[567.168,642.739,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[567.542,642.564,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[567.903,642.385,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[568.247,642.203,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[568.573,642.02,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[568.878,641.834,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.421,641.464,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.862,641.098,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.413,640.579,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.938,639.947,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[571.101,639.389,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.665,638.836,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.281,638.674,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.781,638.553,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.491,638.51,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.177,638.479,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[568.841,638.461,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[568.484,638.456,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[568.111,638.465,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[567.725,638.489,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[567.329,638.528,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[566.928,638.581,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[566.525,638.65,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[566.127,638.735,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1554","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":54,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[187.525,654.877,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.382,654.303,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.384,653.699,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.499,653.063,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.33,653.088,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.208,653.376,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.063,653.7,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.894,654.044,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.8,654.218,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.701,654.392,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.595,654.564,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.483,654.734,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.365,654.899,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.24,655.059,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.11,655.214,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.974,655.363,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.833,655.505,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.686,655.641,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.534,655.769,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.378,655.889,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.218,656.002,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.055,656.107,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.889,656.204,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.721,656.293,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.553,656.374,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.384,656.448,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.218,656.513,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.06,656.568,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.92,656.609,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.799,656.637,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.696,656.652,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.545,656.646,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.691,656.269,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.792,656.197,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.909,656.122,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.044,656.046,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.195,655.969,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.362,655.892,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.544,655.816,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.741,655.741,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.953,655.669,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.178,655.6,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.416,655.535,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.666,655.473,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.927,655.416,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.199,655.364,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.481,655.317,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.771,655.275,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.069,655.239,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.373,655.207,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.684,655.181,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1681","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":55,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[114.044,628.654,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[113.896,628.947,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[113.714,629.277,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[113.501,629.638,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[113.261,630.027,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[112.996,630.437,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[112.711,630.864,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[112.406,631.305,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[112.086,631.754,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111.754,632.209,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111.411,632.665,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111.06,633.12,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.703,633.571,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.344,634.014,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.982,634.448,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.622,634.87,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.264,635.278,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.909,635.67,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.56,636.044,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.218,636.399,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[107.884,636.734,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[107.558,637.046,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[107.242,637.335,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.937,637.6,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.642,637.839,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.358,638.052,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.086,638.237,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.825,638.395,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.577,638.523,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.344,638.621,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.129,638.687,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.931,638.722,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.751,638.726,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.59,638.701,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.447,638.646,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.324,638.562,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.22,638.45,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.136,638.311,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.072,638.147,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[103.998,637.512,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.047,636.984,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.101,636.693,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.173,636.386,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.265,636.066,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.374,635.733,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.501,635.39,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.645,635.038,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.806,634.679,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.984,634.314,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.176,633.947,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.384,633.577,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.606,633.208,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.841,632.841,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.088,632.477,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.347,632.119,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.613,631.769,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.869,631.435,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[107.117,631.114,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[107.355,630.808,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[107.586,630.516,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[107.808,630.237,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.023,629.97,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.232,629.715,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.435,629.473,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.632,629.242,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.825,629.023,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.015,628.816,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.202,628.622,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.388,628.439,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.573,628.269,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.758,628.113,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.945,627.97,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.135,627.842,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.33,627.729,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.529,627.633,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.735,627.554,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.949,627.494,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111.173,627.455,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111.407,627.439,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111.654,627.446,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111.915,627.479,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[112.192,627.54,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[112.485,627.632,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[112.798,627.757,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[113.131,627.917,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[113.472,628.119,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[113.777,628.365,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[114.044,628.654,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1683","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":56,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[214.889,632.132,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.55,632.487,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.231,632.815,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.935,633.115,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.66,633.386,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.408,633.628,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.178,633.839,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.972,634.02,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.789,634.169,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.63,634.287,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.496,634.372,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.299,634.448,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.295,633.924,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.487,633.51,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.619,633.262,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.775,632.988,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[212.953,632.689,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.155,632.366,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.379,632.02,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.625,631.652,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[213.892,631.267,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.169,630.885,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.451,630.511,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.735,630.145,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.021,629.786,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.306,629.437,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.588,629.096,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.866,628.765,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.139,628.443,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.406,628.13,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.666,627.828,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.918,627.537,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.162,627.256,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.397,626.986,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.624,626.727,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.843,626.481,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.054,626.248,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.257,626.027,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.453,625.821,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.644,625.629,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.829,625.452,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.011,625.292,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.19,625.15,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.369,625.027,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.548,624.924,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.73,624.842,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.916,624.784,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.109,624.751,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.311,624.745,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.525,624.768,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.749,624.823,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.949,624.908,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.12,625.022,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.26,625.162,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.452,625.516,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.527,625.951,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.49,626.452,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.347,627,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.237,627.287,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[221.103,627.58,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.946,627.876,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.766,628.173,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.564,628.471,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.343,628.766,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[220.101,629.058,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.842,629.344,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.565,629.622,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[219.272,629.892,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.963,630.152,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.641,630.401,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[218.306,630.638,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.959,630.862,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.602,631.072,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[217.234,631.267,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.859,631.448,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.476,631.614,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[216.086,631.765,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.691,631.903,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[215.292,632.026,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[214.889,632.132,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1675","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":57,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[258.984,627.393,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.244,627.105,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.504,626.813,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.762,626.519,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.015,626.225,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.263,625.934,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.502,625.647,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.733,625.367,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.952,625.095,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.16,624.831,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.356,624.579,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.538,624.337,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.707,624.108,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.861,623.893,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.001,623.691,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.239,623.331,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.496,622.907,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.737,622.51,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.529,623.079,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.342,623.419,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.109,623.823,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.977,624.047,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.836,624.282,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.687,624.529,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.53,624.785,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.367,625.049,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.199,625.32,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[261.027,625.595,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.85,625.874,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.671,626.156,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.491,626.437,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.31,626.718,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.13,626.995,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.951,627.269,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.774,627.536,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.601,627.797,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.432,628.049,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.267,628.291,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[259.109,628.522,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.958,628.74,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.816,628.955,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.565,629.389,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.357,629.822,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.126,630.447,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.988,631.01,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.934,631.586,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.176,631.632,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.354,631.053,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.421,630.764,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.491,630.42,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.565,630.018,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.642,629.555,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.724,629.051,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.81,628.521,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.897,627.967,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1677","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":58,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[420.402,620.794,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[420.018,621.345,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[419.636,621.903,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[419.257,622.466,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[418.884,623.033,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[418.516,623.601,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[418.156,624.169,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[417.806,624.734,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[417.466,625.294,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[417.138,625.848,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[416.823,626.392,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[416.524,626.925,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[416.24,627.445,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.975,627.948,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.728,628.433,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.502,628.897,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.298,629.338,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.116,629.753,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[414.959,630.14,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[414.828,630.497,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[414.646,631.111,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[414.578,631.576,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[414.79,632.168,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.194,632.286,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.483,632.244,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[415.831,632.139,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[416.239,631.971,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[416.464,631.863,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[416.703,631.739,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[416.954,631.598,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[417.218,631.441,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[417.493,631.265,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[417.779,631.071,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[418.074,630.857,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[418.378,630.622,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[418.688,630.365,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[419.005,630.085,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[419.326,629.779,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[419.65,629.446,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[419.976,629.085,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[420.301,628.692,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[420.625,628.265,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[420.944,627.803,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[421.26,627.312,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[421.57,626.81,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[421.873,626.298,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[422.169,625.78,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[422.454,625.259,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[422.728,624.738,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[422.989,624.22,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.235,623.707,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.465,623.204,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.678,622.711,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.871,622.234,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.044,621.773,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.196,621.332,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.324,620.913,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.429,620.519,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.509,620.152,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.562,619.815,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.589,619.236,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.417,618.636,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[424.157,618.43,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.781,618.39,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.55,618.433,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.291,618.518,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[423.005,618.646,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[422.693,618.815,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[422.356,619.025,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[421.996,619.273,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[421.613,619.561,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[421.21,619.887,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[420.787,620.252,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1673","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":59,"ty":4,"nm":".dot2","cl":"dot2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[465.696,656.832,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.843,656.419,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.046,655.905,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.311,655.299,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.467,654.964,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.638,654.609,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.826,654.235,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.029,653.841,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.248,653.429,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.481,652.999,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.727,652.55,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.987,652.084,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.258,651.599,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.54,651.097,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.832,650.575,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.131,650.036,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.435,649.485,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.743,648.926,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.054,648.359,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.366,647.79,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.678,647.218,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.988,646.648,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.295,646.082,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.597,645.523,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.894,644.973,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.182,644.435,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.462,643.913,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.732,643.408,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.99,642.924,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[473.235,642.463,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[473.465,642.028,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[473.68,641.622,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[473.878,641.247,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[474.057,640.905,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[474.357,640.331,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[474.646,639.776,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[474.34,640.338,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[474.023,640.852,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[473.624,641.473,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[473.396,641.826,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[473.15,642.208,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.888,642.62,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.61,643.061,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.319,643.532,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.015,644.03,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.7,644.556,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.376,645.108,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.044,645.685,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.707,646.285,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.365,646.905,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.022,647.543,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.679,648.195,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.339,648.86,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.004,649.532,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.677,650.208,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.359,650.882,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.055,651.551,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.768,652.208,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.499,652.848,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.253,653.464,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.033,654.05,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.842,654.597,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.685,655.099,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.551,655.551,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.392,655.97,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.205,656.356,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.992,656.708,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.753,657.026,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215707779,0.839215695858,0.615686297417,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1671","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":60,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[640.676,188.45,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.691,188.261,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.725,188.063,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.777,187.858,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.847,187.646,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.933,187.431,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.036,187.212,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.154,186.994,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.288,186.777,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.436,186.563,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.598,186.355,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.773,186.156,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.961,185.966,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.161,185.79,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.373,185.628,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.595,185.484,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.828,185.36,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.323,185.179,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.854,185.105,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.416,185.152,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.988,185.264,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.512,185.249,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.988,185.136,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.425,184.963,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.63,184.866,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.828,184.767,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.019,184.669,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.386,184.492,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.911,184.309,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.434,184.269,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.99,184.385,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.399,184.542,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.62,184.638,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.854,184.744,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.103,184.855,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.37,184.967,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.655,185.077,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.963,185.179,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.593,185.36,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.862,185.453,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.095,185.55,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.291,185.651,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.451,185.755,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.573,185.862,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.658,185.973,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.704,186.087,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.713,186.203,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.683,186.323,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.615,186.444,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.508,186.568,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.364,186.694,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[652.183,186.82,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.964,186.948,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.708,187.075,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.417,187.203,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[651.09,187.329,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.729,187.454,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[650.335,187.577,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.907,187.698,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[649.449,187.814,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.961,187.927,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[648.444,188.034,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.9,188.136,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[647.331,188.231,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.738,188.319,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[646.123,188.399,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[645.488,188.469,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.835,188.529,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.169,188.575,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.49,188.607,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.8,188.626,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.101,188.635,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.393,188.635,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.679,188.629,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"329","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":61,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[613.736,119.525,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.988,119.068,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.227,118.563,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.456,118.019,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.679,117.441,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.896,116.835,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.111,116.208,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.325,115.565,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.541,114.911,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.761,114.251,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.987,113.59,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.221,112.93,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.463,112.276,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.717,111.632,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.982,110.999,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.262,110.38,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.557,109.778,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.869,109.192,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.198,108.625,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.546,108.077,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.914,107.547,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.303,107.035,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.713,106.54,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.146,106.059,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.589,105.6,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.034,105.166,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.477,104.761,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.917,104.384,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.352,104.037,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.781,103.72,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.201,103.434,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.611,103.181,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.008,102.96,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.392,102.772,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.76,102.617,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.111,102.497,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.442,102.41,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.041,102.338,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.545,102.401,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.758,102.484,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.943,102.599,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.099,102.747,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.224,102.928,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.319,103.14,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.382,103.383,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.412,103.657,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.409,103.959,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.372,104.291,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.301,104.65,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.195,105.035,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.055,105.446,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.881,105.881,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.682,106.313,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.464,106.728,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.226,107.126,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.968,107.508,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.688,107.875,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.387,108.228,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.065,108.569,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.723,108.9,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.361,109.22,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.979,109.534,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.58,109.84,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.164,110.143,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.732,110.443,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.288,110.742,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.833,111.042,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.369,111.345,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.899,111.653,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.425,111.969,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.951,112.294,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.479,112.63,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.013,112.98,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.557,113.347,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[618.114,113.732,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.688,114.138,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[617.284,114.566,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.905,115.021,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.557,115.504,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[616.244,116.017,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.971,116.564,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.743,117.145,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.517,117.697,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[615.267,118.176,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.995,118.585,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.704,118.923,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.395,119.192,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[614.072,119.392,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[613.736,119.525,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"411","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":62,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[622.845,154.534,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.152,153.788,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.483,153.094,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.834,152.451,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.205,151.862,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.593,151.329,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.996,150.853,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.413,150.434,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.841,150.075,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.278,149.776,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.721,149.539,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.17,149.363,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.621,149.25,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.073,149.201,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.523,149.215,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.969,149.292,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.408,149.434,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.84,149.64,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.261,149.911,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.67,150.245,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.065,150.642,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.443,151.103,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.803,151.627,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.148,152.192,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.485,152.765,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.81,153.344,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.122,153.926,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.417,154.512,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.695,155.1,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.953,155.689,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.19,156.278,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.405,156.867,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.597,157.455,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.766,158.042,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.91,158.626,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.03,159.207,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.126,159.785,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.199,160.36,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.249,160.932,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.277,161.5,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.284,162.064,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.271,162.624,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.241,163.181,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.194,163.733,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.134,164.283,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.062,164.829,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.981,165.372,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.894,165.913,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.803,166.451,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.712,166.988,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.624,167.523,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.544,168.058,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.474,168.593,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.398,169.109,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.287,169.573,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.139,169.984,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.958,170.342,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.746,170.645,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.503,170.894,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.232,171.088,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.936,171.227,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.617,171.312,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.276,171.342,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.916,171.318,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.539,171.24,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.148,171.109,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.746,170.926,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.334,170.691,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.915,170.406,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.491,170.071,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.064,169.687,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.638,169.257,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.214,168.78,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.793,168.259,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.38,167.696,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.974,167.091,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.579,166.447,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.195,165.766,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.825,165.05,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.471,164.3,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.133,163.519,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.813,162.709,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.511,161.872,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.227,161.013,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.96,160.135,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.711,159.239,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.484,158.325,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.282,157.396,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.106,156.453,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.96,155.498,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.845,154.534,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"328","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":63,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[548.335,42.454,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.471,42.827,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.591,43.213,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.696,43.609,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.786,44.015,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.86,44.429,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.92,44.849,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.965,45.275,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.996,45.706,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.013,46.14,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.018,46.576,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[549.01,47.014,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.991,47.453,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.962,47.892,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.922,48.329,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.874,48.765,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.819,49.198,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.756,49.629,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.689,50.055,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.617,50.478,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.542,50.896,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.466,51.309,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.388,51.715,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.302,52.106,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.208,52.481,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[548.105,52.838,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.995,53.176,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.877,53.493,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.753,53.789,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.623,54.062,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.488,54.312,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.348,54.538,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.205,54.739,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.058,54.914,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[546.91,55.063,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[546.76,55.186,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[546.609,55.281,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[546.459,55.349,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[546.019,55.386,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.879,55.342,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.744,55.271,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.615,55.172,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.492,55.045,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.376,54.891,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.268,54.71,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.169,54.504,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.08,54.271,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.001,54.014,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.933,53.733,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.876,53.428,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.825,53.105,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.756,52.776,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.667,52.442,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.562,52.102,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.445,51.757,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.319,51.404,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.187,51.045,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.051,50.679,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.915,50.306,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.781,49.927,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.651,49.542,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.529,49.152,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.416,48.757,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.316,48.359,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.229,47.959,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.159,47.559,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.107,47.159,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.075,46.762,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.065,46.369,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.078,45.983,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.117,45.605,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.182,45.238,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.275,44.884,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.397,44.547,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.549,44.228,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.732,43.931,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.948,43.658,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.197,43.413,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.479,43.2,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[544.796,43.021,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.144,42.877,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.507,42.753,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[545.882,42.649,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[546.269,42.566,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[546.667,42.502,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.073,42.459,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.488,42.436,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[547.909,42.434,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"330","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":64,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[497.037,46.056,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.981,45.887,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.951,45.727,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.947,45.575,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.967,45.433,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.011,45.3,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.079,45.177,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.17,45.065,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.282,44.963,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.416,44.872,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.569,44.793,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.741,44.725,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.931,44.668,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.137,44.624,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.359,44.591,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.845,44.563,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.106,44.567,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.378,44.584,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.659,44.613,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.949,44.654,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.242,44.708,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.497,44.781,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.704,44.874,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.867,44.983,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.987,45.108,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.068,45.245,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.113,45.393,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.123,45.551,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.102,45.716,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[501.053,45.887,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.978,46.062,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.88,46.24,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.761,46.42,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.625,46.601,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.472,46.78,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.307,46.958,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[500.132,47.134,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.949,47.306,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.761,47.473,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.571,47.636,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.38,47.793,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.193,47.943,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[499.011,48.087,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.837,48.224,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.674,48.353,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.524,48.475,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.391,48.589,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.277,48.695,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.186,48.792,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.119,48.882,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.079,48.964,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[498.04,49.035,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.996,49.095,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.949,49.145,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.897,49.184,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.786,49.229,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.549,49.196,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.49,49.163,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.433,49.121,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.378,49.069,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.325,49.01,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.274,48.942,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.227,48.866,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.183,48.783,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.143,48.693,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.106,48.596,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.074,48.494,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.046,48.386,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.022,48.272,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.002,48.155,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.987,48.033,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.976,47.908,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.968,47.78,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.965,47.649,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.965,47.516,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.968,47.382,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.974,47.246,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.981,47.107,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.988,46.966,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[496.995,46.823,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.002,46.683,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.009,46.546,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.016,46.413,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.023,46.286,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.03,46.167,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[497.037,46.056,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"29","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":65,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[629.73,209.675,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.763,210.028,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.767,210.404,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.744,210.803,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.694,211.222,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.622,211.66,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.528,212.115,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.415,212.586,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.285,213.072,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.139,213.57,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.98,214.079,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.811,214.598,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.633,215.124,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.449,215.656,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.26,216.191,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.07,216.729,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.881,217.265,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.695,217.799,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.516,218.328,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.344,218.85,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.184,219.362,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.028,219.862,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.87,220.349,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.71,220.821,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.548,221.277,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.385,221.714,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.222,222.131,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.059,222.527,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.897,222.9,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.738,223.248,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.58,223.571,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.426,223.866,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.276,224.133,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.131,224.371,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.992,224.577,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.859,224.753,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.733,224.896,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.508,225.082,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.13,224.938,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.092,224.803,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.069,224.632,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.06,224.426,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.067,224.185,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.089,223.91,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.128,223.6,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.183,223.258,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.243,222.887,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.301,222.491,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.357,222.07,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.412,221.627,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.468,221.163,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.526,220.679,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.587,220.178,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.651,219.661,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.721,219.13,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.796,218.587,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.878,218.034,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.969,217.473,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.067,216.907,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.176,216.338,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.295,215.768,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.425,215.202,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.566,214.64,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.72,214.087,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.887,213.545,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.067,213.018,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.261,212.51,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.469,212.024,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.692,211.564,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.928,211.135,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.18,210.74,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.445,210.384,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.726,210.073,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.02,209.811,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.328,209.603,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.649,209.455,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.211,209.278,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.817,209.269,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.86,209.424,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.816,209.538,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"532","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":66,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[621.553,542.61,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.405,543.046,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.266,543.47,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.138,543.88,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.02,544.274,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.915,544.649,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.823,545.004,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.744,545.336,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.68,545.643,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.6,546.175,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.59,546.585,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.185,546.9,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.276,546.404,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.287,545.955,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.351,545.591,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.468,545.199,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.641,544.808,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.011,544.303,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.481,543.963,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.074,543.466,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.466,543.056,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.796,542.635,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.116,542.096,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.27,541.633,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.651,541.163,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.198,541.321,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.626,541.613,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.186,541.869,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1440","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":67,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[658.553,541.954,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.241,542.767,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.927,543.583,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.613,544.397,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.302,545.203,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.998,545.996,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.701,546.774,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.415,547.531,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.142,548.265,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.884,548.973,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.641,549.653,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.415,550.303,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.208,550.922,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.021,551.51,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.853,552.065,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.706,552.589,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.58,553.082,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.475,553.546,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.39,553.983,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.326,554.393,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.282,554.764,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.258,555.094,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.27,555.631,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[654.428,556.12,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.022,556.11,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.538,555.637,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[655.931,555.145,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.139,554.851,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.354,554.525,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.573,554.17,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[656.797,553.788,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.023,553.381,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.25,552.949,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.479,552.496,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.706,552.022,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[657.932,551.53,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.156,551.021,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.376,550.498,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.591,549.963,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.797,549.419,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.973,548.873,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.118,548.33,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.233,547.792,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.32,547.263,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.38,546.744,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.414,546.237,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.425,545.744,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.415,545.267,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.384,544.806,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.336,544.363,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.273,543.938,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.196,543.532,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.108,543.145,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[659.012,542.777,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.91,542.427,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.805,542.096,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.699,541.782,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.595,541.485,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.497,541.205,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.326,540.686,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.212,540.216,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.18,539.78,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.256,539.364,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.469,538.952,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.946,539.382,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.907,539.765,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.847,540.217,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.767,540.736,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.668,541.316,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[658.553,541.954,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1436","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":68,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[636.494,440.925,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.753,441.191,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.335,441.513,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.656,441.569,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.994,441.556,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.347,441.474,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.716,441.324,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.096,441.107,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.488,440.824,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.89,440.477,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.299,440.067,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.714,439.595,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.134,439.064,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.556,438.476,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.98,437.832,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.404,437.134,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.825,436.386,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.21,435.604,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.552,434.796,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.849,433.968,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.105,433.125,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.32,432.271,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.495,431.411,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.633,430.548,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.735,429.686,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.802,428.83,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.838,427.981,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.843,427.143,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.82,426.318,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.771,425.51,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.698,424.72,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.605,423.951,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.492,423.204,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.364,422.481,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.222,421.784,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[644.069,421.114,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.909,420.472,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.744,419.859,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.577,419.277,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.411,418.725,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.251,418.204,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[643.098,417.715,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.956,417.258,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.829,416.834,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.721,416.442,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.635,416.083,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.572,415.758,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.501,415.497,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[642.019,415.193,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.68,415.461,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.491,415.694,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.292,415.989,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[641.083,416.343,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.866,416.755,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.642,417.221,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.414,417.738,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[640.182,418.304,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.948,418.914,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.713,419.566,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.479,420.257,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.248,420.982,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[639.019,421.739,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.796,422.524,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.578,423.333,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.366,424.164,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[638.163,425.012,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.968,425.875,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.783,426.749,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.608,427.631,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.444,428.517,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.291,429.405,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.15,430.291,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[637.02,431.173,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.892,432.05,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.765,432.919,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.644,433.778,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.53,434.625,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.428,435.456,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.34,436.269,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.269,437.06,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.217,437.827,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.188,438.566,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.184,439.275,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.207,439.95,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[636.259,440.588,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1438","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":69,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[624.88,481.986,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.327,481.422,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.755,480.874,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.164,480.343,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.555,479.833,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.926,479.343,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.278,478.878,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.611,478.438,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.925,478.025,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.22,477.64,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.497,477.285,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.757,476.961,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629,476.668,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.227,476.408,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.639,475.989,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.16,475.624,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.605,475.986,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.56,476.419,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.504,476.688,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.425,476.99,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.325,477.322,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.204,477.683,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.064,478.071,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.905,478.482,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.729,478.914,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.536,479.365,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.328,479.832,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.107,480.312,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.873,480.802,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.628,481.299,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.373,481.801,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.11,482.304,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.84,482.805,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.565,483.302,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.287,483.791,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.006,484.27,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.724,484.736,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.443,485.186,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.164,485.617,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.877,486.03,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.571,486.429,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.251,486.812,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.919,487.179,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.578,487.53,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.232,487.865,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.883,488.182,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.533,488.481,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.186,488.761,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.845,489.021,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.51,489.261,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.186,489.479,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.577,489.847,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.033,490.117,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.572,490.28,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.064,490.305,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.794,489.883,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.855,489.458,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[619.937,489.189,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.056,488.881,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.21,488.534,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.4,488.15,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.624,487.735,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.88,487.293,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.168,486.827,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.485,486.338,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.829,485.831,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.2,485.307,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.596,484.77,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.015,484.223,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.454,483.668,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.913,483.109,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.389,482.547,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.88,481.986,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1312","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":70,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[580.44,619.428,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[580.227,619.861,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[580,620.306,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.76,620.759,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.506,621.219,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.242,621.682,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.968,622.145,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.686,622.605,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.397,623.059,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.103,623.503,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.805,623.935,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.505,624.351,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.205,624.748,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.906,625.122,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.609,625.47,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.317,625.789,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.028,626.076,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.735,626.333,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.44,626.56,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.144,626.76,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.847,626.932,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.55,627.08,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.256,627.202,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.963,627.302,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.39,627.433,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.836,627.481,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.309,627.45,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[571.813,627.345,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[571.353,627.17,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.935,626.929,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.392,626.449,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.959,625.836,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.735,625.358,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.564,624.828,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.472,624.243,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.47,623.929,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.496,623.603,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.549,623.267,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.629,622.923,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.736,622.572,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[569.868,622.217,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.024,621.86,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.203,621.502,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.404,621.146,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.627,620.793,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[570.869,620.445,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[571.129,620.105,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[571.407,619.773,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[571.7,619.453,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.008,619.144,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.329,618.85,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[572.661,618.572,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.003,618.311,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.354,618.069,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[573.713,617.847,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.076,617.646,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.444,617.467,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[574.815,617.312,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.187,617.181,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.558,617.075,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[575.928,616.994,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.295,616.94,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[576.657,616.912,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.015,616.91,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.37,616.932,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[577.718,616.98,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.058,617.051,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.387,617.147,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[578.705,617.266,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.008,617.408,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[579.567,617.76,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[580.054,618.199,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[580.463,618.72,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1637","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":71,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[141.769,643.428,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[141.865,643.349,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[141.979,643.256,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.109,643.149,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.255,643.028,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.413,642.895,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.584,642.751,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.765,642.597,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.955,642.434,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.152,642.262,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.355,642.083,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.562,641.897,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.772,641.706,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.982,641.509,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.192,641.309,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.405,641.101,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.622,640.886,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.841,640.666,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.061,640.44,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.282,640.209,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.503,639.975,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.723,639.739,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.94,639.501,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.154,639.264,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.364,639.027,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.568,638.792,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.766,638.561,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.956,638.335,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.138,638.115,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.31,637.902,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.471,637.698,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.62,637.504,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.757,637.321,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.881,637.151,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.989,636.995,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.083,636.854,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.22,636.622,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[148.113,636.445,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.981,636.538,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.856,636.649,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.72,636.784,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.642,636.863,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.556,636.95,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.46,637.047,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.354,637.153,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.235,637.27,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[147.104,637.398,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.96,637.537,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.803,637.689,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.632,637.852,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.449,638.027,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.254,638.214,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[146.046,638.414,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.829,638.625,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.601,638.849,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.366,639.083,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[145.124,639.328,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.878,639.583,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.629,639.847,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.38,640.118,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[144.134,640.397,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.894,640.681,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.662,640.969,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.442,641.258,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.236,641.547,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[143.04,641.818,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.854,642.072,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.677,642.306,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.512,642.52,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.359,642.715,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.218,642.89,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[142.091,643.044,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[141.977,643.178,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[141.879,643.29,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[141.796,643.382,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[141.68,643.501,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1682","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":72,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[93.816,623.805,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.16,623.677,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.475,623.548,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.757,623.419,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.007,623.29,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.222,623.164,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.401,623.041,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.543,622.923,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.647,622.811,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.658,622.452,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.555,622.392,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.408,622.347,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.218,622.318,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[95.013,622.26,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.804,622.161,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.59,622.025,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.369,621.857,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[94.141,621.661,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.904,621.441,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.658,621.203,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.402,620.949,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.136,620.684,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.859,620.412,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.571,620.135,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.272,619.858,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.962,619.583,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.64,619.314,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.307,619.052,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[90.965,618.802,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[90.612,618.566,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[90.25,618.345,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.879,618.143,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.501,617.962,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.117,617.802,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[88.727,617.668,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[88.333,617.559,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[87.938,617.477,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[87.541,617.425,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[87.146,617.404,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[86.754,617.414,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[86.367,617.456,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.988,617.533,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.619,617.643,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.264,617.779,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.928,617.934,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.61,618.108,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.312,618.3,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.035,618.509,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.781,618.733,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.549,618.97,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.342,619.22,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.159,619.48,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.003,619.75,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.873,620.027,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.77,620.31,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.695,620.597,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.632,621.177,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.686,621.754,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.758,622.037,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.86,622.313,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[82.992,622.583,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.154,622.843,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.346,623.092,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.568,623.329,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.819,623.553,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.099,623.762,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.406,623.955,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.741,624.13,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.103,624.288,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.49,624.426,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[85.902,624.544,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[86.337,624.652,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[86.795,624.749,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[87.272,624.832,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[87.768,624.897,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[88.28,624.941,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[88.807,624.961,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.345,624.954,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[89.894,624.919,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[90.45,624.854,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.012,624.758,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[91.577,624.63,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.142,624.471,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[92.705,624.279,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.264,624.057,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[93.816,623.805,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1684","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":73,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[206.153,627.891,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[205.689,627.417,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[205.221,626.951,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[204.75,626.495,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[204.275,626.053,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.798,625.628,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.319,625.221,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.839,624.835,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.357,624.474,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.876,624.138,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.396,623.83,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.916,623.552,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.438,623.305,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.962,623.093,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.489,622.915,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.022,622.772,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.567,622.663,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.125,622.588,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.699,622.546,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.288,622.538,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.896,622.563,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.523,622.62,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.171,622.709,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.84,622.828,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.533,622.976,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.25,623.152,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.992,623.356,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.76,623.584,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.555,623.836,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.379,624.11,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.23,624.405,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.111,624.717,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.022,625.046,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.962,625.39,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.933,625.747,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.935,626.114,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[193.967,626.489,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.03,626.871,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.124,627.258,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.248,627.646,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.403,628.035,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.588,628.422,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[194.802,628.805,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.045,629.183,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.317,629.552,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.613,629.931,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[195.93,630.333,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.267,630.753,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.621,631.184,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[196.993,631.621,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.381,632.058,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[197.783,632.49,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.198,632.912,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[198.624,633.321,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.059,633.714,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.502,634.086,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[199.951,634.435,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.405,634.759,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[200.86,635.056,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.316,635.324,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[201.769,635.561,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.219,635.767,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[202.662,635.942,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.096,636.084,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.519,636.194,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[203.928,636.273,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[204.32,636.322,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[204.693,636.34,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[205.044,636.331,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[205.369,636.294,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[205.666,636.233,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[205.932,636.15,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.163,636.046,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.356,635.925,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.507,635.79,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.626,635.619,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.806,635.101,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.867,634.761,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.909,634.37,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.932,633.934,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.936,633.455,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.921,632.938,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.887,632.387,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.835,631.804,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.765,631.196,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.676,630.564,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.571,629.914,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.448,629.249,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.309,628.574,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[206.153,627.891,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1676","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":74,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[538.451,674.289,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[538.018,674.885,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[538.189,675.491,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[538.708,676.103,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[539.058,676.478,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[539.455,676.865,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[539.888,677.243,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[540.345,677.593,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[540.815,677.897,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[541.285,678.143,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[541.74,678.318,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[542.165,678.413,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[542.544,678.421,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[542.987,678.263,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.269,677.737,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.331,677.169,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.293,676.498,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.215,676.012,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[543.099,675.508,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[542.948,674.999,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[542.764,674.497,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[542.552,674.014,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[542.189,673.353,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[541.786,672.798,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[541.358,672.383,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[540.921,672.132,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[540.395,672.064,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[539.943,672.303,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[539.499,672.847,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[539.147,673.436,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1638","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":75,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[472.549,630.853,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.682,630.347,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.748,629.891,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.703,629.276,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.464,628.708,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.024,628.184,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.635,627.899,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.179,627.671,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.929,627.581,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.667,627.506,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.392,627.447,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.108,627.403,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.816,627.376,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.516,627.365,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.212,627.369,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.905,627.389,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.596,627.425,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.288,627.475,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.981,627.54,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.679,627.618,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.382,627.711,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.092,627.816,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.812,627.933,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.543,628.062,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.287,628.202,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.045,628.352,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.61,628.677,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.25,629.032,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[464.88,629.596,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[464.766,630.172,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[464.892,630.767,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.23,631.381,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.556,631.793,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[465.949,632.2,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.394,632.59,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.632,632.775,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[466.877,632.952,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.127,633.117,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.38,633.269,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.633,633.405,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[467.884,633.524,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.13,633.622,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[468.596,633.746,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.007,633.754,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.467,633.495,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[469.911,633.093,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.251,632.822,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.613,632.556,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[470.984,632.297,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.355,632.051,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[471.713,631.821,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[472.05,631.609,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1425","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":76,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[630.572,266.837,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.953,266.85,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.331,266.869,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.709,266.894,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.093,266.924,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.485,266.959,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.891,266.997,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.314,267.037,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.758,267.078,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.227,267.119,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.725,267.159,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.256,267.197,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.809,267.229,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.381,267.257,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.974,267.282,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.593,267.306,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.239,267.331,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.624,267.383,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.145,267.448,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.604,267.677,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[620.857,267.918,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.407,268.096,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[621.916,268.194,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.51,268.259,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[622.83,268.273,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.161,268.272,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.497,268.253,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[623.834,268.215,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.168,268.154,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.52,268.083,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[624.901,268.009,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.31,267.933,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[625.743,267.856,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.197,267.777,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[626.67,267.697,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.158,267.616,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[627.659,267.534,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.17,267.453,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[628.687,267.372,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.206,267.291,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[629.726,267.212,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.243,267.133,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[630.753,267.057,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.254,266.982,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.742,266.909,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.215,266.839,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.67,266.772,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.103,266.707,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.513,266.646,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.896,266.589,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.251,266.535,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.865,266.441,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[635.34,266.364,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.892,266.403,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.325,266.49,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[634.002,266.537,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.654,266.585,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[633.284,266.634,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.894,266.681,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.487,266.725,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[632.065,266.767,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[631.629,266.803,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"654","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":77,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-2.204,519.466,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.565,519.345,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.879,519.241,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.147,519.156,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.368,519.088,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.542,519.037,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.671,519.002,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.755,518.982,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.795,518.977,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.794,518.986,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.754,519.007,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.677,519.038,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.561,519.081,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.401,519.138,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.197,519.209,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.951,519.293,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.663,519.391,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.335,519.5,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.97,519.622,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.568,519.754,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.133,519.897,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.668,520.05,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.174,520.212,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.346,520.382,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.887,520.559,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.447,520.743,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.023,520.931,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.61,521.124,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.206,521.32,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.807,521.518,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.409,521.717,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.008,521.916,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.601,522.114,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.184,522.309,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.753,522.501,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.304,522.689,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.834,522.871,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.339,523.047,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.816,523.215,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.261,523.374,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.671,523.524,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.043,523.663,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.37,523.798,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.645,523.935,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.871,524.073,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.049,524.212,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.181,524.349,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.268,524.483,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.313,524.614,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.316,524.74,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.281,524.86,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.207,524.973,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.097,525.079,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.953,525.175,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.776,525.263,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.568,525.34,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.332,525.407,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.068,525.463,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.779,525.507,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.468,525.538,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.135,525.557,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.784,525.563,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.417,525.556,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.036,525.535,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.644,525.5,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.244,525.452,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.838,525.389,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.43,525.312,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.023,525.221,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.62,525.116,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.224,524.996,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.84,524.863,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.457,524.711,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.059,524.536,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.649,524.338,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.23,524.119,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.805,523.881,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.377,523.626,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.95,523.355,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.526,523.069,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.108,522.771,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.699,522.462,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.301,522.143,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.083,521.817,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.451,521.486,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.801,521.15,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.13,520.811,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.436,520.472,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.719,520.134,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.975,519.798,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.204,519.466,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1688","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":78,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[29.955,468.393,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.479,468.815,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.024,469.221,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.585,469.609,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.16,469.975,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.743,470.318,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.333,470.634,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.923,470.922,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.512,471.178,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.095,471.399,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.667,471.584,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.218,471.74,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.721,471.894,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.176,472.046,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.586,472.194,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.952,472.334,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.277,472.464,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.561,472.583,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.806,472.687,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.015,472.776,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.189,472.847,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.329,472.9,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.438,472.933,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.516,472.944,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.566,472.934,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.562,472.768,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.514,472.666,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.446,472.541,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.359,472.394,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.255,472.225,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.136,472.035,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.003,471.824,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.859,471.594,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.706,471.346,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.544,471.081,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.377,470.802,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.207,470.51,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.035,470.207,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.863,469.896,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.688,469.575,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.49,469.241,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.267,468.894,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.022,468.536,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.756,468.168,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.472,467.794,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.17,467.415,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.854,467.033,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.524,466.651,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.184,466.27,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.834,465.893,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.477,465.522,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.116,465.16,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.751,464.807,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.386,464.468,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.022,464.142,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.661,463.834,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.305,463.544,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.956,463.274,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.616,463.027,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.286,462.804,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.969,462.606,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.666,462.436,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.379,462.293,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.108,462.181,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.856,462.098,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.624,462.048,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.412,462.03,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.221,462.044,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.054,462.092,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.907,462.17,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.775,462.272,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.659,462.399,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.558,462.552,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.476,462.732,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.411,462.94,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.366,463.175,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.341,463.439,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.337,463.731,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.356,464.049,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.398,464.394,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.464,464.765,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.556,465.158,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.674,465.574,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.818,466.01,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.99,466.463,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.189,466.931,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.416,467.41,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.671,467.899,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.955,468.393,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1689","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":79,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[43.951,532.325,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.74,532.088,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.511,531.823,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.267,531.53,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.011,531.211,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.745,530.866,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.473,530.497,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.196,530.105,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.918,529.693,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.64,529.261,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.366,528.813,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.089,528.349,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.81,527.87,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.529,527.379,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.246,526.877,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.962,526.366,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.678,525.849,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.396,525.328,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.117,524.804,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.841,524.282,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.57,523.762,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.305,523.247,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.048,522.74,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.801,522.242,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.564,521.758,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.339,521.288,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.129,520.835,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.933,520.402,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.755,519.991,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.595,519.604,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.455,519.244,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.337,518.912,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.242,518.611,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.171,518.342,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.126,518.107,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.12,517.748,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.161,517.627,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.233,517.546,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.336,517.508,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.472,517.509,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.632,517.531,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.811,517.569,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.006,517.628,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.214,517.708,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.433,517.812,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.662,517.941,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.897,518.097,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.139,518.279,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.385,518.49,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.634,518.728,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.887,518.994,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.142,519.287,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.398,519.607,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.657,519.952,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.917,520.32,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.179,520.711,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.443,521.123,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.709,521.552,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.977,521.996,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.248,522.453,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.522,522.919,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.799,523.39,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.079,523.865,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.363,524.337,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.651,524.803,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.942,525.26,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.237,525.701,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.535,526.122,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.836,526.518,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.136,526.886,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.404,527.257,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.632,527.635,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.824,528.017,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.979,528.399,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.1,528.78,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.188,529.155,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.245,529.522,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.273,529.878,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.273,530.22,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.248,530.545,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.198,530.85,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.126,531.133,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.033,531.391,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.922,531.622,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.794,531.824,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.65,531.994,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.492,532.131,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.322,532.232,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[44.142,532.298,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[43.951,532.325,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1357","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":80,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[297.778,57.224,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.782,56.922,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.827,56.629,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.917,56.348,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.051,56.079,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.233,55.823,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.462,55.583,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.74,55.36,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.07,55.153,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.451,54.966,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.878,54.776,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.34,54.572,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.832,54.359,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.346,54.137,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.878,53.91,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.421,53.681,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.972,53.45,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[303.526,53.222,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.079,52.997,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.628,52.776,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.17,52.563,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.701,52.358,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.22,52.163,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.724,51.979,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.212,51.806,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.681,51.647,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.131,51.501,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.561,51.369,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.968,51.253,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.354,51.153,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.717,51.069,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.057,51.001,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.373,50.951,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.665,50.917,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.934,50.901,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.178,50.902,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.398,50.92,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.594,50.956,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.765,51.009,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.912,51.079,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[312.021,51.169,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[312.085,51.282,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[312.106,51.416,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[312.083,51.57,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[312.019,51.743,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.915,51.934,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.773,52.141,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.593,52.363,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.378,52.599,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.131,52.847,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.852,53.105,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.545,53.373,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.211,53.647,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.853,53.927,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.473,54.211,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.074,54.497,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.658,54.784,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.228,55.07,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.786,55.353,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.334,55.632,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.875,55.904,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.413,56.17,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.948,56.426,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.483,56.672,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.021,56.907,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.563,57.128,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.113,57.335,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[303.671,57.527,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[303.239,57.703,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.82,57.862,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.412,58.002,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.011,58.123,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.62,58.225,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.24,58.309,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.87,58.374,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.513,58.422,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.17,58.451,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.841,58.462,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.528,58.456,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.234,58.433,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.959,58.393,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.706,58.337,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.476,58.266,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.272,58.18,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.096,58.079,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.95,57.965,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.838,57.838,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.762,57.7,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.724,57.55,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.728,57.391,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.778,57.224,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"22","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":81,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[40.669,194.084,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.908,193.737,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.128,193.387,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.329,193.038,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.509,192.69,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.669,192.347,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.807,192.011,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.922,191.685,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.013,191.372,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.08,191.073,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.122,190.787,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.139,190.514,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.131,190.256,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.098,190.014,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42.041,189.788,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.96,189.578,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.855,189.386,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.727,189.211,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.577,189.055,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.406,188.916,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.215,188.797,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.004,188.696,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.776,188.613,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.531,188.55,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.27,188.505,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.996,188.48,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.71,188.472,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.413,188.483,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.106,188.512,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.793,188.559,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.473,188.624,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.15,188.705,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.825,188.803,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.499,188.917,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.175,189.046,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.854,189.191,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.538,189.35,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.229,189.523,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.929,189.709,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.639,189.894,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.358,190.058,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.086,190.205,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.822,190.337,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.566,190.455,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.317,190.564,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.075,190.663,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.841,190.756,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.613,190.843,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.394,190.927,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.182,191.009,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.978,191.09,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.783,191.172,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.597,191.254,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.421,191.339,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.257,191.426,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.104,191.517,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.964,191.612,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.839,191.712,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.729,191.817,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.635,191.927,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.56,192.043,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.504,192.165,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.47,192.293,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.46,192.427,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.474,192.568,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.515,192.714,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.584,192.868,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.685,193.027,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.819,193.194,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.988,193.361,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.191,193.522,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.427,193.674,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.693,193.818,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.989,193.952,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.313,194.075,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.662,194.188,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.035,194.289,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.43,194.377,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.844,194.451,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.277,194.512,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.726,194.558,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.188,194.589,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.663,194.603,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.149,194.601,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.642,194.582,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.142,194.545,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.646,194.49,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.153,194.417,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.66,194.325,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.166,194.214,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.669,194.084,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"370","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":82,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[26.292,212.525,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.371,212.44,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.422,212.366,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.441,212.251,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.408,212.21,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.345,212.18,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.252,212.161,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.137,212.143,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.028,212.088,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.924,211.996,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.823,211.874,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.724,211.724,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.624,211.55,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.521,211.357,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.414,211.148,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.3,210.925,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.179,210.693,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.05,210.454,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.911,210.211,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.761,209.967,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.6,209.722,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.427,209.481,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.242,209.245,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.043,209.015,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.831,208.793,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.606,208.581,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.367,208.381,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.115,208.192,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.849,208.018,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.57,207.858,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.277,207.714,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.972,207.586,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.655,207.475,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.325,207.381,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.984,207.306,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.631,207.25,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.268,207.213,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.898,207.195,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.528,207.195,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.162,207.213,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.802,207.249,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.449,207.303,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.105,207.372,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.771,207.458,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.449,207.559,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.14,207.674,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.847,207.803,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.571,207.944,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.313,208.097,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.074,208.26,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.857,208.433,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.662,208.614,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.491,208.803,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.346,208.998,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.226,209.197,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.133,209.401,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.069,209.607,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.034,209.815,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.028,210.023,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.053,210.23,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.109,210.436,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.196,210.638,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.314,210.836,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.464,211.029,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.646,211.216,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.859,211.396,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.102,211.568,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.374,211.734,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.666,211.9,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.978,212.065,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.31,212.226,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.661,212.38,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.033,212.527,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.423,212.662,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.832,212.786,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.258,212.895,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.702,212.989,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.161,213.067,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[20.635,213.127,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.122,213.169,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.621,213.193,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.129,213.196,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[22.645,213.18,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.167,213.145,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.692,213.089,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.219,213.014,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.745,212.919,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.268,212.806,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.784,212.674,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.292,212.525,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"457","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":83,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[188.787,38.105,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[188.359,38.084,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.908,38.069,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.434,38.061,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.938,38.059,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.42,38.062,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.881,38.069,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.322,38.081,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.746,38.098,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.156,38.12,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.554,38.147,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.943,38.178,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.326,38.214,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.704,38.255,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.082,38.299,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.46,38.348,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.841,38.4,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.23,38.456,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.627,38.514,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.035,38.576,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.458,38.64,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[176.898,38.706,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[176.356,38.773,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[175.837,38.842,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[175.342,38.912,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[174.874,38.982,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[174.435,39.052,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[174.027,39.121,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[173.652,39.19,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[173.314,39.258,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[173.012,39.324,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.75,39.388,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.529,39.45,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.351,39.509,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.217,39.564,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.128,39.617,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.086,39.665,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.09,39.711,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.119,39.788,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.17,39.899,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.244,40.041,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.343,40.211,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.467,40.403,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.617,40.615,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.794,40.842,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[172.999,41.083,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[173.23,41.332,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[173.487,41.588,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[173.771,41.848,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[174.08,42.108,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[174.413,42.367,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[174.769,42.621,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[175.146,42.869,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[175.542,43.109,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[175.955,43.338,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[176.384,43.555,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[176.824,43.759,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.273,43.947,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[177.729,44.119,0],"t":58,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.189,44.273,0],"t":59,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[178.647,44.409,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.102,44.525,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.548,44.62,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[179.982,44.695,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.4,44.748,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[180.796,44.779,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.167,44.788,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.509,44.776,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[181.86,44.736,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.225,44.669,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.604,44.574,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[182.993,44.452,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.389,44.303,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[183.79,44.128,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.192,43.927,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.593,43.701,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[184.991,43.452,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.382,43.179,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[185.764,42.884,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.134,42.569,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.49,42.233,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[186.829,41.879,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.149,41.508,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.448,41.121,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.723,40.72,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[187.974,40.306,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[188.197,39.881,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[188.391,39.447,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[188.555,39.005,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[188.687,38.557,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[188.787,38.105,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"9","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":84,"ty":4,"nm":".dot3","cl":"dot3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[452.57,29.124,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.29,28.906,0],"t":1,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.038,28.659,0],"t":2,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.815,28.381,0],"t":3,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.621,28.075,0],"t":4,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.457,27.741,0],"t":5,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.323,27.38,0],"t":6,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.195,27.046,0],"t":7,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.059,26.776,0],"t":8,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.917,26.564,0],"t":9,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.773,26.408,0],"t":10,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.628,26.303,0],"t":11,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.484,26.245,0],"t":12,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.345,26.231,0],"t":13,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.211,26.258,0],"t":14,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.085,26.322,0],"t":15,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.967,26.419,0],"t":16,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.859,26.546,0],"t":17,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.761,26.701,0],"t":18,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.675,26.879,0],"t":19,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.601,27.078,0],"t":20,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.539,27.295,0],"t":21,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.489,27.527,0],"t":22,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.451,27.772,0],"t":23,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.425,28.027,0],"t":24,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.41,28.289,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.405,28.555,0],"t":26,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.41,28.825,0],"t":27,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.423,29.095,0],"t":28,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.443,29.363,0],"t":29,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.467,29.628,0],"t":30,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.496,29.888,0],"t":31,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.526,30.141,0],"t":32,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.555,30.385,0],"t":33,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.58,30.619,0],"t":34,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.601,30.842,0],"t":35,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.612,31.053,0],"t":36,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.627,31.259,0],"t":37,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.652,31.466,0],"t":38,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.688,31.673,0],"t":39,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.735,31.878,0],"t":40,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.791,32.081,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.858,32.281,0],"t":42,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[449.933,32.475,0],"t":43,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.017,32.664,0],"t":44,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.109,32.847,0],"t":45,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.208,33.021,0],"t":46,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.314,33.187,0],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.426,33.343,0],"t":48,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.543,33.489,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.665,33.623,0],"t":50,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.791,33.745,0],"t":51,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[450.92,33.854,0],"t":52,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.051,33.95,0],"t":53,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.184,34.031,0],"t":54,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.317,34.097,0],"t":55,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.451,34.147,0],"t":56,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.584,34.182,0],"t":57,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[451.97,34.186,0],"t":60,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.093,34.153,0],"t":61,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.211,34.104,0],"t":62,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.324,34.037,0],"t":63,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.432,33.954,0],"t":64,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.533,33.853,0],"t":65,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.628,33.737,0],"t":66,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.714,33.609,0],"t":67,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.791,33.475,0],"t":68,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.859,33.336,0],"t":69,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.916,33.192,0],"t":70,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.964,33.044,0],"t":71,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.003,32.892,0],"t":72,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.032,32.737,0],"t":73,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.053,32.578,0],"t":74,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.064,32.416,0],"t":75,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.068,32.25,0],"t":76,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.063,32.08,0],"t":77,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.051,31.905,0],"t":78,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.031,31.726,0],"t":79,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[453.006,31.54,0],"t":80,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.974,31.347,0],"t":81,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.938,31.147,0],"t":82,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.897,30.937,0],"t":83,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.853,30.718,0],"t":84,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.807,30.488,0],"t":85,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.759,30.246,0],"t":86,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.71,29.989,0],"t":87,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.662,29.718,0],"t":88,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.615,29.43,0],"t":89,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[452.57,29.124,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6.829,6.829],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":2,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.301960796118,0.321568638086,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[200,200],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"1697","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"shapes","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[362,230,0],"ix":2,"l":2},"a":{"a":0,"k":[412,892,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Hue/Saturation","np":11,"mn":"ADBE HUE SATURATION","ix":1,"en":1,"ef":[{"ty":7,"nm":"Channel Control","mn":"ADBE HUE SATURATION-0002","ix":1,"v":{"a":0,"k":1,"ix":1}},{},{"ty":0,"nm":"Master Hue","mn":"ADBE HUE SATURATION-0004","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Master Saturation","mn":"ADBE HUE SATURATION-0005","ix":4,"v":{"a":0,"k":77,"ix":4}},{"ty":0,"nm":"Master Lightness","mn":"ADBE HUE SATURATION-0006","ix":5,"v":{"a":0,"k":51,"ix":5}},{"ty":7,"nm":"Colorize","mn":"ADBE HUE SATURATION-0007","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Colorize Hue","mn":"ADBE HUE SATURATION-0008","ix":7,"v":{"a":0,"k":0,"ix":7}},{"ty":0,"nm":"Colorize Saturation","mn":"ADBE HUE SATURATION-0009","ix":8,"v":{"a":0,"k":25,"ix":8}},{"ty":0,"nm":"Colorize Lightness","mn":"ADBE HUE SATURATION-0010","ix":9,"v":{"a":0,"k":0,"ix":9}}]}],"w":824,"h":1784,"ip":0,"op":271,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".bg","cl":"bg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[362,362,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[200,200,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-33.768,-77.755],[0,0],[10.315,-23.739],[0,0],[-77.754,33.772],[0,0],[-23.745,-10.309],[0,0],[33.768,77.755],[0,0],[-10.296,23.741],[0,0],[77.773,-33.77],[0,0],[23.725,10.311]],"o":[[-77.754,-33.77],[0,0],[10.315,23.741],[0,0],[-33.768,77.755],[0,0],[23.725,-10.309],[0,0],[77.773,33.772],[0,0],[-10.296,-23.739],[0,0],[33.768,-77.755],[0,0],[-23.745,10.311],[0,0]],"v":[[-50.069,-172.976],[-172.977,-50.071],[-167.391,-37.216],[-167.391,37.215],[-172.977,50.072],[-50.069,172.975],[-37.204,167.391],[37.222,167.391],[50.067,172.975],[172.975,50.072],[167.389,37.215],[167.389,-37.216],[172.975,-50.071],[50.067,-172.976],[37.222,-167.392],[-37.204,-167.392]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":22,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.152941182256,0.172549024224,0.149019613862,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Base shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"ct":1,"bm":0}],"markers":[{"tm":90,"cm":"Loop","dr":0},{"tm":270.5,"cm":"End","dr":0}],"props":{}}
\ No newline at end of file
diff --git a/app/tv/build.gradle.kts b/app/tv/build.gradle.kts
index 93186220b..7e9c7da2e 100644
--- a/app/tv/build.gradle.kts
+++ b/app/tv/build.gradle.kts
@@ -1,7 +1,6 @@
plugins {
alias(gradleLibs.plugins.android.library)
alias(gradleLibs.plugins.compose.compiler)
- alias(gradleLibs.plugins.firebase.crashlytics)
alias(gradleLibs.plugins.google.ksp)
alias(gradleLibs.plugins.google.services) apply false
alias(gradleLibs.plugins.kotlin.android)
@@ -43,11 +42,6 @@ android {
}
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
-
buildFeatures {
compose = true
}
@@ -63,7 +57,7 @@ android {
java {
toolchain {
- languageVersion.set(JavaLanguageVersion.of(17))
+ languageVersion.set(JavaLanguageVersion.of(AppConfiguration.jdk))
}
}
diff --git a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/RegionBlockScreen.kt b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/RegionBlockScreen.kt
new file mode 100644
index 000000000..a864568e1
--- /dev/null
+++ b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/RegionBlockScreen.kt
@@ -0,0 +1,161 @@
+package dev.aaa1115910.bv.tv.screens
+
+import android.app.Activity
+import android.content.res.Configuration
+import android.graphics.BitmapFactory
+import androidx.compose.animation.core.animateIntAsState
+import androidx.compose.animation.core.keyframes
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ImageBitmap
+import androidx.compose.ui.graphics.ImageBitmapConfig
+import androidx.compose.ui.graphics.asImageBitmap
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.input.key.onKeyEvent
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.tv.material3.MaterialTheme
+import androidx.tv.material3.Surface
+import androidx.tv.material3.Text
+import dev.aaa1115910.bv.R
+import dev.aaa1115910.bv.ui.theme.BVTheme
+import okhttp3.internal.toHexString
+import qrcode.QRCode
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import kotlin.system.exitProcess
+
+@Composable
+fun RegionBlockScreen(
+ modifier: Modifier = Modifier
+) {
+ val context = LocalContext.current
+ var qrImage by remember { mutableStateOf(ImageBitmap(1, 1, ImageBitmapConfig.Argb8888)) }
+ val primaryColorHex =
+ "#" + MaterialTheme.colorScheme.surface.toArgb().toHexString().substring(2)
+
+ var finishNumberTarget by remember { mutableIntStateOf(0) }
+ val finishNumber by animateIntAsState(
+ targetValue = finishNumberTarget,
+ animationSpec = keyframes {
+ durationMillis = 12 * 1000
+ 0 at 0
+ 10 at 1 * 1000
+ 60 at 3 * 1000
+ 90 at 7 * 1000
+ 91 at 10 * 1000
+ 100 at 12 * 1000
+ },
+ label = "finish percent animation"
+ )
+
+ LaunchedEffect(Unit) {
+ println(primaryColorHex)
+ val output = ByteArrayOutputStream()
+ finishNumberTarget = 100
+ QRCode(context.getString(R.string.region_block_qr_content))
+ .render()
+ .writeImage(output)
+ val input = ByteArrayInputStream(output.toByteArray())
+ qrImage = BitmapFactory.decodeStream(input).asImageBitmap()
+ }
+
+ DisposableEffect(key1 = Unit) {
+ onDispose {
+ (context as Activity).finish()
+ exitProcess(0)
+ }
+ }
+
+ Surface(
+ modifier = modifier
+ .focusable()
+ .onKeyEvent {
+ (context as Activity).finish()
+ exitProcess(0)
+ },
+ shape = RoundedCornerShape(0.dp)
+ ) {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(84.dp),
+ contentAlignment = Alignment.CenterStart
+ ) {
+ Column(
+ verticalArrangement = Arrangement.spacedBy(24.dp)
+ ) {
+ Text(
+ text = stringResource(R.string.region_block_character_painting),
+ fontSize = 100.sp
+ )
+ Column {
+ Text(
+ text = stringResource(R.string.region_block_title),
+ style = MaterialTheme.typography.titleLarge
+ )
+ Text(
+ text = stringResource(R.string.region_block_subtitle_tv),
+ style = MaterialTheme.typography.titleLarge
+ )
+ }
+ Text(
+ text = "$finishNumber% 完成",
+ style = MaterialTheme.typography.titleLarge
+ )
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(12.dp)
+ ) {
+ Box(
+ modifier = Modifier
+ .size(80.dp)
+ .background(Color.White),
+ contentAlignment = Alignment.Center
+ ) {
+ Image(
+ modifier = Modifier.size(64.dp),
+ bitmap = qrImage,
+ contentDescription = null
+ )
+ }
+ Column {
+ Text(text = stringResource(R.string.region_block_solution_title))
+ Text(text = stringResource(R.string.region_block_solution_text))
+ }
+ }
+ }
+ }
+ }
+}
+
+@Preview(device = "id:tv_1080p")
+@Preview(device = "id:tv_1080p", uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun RegionBlockScreenPreview() {
+ BVTheme {
+ RegionBlockScreen()
+ }
+}
\ No newline at end of file
diff --git a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoInfoScreen.kt b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoInfoScreen.kt
index f0b6539cc..f5494fb67 100644
--- a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoInfoScreen.kt
+++ b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoInfoScreen.kt
@@ -577,13 +577,18 @@ fun VideoInfoScreen(
videoInfoRepository.videoList.addAll(partVideoList)
}
+ val lastPlayedPage =
+ videoDetailViewModel.videoDetail!!.pages.find { it.cid == lastPlayedCid }
+ val playPage = lastPlayedPage
+ ?: videoDetailViewModel.videoDetail!!.pages.first()
+
launchPlayerActivity(
context = context,
avid = videoDetailViewModel.videoDetail!!.aid,
- cid = videoDetailViewModel.videoDetail!!.pages.first().cid,
+ cid = playPage.cid,
title = videoDetailViewModel.videoDetail!!.title,
- partTitle = videoDetailViewModel.videoDetail!!.pages.first().title,
- played = if (videoDetailViewModel.videoDetail!!.cid == lastPlayedCid) lastPlayedTime * 1000 else 0,
+ partTitle = playPage.title,
+ played = if (playPage.cid == lastPlayedCid) lastPlayedTime * 1000 else 0,
fromSeason = false,
isVerticalVideo = containsVerticalScreenVideo,
playerIconIdle = videoDetailViewModel.videoDetail!!.playerIcon?.idle
diff --git a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoPlayerV3Screen.kt b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoPlayerV3Screen.kt
index 0d764b412..8d6bb099d 100644
--- a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoPlayerV3Screen.kt
+++ b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/VideoPlayerV3Screen.kt
@@ -93,6 +93,7 @@ fun VideoPlayerV3Screen(
currentSubtitleFontSize = playerViewModel.currentSubtitleFontSize,
currentSubtitleBackgroundOpacity = playerViewModel.currentSubtitleBackgroundOpacity,
currentSubtitleBottomPadding = playerViewModel.currentSubtitleBottomPadding,
+ currentPlayMode = playerViewModel.currentPlayMode,
incognitoMode = Prefs.incognitoMode,
),
LocalVideoPlayerDanmakuMasksData provides VideoPlayerDanmakuMasksData(
@@ -108,32 +109,7 @@ fun VideoPlayerV3Screen(
danmakuPlayer = playerViewModel.danmakuPlayer,
onSendHeartbeat = playerViewModel::uploadHistory,
onClearBackToHistoryData = { playerViewModel.lastPlayed = 0 },
- onLoadNextVideo = {
- val currentIndex = playerViewModel.availableVideoList
- .indexOfFirst {
- when (it) {
- is VideoListItemData -> it.cid == playerViewModel.currentCid
- else -> false
- }
- }
- if (currentIndex + 1 < playerViewModel.availableVideoList.size) {
- val nextVideos = playerViewModel.availableVideoList.subList(
- currentIndex + 1,
- playerViewModel.availableVideoList.size
- )
- val nextVideo =
- nextVideos.firstOrNull { it is VideoListItemData }!! as VideoListItemData
- logger.info { "Play next video: $nextVideo" }
- playerViewModel.partTitle = nextVideo.title
- playerViewModel.loadPlayUrl(
- avid = nextVideo.aid,
- cid = nextVideo.cid,
- epid = nextVideo.epid,
- seasonId = nextVideo.seasonId,
- continuePlayNext = true
- )
- }
- },
+ onLoadNextVideo = playerViewModel::playNextVideo,
onExit = { (context as Activity).finish() },
onLoadNewVideo = { videoListItem ->
when (videoListItem) {
@@ -215,6 +191,13 @@ fun VideoPlayerV3Screen(
Prefs.defaultSubtitleBottomPadding = padding
playerViewModel.currentSubtitleBottomPadding = padding
},
+<<<<<<< HEAD
+=======
+ onPlayModeChange = { playMode ->
+ Prefs.defaultPlayMode = playMode
+ playerViewModel.currentPlayMode = playMode
+ },
+>>>>>>> develop
onUpdateDanmakuForPosition = playerViewModel::updateDanmakuForPosition
)
}
diff --git a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/login/AppQRLoginContent.kt b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/login/AppQRLoginContent.kt
index b43e202c6..61d108db7 100644
--- a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/login/AppQRLoginContent.kt
+++ b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/login/AppQRLoginContent.kt
@@ -3,8 +3,6 @@ package dev.aaa1115910.bv.tv.screens.login
import android.app.Activity
import android.view.KeyEvent
import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.background
import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -16,8 +14,6 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.nativeKeyCode
import androidx.compose.ui.input.key.onKeyEvent
@@ -32,6 +28,7 @@ import dev.aaa1115910.biliapi.entity.login.QrLoginState
import dev.aaa1115910.bv.R
import dev.aaa1115910.bv.util.toast
import dev.aaa1115910.bv.viewmodel.login.AppQrLoginViewModel
+import dev.aaa1115910.m3qrcode.MaterialShapeQr
import org.koin.androidx.compose.koinViewModel
@Composable
@@ -85,19 +82,10 @@ fun AppQRLoginContent(
visible = listOf(QrLoginState.WaitingForScan, QrLoginState.WaitingForConfirm)
.contains(appQrLoginViewModel.state)
) {
- Box(
- modifier = Modifier
- .size(240.dp)
- .clip(MaterialTheme.shapes.large)
- .background(Color.White),
- contentAlignment = Alignment.Center,
- ) {
- Image(
- modifier = Modifier.size(200.dp),
- bitmap = appQrLoginViewModel.qrImage,
- contentDescription = null
- )
- }
+ MaterialShapeQr(
+ modifier = Modifier.size(280.dp),
+ content = appQrLoginViewModel.loginUrl
+ )
}
Column(
diff --git a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/settings/LogsScreen.kt b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/settings/LogsScreen.kt
index 2988d8f43..2f6ab843b 100644
--- a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/settings/LogsScreen.kt
+++ b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/settings/LogsScreen.kt
@@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
-import androidx.compose.material3.LoadingIndicator
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -42,12 +41,12 @@ import androidx.compose.ui.unit.sp
import androidx.tv.material3.ListItem
import androidx.tv.material3.Text
import dev.aaa1115910.bv.R
-import dev.aaa1115910.bv.component.QrImage
import dev.aaa1115910.bv.network.HttpServer
import dev.aaa1115910.bv.ui.theme.BVTheme
import dev.aaa1115910.bv.util.LogCatcherUtil
import dev.aaa1115910.bv.util.swapList
import dev.aaa1115910.bv.util.toast
+import dev.aaa1115910.m3qrcode.MaterialShapeQr
import java.io.File
import java.net.Inet4Address
import java.net.NetworkInterface
@@ -225,10 +224,9 @@ fun LogsScreenContent(
contentAlignment = Alignment.Center
) {
if (qrContent.isNotBlank()) {
- QrImage(
+ MaterialShapeQr(
modifier = Modifier.size(240.dp),
- content = qrContent,
- showLoadingWhenContentChanged = false
+ content = qrContent
)
} else {
Text(
diff --git a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/user/UserSwitchScreen.kt b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/user/UserSwitchScreen.kt
index f1e6ece4b..8b77d1161 100644
--- a/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/user/UserSwitchScreen.kt
+++ b/app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/user/UserSwitchScreen.kt
@@ -65,7 +65,6 @@ import androidx.tv.material3.SurfaceDefaults
import androidx.tv.material3.Text
import coil.compose.AsyncImage
import dev.aaa1115910.bv.R
-import dev.aaa1115910.bv.component.QrImage
import dev.aaa1115910.bv.entity.BvScheme
import dev.aaa1115910.bv.entity.db.UserDB
import dev.aaa1115910.bv.repository.UserRepository
@@ -77,6 +76,7 @@ import dev.aaa1115910.bv.ui.theme.BVTheme
import dev.aaa1115910.bv.util.ifElse
import dev.aaa1115910.bv.util.requestFocus
import dev.aaa1115910.bv.viewmodel.UserSwitchViewModel
+import dev.aaa1115910.m3qrcode.MaterialShapeQr
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.androidx.compose.koinViewModel
@@ -448,7 +448,7 @@ fun UserAuthDataDialog(
.fillMaxHeight(),
contentAlignment = Alignment.Center,
) {
- QrImage(
+ MaterialShapeQr(
modifier = Modifier
.size(240.dp),
content = qrContent
diff --git a/bili-api-grpc/proto/bilibili/ad/v1/ad.proto b/bili-api-grpc/proto/bilibili/ad/v1/ad.proto
deleted file mode 100644
index a5ce48ad7..000000000
--- a/bili-api-grpc/proto/bilibili/ad/v1/ad.proto
+++ /dev/null
@@ -1,1013 +0,0 @@
-syntax = "proto3";
-
-package bilibili.ad.v1;
-
-option java_multiple_files = true;
-
-import "google/protobuf/any.proto";
-import "google/protobuf/wrappers.proto";
-
-// 自动播放视频
-message AdAutoPlayVideoDto {
- // avid
- int64 avid = 1;
- // cid
- int64 cid = 2;
- // 分P
- int64 page = 3;
- //
- string from = 4;
- // 是否自动播放
- string url = 5;
- // 是否自动播放
- string cover = 6;
- // 是否自动播放
- bool auto_play = 7;
- // 按钮是否动态变色
- bool btn_dyc_color = 8;
- // 按钮动态变色时间 ms
- int32 btn_dyc_time = 9;
- // 用于做联播是否是同一个视频的id
- int64 biz_id = 10;
- // 开始播放三方监控
- repeated string process0_urls = 11;
- // 播放3S三方监控
- repeated string play_3s_urls = 12;
- // 播放5S三方监控
- repeated string play_5s_urls = 13;
- // 横竖屏
- int32 orientation = 14;
-}
-
-// 商业标信息
-message AdBusinessMarkDto {
- // 商业标样式
- // 0:不展示标 1:实心+文字 2:空心框+文字 3:纯文字标 4:纯图片标
- int32 type = 1;
- // 商业标文案
- string text = 2;
- // 商业标文案颜色,如#80FFFFFF RGBA
- string text_color = 3;
- // 夜间模式文字色
- string text_color_night = 4;
- // 背景色
- string bg_color = 5;
- // 夜间模式背景色
- string bg_color_night = 6;
- // 边框色
- string border_color = 7;
- // 夜间模式边框色
- string border_color_night = 8;
- // 图片商业标
- string img_url = 9;
- // 图片高度
- int32 img_height = 10;
- // 图片宽度
- int32 img_width = 11;
- //
- string bg_border_color = 12;
-}
-
-// 按钮
-message AdButtonDto {
- // 类型
- // 1:落地页 2:应用唤起 3:应用下载
- int32 type = 1;
- // 按钮文案
- string text = 2;
- // 按钮跳转地址
- string jump_url = 3;
- // 跳转监测链接
- string report_urls = 4;
- // 唤起schema
- string dlsuc_callup_url = 5;
- // 游戏id
- int32 game_id = 6;
- // 游戏监控字段
- string game_monitor_param = 7;
- //
- int32 game_channel_id = 8;
- //
- string game_channel_extra = 9;
-}
-
-// 卡片
-message AdCardDto {
- // 卡片类型
- int32 card_type = 1;
- // 标题
- string title = 2;
- // 描述
- string desc = 3;
- // 额外描述
- string extra_desc = 4;
- // 长描述
- string long_desc = 5;
- // 短标题, 弹幕广告目录面板标题
- string short_title = 6;
- // 弹幕/浮层广告的弹幕标题
- string danmu_title = 7;
- // 弹幕/浮层广告的弹幕高度,整型,分母为100
- int32 danmu_height = 8;
- // 弹幕/浮层广告的弹幕宽度,整型,分母为100
- int32 danmu_width = 9;
- // 弹幕/浮层广告生存时间,单位为毫秒
- int32 danmu_life = 10;
- // 弹幕/浮层开始时间,单位为毫秒
- int32 danmu_begin = 11;
- // 背景色值(含透明度)如#80FFFFFF
- string danmu_color = 12;
- // 弹幕/浮层广告H5落地页
- string danmu_h5url = 13;
- // 弹幕/浮层 广告icon
- string danmu_icon = 14;
- // 折叠时间,永驻浮层折叠时间,单位为毫秒
- int32 fold_time = 15;
- // 广告标文案
- string ad_tag = 16;
- // cover数组
- repeated AdCoverDto covers = 17;
- // 卡片跳转链接
- string jump_url = 18;
- //
- string imax_landing_page_json_string = 19;
- // app唤起schema
- string callup_url = 20;
- // univeral link域名
- string universal_app = 21;
- // 原价, 单位为分
- string ori_price = 22;
- // 现价, 同上
- int32 cur_price = 23;
- // 券后/现价 价格描述
- string price_desc = 24;
- // 价格单位符号
- string price_symbol = 25;
- // 券后价格 "1000"
- string goods_cur_price = 26;
- // 原价 "¥1002"
- string goods_ori_price = 27;
- // 开放平台商品
- AdGoodDto good = 28;
- // 打分? 满分为100
- int32 rank = 29;
- // 热度
- int32 hot_score = 30;
- // 按钮
- AdButtonDto button = 31;
- // 广告主logo
- string adver_logo = 32;
- // 广告主name
- string adver_name = 33;
- // 广告主主页链接
- string adver_page_url = 34;
- // 视频弹幕,视频广告用
- repeated string video_barrage = 35;
- // 商业标信息
- AdBusinessMarkDto ad_tag_style = 36;
- // 自动播放视频
- AdAutoPlayVideoDto video = 37;
- // 反馈面板功能模块,屏蔽、投诉、广告介绍
- AdFeedbackPanelDto feedback_panel = 38;
- //
- int64 adver_mid = 39;
- //
- int64 adver_account_id = 40;
- //
- string duration = 41;
- //
- repeated QualityInfo quality_infos = 42;
- // 动态广告文本
- string dynamic_text = 43;
- // 广告主信息
- AdverDto adver = 44;
- // 评分
- int32 grade_level = 45;
- //
- bool support_transition = 46;
- //
- string transition = 47;
- //
- int32 under_player_interaction_style = 48;
- //
- string imax_landing_page_v2 = 49;
- //
- SubCardModule subcard_module = 50;
- //
- int32 grade_denominator = 51;
- //
- int32 star_level = 52;
- //
- Bulletin bulletin = 53;
- //
- Gift gift = 54;
- //
- repeated string game_tags = 55;
- //
- int32 ori_mark_hidden = 56;
- //
- bool use_multi_cover = 57;
- //
- WxProgramInfo wx_program_info = 58;
- //
- AndroidGamePageRes android_game_page_res = 59;
- //
- NotClickableArea not_clickable_area = 60;
- //
- ForwardReply forward_reply = 61;
-}
-
-// 额外广告数据
-message AdContentExtraDto {
- // 动态布局
- string layout = 1;
- // 展现监控url
- repeated string show_urls = 2;
- // 点击监控url
- repeated string click_urls = 3;
- // 弹幕创意列表展示第三方上报
- repeated string danmu_list_show_urls = 4;
- // 弹幕创意列表点击第三方上报
- repeated string danmu_list_click_urls = 5;
- // 弹幕详情页展示第三方上报
- repeated string danmu_detail_show_urls = 6;
- // 弹幕商品添加购物车第三方上报
- repeated string danmu_trolley_add_urls = 7;
- // useWebView默认false
- bool use_ad_web_v2 = 8;
- // app唤起白名单
- repeated string open_whitelist = 9;
- // app下载白名单
- AppPackageDto download_whitelist = 10;
- // 卡片相关信息
- AdCardDto card = 11;
- // 视频播放和弹幕播放上报控制时间 ms
- int32 report_time = 12;
- // 是否优先唤起app store
- int32 appstore_priority = 13;
- // 广告售卖类型
- int32 sales_type = 14;
- // 落地页是否预加载
- int32 preload_landingpage = 15;
- // 是否需要展示风险行业提示
- bool special_industry = 16;
- // 风险行业提示
- string special_industry_tips = 17;
- // 是否展示下载弹框
- bool enable_download_dialog = 18;
- // 是否允许分享
- bool enable_share = 19;
- // 个人空间广告入口类型
- // 1:橱窗 2:商品店铺 3:小程序
- int32 upzone_entrance_type = 20;
- // 个人空间广告入口上报id,橱窗id(当前用Mid)、店铺id或者小程序id
- int32 upzone_entrance_report_id = 21;
- // 分享数据
- AdShareInfoDto share_info = 22;
- // topview图片链接,闪屏预下载用
- string topview_pic_url = 23;
- // topview视频链接,闪屏预下载用
- string topview_video_url = 24;
- // 点击区域
- // 0:表示banner可点击 1:表示素材可点击
- int32 click_area = 25;
- // 店铺
- int64 shop_id = 26;
- // up主
- int64 up_mid = 27;
- // 回传id
- string track_id = 28;
- // 商店直投
- int32 enable_store_direct_launch = 29;
- // DPA2.0商品ID
- int64 product_id = 30;
- //
- bool enable_double_jump = 31;
- //
- repeated string show1s_urls = 32;
- //
- string from_track_id = 33;
- //
- bool store_callup_card = 34;
- //
- int32 landingpage_download_style = 35;
- //
- int32 special_industry_style = 36;
- //
- bool enable_h5_alert = 37;
- //
- int32 macro_replace_priority = 38;
- //
- int32 feedback_panel_style = 39;
- //
- string appstore_url = 40;
- //
- int32 enable_h5_pre_load = 41;
- //
- string h5_pre_load_url = 42;
- //
- string cm_from_track_id = 43;
-}
-
-// 广告卡片封面数据
-message AdCoverDto {
- // 图片链接
- string url = 1;
- // 动图循环次数
- // 0:无限循环
- int32 loop = 2;
- // 图片点击跳转地址,截至目前为空
- string jump_url = 3;
- // 跳转监测链接, 数组,单个图片的监控,出区别于click_urls,应前端要求。(此字段截至目前为空,使用时需再次确认)
- repeated string report_urls = 4;
- // 图片高度
- int32 image_height = 5;
- // 图片宽度
- int32 image_width = 6;
-}
-
-// 广告内容
-message AdDto {
- // 广告创意ID
- int64 creative_id = 1;
- // 广告闭环上报回传数据
- string ad_cb = 2;
- // 额外广告数据
- AdContentExtraDto extra = 3;
- // 广告标记
- int32 cm_mark = 4;
- //
- int64 top_view_id = 5;
- //
- int32 creative_type = 6;
- //
- int32 card_type = 7;
- //
- int32 creative_style = 8;
- //
- int32 is_ad = 9;
- //
- CreativeDto creative_content = 10;
-}
-
-// 反馈面板功能模块
-message AdFeedbackPanelDto {
- // 面板类型,广告、推广
- string panel_type_text = 1;
- // 反馈面版信息
- repeated AdFeedbackPanelModuleDto feedback_panel_detail = 2;
- //
- string toast = 3;
- //
- string open_rec_tips = 4;
- //
- string close_rec_tips = 5;
-}
-
-// 反馈面版信息
-message AdFeedbackPanelModuleDto {
- // 模块id
- int32 module_id = 1;
- // icon url
- string icon_url = 2;
- // 跳转类型
- // 1:气泡 2:H5
- int32 jump_type = 3;
- // 跳转地址
- string jump_url = 4;
- // 文案
- string text = 5;
- // 二级文案数组
- repeated AdSecondFeedbackPanelDto secondary_panel = 6;
- //
- string sub_text = 7;
-}
-
-// 开放平台商品
-message AdGoodDto {
- // 电商商品ID
- int64 item_id = 1;
- // 电商SKU ID
- int64 sku_id = 2;
- // 店铺ID
- int64 shop_id = 3;
- // SKU库存
- int64 sku_num = 4;
-}
-
-// 有弹幕的ogv ep
-message AdOgvEpDto {
- // 分集epid
- int64 epid = 1;
- // 是否显示 "荐"
- bool has_recommend = 2;
-}
-
-// 广告控制
-message AdsControlDto {
- // 视频是否有弹幕,如有,需请求弹幕广告
- int32 has_danmu = 1;
- // 有弹幕的分P视频的cid,已弃用
- repeated int64 cids = 2;
- // 有弹幕的ogv ep
- repeated AdOgvEpDto eps = 3;
-}
-
-// 二级文案
-message AdSecondFeedbackPanelDto {
- // 屏蔽理由id
- int32 reason_id = 1;
- // 理由文案
- string text = 2;
-}
-
-// 分享
-message AdShareInfoDto {
- // 分享标题
- string title = 1;
- // 分享副标题
- string subtitle = 2;
- // 分享图片url
- string image_url = 3;
-}
-
-// 广告主信息
-message AdverDto {
- //
- int64 adver_id = 1;
- //
- string adver_logo = 2;
- //
- string adver_name = 3;
- //
- int32 adver_type = 4;
- //
- string adver_page_url = 5;
- //
- string adver_desc = 6;
-}
-
-//
-message AndroidGamePageRes {
- //
- Module1 module1 = 1;
- //
- Module3 module3 = 2;
- //
- Module4 module4 = 3;
- //
- Module5 module5 = 4;
- //
- Module6 module6 = 5;
- //
- Module7 module7 = 6;
- //
- Module8 module8 = 7;
- //
- Module9 module9 = 8;
- //
- Module10 module10 = 9;
- //
- Module11 module11 = 10;
- //
- Module12 module12 = 11;
- //
- Module13 module13 = 12;
- //
- repeated int32 module_seq = 13;
- //
- string background_color = 14;
- //
- Module14 module14 = 15;
-}
-
-//
-message AndroidTag {
- //
- string text = 1;
- //
- int32 type = 2;
-}
-
-// app下载白名单
-message AppPackageDto {
- // 包大小(单位bytes)
- int64 size = 1;
- //
- string display_name = 2;
- //
- string apk_name = 3;
- // url
- string url = 4;
- // bili schema url
- string bili_url = 5;
- // 包md5
- string md5 = 6;
- // 包icon
- string icon = 7;
- // 开发者姓名
- string dev_name = 8;
- // 权限地址
- string auth_url = 9;
- // 权限名,逗号隔开
- string auth_name = 10;
- // 版本
- string version = 11;
- // 更新时间,yy-mm-hh格式
- string update_time = 12;
- // 隐私协议标题
- string privacy_name = 13;
- // 隐私协议url
- string privacy_url = 14;
-}
-
-//
-message Bulletin {
- //
- string tag_text = 1;
- //
- string text = 2;
-}
-
-//
-message Comment {
- //
- int64 game_base_id = 1;
- //
- string user_name = 2;
- //
- string user_face = 3;
- //
- int32 user_level = 4;
- //
- string comment_no = 5;
- //
- int32 grade = 6;
- //
- string content = 7;
- //
- int32 up_count = 8;
-}
-
-//
-message CreativeDto {
- //
- string title = 1;
- //
- string description = 2;
- //
- string image_url = 3;
- //
- string image_md5 = 4;
- //
- string url = 5;
- //
- string click_url = 6;
- //
- string show_url = 7;
- //
- int64 video_id = 8;
- //
- string thumbnail_url = 9;
- //
- string thumbnail_url_md5 = 10;
- //
- string logo_url = 11;
- //
- string logo_md5 = 12;
- //
- string username = 13;
-}
-
-//
-message CustomPlayUrl {
- //
- int32 play_time = 1;
- //
- repeated string urls = 2;
-}
-
-//
-message ForwardReply {
- //
- int64 comment_id = 1;
- //
- string message = 2;
- //
- string highlight_text = 3;
- //
- string highlight_prefix_icon = 4;
- //
- string callup_url = 5;
- //
- string jump_url = 6;
- //
- int32 jump_type = 7;
- //
- string author_name = 8;
- //
- string author_icon = 9;
-}
-
-//
-message Gift {
- //
- string icon = 1;
- //
- string night_icon = 2;
- //
- string text = 3;
- //
- string url = 4;
-}
-
-//
-message IosGamePageRes {
- //
- string logo = 1;
- //
- string name = 2;
- //
- string sub_titile = 3;
- //
- repeated string image_url = 4;
- //
- string desc = 5;
- //
- AdButtonDto game_button = 6;
- //
- double grade = 7;
- //
- string rank_num = 8;
- //
- string rank_name = 9;
-}
-
-//
-message Module1 {
- //
- string game_name = 1;
- //
- string game_icon = 2;
- //
- string developer_input_name = 3;
- //
- repeated AndroidTag tag_list = 4;
-}
-
-//
-message Module3 {
- //
- bool display = 1;
- //
- repeated QualityParmas quality_params = 3;
-}
-
-//
-message Module4 {
- //
- bool display = 1;
- //
- int32 gift_num = 2;
- //
- string gift_name = 3;
- //
- int32 gift_icon_num = 4;
- //
- repeated string icon_urls = 5;
-}
-
-//
-message Module5 {
- //
- bool display = 1;
- //
- string game_summary = 2;
-}
-
-//
-message Module6 {
- //
- bool display = 1;
- //
- string game_desc = 2;
-}
-
-//
-message Module7 {
- //
- bool display = 1;
- //
- repeated ScreenShots screen_shots = 2;
-}
-
-//
-message Module8 {
- //
- bool display = 1;
- //
- repeated string tag_list = 2;
-}
-
-//
-message Module9 {
- //
- bool display = 1;
- //
- string dev_introduction = 2;
-}
-
-//
-message Module10 {
- //
- bool display = 1;
- //
- string latest_update = 2;
-}
-
-//
-message Module11 {
- //
- bool display = 1;
- //
- repeated int32 star_number_list = 2;
- //
- string comment_str = 3;
- //
- double grade = 4;
-}
-
-//
-message Module12 {
- //
- bool display = 1;
- //
- repeated Comment comment_list = 2;
- //
- string comment_num = 3;
- //
- bool show_all_comment = 4;
-}
-
-//
-message Module13 {
- //
- int64 pkg_size = 1;
- //
- string customer_service = 2;
- //
- string website = 3;
- //
- string authority = 4;
- //
- string privacy = 5;
- //
- string developer_name = 6;
- //
- string update_time = 7;
- //
- string game_version = 8;
- //
- string android_pkg_name = 9;
-}
-
-//
-message Module14 {
- //
- repeated Reward reward_list = 1;
- //
- bool display = 2;
-}
-
-//
-message NotClickableArea {
- //
- int32 x = 1;
- //
- int32 y = 2;
- //
- int32 z = 3;
-}
-
-//
-message QualityInfo {
- //
- string icon = 1;
- //
- string text = 2;
- //
- bool is_bg = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
-}
-
-//
-message QualityParmas {
- //
- string first_line = 1;
- //
- string second_line = 2;
- //
- double grade = 3;
- //
- string rank_icon = 4;
- //
- int32 quality_type = 5;
-}
-
-//
-message Reward {
- //
- int32 level = 1;
- //
- string title = 2;
- //
- string content = 3;
- //
- string pic = 4;
- //
- bool reach = 5;
-}
-
-//
-message ScreenShots {
- //
- string url = 1;
- //
- int32 height = 2;
- //
- int32 width = 3;
- //
- int32 seq = 4;
-}
-
-// 广告数据
-message SourceContentDto {
- // 广告请求id
- string request_id = 1;
- // 广告资源位source ID
- int32 source_id = 2;
- // 广告资源位resource ID
- int32 resource_id = 3;
- // 广告位上报标记,对广告返回数据恒为true
- bool is_ad_loc = 4;
- // 与天马现有逻辑一致, 0有含义
- // 0:内容 1:广告
- google.protobuf.Int32Value server_type = 5;
- // 客户端IP回传拼接
- string client_ip = 6;
- // 广告卡片位置在一刷中的位置, 天马用, 0有含义
- google.protobuf.Int32Value card_index = 7;
- // 广告资源位source 位次
- int32 index = 8;
- // 广告内容
- AdDto ad_content = 9;
-}
-
-//
-message SubCardModule {
- //
- string subcard_type = 1;
- //
- string icon = 2;
- //
- string desc = 3;
- //
- string rank_stars = 4;
- //
- string amount_number = 5;
- //
- string avatar = 6;
- //
- string title = 7;
- //
- AdButtonDto button = 8;
- //
- repeated TagInfo tag_infos = 9;
-}
-
-//
-message Tab2ExtraDto {
- //
- string cover_url = 1;
- //
- string title = 2;
- //
- string desc = 3;
- //
- AdButtonDto button = 5;
- //
- int32 auto_animate_time_ms = 6;
- //
- bool enable_click = 7;
- //
- string panel_url = 8;
- //
- repeated AppPackageDto download_whitelist = 9;
- //
- repeated string open_whitelist = 10;
- //
- bool use_ad_web_v2 = 11;
- //
- bool enable_store_direct_launch = 12;
- //
- int32 sales_type = 13;
- //
- int32 landingpage_download_style = 15;
- //
- int32 appstore_priority = 16;
- //
- string appstore_url = 17;
- //
- int32 appstore_delay_time = 18;
- //
- int32 page_cover_type = 19;
- //
- int32 page_pull_type = 20;
- //
- AndroidGamePageRes android_game_page_res = 21;
- //
- IosGamePageRes ios_game_page_res = 22;
- //
- AdBusinessMarkDto ad_tag_style = 23;
- //
- AdFeedbackPanelDto feedback_panel = 24;
- //
- string ad_cb = 25;
- //
- int32 url_type = 26;
-}
-
-//
-message TabExtraDto {
- //
- string tab_url = 1;
- //
- int32 enable_store_direct_launch = 2;
- //
- int32 store_callup_card = 3;
- //
- int32 sales_type = 4;
- //
- repeated AppPackageDto download_whitelist = 5;
- //
- bool special_industry = 6;
- //
- string special_industry_tips = 7;
- //
- repeated string open_whitelist = 8;
- //
- int32 landingpage_download_style = 9;
- //
- int32 appstore_priority = 10;
- //
- bool use_ad_web_v2 = 11;
- //
- bool enable_download_dialog = 12;
- //
- string appstore_url = 13;
- //
- int32 appstore_delay_time = 14;
-}
-
-//
-message TabInfoDto {
- //
- string tab_name = 1;
- //
- google.protobuf.Any extra = 2;
- //
- int32 tab_version = 3;
-}
-
-//
-message TagInfo {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
- //
- string border_color = 6;
- //
- string border_color_night = 7;
- //
- string type = 8;
-}
-
-//
-message WxProgramInfo {
- //
- string org_id = 1;
- //
- string name = 2;
- //
- string path = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/api/player/v1/player.proto b/bili-api-grpc/proto/bilibili/api/player/v1/player.proto
deleted file mode 100644
index 10ac3e302..000000000
--- a/bili-api-grpc/proto/bilibili/api/player/v1/player.proto
+++ /dev/null
@@ -1,77 +0,0 @@
-syntax = "proto3";
-
-package bilibili.api.player.v1;
-
-option java_multiple_files = true;
-
-// 心跳上报
-service Heartbeat {
- // 客户端心跳上报
- rpc Mobile(HeartbeatReq) returns (HeartbeatReply);
-}
-
-// 客户端心跳上报-响应
-message HeartbeatReply {
- // 时间戳
- int64 ts = 1;
-}
-
-// 客户端心跳上报-请求
-message HeartbeatReq {
- //
- int64 server_time = 1;
- //
- string session = 2;
- // 用户 mid
- int64 mid = 3;
- // 稿件 avid
- int64 aid = 4;
- // 视频 cid
- int64 cid = 5;
- //
- string sid = 6;
- //
- int64 epid = 7;
- //
- string type = 8;
- //
- int32 sub_type = 9;
- //
- int32 quality = 10;
- //
- int64 total_time = 11;
- //
- int64 paused_time = 12;
- //
- int64 played_time = 13;
- //
- int64 video_duration = 14;
- //
- string play_type = 15;
- //
- int32 network_type = 16;
- //
- int64 last_play_progress_time = 17;
- //
- int64 max_play_progress_time = 18;
- //
- int32 from = 19;
- //
- string from_spmid = 20;
- //
- string spmid = 21;
- //
- string epid_status = 22;
- //
- string play_status = 23;
- //
- string user_status = 24;
- //
- int64 actual_played_time = 25;
- //
- int32 auto_play = 26;
- //
- int64 list_play_time = 27;
- //
- int64 detail_play_time = 28;
-}
diff --git a/bili-api-grpc/proto/bilibili/api/probe/v1/probe.proto b/bili-api-grpc/proto/bilibili/api/probe/v1/probe.proto
deleted file mode 100644
index 2f7c21cc1..000000000
--- a/bili-api-grpc/proto/bilibili/api/probe/v1/probe.proto
+++ /dev/null
@@ -1,194 +0,0 @@
-syntax = "proto3";
-
-package bilibili.api.probe.v1;
-
-option java_multiple_files = true;
-
-// 服务可用性探针
-service Probe {
- //
- rpc TestCode (CodeReq) returns (CodeReply);
- //
- rpc TestReq (ProbeReq) returns (ProbeReply);
- //
- rpc TestStream (ProbeStreamReq) returns (ProbeStreamReply);
- //
- rpc TestSub (ProbeSubReq) returns (ProbeSubReply);
-}
-
-// 服务可用性探针
-service ProbeService {
- //
- rpc Echo(SimpleMessage) returns (SimpleMessage);
- //
- rpc EchoBody(SimpleMessage) returns (SimpleMessage);
- //
- rpc EchoDelete(SimpleMessage) returns (SimpleMessage);
- //
- rpc EchoError(ErrorMessage) returns (ErrorMessage);
- //
- rpc EchoPatch(DynamicMessageUpdate) returns (DynamicMessageUpdate);
-}
-
-//
-enum Category {
- CATEGORY_UNSPECIFIED = 0; //
- CATEGORY_ONE = 1; //
- CATEGORY_TWO = 2; //
- CATEGORY_THREE = 3; //
- CATEGORY_FOUR = 4; //
-}
-
-//
-message CodeReply {
- //
- string id = 1;
- //
- string id1 = 2;
- //
- int64 code = 3;
- //
- string message_s = 4;
-}
-
-//
-message CodeReq {
- //
- int64 code = 1;
-}
-
-//
-message CreateTopic {
- //
- int64 id = 1;
-}
-
-//
-message CreatTask {
- //
- string task = 1;
-}
-
-//
-message DynamicMessageUpdate {
- //
- SimpleMessage body = 1;
-}
-
-//
-message Embedded {
- //
- bool bool_val = 1;
- //
- int32 int32_val = 2;
- //
- int64 int64_val = 3;
- //
- float float_val = 4;
- //
- double double_val = 5;
- //
- string string_val = 6;
- //
- repeated bool repeated_bool_val = 7;
- //
- repeated int32 repeated_int32_val = 8;
- //
- repeated int64 repeated_int64_val = 9;
- //
- repeated float repeated_float_val = 10;
- //
- repeated double repeated_double_val = 11;
- //
- repeated string repeated_string_val = 12;
- //
- map map_string_val = 13;
- //
- map map_error_val = 14;
-}
-
-//
-message ErrorMessage {
- //
- int64 code = 1;
- //
- string reason = 2;
- //
- string message = 3;
-}
-
-// Deprecated
-enum ErrorReason {
- PROBE_UNSPECIFIED = 0; //
- PROBE_CATEGORY_NOTFOUND = 1; //
-}
-
-//
-message ProbeReply {
- //
- string content = 1;
- //
- int64 timestamp = 2;
-}
-
-//
-message ProbeReq {
- //
- int64 mid = 1;
- //
- string buvid = 2;
-}
-
-//
-message ProbeStreamReply {
- //
- int64 sequence = 1;
- //
- int64 timestamp = 2;
- //
- string content = 3;
-}
-
-//
-message ProbeStreamReq {
- //
- int64 mid = 1;
- //
- int64 sequence = 2;
-}
-
-//
-message ProbeSubReply {
- //
- int64 message_id = 1;
-}
-
-//
-message ProbeSubReq {
- //
- string buvid = 1;
-}
-
-//
-message SimpleMessage {
- //
- int32 id = 1;
- //
- int64 num = 2;
- //
- string lang = 3;
- //
- int32 cate = 4;
- //
- Embedded embedded = 5;
-}
-
-//
-message Task {
- //
- string name = 1;
- //
- string author = 2;
- //
- bool cache = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/api/ticket/v1/ticket.proto b/bili-api-grpc/proto/bilibili/api/ticket/v1/ticket.proto
deleted file mode 100644
index 27e571f39..000000000
--- a/bili-api-grpc/proto/bilibili/api/ticket/v1/ticket.proto
+++ /dev/null
@@ -1,41 +0,0 @@
-syntax = "proto3";
-
-package bilibili.api.ticket.v1;
-
-option java_multiple_files = true;
-
-service Ticket {
- // 获取鉴权用 Ticket
- rpc GetTicket (GetTicketRequest) returns (GetTicketResponse);
-}
-
-//
-message GetTicketRequest {
- // 包含:
- // + x-fingerprint(包含手机各类信息, 使用 datacenter.hakase.protobuf.AndroidDeviceInfo 生成)
- // + x-exbadbasket(?)
- map context = 1;
- // 暂时固定为 ec01
- string key_id = 2;
- //
- bytes sign = 3;
- // 暂时留空
- string token = 4;
-}
-
-//
-message GetTicketResponse {
- //
- message Context {
- //
- string v_voucher = 1;
- }
- // x-bili-ticket
- string ticket = 1;
- // 有效期起
- int64 created_at = 2;
- // 有效期
- int64 ttl = 3;
- //
- Context context = 4;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/archive/v1/archive.proto b/bili-api-grpc/proto/bilibili/app/archive/v1/archive.proto
deleted file mode 100644
index a051c7054..000000000
--- a/bili-api-grpc/proto/bilibili/app/archive/v1/archive.proto
+++ /dev/null
@@ -1,204 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.archive.v1;
-
-option java_multiple_files = true;
-
-// 稿件基本信息
-message Arc {
- // 稿件avid
- int64 aid = 1;
- // 稿件分P数
- int64 videos = 2;
- // 分区id
- int32 type_id = 3;
- // 二级分区名
- string type_name = 4;
- // 稿件类型
- // 1:原创 2:转载
- int32 copyright = 5;
- // 稿件封面url
- string pic = 6;
- // 稿件标题
- string title = 7;
- // 稿件发布时间
- int64 pubdate = 8;
- // 用户投稿时间
- int64 ctime = 9;
- // 稿件简介
- string desc = 10;
- // 稿件状态
- int32 state = 11;
- // 访问属性
- // 0:全部可见 10000:登录可见
- int32 access = 12;
- // 属性位配置(现在无了)
- int32 attribute = 13;
- // 空
- string tag = 14;
- // 空
- repeated string tags = 15;
- // 稿件总时长(单位为秒)
- int64 duration = 16;
- // 参与的活动id
- int64 mission_id = 17;
- // 绑定的商单id
- int64 order_id = 18;
- // PGC稿件强制重定向url(如番剧、影视)
- string redirect_url = 19;
- // 空
- int64 forward = 20;
- // 控制标志
- Rights rights = 21;
- // UP主信息
- Author author = 22;
- // 状态数
- Stat stat = 23;
- // 空
- string report_result = 24;
- // 投稿时发送的动态内容
- string dynamic = 25;
- // 稿件1P cid
- int64 first_cid = 26;
- // 稿件1P 分辨率
- Dimension dimension = 27;
- // 合作组成员列表
- repeated StaffInfo staff_info = 28;
- // UGC合集id
- int64 season_id = 29;
- // 新版属性位配置(也没用)
- int64 attribute_v2 = 30;
- //
- SeasonTheme season_theme = 31;
- //
- string short_link_v2 = 40;
- //
- int32 up_from_v2 = 41;
- //
- string first_frame = 42;
-}
-
-// UP主信息
-message Author {
- // UP主mid
- int64 mid = 1;
- // UP主昵称
- string name = 2;
- // UP主头像url
- string face = 3;
-}
-
-// 分辨率
-message Dimension {
- // 宽度
- int64 width = 1;
- // 高度
- int64 height = 2;
- // 方向
- // 0:横屏 1:竖屏
- int64 rotate = 3;
-}
-
-// 分P信息
-message Page {
- // 视频cid
- int64 cid = 1;
- // 分P序号
- int32 page = 2;
- // 源类型
- // vupload:B站 qq:腾讯 hunan:芒果
- string from = 3;
- // 分P标题
- string part = 4;
- // 分P时长(单位为秒)
- int64 duration = 5;
- // 外链vid
- string vid = 6;
- // 分P简介
- string desc = 7;
- // 外链url
- string webLink = 8;
- // 分P分辨率
- Dimension dimension = 9;
- //
- string first_frame = 10;
-}
-
-// 稿件控制标志
-message Rights {
- // 老版是否付费
- int32 bp = 1;
- // 允许充电
- int32 elec = 2;
- // 允许下载
- int32 download = 3;
- // 是否电影
- int32 movie = 4;
- // PGC稿件需要付费
- int32 pay = 5;
- // 是否高码率
- int32 hd5 = 6;
- // 是否显示“禁止转载”标志
- int32 no_reprint = 7;
- // 是否允许自动播放
- int32 autoplay = 8;
- // UGC稿件需要付费(旧版)
- int32 ugc_pay = 9;
- // 是否联合投稿
- int32 is_cooperation = 10;
- // 是否UGC付费预览
- int32 ugc_pay_preview = 11;
- // 是否禁止后台播放
- int32 no_background = 12;
- // UGC稿件需要付费
- int32 arc_pay = 13;
- // 是否已付费可自由观看
- int32 pay_free_watch = 14;
-}
-
-//
-message SeasonTheme {
- //
- string bg_color = 1;
- //
- string selected_bg_color = 2;
- //
- string text_color = 3;
-}
-
-// 合作成员信息
-message StaffInfo {
- // 成员mid
- int64 mid = 1;
- // 成员角色
- string title = 2;
- // 属性位
- // 0:普通 1:赞助商金色标志
- int64 attribute = 3;
-}
-
-// 状态数
-message Stat {
- // 稿件avid
- int64 aid = 1;
- // 播放数(当屏蔽时为-1)
- int32 view = 2;
- // 弹幕数
- int32 danmaku = 3;
- // 评论数
- int32 reply = 4;
- // 收藏数
- int32 fav = 5;
- // 投币数
- int32 coin = 6;
- // 分享数
- int32 share = 7;
- // 当前排名
- int32 now_rank = 8;
- // 历史最高排名
- int32 his_rank = 9;
- // 点赞数
- int32 like = 10;
- // 点踩数(前端不可见故恒为0)
- int32 dislike = 11;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/card/v1/ad.proto b/bili-api-grpc/proto/bilibili/app/card/v1/ad.proto
deleted file mode 100644
index e77e5139c..000000000
--- a/bili-api-grpc/proto/bilibili/app/card/v1/ad.proto
+++ /dev/null
@@ -1,67 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.card.v1;
-
-option java_multiple_files = true;
-
-//
-message AdInfo {
- //
- int64 creative_id = 1;
- //
- int32 creative_type = 2;
- //
- int32 card_type = 3;
- //
- CreativeContent creative_content = 4;
- //
- string ad_cb = 5;
- //
- int64 resource = 6;
- //
- int32 source = 7;
- //
- string request_id = 8;
- //
- bool is_ad = 9;
- //
- int64 cm_mark = 10;
- //
- int32 index = 11;
- //
- bool is_ad_loc = 12;
- //
- int32 card_index = 13;
- //
- string client_ip = 14;
- //
- bytes extra = 15;
- //
- int32 creative_style = 16;
-}
-
-//
-message CreativeContent {
- //
- string title = 1;
- //
- string description = 2;
- //
- int64 video_id = 3;
- //
- string username = 4;
- //
- string image_url = 5;
- //
- string image_md5 = 6;
- //
- string log_url = 7;
- //
- string log_md5 = 8;
- //
- string url = 9;
- //
- string click_url = 10;
- //
- string show_url = 11;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/card/v1/card.proto b/bili-api-grpc/proto/bilibili/app/card/v1/card.proto
deleted file mode 100644
index d98e9d957..000000000
--- a/bili-api-grpc/proto/bilibili/app/card/v1/card.proto
+++ /dev/null
@@ -1,35 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.card.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/card/v1/single.proto";
-
-// 卡片信息
-message Card {
- oneof item {
- // 小封面条目
- SmallCoverV5 small_cover_v5 = 1;
- //
- LargeCoverV1 large_cover_v1 = 2;
- //
- ThreeItemAllV2 three_item_all_v2 = 3;
- //
- ThreeItemV1 three_item_v1 = 4;
- //
- HotTopic hot_topic = 5;
- //
- DynamicHot three_item_h_v5 = 6;
- //
- MiddleCoverV3 middle_cover_v3 = 7;
- //
- LargeCoverV4 large_cover_v4 = 8;
- // 热门列表顶部按钮
- PopularTopEntrance popular_top_entrance = 9;
- //
- RcmdOneItem rcmd_one_item = 10;
- //
- SmallCoverV5Ad small_cover_v5_ad = 11;
- }
-}
diff --git a/bili-api-grpc/proto/bilibili/app/card/v1/common.proto b/bili-api-grpc/proto/bilibili/app/card/v1/common.proto
deleted file mode 100644
index 168d34842..000000000
--- a/bili-api-grpc/proto/bilibili/app/card/v1/common.proto
+++ /dev/null
@@ -1,342 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.card.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/card/v1/ad.proto";
-
-//
-message Args {
- //
- int32 type = 1;
- //
- int64 up_id = 2;
- //
- string up_name = 3;
- //
- int32 rid = 4;
- //
- string rname = 5;
- //
- int64 tid = 6;
- //
- string tname = 7;
- //
- string track_id = 8;
- //
- string state = 9;
- //
- int32 converge_type = 10;
- //
- int64 aid = 11;
-}
-
-//
-message Avatar {
- //
- string cover = 1;
- //
- string text = 2;
- //
- string uri = 3;
- //
- int32 type = 4;
- //
- string event = 5;
- //
- string event_v2 = 6;
- //
- int32 defalut_cover = 7;
-}
-
-// 条目基本信息
-message Base {
- // 卡片类型
- string card_type = 1;
- // 卡片跳转类型?
- string card_goto = 2;
- // 跳转类型
- // av:视频稿件 mid:用户空间
- string goto = 3;
- // 目标参数
- string param = 4;
- // 封面url
- string cover = 5;
- // 标题
- string title = 6;
- // 跳转uri
- string uri = 7;
- //
- ThreePoint three_point = 8;
- //
- Args args = 9;
- //
- PlayerArgs player_args = 10;
- // 条目排位序号
- int64 idx = 11;
- //
- AdInfo ad_info = 12;
- //
- Mask mask = 13;
- //来源标识
- // recommend:推荐 operation:管理?
- string from_type = 14;
- //
- repeated ThreePointV2 three_point_v2 = 15;
- //
- repeated ThreePointV3 three_point_v3 = 16;
- //
- Button desc_button = 17;
- // 三点v4
- ThreePointV4 three_point_v4 = 18;
- //
- UpArgs up_args = 19;
-}
-
-// 按钮信息
-message Button {
- // 文案
- string text = 1;
- // 参数
- string param = 2;
- //
- string uri = 3;
- // 事件
- string event = 4;
- //
- int32 selected = 5;
- // 类型
- int32 type = 6;
- // 事件v2
- string event_v2 = 7;
- // 关系信息
- Relation relation = 8;
-}
-
-//
-message DislikeReason {
- //
- int64 id = 1;
- //
- string name = 2;
-}
-
-//
-message LikeButton {
- //
- int64 Aid = 1;
- //
- int32 count = 2;
- //
- bool show_count = 3;
- //
- string event = 4;
- //
- int32 selected = 5;
- //
- string event_v2 = 6;
-}
-
-//
-message Mask {
- //
- Avatar avatar = 1;
- //
- Button button = 2;
-}
-
-//
-message PlayerArgs {
- //
- int32 is_live = 1;
- //
- int64 aid = 2;
- //
- int64 cid = 3;
- //
- int32 sub_type = 4;
- //
- int64 room_id = 5;
- //
- int64 ep_id = 7;
- //
- int32 is_preview = 8;
- //
- string type = 9;
- //
- int64 duration = 10;
- //
- int64 season_id = 11;
-}
-
-// 标签框信息
-message ReasonStyle {
- // 文案
- string text = 1;
- // 文字颜色
- string text_color = 2;
- // 背景色
- string bg_color = 3;
- // 边框色
- string border_color = 4;
- // 图标url
- string icon_url = 5;
- // 文字颜色-夜间
- string text_color_night = 6;
- // 背景色-夜间
- string bg_color_night = 7;
- // 边框色-夜间
- string border_color_night = 8;
- // 图标url-夜间
- string icon_night_url = 9;
- // 背景风格id
- // 1:无背景 2:有背景
- int32 bg_style = 10;
- //
- string uri = 11;
- //
- string icon_bg_url = 12;
- //
- string event = 13;
- //
- string event_v2 = 14;
- //
- int32 right_icon_type = 15;
- //
- string left_icon_type = 16;
-}
-
-// 关系信息
-message Relation {
- // 关系状态
- int32 status = 1;
- // 是否关注
- int32 is_follow = 2;
- // 是否粉丝
- int32 is_followed = 3;
-}
-
-// 分享面板信息
-message SharePlane {
- // 标题
- string title = 1;
- // 副标贴文案
- string share_subtitle = 2;
- // 备注
- string desc = 3;
- // 封面url
- string cover = 4;
- // 稿件avid
- int64 aid = 5;
- // 稿件bvid
- string bvid = 6;
- // 允许分享方式
- map share_to = 7;
- // UP主昵称
- string author = 8;
- // UP主mid
- int64 author_id = 9;
- // 短连接
- string short_link = 10;
- // 播放次数文案
- string play_number = 11;
- //
- int64 first_cid = 12;
-}
-
-//
-message ThreePoint {
- //
- repeated DislikeReason dislike_reasons = 1;
- //
- repeated DislikeReason feedbacks = 2;
- //稍后再看
- int32 watch_later = 3;
-}
-
-//
-message ThreePointV2 {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- repeated DislikeReason reasons = 3;
- //
- string type = 4;
- //
- int64 id = 5;
-}
-
-//
-message ThreePointV3 {
- //
- string title = 1;
- //
- string selected_title = 2;
- //
- string subtitle = 3;
- //
- repeated DislikeReason reasons = 4;
- //
- string type = 5;
- //
- int64 id = 6;
- //
- int32 selected = 7;
- //
- string icon = 8;
- //
- string selected_icon = 9;
- //
- string url = 10;
- //
- int32 default_id = 11;
-}
-
-// 三点v4
-message ThreePointV4 {
- // 分享面板信息
- SharePlane share_plane = 1;
- // 稍后再看
- WatchLater watch_later = 2;
-}
-
-//
-message Up {
- //
- int64 id = 1;
- //
- string name = 2;
- //
- string desc = 3;
- //
- Avatar avatar = 4;
- //
- int32 official_icon = 5;
- //
- Button desc_button = 6;
- //
- string cooperation = 7;
-}
-
-//
-message UpArgs {
- //
- int64 up_id = 1;
- //
- string up_name = 2;
- //
- string up_face = 3;
- //
- int64 selected = 4;
-}
-
-// 稍后再看信息
-message WatchLater {
- // 稿件avid
- int64 aid = 1;
- // 稿件bvid
- string bvid = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/card/v1/double.proto b/bili-api-grpc/proto/bilibili/app/card/v1/double.proto
deleted file mode 100644
index 0fb4526b0..000000000
--- a/bili-api-grpc/proto/bilibili/app/card/v1/double.proto
+++ /dev/null
@@ -1,418 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.card.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/card/v1/common.proto";
-
-//
-message DoubleCards {
- oneof Card {
- //
- SmallCoverV2 small_cover_v2 = 1;
- //
- OnePicV2 one_pic_v2 = 2;
- //
- ThreePicV2 three_pic_v2 = 3;
- }
-}
-
-//
-message SmallCoverV2 {
- //
- Base base = 1;
- //
- string cover_gif = 2;
- //
- int32 cover_blur = 3;
- //
- string cover_left_text_1 = 4;
- //
- int32 cover_left_icon_1 = 5;
- //
- string cover_left_text_2 = 6;
- //
- int32 cover_left_icon_2 = 7;
- //
- string cover_right_text = 8;
- //
- int32 cover_right_icon = 9;
- //
- string cover_right_background_color = 10;
- //
- string subtitle = 11;
- //
- string badge = 12;
- //
- string rcmd_reason = 13;
- //
- string desc = 14;
- //
- Avatar avatar = 15;
- //
- int32 official_icon = 16;
- //
- int32 can_play = 17;
- //
- ReasonStyle rcmd_reason_style = 18;
- //
- ReasonStyle rcmd_reason_style_v2 = 19;
- //
- LikeButton like_button = 20;
-}
-
-//
-message SmallCoverV3 {
- //
- Base base = 1;
- //
- Avatar avatar = 2;
- //
- string cover_left_text = 3;
- //
- Button cover_right_button = 4;
- //
- string rcmd_reason = 5;
- //
- string desc = 6;
- //
- int32 official_icon = 7;
- //
- int32 can_play = 8;
- //
- ReasonStyle rcmd_reason_style = 9;
-}
-
-//
-message MiddleCoverV2 {
- //
- Base base = 1;
- //
- int32 ratio = 2;
- //
- string desc = 3;
- //
- string badge = 4;
-}
-
-//
-message LargeCoverV2 {
- //
- Base base = 1;
- //
- Avatar avatar = 2;
- //
- string badge = 3;
- //
- Button cover_right_button = 4;
- //
- string cover_left_text_1 = 5;
- //
- int32 cover_left_icon_1 = 6;
- //
- string cover_left_text_2 = 7;
- //
- int32 cover_left_icon_2 = 8;
- //
- string rcmd_reason = 9;
- //
- int32 official_icon = 10;
- //
- int32 can_play = 11;
- //
- ReasonStyle rcmd_reason_style = 12;
- //
- int32 show_top = 13;
- //
- int32 show_bottom = 14;
-}
-
-//
-message ThreeItemV2 {
- //
- Base base = 1;
- //
- int32 title_icon = 2;
- //
- string more_uri = 3;
- //
- string more_text = 4;
- //
- repeated ThreeItemV2Item items = 5;
-}
-
-//
-message ThreeItemV2Item {
- //
- Base base = 1;
- //
- int32 cover_left_icon = 2;
- //
- string desc_text_1 = 3;
- //
- int32 desc_icon_1 = 4;
- //
- string desc_text_2 = 5;
- //
- int32 desc_icon_2 = 6;
- //
- string badge = 7;
-}
-
-//
-message SmallCoverV4 {
- //
- Base base = 1;
- //
- string cover_badge = 2;
- //
- string desc = 3;
- //
- string title_right_text = 4;
- //
- int32 title_right_pic = 5;
-}
-
-//
-message TwoItemV2 {
- //
- Base base = 1;
- //
- repeated TwoItemV2Item items = 2;
-}
-
-message TwoItemV2Item {
- //
- Base base = 1;
- //
- string badge = 2;
- //
- string cover_left_text_1 = 3;
- //
- int32 cover_left_icon_1 = 4;
-}
-
-//
-message MultiItem {
- //
- Base base = 1;
- //
- string more_uri = 2;
- //
- string more_text = 3;
- //
- repeated DoubleCards items = 4;
-}
-
-//
-message ThreePicV2 {
- //
- Base base = 1;
- //
- string left_cover = 2;
- //
- string right_cover_1 = 3;
- //
- string right_cover_2 = 4;
- //
- string cover_left_text_1 = 5;
- //
- int32 cover_left_icon_1 = 6;
- //
- string cover_left_text_2 = 7;
- //
- int32 cover_left_icon_2 = 8;
- //
- string cover_right_text = 9;
- //
- int32 cover_right_icon = 10;
- //
- string cover_right_background_color = 11;
- //
- string badge = 12;
- //
- string rcmd_reason = 13;
- //
- string desc = 14;
- //
- Avatar avatar = 15;
- //
- ReasonStyle rcmd_reason_style = 16;
-}
-
-//
-message OnePicV2 {
- //
- Base base = 1;
- //
- int32 cover_left_icon_1 = 2;
- //
- string cover_left_text_2 = 3;
- //
- string cover_right_text = 4;
- //
- int32 cover_right_icon = 5;
- //
- string cover_right_background_color = 6;
- //
- string badge = 7;
- //
- string rcmd_reason = 8;
- //
- Avatar avatar = 9;
- //
- ReasonStyle rcmd_reason_style = 10;
-}
-
-//
-message LargeCoverV3 {
- //
- Base base = 1;
- //
- string cover_gif = 2;
- //
- Avatar avatar = 3;
- //
- ReasonStyle top_rcmd_reason_style = 4;
- //
- ReasonStyle bottom_rcmd_reason_style = 5;
- //
- string cover_left_text_1 = 6;
- //
- int32 cover_left_icon_1 = 7;
- //
- string cover_left_text_2 = 8;
- //
- int32 cover_left_icon_2 = 9;
- //
- string cover_right_text = 10;
- //
- string desc = 11;
- //
- int32 official_icon = 12;
-}
-
-//
-message ThreePicV3 {
- //
- Base base = 1;
- //
- string left_cover = 2;
- //
- string right_cover_1 = 3;
- //
- string right_cover_2 = 4;
- //
- string cover_left_text_1 = 5;
- //
- int32 cover_left_icon_1 = 6;
- //
- string cover_left_text_2 = 7;
- //
- int32 cover_left_icon_2 = 8;
- //
- string cover_right_text = 9;
- //
- int32 cover_right_icon = 10;
- //
- string cover_right_background_color = 11;
- //
- string badge = 12;
- //
- ReasonStyle rcmd_reason_style = 13;
-}
-
-//
-message OnePicV3 {
- //
- Base base = 1;
- //
- string cover_left_text_1 = 2;
- //
- int32 cover_left_icon_1 = 3;
- //
- string cover_right_text = 4;
- //
- int32 cover_right_icon = 5;
- //
- string cover_right_background_color = 6;
- //
- string badge = 7;
- //
- ReasonStyle rcmd_reason_style = 8;
-}
-
-//
-message SmallCoverV7 {
- //
- Base base = 1;
- //
- string desc = 2;
-}
-
-//
-message SmallCoverV9 {
- //
- Base base = 1;
- //
- string cover_left_text_1 = 2;
- //
- int32 cover_left_icon_1 = 3;
- //
- string cover_left_text_2 = 4;
- //
- int32 cover_left_icon_2 = 5;
- //
- string cover_right_text = 6;
- //
- int32 cover_right_icon = 7;
- //
- int32 can_play = 8;
- //
- ReasonStyle rcmd_reason_style = 9;
- //
- Up up = 10;
- //
- ReasonStyle left_cover_badge_style = 11;
- //
- ReasonStyle left_bottom_rcmd_reason_style = 12;
-}
-
-//
-message SmallCoverConvergeV2 {
- //
- Base base = 1;
- //
- string cover_left_text_1 = 2;
- //
- int32 cover_left_icon_1 = 3;
- //
- string cover_left_text_2 = 4;
- //
- int32 cover_left_icon_2 = 5;
- //
- string cover_right_text = 6;
- //
- string cover_right_top_text = 7;
- //
- ReasonStyle rcmd_reason_style = 8;
- //
- ReasonStyle rcmd_reason_style_v2 = 9;
-}
-
-//
-message SmallChannelSpecial {
- //
- Base base = 1;
- //
- string bg_cover = 2;
- //
- string desc_1 = 3;
- //
- string desc_2 = 4;
- //
- string badge = 5;
- //
- ReasonStyle rcmd_reason_style_2 = 6;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/card/v1/single.proto b/bili-api-grpc/proto/bilibili/app/card/v1/single.proto
deleted file mode 100644
index ebb5f4e3e..000000000
--- a/bili-api-grpc/proto/bilibili/app/card/v1/single.proto
+++ /dev/null
@@ -1,355 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.card.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/card/v1/common.proto";
-
-//
-message SmallCoverV5 {
- // 条目基本信息
- Base base = 1;
- //
- string cover_gif = 2;
- //
- Up up = 3;
- // 封面右下角标文案
- string cover_right_text_1 = 4;
- // 右侧文案1
- string right_desc_1 = 5;
- // 右侧文案2
- string right_desc_2 = 6;
- // 右侧推荐原因标签框
- ReasonStyle rcmd_reason_style = 7;
- //
- HotwordEntrance hotword_entrance = 8;
- // 直播小卡的角标
- ReasonStyle corner_mark_style = 9;
- // 右侧文案1图标id
- int32 right_icon_1 = 10;
- // 右侧文案2图标id
- int32 right_icon_2 = 11;
- // 左上角角标
- ReasonStyle left_corner_mark_style = 12;
- //
- string cover_right_text_content_description = 13;
- //
- string right_desc1_content_description = 14;
-}
-
-//
-message SmallCoverV5Ad {
- //
- Base base = 1;
- //
- string cover_gif = 2;
- //
- Up up = 3;
- //
- string cover_right_text1 = 4;
- //
- string right_desc1 = 5;
- //
- string right_desc2 = 6;
- //
- ReasonStyle rcmd_reason_style = 7;
- //
- HotwordEntrance hotword_entrance = 8;
- //
- ReasonStyle corner_mark_style = 9;
- //
- int32 right_icon1 = 10;
- //
- int32 right_icon2 = 11;
- //
- ReasonStyle left_corner_mark_style = 12;
- //
- string cover_right_text_content_description = 13;
- //
- string right_desc1_content_description = 14;
-}
-
-//
-message HotwordEntrance {
- //
- int64 hotword_id = 1;
- //
- string hot_text = 2;
- //
- string h5_url = 3;
- //
- string icon = 4;
-}
-
-//
-message LargeCoverV1 {
- // 条目基本信息
- Base base = 1;
- //
- string cover_gif = 2;
- //
- Avatar avatar = 3;
- //
- string cover_left_text_1 = 4;
- //
- string cover_left_text_2 = 5;
- //
- string cover_left_text_3 = 6;
- //
- string cover_badge = 7;
- //
- string top_rcmd_reason = 8;
- //
- string bottom_rcmd_reason = 9;
- //
- string desc = 10;
- //
- int32 official_icon = 11;
- //
- int32 can_play = 12;
- //
- ReasonStyle top_rcmd_reason_style = 13;
- //
- ReasonStyle bottom_rcmd_reason_style = 14;
- //
- ReasonStyle rcmd_reason_style_v2 = 15;
- //
- ReasonStyle left_cover_badge_style = 16;
- //
- ReasonStyle right_cover_badge_style = 17;
- //
- string cover_badge_2 = 18;
- //
- LikeButton like_button = 19;
- //
- int32 title_single_line = 20;
- //
- string cover_right_text = 21;
-}
-
-//
-message ThreeItemAllV2 {
- // 条目基本信息
- Base base = 1;
- //
- ReasonStyle top_rcmd_reason_style = 2;
- //
- repeated TwoItemHV1Item item = 3;
-}
-
-//
-message TwoItemHV1Item {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string uri = 3;
- //
- string param = 4;
- //
- Args args = 5;
- //
- string goto = 6;
- //
- string cover_left_text_1 = 7;
- //
- int32 cover_left_icon_1 = 8;
- //
- string cover_right_text = 9;
-}
-
-// 推荐
-message RcmdOneItem {
- // 条目基本信息
- Base base = 1;
- // 标签框信息
- ReasonStyle topRcmdReasonStyle = 2;
- // 小封面推荐内容信息
- SmallCoverRcmdItem item = 3;
-}
-
-// 小封面推荐内容信息
-message SmallCoverRcmdItem {
- // 标题
- string title = 1;
- // 封面url
- string cover = 2;
- // 跳转uri
- string uri = 3;
- // 参数
- string param = 4;
- // 跳转类型
- // av:视频稿件
- string goto = 5;
- // 封面右下角标文案
- string coverRightText1 = 6;
- // 右侧文案1
- string rightDesc1 = 7;
- // 右侧文案2
- string rightDesc2 = 8;
- //
- string coverGif = 9;
- // 右侧文案1图标id
- int32 rightIcon1 = 10;
- // 右侧文案2图标id
- int32 rightIcon2 = 11;
- //
- string cover_right_text_content_description = 12;
- //
- string right_desc1_content_description = 13;
-}
-
-//
-message ThreeItemV1 {
- // 条目基本信息
- Base base = 1;
- //
- int32 titleIcon = 2;
- //
- string moreUri = 3;
- //
- string moreText = 4;
- //
- repeated ThreeItemV1Item items = 5;
-}
-
-//
-message ThreeItemV1Item {
- // 条目基本信息
- Base base = 1;
- //
- string coverLeftText = 2;
- //
- int32 coverLeftIcon = 3;
- //
- string desc1 = 4;
- //
- string desc2 = 5;
- //
- string badge = 6;
-}
-
-//
-message HotTopicItem {
- //
- string cover = 1;
- //
- string uri = 2;
- //
- string param = 3;
- //
- string name = 4;
-}
-
-//
-message HotTopic {
- // 条目基本信息
- Base base = 1;
- //
- string desc = 2;
- //
- repeated HotTopicItem items = 3;
-}
-
-//
-message DynamicHot {
- // 条目基本信息
- Base base = 1;
- //
- string top_left_title = 2;
- //
- string desc1 = 3;
- //
- string desc2 = 4;
- //
- string more_uri = 5;
- //
- string more_text = 6;
- //
- repeated string covers = 7;
- //
- string cover_right_text = 8;
- //
- ReasonStyle top_rcmd_reason_style = 9;
-}
-
-//
-message MiddleCoverV3 {
- // 条目基本信息
- Base base = 1;
- //
- string desc1 = 2;
- //
- string desc2 = 3;
- //
- ReasonStyle cover_badge_style = 4;
-}
-
-//
-message LargeCoverV4 {
- // 条目基本信息
- Base base = 1;
- //
- string cover_left_text_1 = 2;
- //
- string cover_left_text_2 = 3;
- //
- string cover_left_text_3 = 4;
- //
- string cover_badge = 5;
- //
- int32 can_play = 6;
- //
- Up up = 7;
- //
- string short_link = 8;
- //
- string share_subtitle = 9;
- //
- string play_number = 10;
- //
- string bvid = 11;
- //
- string sub_param = 12;
-}
-
-// 热门列表顶部按钮
-message PopularTopEntrance {
- // 条目基本信息
- Base base = 1;
- // 按钮项
- repeated EntranceItem items = 2;
-}
-
-// 热门列表按钮信息
-message EntranceItem {
- // 跳转类型
- string goto = 1;
- // 图标url
- string icon = 2;
- // 标题
- string title = 3;
- // 入口模块id
- string module_id = 4;
- // 跳转uri
- string uri = 5;
- // 入口id
- int64 entrance_id = 6;
- // 气泡信息
- Bubble bubble = 7;
- // 入口类型
- // 1:代表分品类热门
- int32 entrance_type = 8;
-}
-
-// 气泡信息
-message Bubble {
- // 文案
- string bubble_content = 1;
- // 版本
- int32 version = 2;
- // 起始时间
- int64 stime = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/click/v1/heartbeat.proto b/bili-api-grpc/proto/bilibili/app/click/v1/heartbeat.proto
deleted file mode 100644
index bf8bba58d..000000000
--- a/bili-api-grpc/proto/bilibili/app/click/v1/heartbeat.proto
+++ /dev/null
@@ -1,123 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.click.v1;
-
-option java_multiple_files = true;
-
-service Click {
-
-}
-
-// 账户信息
-message AccountInfo {
- //
- uint64 mid = 1;
-}
-
-//
-message AppInfo {
- //
- string top_page_class = 1;
- // 客户端首次启动时的毫秒时间戳
- int64 ftime = 2;
- //
- string did = 3;
-}
-
-// 心跳补充信息
-message Extra {
- //
- string session = 1;
- //
- string refer = 2;
-}
-
-message HeartBeatReply {}
-
-//
-message HeartBeatReq {
- //
- string session_v2 = 1;
- //
- Stage stage = 2;
- // 流加载失败timeout
- uint64 stream_timeout = 3;
- //
- uint64 batch_frequency = 4;
- //
- float frequency = 5;
- //
- VideoMeta video_meta = 6;
- //
- AppInfo app_info = 7;
- //
- AccountInfo account_info = 8;
- //
- PreProcessResult pre_process_result = 9;
- //
- repeated PlayerStatus player_status = 10;
- //
- VideoInfo video_info = 11;
-}
-
-//
-message PlayerStatus {
- //
- float playback_rate = 1;
- //
- uint64 progress = 2;
- //
- PlayState play_state = 3;
- //
- bool is_buffering = 4;
-}
-
-//
-enum PlayState {
- //
- STATE_UNKNOWN = 0;
- //
- PREPARING = 1;
- //
- PREPARED = 2;
- //
- PLAYING = 3;
- //
- PAUSED = 4;
- //
- STOPPED = 5;
- //
- FAILED = 6;
-}
-
-//
-message PreProcessResult {
- //
- int64 vt = 1;
-}
-
-//
-enum Stage {
- //
- STAGE_UNKNOWN = 0;
- //
- START = 1;
- //
- END = 2;
- //
- SAMPLE = 3;
-}
-
-//
-message VideoInfo {
- //
- uint64 cid_duration = 1;
-}
-
-//
-message VideoMeta {
- //
- uint64 aid = 1;
- //
- uint64 cid = 2;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/experimental.proto b/bili-api-grpc/proto/bilibili/app/distribution/setting/experimental.proto
deleted file mode 100644
index 6d94e24e6..000000000
--- a/bili-api-grpc/proto/bilibili/app/distribution/setting/experimental.proto
+++ /dev/null
@@ -1,67 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.distribution.setting.experimental;
-
-option java_multiple_files = true;
-
-import "bilibili/app/distribution/v1/distribution.proto";
-
-//
-message DynamicSelect {
- //
- bilibili.app.distribution.v1.BoolValue fold = 1;
-}
-
-//
-message Exp {
- //
- bilibili.app.distribution.v1.Int64Value id = 1;
- //
- bilibili.app.distribution.v1.Int32Value bucket = 2;
-}
-
-//
-message ExperimentalConfig {
- //
- bilibili.app.distribution.v1.StringValue flag = 1;
- //
- repeated Exp exps = 2;
-}
-
-//
-message MultipleTusConfig {
- //
- TopLeft top_left = 1;
- //
- DynamicSelect dynamic_select = 2;
-}
-
-// APP首页头像跳转信息
-message TopLeft {
- //
- bilibili.app.distribution.v1.StringValue url = 1;
- //
- bilibili.app.distribution.v1.StringValue story_foreground_image = 2;
- //
- bilibili.app.distribution.v1.StringValue story_background_image = 3;
- //
- bilibili.app.distribution.v1.StringValue listen_foreground_image = 4;
- //
- bilibili.app.distribution.v1.StringValue listen_background_image = 5;
- //
- bilibili.app.distribution.v1.StringValue ios_story_foreground_image = 6;
- //
- bilibili.app.distribution.v1.StringValue ios_story_background_image = 7;
- //
- bilibili.app.distribution.v1.StringValue ios_listen_foreground_image = 8;
- //
- bilibili.app.distribution.v1.StringValue ios_listen_background_image = 9;
- //
- bilibili.app.distribution.v1.StringValue goto = 10;
- //
- bilibili.app.distribution.v1.StringValue url_v2 = 11;
- //
- bilibili.app.distribution.v1.Int64Value goto_v2 = 12;
- //
- bilibili.app.distribution.v1.StringValue badge = 13;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/other.proto b/bili-api-grpc/proto/bilibili/app/distribution/setting/other.proto
deleted file mode 100644
index 94e3d88d8..000000000
--- a/bili-api-grpc/proto/bilibili/app/distribution/setting/other.proto
+++ /dev/null
@@ -1,27 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.distribution.setting.other;
-
-option java_multiple_files = true;
-
-import "bilibili/app/distribution/v1/distribution.proto";
-
-//
-message OtherSettingsConfig {
- //
- bilibili.app.distribution.v1.Int64Value watermark_type = 1;
- //
- bilibili.app.distribution.v1.Int64Value web_image_quality_type = 2;
- //
- bilibili.app.distribution.v1.BoolValue enable_read_pasteboard = 3;
- //
- bilibili.app.distribution.v1.BoolValue paste_auto_jump = 4;
- //
- bilibili.app.distribution.v1.BoolValue mini_screen_play_when_back = 5;
- //
- bilibili.app.distribution.v1.BoolValue enable_resume_playing = 6;
- //
- bilibili.app.distribution.v1.BoolValue enable_wifi_auto_update = 7;
- //
- bilibili.app.distribution.v1.BoolValue enable_guide_screenshot_share = 8;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/pegasus.proto b/bili-api-grpc/proto/bilibili/app/distribution/setting/pegasus.proto
deleted file mode 100644
index 36dff2def..000000000
--- a/bili-api-grpc/proto/bilibili/app/distribution/setting/pegasus.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.distribution.setting.pegasus;
-
-option java_multiple_files = true;
-
-import "bilibili/app/distribution/v1/distribution.proto";
-
-//
-message FeedModeValue {
- //
- bilibili.app.distribution.v1.Int64Value value = 1;
-}
-
-//
-message PegasusAutoPlay {
- //
- bilibili.app.distribution.v1.Int64Value single = 1;
- //
- bilibili.app.distribution.v1.Int64Value double = 2;
- //
- bilibili.app.distribution.v1.BoolValue single_affected_by_server_side = 3;
- //
- bilibili.app.distribution.v1.BoolValue double_affected_by_server_side = 4;
-}
-
-//
-message PegasusColumnValue {
- //
- bilibili.app.distribution.v1.Int64Value value = 1;
- //
- bilibili.app.distribution.v1.BoolValue affected_by_server_side = 2;
-}
-
-//
-message PegasusDeviceConfig {
- //
- PegasusColumnValue column = 1;
- //
- FeedModeValue mode = 2;
- //
- PegasusAutoPlay auto_play = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/play.proto b/bili-api-grpc/proto/bilibili/app/distribution/setting/play.proto
deleted file mode 100644
index 29e819239..000000000
--- a/bili-api-grpc/proto/bilibili/app/distribution/setting/play.proto
+++ /dev/null
@@ -1,60 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.distribution.setting.play;
-
-option java_multiple_files = true;
-
-import "bilibili/app/distribution/v1/distribution.proto";
-
-// 云端保存的播放器配置
-message CloudPlayConfig {
- // 启用杜比全景声
- bilibili.app.distribution.v1.BoolValue enable_panorama = 1;
- // 启用杜比音效
- bilibili.app.distribution.v1.BoolValue enable_dolby = 2;
- // 启用震动
- bilibili.app.distribution.v1.BoolValue enable_shake = 3;
- // 启用后台播放
- bilibili.app.distribution.v1.BoolValue enable_background = 4;
- // 启用HIRES
- bilibili.app.distribution.v1.BoolValue enable_loss_less = 5;
-}
-
-// 播放器策略配置
-message PlayConfig {
- //
- bilibili.app.distribution.v1.BoolValue should_auto_play = 1;
- //
- bilibili.app.distribution.v1.BoolValue should_auto_fullscreen = 2;
- //
- bilibili.app.distribution.v1.BoolValue enable_playurl_https = 3;
- //
- bilibili.app.distribution.v1.BoolValue enable_danmaku_interaction = 4;
- //
- bilibili.app.distribution.v1.Int64Value small_screen_status = 5;
- //
- bilibili.app.distribution.v1.Int64Value player_codec_mode_key = 6;
- //
- bilibili.app.distribution.v1.BoolValue enable_gravity_rotate_screen = 7;
- //
- bilibili.app.distribution.v1.BoolValue enable_danmaku_monospaced = 8;
- //
- bilibili.app.distribution.v1.BoolValue enable_edit_subtitle = 9;
- //
- bilibili.app.distribution.v1.BoolValue enable_subtitle = 10;
- //
- bilibili.app.distribution.v1.Int64Value color_filter = 11;
- //
- bilibili.app.distribution.v1.BoolValue should_auto_story = 12;
- //
- bilibili.app.distribution.v1.BoolValue landscape_auto_story = 13;
- //
- bilibili.app.distribution.v1.BoolValue volume_balance = 14;
-}
-
-// 灰度测试特殊功能?
-message SpecificPlayConfig {
- //
- bilibili.app.distribution.v1.BoolValue enable_segmented_section = 1;
-}
-
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/v1/distribution.proto b/bili-api-grpc/proto/bilibili/app/distribution/v1/distribution.proto
deleted file mode 100644
index 353919bb8..000000000
--- a/bili-api-grpc/proto/bilibili/app/distribution/v1/distribution.proto
+++ /dev/null
@@ -1,160 +0,0 @@
-syntax = "proto3";
-
-import "google/protobuf/any.proto";
-
-package bilibili.app.distribution.v1;
-
-option java_multiple_files = true;
-
-// APP配置
-service Distribution {
- // 获取云端储存的用户偏好
- rpc GetUserPreference (GetUserPreferenceReq) returns (GetUserPreferenceReply);
- // 设定用户偏好
- rpc SetUserPreference (SetUserPreferenceReq) returns (SetUserPreferenceReply);
- // 获取云控配置
- rpc UserPreference (UserPreferenceReq) returns (UserPreferenceReply);
-}
-
-//
-message GetUserPreferenceReq {
- //
- repeated string type_url = 1;
- //
- map extra_context = 2;
-}
-
-//
-message GetUserPreferenceReply {
- // 对应 GetUserPreferenceReq 的请求的类型
- repeated google.protobuf.Any value = 1;
-}
-
-//
-message SetUserPreferenceReq {
- //
- repeated google.protobuf.Any preference = 1;
- //
- map extra_context = 2;
-}
-
-//
-message SetUserPreferenceReply {}
-
-//
-message UserPreferenceReq {}
-
-// 云控配置下发
-message UserPreferenceReply {
- // 具体解码需要根据实际请求 type_url 来判断
- repeated google.protobuf.Any preference = 1;
-}
-
-//
-message BoolValue {
- //
- bool value = 1;
- //
- int64 last_modified = 2;
- //
- bool default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message BytesValue {
- //
- bytes value = 1;
- //
- int64 last_modified = 2;
- //
- bytes default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message DoubleValue {
- //
- double value = 1;
- //
- int64 last_modified = 2;
- //
- double default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message FloatValue {
- //
- float value = 1;
- //
- int64 last_modified = 2;
- //
- float default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message Int32Value {
- //
- int32 value = 1;
- //
- int64 last_modified = 2;
- //
- int32 default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message Int64Value {
- //
- int64 value = 1;
- //
- int64 last_modified = 2;
- //
- int64 default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message StringValue {
- //
- string value = 1;
- //
- int64 last_modified = 2;
- //
- string default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message UInt32Value {
- //
- uint32 value = 1;
- //
- int64 last_modified = 2;
- //
- uint32 default_value = 3;
- //
- string exp = 4;
-}
-
-//
-message UInt64Value {
- //
- uint64 value = 1;
- //
- int64 last_modified = 2;
- //
- uint64 default_value = 3;
- //
- string exp = 4;
-}
-
diff --git a/bili-api-grpc/proto/bilibili/app/dynamic/common/dynamic.proto b/bili-api-grpc/proto/bilibili/app/dynamic/common/dynamic.proto
deleted file mode 100644
index 4a720df75..000000000
--- a/bili-api-grpc/proto/bilibili/app/dynamic/common/dynamic.proto
+++ /dev/null
@@ -1,23 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.dynamic.common;
-
-option java_multiple_files = true;
-
-//
-message ItemWHRatio {
- //
- int32 ratio = 1;
- //
- int32 width = 2;
- //
- int32 height = 3;
-}
-
-//
-enum WHRatio {
- W_H_RATIO_1_1 = 0;
- W_H_RATIO_16_9 = 1;
- W_H_RATIO_3_4 = 2;
- W_H_RATIO_CUSTOM = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/dynamic/v1/dynamic.proto b/bili-api-grpc/proto/bilibili/app/dynamic/v1/dynamic.proto
deleted file mode 100644
index 3dcaaaa9d..000000000
--- a/bili-api-grpc/proto/bilibili/app/dynamic/v1/dynamic.proto
+++ /dev/null
@@ -1,1391 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.dynamic.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/archive/middleware/v1/preload.proto";
-
-// v1动态
-service Dynamic {
- // 动态视频页
- rpc DynVideo (DynVideoReq) returns (DynVideoReqReply);
- // 批量动态id获取动态详情
- rpc DynDetails (DynDetailsReq) returns (DynDetailsReply);
- // 小视频连播页
- rpc SVideo (SVideoReq) returns (SVideoReply);
- // 动态tab页
- rpc DynTab (DynTabReq) returns (DynTabReply);
- // 同城接口开关
- rpc DynOurCitySwitch (DynOurCitySwitchReq) returns (NoReply);
- // 动态同城页
- rpc DynOurCity(DynOurCityReq) returns (DynOurCityReply);
- // 最近访问-个人视频feed流
- rpc DynVideoPersonal(DynVideoPersonalReq) returns (DynVideoPersonalReply);
- // 最近访问-标记已读
- rpc DynUpdOffset(DynUpdOffsetReq) returns (NoReply);
- // 动态红点接口
- rpc DynRed(DynRedReq) returns(DynRedReply);
- // 查看更多-列表
- rpc DynMixUpListViewMore(NoReq) returns (DynMixUpListViewMoreReply);
- // 查看更多-搜索
- rpc DynMixUpListSearch(DynMixUpListSearchReq) returns (DynMixUpListSearchReply);
- // 同城点击上报
- rpc OurCityClickReport(OurCityClickReportReq) returns (OurCityClickReportReply);
- // 位置定位
- rpc GeoCoder(GeoCoderReq) returns (GeoCoderReply);
-}
-
-// 地址部件
-message AddressComponent {
- // 国家
- string nation = 1;
- // 省
- string province = 2;
- // 市
- string city = 3;
- // 区,可能为空字串
- string district = 4;
- // 街道,可能为空字串
- string street = 5;
- // 门牌,可能为空字串
- string street_number = 6;
-}
-
-// 行政区划信息
-message AdInfo {
- // 国家代码(ISO3166标准3位数字码)
- string nation_code = 1;
- // 行政区划代码,规则详见:行政区划代码说明
- string adcode = 2;
- // 城市代码,由国家码+行政区划代码(提出城市级别)组合而来,总共为9位
- string city_code = 3;
- // 行政区划名称
- string name = 4;
- // 行政区划中心点坐标
- Gps gps = 5;
-}
-
-//
-enum BgType {
- bg_type_default = 0; //
- bg_type_face = 1; //
-}
-
-// 付费课程批次卡
-message CardCurrBatch {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 跳转地址
- string uri = 3;
- // 展示项 1(本集标题)
- string text_1 = 4;
- // 展示项 2(更新了多少个视频)
- string text_2 = 5;
- // 角标
- VideoBadge badge = 6;
-}
-
-// 付费课程系列卡
-message CardCurrSeason {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 跳转地址
- string uri = 3;
- // 展示项 1(更新信息)
- string text_1 = 4;
- // 描述信息
- string desc = 5;
- // 角标
- VideoBadge badge = 6;
-}
-
-// PGC视频卡片数据
-message CardPGC {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // cid
- int64 cid = 7;
- // season_id
- int64 season_id = 8;
- // epid
- int64 epid = 9;
- // aid
- int64 aid = 10;
- // 视频源类型
- MediaType media_type = 11;
- // 番剧类型
- VideoSubType sub_type = 12;
- // 番剧是否为预览视频 0:否,1:是
- int32 is_preview = 13;
- // 尺寸信息
- Dimension dimension = 14;
- // 角标
- repeated VideoBadge badge = 15;
- // 是否能够自动播放
- int32 can_play= 16;
- // PGC单季信息
- PGCSeason season = 17;
-}
-
-// UGC视频卡片数据
-message CardUGC {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // avid
- int64 avid = 7;
- // cid
- int64 cid = 8;
- // 视频源类型
- MediaType media_type = 9;
- // 尺寸信息
- Dimension dimension = 10;
- // 角标
- repeated VideoBadge badge = 11;
- // 是否能够自动播放
- int32 can_play= 12;
-}
-
-//
-enum CornerType {
- corner_type_none = 0; //
- corner_type_text = 1; //
- corner_type_animation = 2; //
-}
-
-// 粉丝样式
-message DecoCardFan {
- // 是否是粉丝
- int32 is_fan = 1;
- // 数量
- int32 number = 2;
- // 颜色
- string color = 3;
-}
-
-// 装扮卡片
-message DecorateCard {
- // 装扮卡片id
- int64 id = 1;
- // 装扮卡片链接
- string card_url = 2;
- // 装扮卡片点击跳转链接
- string jump_url = 3;
- // 粉丝样式
- DecoCardFan fan = 4;
-}
-
-// 文本描述
-message Description {
- // 文本内容
- string text = 1;
- // 文本类型
- string type = 2;
- // 点击跳转链接
- string uri = 3;
- // emoji类型
- string emoji_type = 4;
- // 商品类型
- string goods_type = 5;
-}
-
-// 尺寸信息
-message Dimension {
- //
- int64 height = 1;
- //
- int64 width = 2;
- //
- int64 rotate = 3;
-}
-
-// 动态卡片项
-message DynamicItem {
- // 卡片类型
- // forward:转发 av:稿件视频 fold:折叠 pgc:pgc内容 courses:付费视频 upList:最近访问列表 followList:我的追番列表
- string card_type = 1;
- // 转发类型下,items的类型
- string item_type = 2;
- // 模块内容
- repeated Module modules = 3;
- // 动态ID str
- string dyn_id_str = 4;
- // 转发动态ID str
- string orig_dyn_id_str = 5;
- // r_type
- int32 r_type = 6;
- // 该卡片下面是否含有折叠卡
- int32 has_fold = 7;
-}
-
-// 批量动态id获取动态详情返回值
-message DynDetailsReply {
- // 动态列表
- repeated DynamicItem list = 1;
-}
-
-// 批量动态id获取动态详情请求参数
-message DynDetailsReq {
- // 青少年模式
- int32 teenagers_mode = 1;
- // 动态id
- string dynamic_ids = 2;
- // 清晰度
- int32 qn = 3;
- // 流版本
- int32 fnver = 4;
- // 流功能
- int32 fnval = 5;
- // 是否强制使用域名
- int32 force_host = 6;
- // 是否4k
- int32 fourk = 7;
-}
-
-// 查看更多-搜索-响应
-message DynMixUpListSearchReply {
- //
- repeated MixUpListItem items = 1;
-}
-
-// 查看更多-搜索-请求
-message DynMixUpListSearchReq {
- //
- string name = 1;
-}
-
-// 查看更多-列表-响应
-message DynMixUpListViewMoreReply {
- // 关注up主列表信息
- repeated MixUpListItem items = 1;
- // 默认搜索文案
- string search_default_text = 2;
-}
-
-// 动态同城物料
-message DynOurCityItem {
- // 卡片类型
- // av:稿件 draw:图文
- string card_type = 1;
- // 动态ID
- int64 dyn_id = 2;
- // 跳转地址
- string uri = 3;
- // 模块列表
- repeated DynOurCityModule modules = 4;
- // 资源ID
- int64 rid = 5;
- // 透传服务端魔镜参数
- string debug_info = 6;
-}
-
-// 动态同城物料模块
-message DynOurCityModule {
- // 类型
- // cover:封面 desc:描述 author:发布人 extend:扩展部分
- string module_type = 1;
- //
- oneof module_item {
- // 封面
- DynOurCityModuleCover module_cover = 2;
- // 描述
- DynOurCityModuleDesc module_desc = 3;
- // 发布人
- DynOurCityModuleAuthor module_author = 4;
- // 扩展部分
- DynOurCityModuleExtend module_extend = 5;
- }
-}
-
-// 动态同城物料-发布人模块
-message DynOurCityModuleAuthor {
- // 用户Mid
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- // 用户头像
- string face = 3;
- // 跳转地址
- string uri = 4;
-}
-
-// 动态同城物料-封面模块
-message DynOurCityModuleCover {
- // 封面图 单图样式取第一个元素
- repeated string covers = 1;
- // 封面样式
- // 1:横图 2:竖图 3:方图
- int32 style = 2;
- // 视频封面展示项图标 1
- int32 cover_left_icon_1 = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项图标 2
- int32 cover_left_icon_2 = 5;
- // 视频封面展示项 2
- string cover_left_text_2 = 6;
- // 封面视频展示项 3
- string cover_left_text_3 = 7;
- // 角标
- repeated VideoBadge badge = 8;
-}
-
-// 动态同城物料-描述模块
-message DynOurCityModuleDesc {
- // 描述信息
- string desc = 1;
-}
-
-// 动态同城物料-扩展部分模块
-message DynOurCityModuleExtend {
- // 类型
- string type = 1;
- oneof extend {
- // LBS模块
- DynOurCityModuleExtendLBS extend_lbs = 2;
- }
-}
-
-// 动态同城物料extent-LBS模块
-message DynOurCityModuleExtendLBS {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // poiType
- int32 poi_type = 4;
-}
-
-// 动态同城-响应
-message DynOurCityReply {
- // 翻页游标
- string offset = 1;
- // 是否还有更多数据
- // 1:有
- int32 has_more = 2;
- // 样式类型
- // 1:双列 2:瀑布流
- int32 style = 3;
- // 顶导信息
- string top_label = 4;
- // 列表详情
- repeated DynOurCityItem list = 5;
- // 顶导按钮信息
- string top_button_label = 6;
- // 城市ID
- int32 city_id = 7;
- // 城市名
- string city_name = 8;
-}
-
-// 动态同城页-请求
-message DynOurCityReq {
- // 城市ID
- int64 city_id = 1;
- // 纬度
- double lat = 2;
- // 经度
- double lng = 3;
- // 透传上一次接口请求返回的offset
- string offset = 4;
- // 每页元素个数
- int32 page_size = 5;
- // 青少年模式
- // 1:开启青少年模式
- int32 teenagers_mode = 6;
- // 清晰度(旧版)
- int32 qn = 7;
- // 流版本(旧版)
- int32 fnver = 8;
- // 流类型(旧版)
- int32 fnval = 9;
- // 是否强制使用域名(旧版)
- int32 force_host = 10;
- // 是否4k(旧版)
- int32 fourk = 11;
- // 是否开启lbs
- // 0:关闭 1:开启
- int32 lbs_state = 12;
- // 是否刷新城市
- uint32 refresh_city = 13;
- // 魔镜设置
- ExpConf exp_conf = 14;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 15;
- // 城市码
- int64 city_code = 16;
- // 构建时间
- int64 build_time = 17;
-}
-
-// 动态同城开关-请求
-message DynOurCitySwitchReq {
- // 开关参数
- // 0:关闭 1:开启
- int32 switch = 1;
-}
-
-// 红点接口物料
-message DynRedItem {
- // 数字红点有效 更新数
- uint64 count = 1;
-}
-
-// 红点接口-响应
-message DynRedReply {
- // 类型
- // count:数字红点 point:普通红点 no_point:没有红点
- string red_type = 1;
- // 红点具体信息
- DynRedItem dyn_red_item = 2;
- // 默认tab 值对应tab接口下发的anchor
- string default_tab = 3;
- //
- DynRedStyle red_style = 4;
-}
-
-// 动态红点接口-请求
-message DynRedReq {
- // 动态红点接口各tab offset信息
- repeated TabOffset tab_offset = 1;
-}
-
-//
-message DynRedStyle {
- //
- int32 bg_type = 1;
- //
- int32 corner_type = 2;
- //
- int32 display_time = 3;
- //
- string corner_mark = 4;
- //
- DynRedStyleUp up = 5;
- //
- int32 type = 6;
-}
-
-//
-message DynRedStyleUp {
- //
- int64 uid = 1;
- //
- string face = 2;
-}
-
-// 动态tab详情
-message DynTab {
- // tab标题 优先展示用,未开启状态第一次请求返回同城,后续请求返回对应城市名
- string title = 1;
- // 跳转链接
- string uri = 2;
- // 气泡内容
- string bubble = 3;
- // 是否推红点
- int32 red_point = 4;
- // 城市ID
- int64 city_id = 5;
- // 是否弹窗
- int32 is_popup = 6;
- // 弹窗内容
- Popup popup = 7;
- // 是否默认tab
- bool defaultTab = 8;
- // 副标题 对应城市名
- string sub_title = 9;
- // 锚点字段
- string anchor = 10;
- // 内测文案
- string internal_test = 11;
-}
-
-// 动态tab页-响应
-message DynTabReply {
- // 动态tab详情列表
- repeated DynTab dyn_tab = 1;
-}
-
-// 动态tab页-请求
-message DynTabReq {
- // 青少年模式
- // 1:开启青少年模式
- int32 teenagers_mode = 1;
-}
-
-// 最近访问-标记已读-请求
-message DynUpdOffsetReq {
- // 被访问者的UID
- int64 host_uid = 1;
- // 用户已读进度
- string read_offset = 2;
-}
-
-// 最近访问-个人feed流列表-响应
-message DynVideoPersonalReply {
- // 动态列表
- repeated DynamicItem list = 1;
- // 偏移量
- string offset = 2;
- // 是否还有更多数据
- int32 has_more = 3;
- // 已读进度
- string read_offset = 4;
-}
-
-// 最近访问-个人feed流列表-请求
-message DynVideoPersonalReq {
- // 青少年模式
- // 1:开启青少年模式
- int32 teenagers_mode = 1;
- // 被访问者的mid
- int64 host_uid = 2;
- // 偏移量 第一页可传空
- string offset = 3;
- // 标明下拉几次
- int32 page = 4;
- // 是否是预加载
- int32 is_preload = 5;
- // 清晰度
- int32 qn = 6;
- // 流版本
- int32 fnver = 7;
- // 流类型
- int32 fnval = 8;
- // 是否强制使用域名
- int32 force_host = 9;
- // 是否4k
- int32 fourk = 10;
-}
-
-// 动态视频页-请求
-message DynVideoReq {
- // 青少年模式
- int32 teenagers_mode = 1;
- // 透传 update_baseline
- string update_baseline = 2;
- // 透传 history_offset
- string offset = 3;
- // 向下翻页数
- int32 page = 4;
- // 刷新方式
- // 1:向上刷新 2:向下翻页
- int32 refresh_type = 5;
- // 清晰度
- int32 qn = 6;
- // 流版本
- int32 fnver = 7;
- // 流类型
- int32 fnval = 8;
- // 是否强制使用域名
- int32 force_host = 9;
- // 是否4K
- int32 fourk = 10;
-}
-
-// 动态视频页-响应
-message DynVideoReqReply {
- // 动态列表
- repeated DynamicItem list = 1;
- // 更新的动态数
- int32 update_num = 2;
- // 历史偏移
- string history_offset = 3;
- // 更新基础信息
- string update_baseline = 4;
- // 是否还有更多数据
- int32 has_more = 5;
-}
-
-// 魔镜实验配置项
-message Exp {
- // 实验名
- string exp_name = 1;
- // 实验组
- string exp_group = 2;
-}
-
-// 魔镜设置
-message ExpConf {
- // 是否是魔镜请求
- int32 exp_enable = 1;
- // 实验配置
- repeated Exp exps = 2;
-}
-
-// 拓展
-message Extend {
- // 类型
- // topic:话题小卡 lbs:lbs hot:热门视频 game:游戏
- string type = 1;
- // 卡片详情
- oneof extend {
- // 话题小卡
- ExtInfoTopic ext_info_topic = 2;
- // lbs
- ExtInfoLBS ext_info_lbs = 3;
- // 热门视频
- ExtInfoHot ext_info_hot = 4;
- // 游戏
- ExtInfoGame ext_info_game = 5;
- }
-}
-
-// 拓展信息-游戏小卡
-message ExtInfoGame {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 拓展信息-热门视频
-message ExtInfoHot {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 拓展信息-lbs
-message ExtInfoLBS {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // poiType
- int32 poi_type = 4;
-}
-
-// 拓展信息-话题小卡
-message ExtInfoTopic {
- // 标题-话题名
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 折叠分类
-enum FoldType {
- FoldTypeZero = 0; // 占位
- FoldTypePublish = 1; // 用户发布折叠
- FoldTypeFrequent = 2; // 转发超频折叠
- FoldTypeUnite = 3; // 联合投稿折叠
- FoldTypeLimit = 4; // 动态受限折叠
-}
-
-// 我的追番列表Item
-message FollowListItem {
- // season_id
- int32 season_id = 1;
- // 标题
- string title = 2;
- // 封面图
- string cover = 3;
- // 跳转链接
- string url = 4;
- // 最新ep
- NewEP new_ep = 5;
-}
-
-// 位置定位-响应
-message GeoCoderReply {
- // 以行政区划+道路+门牌号等信息组成的标准格式化地址
- string address = 1;
- // 地址部件,address不满足需求时可自行拼接
- AddressComponent address_component = 2;
- // 行政区划信息
- AdInfo ad_info = 3;
-}
-
-// 位置定位-请求
-message GeoCoderReq {
- // 纬度
- double lat = 1;
- // 经度
- double lng = 2;
- // 页面来源
- string from = 3;
-}
-
-// 行政区划中心点坐标
-message Gps {
- // 纬度
- double lat = 1;
- // 经度
- double lng = 2;
-}
-
-// 点赞动画
-message LikeAnimation {
- // 开始动画
- string begin = 1;
- // 过程动画
- string proc = 2;
- // 结束动画
- string end = 3;
- // id
- int64 like_icon_id = 4;
-}
-
-// 点赞拓展信息
-message LikeInfo {
- // 点赞动画
- LikeAnimation animation = 1;
- // 是否点赞
- int32 is_like = 2;
-}
-
-// 点赞用户
-message LikeUser {
- // 用户mid
- int64 uid = 1;
- // 用户昵称
- string uname = 2;
- // 点击跳转链接
- string uri = 3;
-}
-
-// 直播信息
-message LiveInfo {
- // 是否在直播
- // 0:未直播 1:正在直播
- int32 is_living = 1;
- // 跳转链接
- string uri = 2;
-}
-
-// 播放器类型
-enum MediaType {
- MediaTypeNone = 0; // 本地
- MediaTypeUGC = 1; // UGC
- MediaTypePGC = 2; // PGC
- MediaTypeLive = 3; // 直播
- MediaTypeVCS = 4; // 小视频
-}
-
-// 查看更多-列表单条数据
-message MixUpListItem {
- // 用户mid
- int64 uid = 1;
- // 特别关注
- // 0:否 1:是
- int32 special_attention = 2;
- // 小红点状态
- // 0:没有 1:有
- int32 reddot_state = 3;
- // 直播信息
- MixUpListLiveItem live_info = 4;
- // 昵称
- string name = 5;
- // 头像
- string face = 6;
- // 认证信息
- OfficialVerify official = 7;
- // 大会员信息
- VipInfo vip = 8;
- // 关注状态
- Relation relation = 9;
- //
- int32 premiere_state = 10;
- //
- string uri = 11;
-}
-
-// 直播信息
-message MixUpListLiveItem {
- // 直播状态
- // 0:未直播 1:直播中
- bool status = 1;
- // 房间号
- int64 room_id = 2;
- // 跳转地址
- string uri = 3;
-}
-
-// 模块
-message Module {
- // 类型
- // fold:折叠 author:发布人 dynamic:动态卡片内容 state:计数信息 forward:转发 extend:小卡信息 dispute:争议小黄条 desc:描述信息
- // likeUser:点赞用户 upList:最近访问列表 followList:我的追番
- string module_type = 1;
- oneof module_item{
- // 折叠
- ModuleFold module_fold = 2;
- // 发布人
- ModuleAuthor module_author = 3;
- // 动态卡片内容
- ModuleDynamic module_dynamic = 4;
- // 计数信息
- ModuleState module_state = 5;
- // 转发
- ModuleForward module_forward = 6;
- // 小卡信息
- ModuleExtend module_extend = 7;
- // 争议小黄条
- ModuleDispute module_dispute = 8;
- // 描述信息
- ModuleDesc module_desc = 9;
- // 点赞用户
- ModuleLikeUser module_likeUser= 10;
- // 最近访问列表
- ModuleDynUpList module_upList = 11;
- // 我的追番
- ModuleFollowList module_followList = 12;
- }
-}
-
-// 作者信息模块
-message ModuleAuthor {
- // 用户mid
- int64 id = 1;
- // 时间标签
- string ptime_label_text = 2;
- // 用户详情
- UserInfo author = 3;
- // 装扮卡片
- DecorateCard decorate_card = 4;
-}
-
-// 文本内容模块
-message ModuleDesc {
- // 文本描述
- repeated Description desc = 1;
-}
-
-// 争议小黄条模块
-message ModuleDispute {
- // 标题
- string title = 1;
- // 描述内容
- string desc = 2;
- // 跳转链接
- string uri = 3;
-}
-
-// 动态详情模块
-message ModuleDynamic {
- // 卡片类型
- // ugc:ugc卡 pgc:pgc卡 currSeason:付费课程系列 currBatch:付费课程批次
- string card_type = 1;
- // 正文卡片
- oneof card {
- // ugc卡
- CardUGC card_ugc = 2;
- // pgc卡
- CardPGC card_pgc = 3;
- // 付费课程系列
- CardCurrSeason card_curr_season = 4;
- // 付费课程批次
- CardCurrBatch card_curr_batch = 5;
- }
-}
-
-// 最近访问up主列表
-message ModuleDynUpList {
- // 标题展示文案
- string module_title = 1;
- // “全部”按钮文案
- string show_all = 2;
- // up主列表
- repeated UpListItem list = 3;
-}
-
-// 拓展信息
-message ModuleExtend {
- // 拓展
- repeated Extend extend = 1;
-}
-
-// 折叠模块
-message ModuleFold {
- // 折叠分类(该字段废弃)
- int32 fold_type = 1;
- // 折叠文案
- string text = 2;
- // 被折叠的动态
- string fold_ids = 3;
- // 被折叠的用户信息
- repeated UserInfo fold_users = 4;
- // 折叠分类
- FoldType fold_type_v2 = 5;
-}
-
-// 我的追番列表
-message ModuleFollowList {
- // 查看全部的跳转链接
- string view_all_link = 1;
- //
- repeated FollowListItem list = 2;
-}
-
-// 转发模块
-message ModuleForward {
- // 卡片类型
- string card_type = 1;
- // 嵌套模型
- repeated Module modules= 2;
-}
-
-// 点赞用户模块
-message ModuleLikeUser {
- // 点赞用户
- repeated LikeUser like_users = 1;
- // 文案
- string display_text = 2;
-}
-
-// 计数信息模块
-message ModuleState {
- // 转发数
- int32 repost = 1;
- // 点赞数
- int32 like = 2;
- // 评论数
- int32 reply = 3;
- // 点赞拓展信息
- LikeInfo like_info = 4;
- // 禁评
- bool no_comment = 5;
- // 禁转
- bool no_forward = 6;
-}
-
-// 认证名牌
-message Nameplate {
- // nid
- int64 nid = 1;
- // 名称
- string name = 2;
- // 图片地址
- string image = 3;
- // 小图地址
- string image_small = 4;
- // 等级
- string level = 5;
- // 获取条件
- string condition = 6;
-}
-
-// 最新ep
-message NewEP {
- // 最新话epid
- int32 id = 1;
- // 更新至XX话
- string index_show = 2;
- // 更新剧集的封面
- string cover = 3;
-}
-
-// 空响应
-message NoReply {
-
-}
-
-// 空请求
-message NoReq {
-
-}
-
-// 认证信息
-message OfficialVerify {
- // 认证类型
- // 127:未认证 0:个人 1:机构
- int32 type = 1;
- // 认证描述
- string desc = 2;
- //
- int32 is_atten = 3;
-}
-
-// 动态同城点击上报-响应
-message OurCityClickReportReply {
-
-}
-
-// 动态同城点击上报-请求
-message OurCityClickReportReq {
- // 动态ID
- string dynamic_id = 1;
- // 城市ID
- int64 city_id = 2;
- // 纬度
- double lat = 3;
- // 经度
- double lng = 4;
-}
-
-// PGC单季信息
-message PGCSeason {
- // 是否完结
- int32 is_finish = 1;
- // 标题
- string title = 2;
- // 类型
- int32 type = 3;
-}
-
-// 秒开参数
-message PlayerPreloadParams {
- // 清晰度
- int32 qn = 1;
- // 流版本
- int32 fnver = 2;
- // 流类型
- int32 fnval = 3;
- // 是否强制使用域名
- int32 force_host = 4;
- // 是否4k
- int32 fourk = 5;
-}
-
-// 动态tab弹窗详情
-message Popup {
- // 标题
- string title = 1;
- // 文案
- string desc = 2;
- // 文案附加跳转地址
- string uri = 3;
-}
-
-// 关注关系
-message Relation {
- // 关注状态
- RelationStatus status = 1;
- // 关注
- int32 is_follow = 2;
- // 被关注
- int32 is_followed = 3;
- // 文案
- string title = 4;
-}
-
-// 关注状态
-enum RelationStatus {
- relation_status_none = 0; //
- relation_status_nofollow = 1; // 未关注
- relation_status_follow = 2; // 关注
- relation_status_followed = 3; // 被关注
- relation_status_mutual_concern = 4; // 互相关注
- relation_status_special = 5; // 特别关注
-}
-
-// 分享需要
-message ShareInfo {
- // 稿件avid
- int64 aid = 1;
- // 稿件bvid
- string bvid = 2;
- // 标题
- string title = 3;
- // 副标题
- string subtitle = 4;
- // 稿件封面
- string cover = 5;
- // up mid
- int64 mid = 6;
- // up昵称
- string name = 7;
-}
-
-//
-enum StyleType {
- STYLE_TYPE_NONE = 0; //
- STYLE_TYPE_LIVE = 1; //
- STYLE_TYPE_DYN_UP = 2; //
-}
-
-// 小视频卡片项
-message SVideoItem {
- // 卡片类型
- // av:稿件视频
- string card_type = 1;
- // 模块内容
- repeated SVideoModule modules = 2;
- // 动态ID str
- string dyn_id_str = 3;
- // 卡片游标
- int64 index = 4;
-}
-
-// 小视频模块
-message SVideoModule {
- // 类型
- // author:发布人 player:播放器内容 desc:描述信息 stat:计数信息
- string module_type = 1;
- oneof module_item {
- // 发布人
- SVideoModuleAuthor module_author = 2;
- // 播放器内容
- SVideoModulePlayer module_player = 3;
- // 描述信息
- SVideoModuleDesc module_desc = 4;
- // 计数信息
- SVideoModuleStat module_stat = 5;
- }
-}
-
-// 作者信息模块
-message SVideoModuleAuthor {
- // 用户mid
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- // 用户头像
- string face = 3;
- // 发布描述
- string pub_desc = 4;
- // 是否关注up
- // 1:已关注
- int32 is_attention = 5;
- // 跳转地址
- string uri = 6;
-}
-
-// 文本内容模块
-message SVideoModuleDesc {
- // 文本内容
- string text = 1;
- // 跳转地址
- string uri = 2;
-}
-
-// 播放器模块
-message SVideoModulePlayer {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 跳转地址,秒开地址如果有会拼接player_preload可参考天马
- string uri = 3;
- // aid
- int64 aid = 4;
- // cid
- int64 cid = 5;
- // 视频时长
- int64 duration = 6;
- // 尺寸信息
- Dimension dimension = 7;
-}
-
-// 计数信息模块
-message SVideoModuleStat {
- // 计数内容
- repeated SVideoStatInfo stat_info = 1;
- // 分享需要
- ShareInfo share_info = 2;
-}
-
-// 小视频连播页-响应
-message SVideoReply {
- // 列表
- repeated SVideoItem list = 1;
- // 翻页游标
- string offset = 2;
- // 是否还有更多数据
- // 1:有
- int32 has_more = 3;
- // 顶部
- SVideoTop top = 4;
-}
-
-// 小视频连播页-请求
-message SVideoReq {
- // 当前素材的id
- int64 oid = 1;
- // 当前素材类型
- // 1:动态(如果有oid则必传) 2:热门分类 3:热点聚合
- SVideoType type = 2;
- // 翻页offset
- string offset = 3;
- // 清晰度(旧版)
- int32 qn = 4;
- // 流版本(旧版)
- int32 fnver = 5;
- // 流类型(旧版)
- int32 fnval = 6;
- // 是否强制使用域名(旧版)
- int32 force_host = 7;
- // 是否4k(旧版)
- int32 fourk = 8;
- // 当前页面spm
- string spmid = 9;
- // 上级页面spm
- string from_spmid = 10;
- // 秒开参数
- PlayerPreloadParams player_preload = 11;
- // 热门进入联播页的锚点aid
- int64 focus_aid = 12;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 13;
-}
-
-// 计数内容
-message SVideoStatInfo {
- // 计数icon
- // 1:分享符号 2:评论符号 3:点赞符号
- int32 icon = 1;
- // 计数值
- int64 num = 2;
- // 选中状态
- // 1:选中
- int32 selected = 3;
- // 跳转链接(如评论)
- string uri = 4;
-}
-
-// 顶部
-message SVideoTop {
- // 联播页标题
- string Title = 1;
- // 联播页导语
- string Desc = 2;
-}
-
-// 入口联播页类型
-enum SVideoType {
- TypeNone = 0; // 无类型
- TypeDynamic = 1; // 动态
- TypePopularIndex = 2; // 热门分类
- TypePopularHotword = 3; // 热点聚合
-}
-
-// 动态红点接口各tab offset信息
-message TabOffset {
- // 1:综合页 2:视频页
- int32 tab = 1;
- // 上一次对应列表页offset
- string offset = 2;
-}
-
-// up主列表
-message UpListItem {
- // 是否有更新
- // 0:没有 1:有
- int32 has_update = 1;
- // up主头像
- string face = 2;
- // up主昵称
- string name = 3;
- // up主uid
- int64 uid = 4;
-}
-
-// 用户信息
-message UserInfo {
- // 用户mid
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- // 用户头像
- string face = 3;
- // 认证信息
- OfficialVerify official = 4;
- // 大会员信息
- VipInfo vip = 5;
- // 直播信息
- LiveInfo live = 6;
- // 空间页跳转链接
- string uri = 7;
- // 挂件信息
- UserPendant pendant = 8;
- // 认证名牌
- Nameplate nameplate = 9;
-}
-
-// 头像挂件信息
-message UserPendant {
- // pid
- int64 pid = 1;
- // 名称
- string name = 2;
- // 图片链接
- string image = 3;
- // 有效期
- int64 expire = 4;
-}
-
-// 角标信息
-message VideoBadge {
- // 文案
- string text = 1;
- // 文案颜色-日间
- string text_color = 2;
- // 文案颜色-夜间
- string text_color_night = 3;
- // 背景颜色-日间
- string bg_color = 4;
- // 背景颜色-夜间
- string bg_color_night = 5;
- // 边框颜色-日间
- string border_color = 6;
- // 边框颜色-夜间
- string border_color_night = 7;
- // 样式
- int32 bg_style = 8;
-}
-
-// 番剧类型
-enum VideoSubType {
- VideoSubTypeNone = 0; // 没有子类型
- VideoSubTypeBangumi = 1; // 番剧
- VideoSubTypeMovie = 2; // 电影
- VideoSubTypeDocumentary = 3; // 纪录片
- VideoSubTypeDomestic = 4; // 国创
- VideoSubTypeTeleplay = 5; // 电视剧
-}
-
-// 大会员信息
-message VipInfo {
- // 大会员类型
- int32 Type = 1;
- // 大会员状态
- int32 status = 2;
- // 到期时间
- int64 due_date = 3;
- // 标签
- VipLabel label = 4;
- // 主题
- int32 theme_type = 5;
-}
-
-// 大会员标签
-message VipLabel {
- // 图片地址
- string path = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/dynamic/v2/campus.proto b/bili-api-grpc/proto/bilibili/app/dynamic/v2/campus.proto
deleted file mode 100644
index e3bbc97ca..000000000
--- a/bili-api-grpc/proto/bilibili/app/dynamic/v2/campus.proto
+++ /dev/null
@@ -1,67 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.dynamic.v2;
-
-option java_multiple_files = true;
-
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/pagination/pagination.proto";
-import "bilibili/app/dynamic/common/dynamic.proto";
-import "bilibili/app/dynamic/v2/dynamic.proto";
-
-service Campus {
- //
- //rpc WaterFlowRcmd (WaterFlowRcmdReq) returns (WaterFlowRcmdResp);
-}
-
-//
-message CampusWaterFlowItem {
- //
- int32 item_type = 1;
- //
- bilibili.app.dynamic.common.ItemWHRatio wh_ratio = 2;
- //
- oneof item {
- WFItemDefault item_default = 3;
- }
-}
-
-//
-message WaterFlowRcmdReq {
- //
- int64 campus_id = 1;
- //
- int32 page = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- //
- //CampusRcmdReqFrom from = 4;
-}
-
-//
-message WaterFlowRcmdResp {
- //
- repeated CampusWaterFlowItem items = 1;
- //
- bilibili.pagination.FeedPaginationReply offset = 2;
-}
-
-//
-message WFItemDefault {
- //
- string title = 1;
- //
- string cover = 2;
- //
- //CoverIconWithText bottom_left_1 = 3;
- //
- //CoverIconWithText bottom_left_2 = 4;
- //
- //CoverIconWithText bottom_right_1 = 5;
- //
- string uri = 6;
- //
- //RcmdReason rcmd_reason = 7;
- //
- map annotations = 8;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/dynamic/v2/dynamic.proto b/bili-api-grpc/proto/bilibili/app/dynamic/v2/dynamic.proto
deleted file mode 100644
index 5d9df340b..000000000
--- a/bili-api-grpc/proto/bilibili/app/dynamic/v2/dynamic.proto
+++ /dev/null
@@ -1,5811 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.dynamic.v2;
-
-option java_multiple_files = true;
-
-import "google/protobuf/any.proto";
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/dagw/component/avatar/v1/avatar.proto";
-
-// v2动态, rpc 按字母顺序排列
-service Dynamic {
- //
- rpc AlumniDynamics (AlumniDynamicsReq) returns (AlumniDynamicsReply);
- //
- rpc CampusBillBoard (CampusBillBoardReq) returns (CampusBillBoardReply);
- //
- rpc CampusEntryTab(CampusEntryTabReq) returns (CampusEntryTabResp);
- //
- rpc CampusFeedback(CampusFeedbackReq) returns (CampusFeedbackReply);
- //
- rpc CampusHomePages(CampusHomePagesReq) returns (CampusHomePagesReply);
- //
- rpc CampusMateLikeList(CampusMateLikeListReq) returns (CampusMateLikeListReply);
- //
- rpc CampusMngDetail(CampusMngDetailReq) returns (CampusMngDetailReply);
- //
- rpc CampusMngQuizOperate(CampusMngQuizOperateReq) returns (CampusMngQuizOperateReply);
- //
- rpc CampusMngSubmit(CampusMngSubmitReq) returns (CampusMngSubmitReply);
- //
- rpc CampusRcmd(CampusRcmdReq) returns (CampusRcmdReply);
- //
- rpc CampusRcmdFeed(CampusRcmdFeedReq) returns (CampusRcmdFeedReply);
- //
- rpc CampusRecommend(CampusRecommendReq) returns (CampusRecommendReply);
- //
- rpc CampusRedDot(CampusRedDotReq) returns (CampusRedDotReply);
- //
- rpc CampusSquare(CampusSquareReq) returns (CampusSquareReply);
- //
- rpc CampusTopicRcmdFeed(CampusTopicRcmdFeedReq) returns (CampusTopicRcmdFeedReply);
- // 动态通用附加卡-follow/取消follow
- rpc DynAdditionCommonFollow(DynAdditionCommonFollowReq) returns (DynAdditionCommonFollowReply);
- // 动态综合页
- rpc DynAll(DynAllReq) returns (DynAllReply);
- // 综合页最近访问 - 个人feed流
- rpc DynAllPersonal(DynAllPersonalReq) returns (DynAllPersonalReply);
- // 综合页最近访问 - 标记已读
- rpc DynAllUpdOffset(DynAllUpdOffsetReq) returns (NoReply);
- // 动态详情页
- rpc DynDetail(DynDetailReq) returns (DynDetailReply);
- // 批量动态id获取动态详情
- rpc DynDetails(DynDetailsReq) returns (DynDetailsReply);
- // 动态发布生成临时卡
- rpc DynFakeCard(DynFakeCardReq) returns (DynFakeCardReply);
- //
- rpc DynFriend(DynFriendReq) returns (DynFriendReply);
- // 轻浏览
- rpc DynLight(DynLightReq) returns (DynLightReply);
- // 网关调用 - 查看更多-列表
- rpc DynMixUpListViewMore(DynMixUpListViewMoreReq) returns (DynMixUpListViewMoreReply);
- // 关注推荐up主换一换
- rpc DynRcmdUpExchange(DynRcmdUpExchangeReq) returns (DynRcmdUpExchangeReply);
- //
- rpc DynSearch(DynSearchReq) returns (DynSearchReply);
- //
- rpc DynServerDetails(DynServerDetailsReq) returns (DynServerDetailsReply);
- // 空间页动态
- rpc DynSpace(DynSpaceReq) returns (DynSpaceRsp);
- //
- rpc DynSpaceSearchDetails(DynSpaceSearchDetailsReq) returns (DynSpaceSearchDetailsReply);
- //
- rpc DynTab(DynTabReq) returns (DynTabReply);
- // 动态点赞
- rpc DynThumb(DynThumbReq) returns (NoReply);
- // 未登录页分区UP主推荐
- rpc DynUnLoginRcmd(DynRcmdReq) returns (DynRcmdReply);
- // 动态视频页
- rpc DynVideo(DynVideoReq) returns (DynVideoReply);
- // 视频页最近访问 - 个人feed流
- rpc DynVideoPersonal(DynVideoPersonalReq) returns (DynVideoPersonalReply);
- // 视频页最近访问 - 标记已读
- rpc DynVideoUpdOffset(DynVideoUpdOffsetReq) returns (NoReply);
- //
- rpc DynVote(DynVoteReq) returns (DynVoteReply);
- //
- rpc FeedFilter(FeedFilterReq) returns (FeedFilterReply);
- //
- rpc FetchTabSetting(NoReq) returns (FetchTabSettingReply);
- //
- rpc HomeSubscribe(HomeSubscribeReq) returns (HomeSubscribeReply);
- //
- rpc LbsPoi(LbsPoiReq) returns (LbsPoiReply);
- //
- rpc LegacyTopicFeed(LegacyTopicFeedReq) returns (LegacyTopicFeedReply);
- // 点赞列表
- rpc LikeList(LikeListReq) returns (LikeListReply);
- //
- rpc OfficialAccounts(OfficialAccountsReq) returns (OfficialAccountsReply);
- //
- rpc OfficialDynamics(OfficialDynamicsReq) returns (OfficialDynamicsReply);
- // 新版动态转发点赞列表 需要登录
- rpc ReactionList(ReactionListReq) returns (ReactionListReply);
- // 转发列表
- rpc RepostList(RepostListReq) returns (RepostListRsp);
- //
- rpc SchoolRecommend(SchoolRecommendReq) returns (SchoolRecommendReply);
- //
- rpc SchoolSearch(SchoolSearchReq) returns (SchoolSearchReply);
- //
- rpc SetDecision(SetDecisionReq) returns (NoReply);
- //
- rpc SetRecentCampus(SetRecentCampusReq) returns (NoReply);
- //
- rpc SubscribeCampus(SubscribeCampusReq) returns (NoReply);
- //
- rpc TopicList(TopicListReq) returns (TopicListReply);
- //
- rpc TopicSquare(TopicSquareReq) returns (TopicSquareReply);
- //
- rpc UnfollowMatch(UnfollowMatchReq) returns (NoReply);
- //
- rpc UpdateTabSetting(UpdateTabSettingReq) returns (NoReply);
-}
-
-//
-enum AddButtonBgStyle {
- fill = 0; // 默认填充
- stroke = 1; // 描边
- gray = 2; // 置灰
-}
-
-// 按钮类型
-enum AddButtonType {
- bt_none = 0; // 占位
- bt_jump = 1; // 跳转
- bt_button = 2; // 按钮
-}
-
-// 活动皮肤
-message AdditionalActSkin {
- // 动画SVGA资源
- string svga = 1;
- // 动画SVGA最后一帧图片资源
- string last_image = 2;
- // 动画播放次数
- int64 play_times = 3;
-}
-
-// 动态-附加卡-按钮
-message AdditionalButton {
- // 按钮类型
- AddButtonType type = 1;
- // jump-跳转样式
- AdditionalButtonStyle jump_style = 2;
- // jump-跳转链接
- string jump_url = 3;
- // button-未点样式
- AdditionalButtonStyle uncheck = 4;
- // button-已点样式
- AdditionalButtonStyle check = 5;
- // button-当前状态
- AdditionalButtonStatus status = 6;
- // 按钮点击样式
- AdditionalButtonClickType click_type = 7;
-}
-
-// 附加卡按钮点击类型
-enum AdditionalButtonClickType {
- click_none = 0; // 通用按钮
- click_up = 1; // 预约卡按钮
-}
-
-//
-message AdditionalButtonInteractive {
- // 是否弹窗
- string popups = 1;
- // 弹窗确认文案
- string confirm = 2;
- // 弹窗取消文案
- string cancel = 3;
- //
- string desc = 4;
-}
-
-//
-message AdditionalButtonShare {
- //
- int32 show = 1;
- //
- string icon = 2;
- //
- string text = 3;
-}
-
-// 附加卡按钮状态
-enum AdditionalButtonStatus {
- none = 0; //
- uncheck = 1; //
- check = 2; //
-}
-
-// 动态-附加卡-按钮样式
-message AdditionalButtonStyle {
- // icon
- string icon = 1;
- // 文案
- string text = 2;
- // 按钮点击交互
- AdditionalButtonInteractive interactive = 3;
- // 当前按钮填充样式
- AddButtonBgStyle bg_style = 4;
- // toast文案, 当disable=1时有效
- string toast = 5;
- // 当前按钮样式,
- // 0:高亮 1:置灰(按钮不可点击)
- DisableState disable = 6;
- //
- AdditionalButtonShare share = 7;
-}
-
-// 动态-附加卡-番剧卡
-message AdditionalPGC {
- // 头部说明文案
- string head_text = 1;
- // 标题
- string title = 2;
- // 展示图
- string image_url = 3;
- // 描述文字1
- string desc_text_1 = 4;
- // 描述文字2
- string desc_text_2 = 5;
- // 点击跳转链接
- string url = 6;
- // 按钮
- AdditionalButton button = 7;
- // 头部icon
- string head_icon = 8;
- // style
- ImageStyle style = 9;
- // 动态本身的类型 type
- string type = 10;
-}
-
-//
-enum AdditionalShareShowType {
- st_none = 0; //
- st_show = 1; //
-}
-
-// 枚举-动态附加卡
-enum AdditionalType {
- additional_none = 0; // 占位
- additional_type_pgc = 1; // 附加卡-追番
- additional_type_goods = 2; // 附加卡-商品
- additional_type_vote = 3; // 附加卡投票
- additional_type_common = 4; // 附加通用卡
- additional_type_esport = 5; // 附加电竞卡
- additional_type_up_rcmd = 6; // 附加UP主推荐卡
- additional_type_ugc = 7; // 附加卡-ugc
- additional_type_up_reservation = 8; // UP主预约卡
-}
-
-// 动态-附加卡-专栏
-message AdditionArticle {
- //
- string title = 1;
- //
- MdlDynDrawItem cover = 2;
- //
- string desc_text_left = 3;
- //
- string desc_text_right = 4;
- //
- string uri = 5;
- //
- string card_type = 6;
-}
-
-// 动态-附加卡-通用卡
-message AdditionCommon {
- // 头部说明文案
- string head_text = 1;
- // 标题
- string title = 2;
- // 展示图
- string image_url = 3;
- // 描述文字1
- string desc_text_1 = 4;
- // 描述文字2
- string desc_text_2 = 5;
- // 点击跳转链接
- string url = 6;
- // 按钮
- AdditionalButton button = 7;
- // 头部icon
- string head_icon = 8;
- // style
- ImageStyle style = 9;
- // 动态本身的类型 type
- string type = 10;
- // 附加卡类型
- string card_type = 11; // ogv manga
-}
-
-// 动态-附加卡-电竞卡
-message AdditionEsport {
- // 电竞类型
- EspaceStyle style = 1;
- oneof item {
- // moba类
- AdditionEsportMoba addition_esport_moba = 2;
- }
- // 动态本身的类型 type
- string type = 3;
- // 附加卡类型
- string card_type = 4; // ogv manga
-}
-
-// 动态-附加卡-电竞卡-moba类
-message AdditionEsportMoba {
- // 头部说明文案
- string head_text = 1;
- // 标题
- string title = 2;
- // 战队列表
- repeated MatchTeam match_team = 3;
- // 比赛信息
- AdditionEsportMobaStatus addition_esport_moba_status = 4;
- // 卡片跳转
- string uri = 5;
- // 按钮
- AdditionalButton button = 6;
- // 副标题
- string sub_title = 7;
- // 动态本身的类型 type
- string type = 10;
- // 附加卡类型
- string card_type = 11;
- // 附加卡图标
- string head_icon = 12;
-}
-
-// 动态-附加卡-电竞卡-moba类-比赛信息
-message AdditionEsportMobaStatus {
- // 文案类
- repeated AdditionEsportMobaStatusDesc addition_esport_moba_status_desc = 1;
- // 比赛状态文案
- string title = 2;
- // 比赛状态状态
- int32 status = 3;
- // 日间色值
- string color = 4;
- // 夜间色值
- string night_color = 5;
-}
-
-// 动态-附加卡-电竞卡-moba类-比赛信息-文案类
-message AdditionEsportMobaStatusDesc {
- // 文案
- string title = 1;
- // 日间色值
- string color = 2;
- // 夜间色值
- string night_color = 3;
-}
-
-// 动态-附加卡-商品卡
-message AdditionGoods {
- // 推荐文案
- string rcmd_desc = 1;
- // 商品信息
- repeated GoodsItem goods_items = 2;
- // 附加卡类型
- string card_type = 3;
- // 头部icon
- string icon = 4;
- // 商品附加卡整卡跳转
- string uri = 5;
- // 商品类型
- // 1:淘宝 2:会员购,注:实际是获取的goods_items里面的第一个source_type
- int32 source_type = 6;
- //
- int32 jump_type = 7;
- //
- string app_name = 8;
- //
- string ad_mark_icon = 9;
-}
-
-// 动态-附加卡-直播附加卡
-message AdditionLiveRoom {
- //
- string title = 1;
- //
- string cover = 2;
- //
- VideoBadge badge = 3;
- //
- CoverIconWithText desc_text_upper = 4;
- //
- string desc_text_lower = 5;
- //
- string uri = 6;
- //
- string card_type = 7;
-}
-
-// 动态-附加卡-UGC视频附加卡
-message AdditionUgc {
- // 说明文案
- string head_text = 1;
- // 稿件标题
- string title = 2;
- // 封面
- string cover = 3;
- // 描述文字1
- string desc_text_1 = 4;
- // 描述文字2
- string desc_text_2 = 5;
- // 接秒开
- string uri = 6;
- // 时长
- string duration = 7;
- // 标题支持换行-标题支持单行和双行,本期不支持填充up昵称,支持双行展示,字段默认为true
- bool line_feed = 8;
- // 附加卡类型
- string card_type = 9;
-}
-
-// up主预约发布卡
-message AdditionUP {
- // 标题
- string title = 1;
- // 高亮文本,描述文字1
- HighlightText desc_text_1 = 2;
- // 描述文字2
- string desc_text_2 = 3;
- // 点击跳转链接
- string url = 4;
- // 按钮
- AdditionalButton button = 5;
- // 附加卡类型
- string card_type = 6;
- // 预约人数(用于预约人数变化)
- int64 reserve_total = 7;
- // 活动皮肤
- AdditionalActSkin act_skin = 8;
- // 预约id
- int64 rid = 9;
- //
- int32 lottery_type = 10;
- //
- HighlightText desc_text3 = 11;
- //
- int64 up_mid = 12;
- //
- AdditionUserInfo user_info = 13;
- //
- string dynamic_id = 14;
- //
- bool show_text2 = 15;
- //
- int64 dyn_type = 16;
- //
- string business_id = 17;
- //
- string badge_text = 18;
- //
- bool is_premiere = 19;
-}
-
-//
-message AdditionUserInfo {
- //
- string name = 1;
- //
- string face = 2;
-}
-
-// 动态-附加卡-投票
-message AdditionVote {
- // 封面图
- string image_url = 1;
- // 标题
- string title = 2;
- // 展示项1
- string text_1 = 3;
- // button文案
- string button_text = 4;
- // 点击跳转链接
- string url = 5;
-}
-
-// 动态模块-投票
-message AdditionVote2 {
- // 投票类型
- AdditionVoteType addition_vote_type = 1;
- // 投票ID
- int64 vote_id = 2;
- // 标题
- string title = 3;
- // 已过期: xxx人参与· 投票已过期。button 展示去查看
- // 未过期: xxx人参与· 剩xx天xx时xx分。button展示去投票
- string label = 4;
- // 剩余时间
- int64 deadline = 5;
- // 生效文案
- string open_text = 6;
- // 过期文案
- string close_text = 7;
- // 已投票
- string voted_text = 8;
- // 投票状态
- AdditionVoteState state = 9;
- // 投票信息
- oneof item {
- //
- AdditionVoteWord addition_vote_word = 10;
- //
- AdditionVotePic addition_vote_pic = 11;
- //
- AdditionVoteDefaule addition_vote_defaule = 12;
- }
- // 业务类型
- // 0:动态投票 1:话题h5组件
- int32 biz_type = 13;
- // 投票总人数
- int64 total = 14;
- // 附加卡类型
- string card_type = 15;
- // 异常提示
- string tips = 16;
- // 跳转地址
- string uri = 17;
- // 是否投票
- bool is_voted = 18;
- // 投票最多多选个数,单选为1
- int32 choice_cnt = 19;
- // 是否默认选中分享到动态
- bool defaule_select_share = 20;
-}
-
-// 外露投票
-message AdditionVoteDefaule {
- // 图片 多张
- repeated string cover = 1;
-}
-
-// 外露图片类型
-message AdditionVotePic {
- // 图片投票详情
- repeated AdditionVotePicItem item = 1;
-}
-
-// 图片投票详情
-message AdditionVotePicItem {
- // 选项索引,从1开始
- int32 opt_idx = 1;
- // 图片
- string cover = 2;
- // 选中状态
- bool is_vote = 3;
- // 人数
- int32 total = 4;
- // 占比
- double persent = 5;
- // 标题文案
- string title = 6;
- // 是否投票人数最多的选项
- bool is_max_option = 7;
-}
-
-// 投票状态
-enum AdditionVoteState {
- addition_vote_state_none = 0; //
- addition_vote_state_open = 1; //
- addition_vote_state_close = 2; //
-}
-
-// 投票类型
-enum AdditionVoteType {
- addition_vote_type_none = 0; //
- addition_vote_type_word = 1; //
- addition_vote_type_pic = 2; //
- addition_vote_type_default = 3; //
-}
-
-
-// 外露文字类型
-message AdditionVoteWord {
- // 外露文字投票详情
- repeated AdditionVoteWordItem item = 1;
-}
-
-// 外露文字投票详情
-message AdditionVoteWordItem {
- // 选项索引,从1开始
- int32 opt_idx = 1;
- // 文案
- string title = 2;
- // 选中状态
- bool is_vote = 3;
- // 人数
- int32 total = 4;
- // 占比
- double persent = 5;
- // 是否投票人数最多的选项
- bool is_max_option = 6;
-}
-
-// 综合页请求广告所需字段,由客户端-网关透传
-message AdParam {
- // 综合页请求广告所需字段,由客户端-网关透传
- string ad_extra = 1;
- // request_id
- string request_id = 2;
-}
-
-//
-message AlumniDynamicsReply {
- //
- repeated DynamicItem list = 1;
- //
- string toast = 2;
-}
-
-//
-message AlumniDynamicsReq {
- //
- int64 campus_id = 1;
- //
- int32 first_time = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- //
- int32 local_time = 4;
- //
- int32 page = 5;
- //
- int32 from_type = 6;
-}
-
-//
-message CampusBannerInfo {
- //
- string image = 1;
- //
- string jump_url = 2;
-}
-
-//
-message CampusBillboardInternalReq {
- //
- int64 mid = 1;
- //
- int64 campus_id = 2;
- //
- string version_code = 3;
-}
-
-//
-message CampusBillBoardReply {
- //
- string title = 1;
- //
- string help_uri = 2;
- //
- string campus_name = 3;
- //
- int64 build_time = 4;
- //
- string version_code = 5;
- //
- repeated OfficialItem list = 6;
- //
- string share_uri = 7;
- //
- int32 bind_notice = 8;
- //
- string update_toast = 9;
- //
- int64 campus_id = 10;
- //
- CampusFeatureProgress open_progress = 11;
-}
-
-//
-message CampusBillBoardReq {
- //
- int64 campus_id = 1;
- //
- string version_code = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- //
- CampusReqFromType from_type = 4;
-}
-
-//
-message CampusEntryTabReq {
- //
- int64 campus_id = 1;
-}
-
-//
-message CampusEntryTabResp {
- //
- CampusEntryType entry_type = 1;
-}
-
-//
-enum CampusEntryType {
- //
- NONE = 0;
- //
- ENTRY_DYNAMIC = 1;
- //
- ENTRY_HOME = 2;
-}
-
-//
-message CampusFeatureProgress {
- //
- int64 progress_full = 1;
- //
- int64 progress_achieved = 2;
- //
- string desc_title = 3;
- //
- string desc_1 = 4;
- //
- CampusLabel btn = 5;
-}
-
-//
-message CampusFeedbackInfo {
- //
- int32 biz_type = 1;
- //
- int64 biz_id = 2;
- //
- int64 campus_id = 3;
- //
- string reason = 4;
-}
-
-//
-message CampusFeedbackReply {
- //
- string message = 1;
-}
-
-//
-message CampusFeedbackReq {
- //
- repeated CampusFeedbackInfo infos = 1;
- //
- int32 from = 2;
-}
-
-//
-message CampusHomePagesReply {
- //
- CampusRcmdTop top = 1;
- //
- CampusTop campus_top = 2;
- //
- int32 page_type = 3;
-}
-
-//
-message CampusHomePagesReq {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- double lat = 3;
- //
- double lng = 4;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
- //
- int32 page_type = 6;
-}
-
-enum CampusRcmdReqFrom {
- CAMPUS_RCMD_FROM_UNKNOWN = 0;
- CAMPUS_RCMD_FROM_HOME_UN_OPEN = 1;
- CAMPUS_RCMD_FROM_VISIT_OTHER = 2;
- CAMPUS_RCMD_FROM_HOME_MOMENT = 3;
- CAMPUS_RCMD_FROM_DYN_MOMENT = 4;
- CAMPUS_RCMD_FROM_PAGE_SUBORDINATE_MOMENT = 5;
-}
-
-//
-enum CampusHomePageType {
- //
- PAGE_MAJOR = 0;
- //
- PAGE_SUBORDINATE = 1;
- //
- PAGE_MAJOR_DETAIL = 2;
-}
-
-//
-message CampusHomeRcmdTopic {
- //
- ModuleTitle title = 1;
- //
- repeated TopicItem topic = 2;
-}
-
-//
-message CampusInfo {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- string desc = 3;
- //
- int64 online = 4;
- //
- string url = 5;
-}
-
-//
-message CampusLabel {
- //
- string text = 1;
- //
- string url = 2;
- //
- string desc = 3;
-}
-
-//
-message CampusMateLikeListReply {
- //
- repeated ModuleAuthor list = 1;
-}
-
-//
-message CampusMateLikeListReq {
- //
- int64 dynamic_id = 1;
- //
- CampusReqFromType from_type = 2;
-}
-
-//
-enum CampusMngAuditStatus {
- //
- campus_mng_audit_none = 0;
- //
- campus_mng_audit_in_process = 1;
- //
- campus_mng_audit_failed = 2;
-}
-
-//
-message CampusMngBadge {
- //
- string title = 1;
- //
- string badge_url = 2;
- //
- string upload_hint_msg = 3;
-}
-
-//
-message CampusMngBasicInfo {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- string hint_msg = 3;
-}
-
-//
-message CampusMngDetailReply {
- //
- repeated CampusMngItem items = 1;
- //
- string top_hint_bar_msg = 2;
- //
- string bottom_submit_hint_msg = 3;
- //
- int64 campus_id = 4;
- //
- string campus_name = 5;
-}
-
-//
-message CampusMngDetailReq {
- //
- int64 campus_id = 1;
-}
-
-//
-message CampusMngItem {
- //
- int32 audit_status = 1;
- //
- string audit_message = 2;
- //
- int32 item_type = 3;
- //
- string mng_item_id = 4;
- //
- bool is_del = 5;
- // Oneof field:
- oneof item {
- //
- CampusMngBasicInfo basic_info = 6;
- //
- CampusMngBadge badge = 7;
- //
- string slogan = 8;
- //
- CampusMngQuiz quiz = 9;
- }
-}
-
-//
-enum CampusMngItemType {
- //
- campus_mng_none = 0;
- //
- campus_mng_basic_info = 1;
- //
- campus_mng_badge = 2;
- //
- campus_mng_slogan = 3;
- //
- campus_mng_quiz = 4;
-}
-
-//
-message CampusMngQuiz {
- //
- string title = 1;
- //
- CampusLabel more_label = 2;
- //
- string add_label = 3;
- //
- string submit_label = 4;
- //
- int64 quiz_count = 5;
-}
-
-//
-enum CampusMngQuizAction {
- //
- campus_mng_quiz_act_list = 0;
- //
- campus_mng_quiz_act_add = 1;
- //
- campus_mng_quiz_act_del = 2;
-}
-
-//
-message CampusMngQuizDetail {
- //
- int64 quiz_id = 1;
- //
- string question = 2;
- //
- string correct_answer = 3;
- //
- repeated string wrong_answer_list = 4;
- //
- int32 audit_status = 5;
- //
- string audit_message = 6;
-}
-
-//
-message CampusMngQuizOperateReply {
- //
- string toast = 1;
- //
- repeated CampusMngQuizDetail quiz = 2;
- //
- int64 quiz_total = 3;
-}
-
-//
-message CampusMngQuizOperateReq {
- //
- int32 action = 1;
- //
- int64 campus_id = 2;
- //
- repeated CampusMngQuizDetail quiz = 3;
-}
-
-//
-message CampusMngSlogan {
- //
- string title = 1;
- //
- string slogan = 2;
- //
- string input_hint_msg = 3;
-}
-
-//
-message CampusMngSubmitReply {
- //
- string toast = 1;
-}
-
-//
-message CampusMngSubmitReq {
- //
- int64 campus_id = 1;
- //
- repeated CampusMngItem modified_items = 2;
-}
-
-//
-message CampusNoticeInfo {
- //
- string title = 1;
- //
- string desc = 2;
- //
- CampusLabel button = 3;
-}
-
-//
-enum CampusOnlineStatus {
- //
- campus_online_offline = 0;
- //
- campus_online_online = 1;
-}
-
-//
-message CampusRcmdFeedReply {
- //
- repeated DynamicItem list = 1;
- //
- string toast = 2;
- //
- GuideBarInfo guide_bar = 3;
- //
- bool has_more = 4;
- //
- bool update = 5;
-}
-
-//
-message CampusRcmdFeedReq {
- //
- int64 campus_id = 1;
- //
- int32 first_time = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- //
- int32 local_time = 4;
- //
- int32 page = 5;
- //
- int32 scroll = 6;
- //
- string view_dyn_id = 7;
- //
- CampusReqFromType from_type = 8;
-}
-
-//
-message CampusRcmdInfo {
- //
- string title = 1;
- //
- repeated CampusRcmdItem items = 2;
-}
-
-//
-message CampusRcmdItem {
- //
- string title = 1;
- //
- repeated RcmdItem items = 2;
- //
- int64 campus_id = 3;
- //
- CampusLabel entry_label = 4;
-}
-
-//
-message CampusRcmdReply {
- //
- CampusRcmdTop top = 1;
- //
- CampusRcmdInfo rcmd = 2;
- //
- CampusTop campus_top = 3;
- //
- int32 page_type = 4;
- //
- int32 jump_home_pop = 5;
-}
-
-//
-message CampusRcmdReq {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- double lat = 3;
- //
- double lng = 4;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
- //
- CampusReqFromType from_type = 6;
- //
- CampusHomePageType page_type = 7;
-}
-
-//
-message CampusRcmdTop {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- string title = 3;
- //
- string desc = 4;
- //
- int32 type = 5;
- //
- RcmdTopButton button = 6;
- //
- CampusLabel switch_label = 7;
- //
- CampusLabel notice_label = 8;
- //
- string desc2 = 9;
- //
- string desc3 = 10;
- //
- CampusLabel invite_label = 11;
- //
- CampusLabel reserve_label = 12;
- //
- int64 reserve_number = 13;
- //
- int64 max_reserve = 14;
- //
- CampusLabel school_label = 15;
- //
- CampusLabel mng_label = 16;
- //
- CampusHomeRcmdTopic rcmd_topic = 17;
- //
- bool audit_before_open = 18;
- //
- string audit_message = 19;
-}
-
-//
-message CampusRecommendReply {
- //
- repeated RcmdItem items = 1;
- //
- bool has_more = 2;
-}
-
-//
-message CampusRecommendReq {
- //
- int64 campus_id = 1;
- //
- int64 page_no = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- //
- //CampusRcmdReqFrom from = 4;
-}
-
-//
-message CampusRedDotReply {
- //
- int32 red_dot = 1;
-}
-
-//
-message CampusRedDotReq {
- //
- int64 campus_id = 1;
- //
- CampusReqFromType from_type = 2;
-}
-
-//
-enum CampusReqFromType {
- //
- DYNAMIC = 0;
- //
- HOME = 1;
-}
-
-//
-message CampusShowTabInfo {
- //
- string name = 1;
- //
- string url = 2;
- //
- int32 type = 3;
- //
- int32 red_dot = 4;
- //
- string icon_url = 5;
-}
-
-//
-message CampusSquareReply {
- //
- string title = 1;
- //
- repeated RcmdCampusBrief list = 2;
- //
- CampusLabel button = 3;
-}
-
-//
-message CampusSquareReq {
- //
- int64 campus_id = 1;
- //
- double lat = 2;
- //
- double lng = 3;
-}
-
-//
-enum CampusTabType {
- campus_none = 0; //
- campus_school = 1; //
- campus_dynamic = 2; //
- campus_account = 3; //
- campus_billboard = 4; //
- campus_topic = 5; //
- campues_other = 6; //
-}
-
-//
-message CampusTop {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- repeated CampusShowTabInfo tabs = 3;
- //
- CampusLabel switch_label = 4;
- //
- string title = 5;
- //
- repeated CampusBannerInfo banner = 6;
- //
- CampusLabel invite_label = 7;
- //
- CampusNoticeInfo notice = 8;
- //
- TopicSquareInfo topic_square = 9;
- //
- string campus_badge = 10;
- //
- string campus_background = 11;
- //
- string campus_motto = 12;
- //
- CampusLabel mng_entry = 13;
- //
- string campus_intro = 14;
- //
- string campus_name_link = 15;
- //
- string bottom_left_text = 16;
-}
-
-//
-message CampusTopicRcmdFeedReply {
- //
- repeated DynamicItem list = 1;
- //
- string toast = 2;
- //
- bool has_more = 3;
- //
- string offset = 4;
- //
- IconButton join_discuss = 5;
-}
-
-//
-message CampusTopicRcmdFeedReq {
- //
- int64 campus_id = 1;
- //
- string offset = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- //
- int32 local_time = 4;
- //
- CampusReqFromType from_type = 5;
-}
-
-//
-message CardParagraph {
- //
- ModuleAdditional additional_card = 1;
- //
- string biz_id = 3;
- //
- LinkNodeType biz_type = 2;
-}
-
-// 动态卡片列表
-message CardVideoDynList {
- // 动态列表
- repeated DynamicItem list = 1;
- // 更新的动态数
- int64 update_num = 2;
- // 历史偏移
- string history_offset = 3;
- // 更新基础信息
- string update_baseline = 4;
- // 是否还有更多数据
- bool has_more = 5;
-}
-
-// 视频页-我的追番
-message CardVideoFollowList {
- // 查看全部(跳转链接)
- string view_all_link = 1;
- // 追番列表
- repeated FollowListItem list = 2;
-}
-
-// 视频页-最近访问
-message CardVideoUpList {
- // 标题展示文案
- string title = 1;
- // up主列表
- repeated UpListItem list = 2;
- // 服务端生成的透传上报字段
- string footprint = 3;
- // 直播数
- int32 show_live_num = 4;
- // 跳转label
- UpListMoreLabel more_label = 5;
- // 标题开关(综合页)
- int32 title_switch = 6;
- // 是否展示右上角查看更多label
- bool show_more_label = 7;
- // 是否在快速消费页查看更多按钮
- bool show_in_personal = 8;
- // 是否展示右侧查看更多按钮
- bool show_more_button = 9;
- //
- repeated UpListItem list_second = 10;
-}
-
-//
-message ChannelInfo {
- //
- int64 channel_id = 1;
- //
- string channel_name = 2;
- //
- string desc = 3;
- //
- bool is_atten = 4;
- //
- string type_icon = 5;
- //
- repeated RcmdItem items = 6;
- //
- string icon = 7;
- //
- string jump_uri = 8;
-}
-
-// 评论外露展示项
-message CmtShowItem {
- // 用户mid
- int64 uid = 1;
- // 用户昵称
- string uname = 2;
- // 点击跳转链接
- string uri = 3;
- // 评论内容
- string comment = 4;
-}
-
-//
-message Colors {
- //
- string color_day = 1;
- //
- string color_night = 2;
-}
-
-// 精选评论区
-message CommentDetail {
- // 该功能能不能用
- bool can_modify = 1;
- // up关闭评论区功能 1允许关闭 0允许开放
- // 精选评论区功能 1允许停止评论精选 0允许评论精选
- int64 status = 2;
-}
-
-//
-message Config {
- //
- bool story_vertical_exp = 1;
- //
- int64 detail_view_bits = 2;
-}
-
-//
-enum CoverIcon {
- cover_icon_none = 0; // 占位 啥都不展示
- cover_icon_play = 1; // 播放icon
- cover_icon_danmaku = 2; //
- cover_icon_up = 3; //
- cover_icon_vt = 4; // ? 竖屏模式 icon
-}
-
-//
-message CoverIconWithText {
- //
- int32 icon = 1;
- //
- string text = 2;
-}
-
-// 装扮卡片-粉丝勋章信息
-message DecoCardFan {
- // 是否是粉丝
- int32 is_fan = 1;
- // 数量
- int32 number = 2;
- // 数量 str
- string number_str = 3;
- // 颜色
- string color = 4;
-}
-
-// 装扮卡片
-message DecorateCard {
- // 装扮卡片id
- int64 id = 1;
- // 装扮卡片链接
- string card_url = 2;
- // 装扮卡片点击跳转链接
- string jump_url = 3;
- // 粉丝样式
- DecoCardFan fan = 4;
-}
-
-// 文本描述
-message Description {
- // 文本内容
- string text = 1;
- // 文本类型
- DescType type = 2;
- // 点击跳转链接
- string uri = 3;
- // emoji类型
- EmojiType emoji_type = 4;
- // 商品类型
- string goods_type = 5;
- // 前置Icon
- string icon_url = 6;
- // icon_name
- string icon_name = 7;
- // 资源ID
- string rid = 8;
- // 商品卡特殊字段
- ModuleDescGoods goods = 9;
- // 文本原始文案
- string orig_text = 10;
- //
- int32 emoji_size = 11;
- //
- EmojiSizeSpec emoji_size_spec = 12;
-}
-
-// 文本类型
-enum DescType {
- desc_type_none = 0; // 占位
- desc_type_text = 1; // 文本
- desc_type_aite = 2; // @
- desc_type_lottery = 3; // 抽奖
- desc_type_vote = 4; // 投票
- desc_type_topic = 5; // 话题
- desc_type_goods = 6; // 商品
- desc_type_bv = 7; // bv
- desc_type_av = 8; // av
- desc_type_emoji = 9; // 表情
- desc_type_user = 10; // 外露用户
- desc_type_cv = 11; // 专栏
- desc_type_vc = 12; // 小视频
- desc_type_web = 13; // 网址
- desc_type_taobao = 14; // 淘宝
- desc_type_mail = 15; // 邮箱
- desc_type_ogv_season = 16; // 番剧season
- desc_type_ogv_ep = 17; // 番剧ep
- desc_type_search_word = 18; //
-}
-
-
-// 尺寸信息
-message Dimension {
- //
- int64 height = 1;
- //
- int64 width = 2;
- //
- int64 rotate = 3;
-}
-
-//
-enum DisableState {
- highlight = 0; // 高亮
- gary = 1; // 置灰(按钮不可点击)
-}
-
-// 动态通用附加卡-follow/取消follow-响应
-message DynAdditionCommonFollowReply {
- //
- AdditionalButtonStatus status = 1;
-}
-
-// 动态通用附加卡-follow/取消follow-请求
-message DynAdditionCommonFollowReq {
- //
- AdditionalButtonStatus status = 1;
- //
- string dyn_id = 2;
- //
- string card_type = 3;
-}
-
-// 最近访问-个人feed流列表-返回
-message DynAllPersonalReply {
- // 动态列表
- repeated DynamicItem list = 1;
- // 偏移量
- string offset = 2;
- // 是否还有更多数据
- bool has_more = 3;
- // 已读进度
- string read_offset = 4;
- // 关注状态
- Relation relation = 5;
- // 顶部预约卡
- TopAdditionUP addition_up = 6;
- //
- string title = 7;
- //
- string title_sub = 8;
-}
-
-// 最近访问-个人feed流列表-请求
-message DynAllPersonalReq {
- // 被访问者的 UID
- int64 host_uid = 1;
- // 偏移量 第一页可传空
- string offset = 2;
- // 标明下拉几次
- int32 page = 3;
- // 是否是预加载 默认是1;客户端预加载。1:是预加载,不更新已读进度,不会影响小红点;0:非预加载,更新已读进度
- int32 is_preload = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 6;
- // 服务端生成的透传上报字段
- string footprint = 7;
- // 来源
- string from = 8;
- // 秒开用
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 9;
- //
- string personal_extra = 10;
-}
-
-// 动态综合页-响应
-message DynAllReply {
- // 卡片列表
- DynamicList dynamic_list = 1;
- // 顶部up list
- CardVideoUpList up_list = 2;
- // 话题广场
- TopicList topic_list = 3;
- // 无关注推荐
- Unfollow unfollow = 4;
- // 分区UP推荐
- DynRegionRcmd region_rcmd = 5;
- //
- Config config = 6;
-}
-
-// 动态综合页-请求
-message DynAllReq {
- // 透传 update_baseline
- string update_baseline = 1;
- // 透传 history_offset
- string offset = 2;
- // 向下翻页数
- int32 page = 3;
- // 刷新方式 1向上刷新 2向下翻页
- Refresh refresh_type = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 综合页当前更新的最大值
- string assist_baseline = 6;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 7;
- // 推荐up主入参(new的时候传)
- RcmdUPsParam rcmd_ups_param = 8;
- // 广告参数
- AdParam ad_param = 9;
- // 是否冷启
- int32 cold_start = 10;
- // 来源
- string from = 11;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 12;
- //
- int64 tab_recall_uid = 13;
- //
- int32 tab_recall_type = 14;
-}
-
-// 最近访问-标记已读-请求
-message DynAllUpdOffsetReq {
- // 被访问者的UID
- int64 host_uid = 1;
- // 用户已读进度
- string read_offset = 2;
- // 服务端生成的透传上报字段
- string footprint = 3;
- //
- string personal_extra = 4;
-}
-
-
-// 动态卡片
-message DynamicItem {
- // 动态卡片类型
- DynamicType card_type = 1;
- // 转发类型下,源卡片类型
- DynamicType item_type = 2;
- // 模块内容
- repeated Module modules = 3;
- // 操作相关字段
- Extend extend = 4;
- // 该卡片下面是否含有折叠卡
- int32 has_fold = 5;
- // 透传到客户端的埋点字段。
- string server_info = 6;
-}
-
-//动态卡片列表
-message DynamicList {
- // 动态列表
- repeated DynamicItem list = 1;
- // 更新的动态数
- int64 update_num = 2;
- // 历史偏移
- string history_offset = 3;
- // 更新基础信息
- string update_baseline = 4;
- // 是否还有更多数据
- bool has_more = 5;
-}
-
-// 枚举-动态类型
-enum DynamicType {
- dyn_none = 0; // 占位
- forward = 1; // 转发
- av = 2; // 稿件: ugc、小视频、短视频、UGC转PGC
- pgc = 3; // pgc:番剧、PGC番剧、PGC电影、PGC电视剧、PGC国创、PGC纪录片
- courses = 4; // 付费更新批次
- fold = 5; // 折叠
- word = 6; // 纯文字
- draw = 7; // 图文
- article = 8; // 专栏 原仅phone端
- music = 9; // 音频 原仅phone端
- common_square = 10; // 通用卡 方形
- common_vertical = 11; // 通用卡 竖形
- live = 12; // 直播卡 只有转发态
- medialist = 13; // 播单 原仅phone端 只有转发态
- courses_season = 14; // 付费更新批次 只有转发态
- ad = 15; // 广告卡
- applet = 16; // 小程序卡
- subscription = 17; // 订阅卡
- live_rcmd = 18; // 直播推荐卡
- banner = 19; // 通栏
- ugc_season = 20; // 合集卡
- subscription_new = 21; // 新订阅卡
- story = 22; //
- topic_rcmd = 23; //
- cour_up = 24; //
- topic_set = 25; //
- notice = 26; //
- text_notice = 27; //
-}
-
-// 动态详情页-响应
-message DynDetailReply {
- // 动态详情
- DynamicItem item = 1;
-}
-
-// 动态详情页-请求
-message DynDetailReq {
- // up主uid
- int64 uid = 1;
- // 动态ID
- string dynamic_id = 2;
- // 动态类型
- int64 dyn_type = 3;
- // 业务方资源id
- int64 rid = 4;
- // 广告参数
- AdParam ad_param = 5;
- // From来源
- string from = 6;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 7;
- // 分享id
- string share_id = 8;
- // 分享类型
- // 1:文字 2:图片 3:链接 4:视频 5:音频
- int32 share_mode = 9;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 10;
- // pattern
- string pattern = 11;
- //
- Config config = 12;
-}
-
-// 批量动态id获取动态详情-响应
-message DynDetailsReply {
- // 动态列表
- repeated DynamicItem list = 1;
-}
-
-// 批量动态id获取动态详情-请求
-message DynDetailsReq {
- // 动态id
- string dynamic_ids = 1;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 2;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 3;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
- //
- Config config = 5;
-}
-
-// 动态小卡类型
-enum DynExtendType {
- dyn_ext_type_none = 0; // 占位
- dyn_ext_type_topic = 1; // 话题小卡
- dyn_ext_type_lbs = 2; // lbs小卡
- dyn_ext_type_hot = 3; // 热门小卡
- dyn_ext_type_game = 4; // 游戏小卡
- dyn_ext_type_common = 5; // 通用小卡
- dyn_ext_type_biliCut = 6; // 必剪小卡
- dyn_ext_type_ogv = 7; // ogv小卡
- dyn_ext_type_auto_ogv = 8; // 自动附加ogv小卡
-}
-
-// 动态发布生成临时卡-响应
-message DynFakeCardReply {
- // 动态卡片
- DynamicItem item = 1;
-}
-
-// 动态发布生成临时卡-请求
-message DynFakeCardReq {
- //卡片内容json string
- string content = 1;
-}
-
-//
-message DynFeatureGate {
- //
- bool enhanced_interaction = 1;
-}
-
-//
-message DynFriendReply {
- //
- repeated DynamicItem dyn_list = 1;
- //
- bool has_more = 2;
- //
- string offset = 3;
-}
-
-//
-message DynFriendReq {
- //
- string offset = 1;
- //
- int32 local_time = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
-}
-
-// 轻浏览-响应
-message DynLightReply {
- // 卡片列表
- DynamicList dynamic_list = 1;
-}
-
-// 轻浏览-请求
-message DynLightReq {
- // 透传 history_offset
- string history_offset = 1;
- // 向下翻页数
- int32 page = 2;
- // 来源
- string from = 3;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 5;
- //
- int32 from_type = 6;
- //
- int64 fake_uid = 7;
-}
-
-// 查看更多-列表-响应
-message DynMixUpListViewMoreReply {
- //
- repeated MixUpListItem items = 1;
- //
- string search_default_text = 2;
- // 排序类型列表
- repeated SortType sort_types = 3;
- // 是否展示更多的排序策略
- bool show_more_sort_types = 4;
- // 默认排序策略
- int32 default_sort_type = 5;
-}
-
-// 查看更多-请求
-message DynMixUpListViewMoreReq {
- // 排序策略
- // 1:推荐排序 2:最常访问 3:最近关注,其他值为默认排序
- int32 sort_type = 1;
-}
-
-// 动态模块类型
-enum DynModuleType {
- module_none = 0; // 占位
- module_author = 1; // 发布人模块
- module_dispute = 2; // 争议小黄条
- module_desc = 3; // 描述文案
- module_dynamic = 4; // 动态卡片
- module_forward = 5; // 转发模块
- module_likeUser = 6; // 点赞用户(废弃)
- module_extend = 7; // 小卡模块
- module_additional = 8; // 附加卡
- module_stat = 9; // 计数信息
- module_fold = 10; // 折叠
- module_comment = 11; // 评论外露(废弃)
- module_interaction = 12; // 外露交互模块(点赞、评论)
- module_author_forward = 13; // 转发卡的发布人模块
- module_ad = 14; // 广告卡模块
- module_banner = 15; // 通栏模块
- module_item_null = 16; // 获取物料失败模块
- module_share_info = 17; // 分享组件
- module_recommend = 18; // 相关推荐模块
- module_stat_forward = 19; // 转发卡计数信息
- module_top = 20; // 顶部模块
- module_bottom = 21; // 底部模块
- module_story = 22; //
- module_topic = 23; //
- module_topic_details_ext = 24; //
- module_top_tag = 25; //
- module_topic_brief = 26; //
- module_title = 27; //
- module_button = 28;
- module_notice = 29;
- module_opus_summary = 30;
- module_copyright = 31;
- module_paragraph = 32;
- module_blocked = 33;
- module_text_notice = 34;
- module_opus_collection = 35;
-}
-
-// 推荐页-响应
-message DynRcmdReply {
- // 推荐页返回参数
- DynRegionRcmd region_rcmd = 1;
- //
- DynamicList dynamic_list = 2;
-}
-
-// 推荐页-请求
-message DynRcmdReq {
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 1;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 2;
- //
- int64 fake_uid = 3;
- //
- bool is_refresh = 4;
-}
-
-// 关注推荐up主换一换-响应
-message DynRcmdUpExchangeReply {
- // 无关注推荐
- Unfollow unfollow = 1;
-}
-
-// 关注推荐up主换一换-请求
-message DynRcmdUpExchangeReq {
- // 登录用户id
- int64 uid = 1;
- // 上一次不感兴趣的ts,单位:秒;该字段透传给搜索
- int64 dislikeTs = 2;
- // 需要与服务端确认或参照客户端现有参数
- string from = 3;
-}
-
-// 推荐页返回参数
-message DynRegionRcmd {
- // 分区推荐项目列表
- repeated DynRegionRcmdItem items = 1;
- // 分区聚类推荐选项
- RcmdOption opts = 2;
-}
-
-// 分区推荐项目
-message DynRegionRcmdItem {
- // 分区id
- int64 rid = 1;
- // 标题
- string title = 2;
- // 推荐模块
- repeated ModuleRcmd items = 3;
-}
-
-//
-message DynScreenTab {
- //
- string title = 1;
- //
- string name = 2;
- //
- bool default_tab = 3;
- //
- bool strategy_show_on_entrance = 4;
- //
- bool strategy_show_on_refresh = 5;
- //
- bool strategy_show_on_pull_up = 6;
-}
-
-//
-message DynSearchReply {
- //
- SearchChannel channel_info = 1;
- //
- SearchTopic search_topic = 2;
- //
- SearchInfo search_info = 3;
-}
-
-//
-message DynSearchReq {
- //
- string keyword = 1;
- //
- int32 page = 2;
- //
- int32 local_time = 3;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
-}
-
-//
-message DynServerDetailsReply {
- //
- map items = 1;
-}
-
-//
-message DynServerDetailsReq {
- //
- int32 local_time = 2;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- //
- string mobi_app = 4;
- //
- string device = 5;
- //
- string buvid = 6;
- //
- int64 build = 7;
- //
- int64 mid = 8;
- //
- string platform = 9;
- //
- bool is_master = 10;
- //
- repeated int64 top_dynamic_ids = 11;
-}
-
-// 空间页动态-请求
-message DynSpaceReq {
- // 被访问者,也就是空间主人的uid
- int64 host_uid = 1;
- // 动态偏移history_offset
- string history_offset = 2;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 4;
- // 向下翻页数,默认从1开始
- int64 page = 5;
- // 来源,空间页:space,直播tab:live
- string from = 6;
-}
-
-// 空间页动态-响应
-message DynSpaceRsp {
- // 卡片列表
- repeated DynamicItem list = 1;
- // 历史偏移
- string history_offset = 2;
- // 是否还有更多数据
- bool has_more = 3;
-}
-
-//
-message DynSpaceSearchDetailsReply {
- //
- map items = 1;
-}
-
-//
-message DynSpaceSearchDetailsReq {
- //
- repeated string search_words = 2;
- //
- int32 local_time = 3;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
- //
- string mobi_app = 5;
- //
- string device = 6;
- //
- string buvid = 7;
- //
- int64 build = 8;
- //
- int64 mid = 9;
- //
- string platform = 10;
- //
- string ip = 11;
- //
- int32 net_type = 12;
- //
- int32 tf_type = 13;
-}
-
-//
-message DynTab {
- //
- string title = 1;
- //
- string uri = 2;
- //
- string bubble = 3;
- //
- int32 red_point = 4;
- //
- int64 city_id = 5;
- //
- int32 is_popup = 6;
- //
- Popup popup = 7;
- //
- bool default_tab = 8;
- //
- string sub_title = 9;
- //
- string anchor = 10;
- //
- string internal_test = 11;
- //
- int32 type = 12;
- //
- DynTab back_up = 13;
-}
-
-//
-message DynTabReply {
- //
- repeated DynTab dyn_tab = 1;
- //
- repeated DynScreenTab screen_tab = 2;
-}
-
-//
-message DynTabReq {
- //
- int32 teenagers_mode = 1;
- //
- CampusReqFromType from_type = 2;
-}
-
-// 动态点赞-请求
-message DynThumbReq {
- // 用户uid
- int64 uid = 1;
- // 动态id
- string dyn_id = 2;
- // 动态类型(透传extend中的dyn_type)
- int64 dyn_type = 3;
- // 业务方资源id
- string rid = 4;
- // 点赞类型
- ThumbType type = 5;
-}
-
-// 最近访问-个人feed流列表-响应
-message DynVideoPersonalReply {
- // 动态列表
- repeated DynamicItem list = 1;
- // 偏移量
- string offset = 2;
- // 是否还有更多数据
- bool has_more = 3;
- // 已读进度
- string read_offset = 4;
- // 关注状态
- Relation relation = 5;
- // 顶部预约卡
- TopAdditionUP addition_up = 6;
- //
- string title = 7;
- //
- string title_sub = 8;
-}
-
-// 最近访问-个人feed流列表-请求
-message DynVideoPersonalReq {
- // 被访问者的 UID
- int64 host_uid = 1;
- // 偏移量 第一页可传空
- string offset = 2;
- // 标明下拉几次
- int32 page = 3;
- // 是否是预加载
- int32 is_preload = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 6;
- // 服务端生成的透传上报字段
- string footprint = 7;
- // 来源
- string from = 8;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 9;
- //
- int64 pegasus_avid = 10;
- //
- string personal_extra = 11;
-}
-
-// 动态视频页-响应
-message DynVideoReply {
- // 卡片列表
- CardVideoDynList dynamic_list = 1;
- // 动态卡片
- CardVideoUpList video_up_list = 2;
- // 视频页-我的追番
- CardVideoFollowList video_follow_list = 3;
-}
-
-// 动态视频页-请求
-message DynVideoReq {
- // 透传 update_baseline
- string update_baseline = 1;
- // 透传 history_offset
- string offset = 2;
- // 向下翻页数
- int32 page = 3;
- // 刷新方式
- // 1:向上刷新 2:向下翻页
- Refresh refresh_type = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 综合页当前更新的最大值
- string assist_baseline = 6;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 7;
- // 来源
- string from = 8;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 9;
-}
-
-// 最近访问-标记已读-请求
-message DynVideoUpdOffsetReq {
- // 被访问者的UID
- int64 host_uid = 1;
- // 用户已读进度
- string read_offset = 2;
- // 服务端生成的透传上报字段
- string footprint = 3;
- //
- string personal_extra = 4;
-}
-
-// 投票操作-响应
-message DynVoteReply {
- // 投票详情
- AdditionVote2 item = 1;
- // 投票操作返回状态
- string toast = 2;
-}
-
-// 投票操作-请求
-message DynVoteReq {
- // 投票ID
- int64 vote_id = 1;
- // 选项索引数组
- repeated int64 votes = 2;
- // 状态
- VoteStatus status = 3;
- // 动态ID
- string dynamic_id = 4;
- // 是否分享
- bool share = 5;
-}
-
-//
-message EmojiSizeSpec {
- //
- int64 width = 1;
-}
-
-// 表情包类型
-enum EmojiType {
- emoji_none = 0; // 占位
- emoji_old = 1; // emoji旧类型
- emoji_new = 2; // emoji新类型
- vip = 3; // 大会员表情
-}
-
-//
-message EmoteNode {
- //
- string emote_url = 2;
- //
- EmoteSize emote_width = 3;
- //
- ImgInlineCfg inline_img_cfg = 5;
- //
- bool is_inline_img = 4;
- //
- WordNode raw_text = 1;
-}
-
-//
-message EmoteSize {
- //
- double width = 1;
- //
- int32 emoji_size = 2;
-}
-
-// 附加大卡-电竞卡样式
-enum EspaceStyle {
- moba = 0; // moba类
-}
-
-// 扩展字段,用于动态部分操作使用
-message Extend {
- // 动态id
- string dyn_id_str = 1;
- // 业务方id
- string business_id = 2;
- // 源动态id
- string orig_dyn_id_str = 3;
- // 转发卡:用户名
- string orig_name = 4;
- // 转发卡:图片url
- string orig_img_url = 5;
- // 转发卡:文字内容
- repeated Description orig_desc = 6;
- // 填充文字内容
- repeated Description desc = 7;
- // 被转发的源动态类型
- DynamicType orig_dyn_type = 8;
- // 分享到站外展示类型
- string share_type = 9;
- // 分享的场景
- string share_scene = 10;
- // 是否快速转发
- bool is_fast_share = 11;
- // r_type 分享和转发
- int32 r_type = 12;
- // 数据源的动态类型
- int64 dyn_type = 13;
- // 用户id
- int64 uid = 14;
- // 卡片跳转
- string card_url = 15;
- // 透传字段
- google.protobuf.Any source_content = 16;
- // 转发卡:用户头像
- string orig_face = 17;
- // 评论跳转
- ExtendReply reply = 18;
- //
- string track_id = 19;
- //
- ModuleOpusSummary opus_summary = 20;
- //
- OnlyFansProperty only_fans_property = 21;
- //
- DynFeatureGate feature_gate = 22;
- //
- bool is_in_audit = 23;
- //
- map history_report = 24;
-}
-
-// 评论扩展
-message ExtendReply {
- // 基础跳转地址
- string uri = 1;
- // 参数部分
- repeated ExtendReplyParam params = 2;
-}
-
-// 评论扩展参数部分
-message ExtendReplyParam {
- // 参数名
- string key = 1;
- // 参数值
- string value = 2;
-}
-
-// 动态-拓展小卡模块-通用小卡
-message ExtInfoCommon {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // poiType
- int32 poi_type = 4;
- // 类型
- DynExtendType type = 5;
- // 客户端埋点用
- string sub_module = 6;
- // 行动点文案
- string action_text = 7;
- // 行动点链接
- string action_url = 8;
- // 资源rid
- int64 rid = 9;
- // 轻浏览是否展示
- bool is_show_light = 10;
-}
-
-// 动态-拓展小卡模块-游戏小卡
-message ExtInfoGame {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 动态-拓展小卡模块-热门小卡
-message ExtInfoHot {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 动态-拓展小卡模块-lbs小卡
-message ExtInfoLBS {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // poiType
- int32 poi_type = 4;
-}
-
-// 动态-拓展小卡模块-ogv小卡
-message ExtInfoOGV {
- // ogv小卡
- repeated InfoOGV info_ogv = 1;
-}
-
-// 动态-拓展小卡模块-话题小卡
-message ExtInfoTopic {
- // 标题-话题名
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-//
-message FeedFilterReply {
- //
- string offset = 1;
- //
- bool has_more = 2;
- //
- repeated DynamicItem list = 3;
-}
-
-//
-message FeedFilterReq {
- //
- string offset = 1;
- //
- string tab = 2;
- //
- int32 local_time = 3;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
- //
- AdParam ad_param = 5;
- //
- int32 cold_start = 6;
- //
- int64 page = 7;
-}
-
-//
-message FetchTabSettingReply {
- //
- int32 status = 1;
-}
-
-// 折叠类型
-enum FoldType {
- FoldTypeZore = 0; // 占位
- FoldTypePublish = 1; // 用户发布折叠
- FoldTypeFrequent = 2; // 转发超频折叠
- FoldTypeUnite = 3; // 联合投稿折叠
- FoldTypeLimit = 4; // 动态受限折叠
- FoldTypeTopicMerged = 5;
-}
-
-// 视频页-我的追番-番剧信息
-message FollowListItem {
- // season_id
- int64 season_id = 1;
- // 标题
- string title = 2;
- // 封面图
- string cover = 3;
- // 跳转链接
- string url = 4;
- // new_ep
- NewEP new_ep = 5;
- // 子标题
- string sub_title = 6;
- // 卡片位次
- int64 pos = 7;
-}
-
-//
-enum FollowType {
- ft_not_follow = 0; //
- ft_follow = 1; //
-}
-
-// 动态-附加卡-商品卡-商品
-message GoodsItem {
- // 图片
- string cover = 1;
- // schemaPackageName(Android用)
- string schema_package_name = 2;
- // 商品类型
- // 1:淘宝 2:会员购
- int32 source_type = 3;
- // 跳转链接
- string jump_url = 4;
- // 跳转文案
- string jump_desc = 5;
- // 标题
- string title = 6;
- // 摘要
- string brief = 7;
- // 价格
- string price = 8;
- // item_id
- int64 item_id = 9;
- // schema_url
- string schema_url = 10;
- // open_white_list
- repeated string open_white_list = 11;
- // use_web_v2
- bool user_web_v2 = 12;
- // ad mark
- string ad_mark = 13;
- //
- string app_name = 14;
- //
- GoodsJumpType jump_type = 15;
-}
-
-//
-enum GoodsJumpType {
- goods_none = 0;
- goods_schema = 1;
- goods_url = 2;
-}
-
-//
-message GuideBarInfo {
- //
- int32 show = 1;
- //
- int32 page = 2;
- //
- int32 position = 3;
- //
- string desc = 4;
- //
- int32 jump_page = 5;
- //
- int32 jump_position = 6;
-}
-
-// 高亮文本
-message HighlightText {
- // 展示文本
- string text = 1;
- // 高亮类型
- HighlightTextStyle text_style = 2;
- //
- string jump_url = 3;
- //
- string icon = 4;
-}
-
-// 文本高亮枚举
-enum HighlightTextStyle {
- style_none = 0; // 默认
- style_highlight = 1; // 高亮
-}
-
-//
-enum HomePageTabSttingStatus {
- SETTING_INVALID = 0;
- SETTING_OPEN = 1;
- SETTING_CLOSE = 2;
-}
-
-//
-message HomeSubscribeReply {
- //
- int32 online = 1;
-}
-
-//
-message HomeSubscribeReq {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
-}
-
-//
-message IconBadge {
- //
- string icon_bg_url = 1;
- //
- string text = 2;
-}
-
-//
-message IconButton {
- //
- string text = 1;
- //
- string icon_head = 2;
- //
- string icon_tail = 3;
- //
- string jump_uri = 4;
-}
-
-//
-enum IconResLocal {
- ICON_RES_LOCAL_NONE = 0;
- ICON_RES_LOCAL_LIVE = 1;
-}
-
-//
-message ImageSet {
- //
- string img_day = 1;
- //
- string img_dark = 2;
-}
-
-// 枚举-附加卡样式
-enum ImageStyle {
- add_style_vertical = 0; //
- add_style_square = 1; //
-}
-
-//
-message ImgInlineCfg {
- //
- double width = 1;
- //
- double height = 2;
- //
- Colors color = 3;
-}
-
-// 动态-拓展小卡模块-ogv小卡-(one of 片单、榜单、分区)
-message InfoOGV {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // 客户端埋点用
- string sub_module = 4;
-}
-
-//
-message InteractionFace {
- //
- int64 mid = 1;
- //
- string face = 2;
-}
-
-// 外露交互模块
-message InteractionItem {
- // 外露模块类型
- LocalIconType icon_type = 1;
- // 外露模块文案
- repeated Description desc = 2;
- // 外露模块uri相关 根据type不同用法不同
- string uri = 3;
- // 动态id
- string dynamic_id = 4;
- // 评论mid
- int64 comment_mid = 6;
- //
- repeated InteractionFace faces = 7;
- //
- InteractionStat stat = 8;
- //
- string icon = 9;
-}
-
-//
-message InteractionStat {
- //
- int64 like = 1;
-}
-
-//
-message LbsPoiDetail {
- //
- string poi = 1;
- //
- int64 type = 2;
- //
- repeated string base_pic = 3;
- //
- repeated string cover = 4;
- //
- string address = 5;
- //
- string title = 6;
-}
-
-//
-message LbsPoiReply {
- //
- bool has_more = 1;
- //
- string offset = 2;
- //
- LbsPoiDetail detail = 3;
- //
- repeated DynamicItem list = 4;
-}
-
-//
-message LbsPoiReq {
- //
- string poi = 1;
- //
- int64 type = 2;
- //
- string offset = 3;
- //
- int32 refresh_type = 4;
- //
- int32 local_time = 5;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
-}
-
-//
-message LegacyTopicFeedReply {
- //
- repeated DynamicItem list = 1;
- //
- bool has_more = 2;
- //
- string offset = 3;
- //
- repeated SortType supported_sort_types = 4;
- //
- repeated SortType feed_card_filters = 5;
-}
-
-//
-message LegacyTopicFeedReq {
- //
- int64 topic_id = 1;
- //
- string topic_name = 2;
- //
- string offset = 3;
- //
- SortType sort_type = 4;
- //
- SortType card_filter = 5;
-}
-
-//
-enum LightFromType {
- from_login = 0; //
- from_unlogin = 1; //
-}
-
-// 点赞动画
-message LikeAnimation {
- // 开始动画
- string begin = 1;
- // 过程动画
- string proc = 2;
- // 结束动画
- string end = 3;
- // id
- int64 like_icon_id = 4;
-}
-
-// 点赞拓展信息
-message LikeInfo {
- // 点赞动画
- LikeAnimation animation = 1;
- // 是否点赞
- bool is_like = 2;
-}
-
-// 点赞列表-响应
-message LikeListReply {
- // 用户模块列表
- repeated ModuleAuthor list = 1;
- // 是否还有更多数据
- bool has_more = 2;
- // 点赞总数
- int64 total_count = 3;
-}
-
-// 点赞列表-请求
-message LikeListReq {
- // 动态ID
- string dynamic_id = 1;
- // 动态类型
- int64 dyn_type = 2;
- // 业务方资源id
- int64 rid = 3;
- //上一页最后一个uid
- int64 uid_offset = 4;
- // 下拉页数
- int32 page = 5;
-}
-
-// 点赞用户
-message LikeUser {
- // 用户mid
- int64 uid = 1;
- // 用户昵称
- string uname = 2;
- // 点击跳转链接
- string uri = 3;
-}
-
-//
-message LineParagraph {
- //
- MdlDynDrawItem pic = 1;
-}
-
-//
-message LinkNode {
- //
- string show_text = 1;
- //
- string link = 2;
- //
- string icon = 3;
- //
- string icon_suffix = 4;
- //
- string link_type = 5;
- //
- LinkNodeType link_type_enum = 6;
- //
- string biz_id = 7;
- //
- int64 timestamp = 8;
- //
- GoodsItem goods_item = 9;
- //
- NoteVideoTS note_video_ts = 10;
-}
-
-//
-enum LinkNodeType {
- INVALID = 0;
- VIDEO = 1;
- RESERVE = 2;
- VOTE = 3;
- LIVE = 4;
- LOTTERY = 5;
- MATCH = 6;
- GOODS = 7;
- OGV_SS = 8;
- OGV_EP = 9;
- MANGA = 10;
- CHEESE = 11;
- VIDEO_TS = 12;
- AT = 13;
- HASH_TAG = 14;
- ARTICLE = 15;
- URL = 16;
- MAIL = 17;
- LBS = 18;
- ACTIVITY = 19;
- ATTACH_CARD_OFFICIAL_ACTIVITY = 20;
- GAME = 21;
- DECORATION = 22;
- UP_TOPIC = 23;
- UP_ACTIVITY = 24;
- UP_MAOER = 25;
- MEMBER_GOODS = 26;
- OPENMALL_UP_ITEMS = 27;
- SEARCH = 28;
-}
-
-// 直播信息
-message LiveInfo {
- // 是否在直播
- // 0:未直播 1:正在直播 (废弃)
- int32 is_living = 1;
- // 跳转链接
- string uri = 2;
- // 直播状态
- LiveState live_state = 3;
-}
-
-//
-message LivePendant {
- //
- string text = 1;
- //
- string icon = 2;
- //
- int64 pendant_id = 3;
-}
-
-// 直播状态
-enum LiveState {
- live_none = 0; // 未直播
- live_live = 1; // 直播中
- live_rotation = 2; // 轮播中
-}
-
-// 外露模块类型
-enum LocalIconType {
- local_icon_comment = 0; //
- local_icon_like = 1; //
- local_icon_avatar = 2;
- local_icon_cover = 3;
- local_icon_like_and_forward = 4;
-}
-
-// 动态-附加卡-电竞卡-战队
-message MatchTeam {
- // 战队ID
- int64 id = 1;
- // 战队名
- string name = 2;
- // 战队图标
- string cover = 3;
- // 日间色值
- string color = 4;
- // 夜间色值
- string night_color = 5;
-}
-
-//
-enum MdlBlockedStyle {
- BLOCKED_STYLE_DEFAULT = 0;
- BLOCKED_STYLE_IN_AUDIT = 1;
- BLOCKED_STYLE_ONLY_FANS_LIST = 2;
- BLOCKED_STYLE_ONLY_FANS_VIDEO = 3;
-}
-
-// 动态列表渲染部分-详情模块-小程序/小游戏
-message MdlDynApplet {
- // 小程序id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 主标题
- string title = 4;
- // 副标题
- string sub_title = 5;
- // 封面图
- string cover = 6;
- // 小程序icon
- string icon = 7;
- // 小程序标题
- string label = 8;
- // 按钮文案
- string button_title = 9;
-}
-
-// 动态-详情模块-稿件
-message MdlDynArchive {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // avid
- int64 avid = 7;
- // cid
- int64 cid = 8;
- // 视频源类型
- MediaType media_type = 9;
- // 尺寸信息
- Dimension dimension = 10;
- // 角标,多个角标之前有间距
- repeated VideoBadge badge = 11;
- // 是否能够自动播放
- bool can_play= 12;
- // stype
- VideoType stype = 13;
- // 是否PGC
- bool isPGC = 14;
- // inline播放地址
- string inlineURL = 15;
- // PGC的epid
- int64 EpisodeId = 16;
- // 子类型
- int32 SubType = 17;
- // PGC的ssid
- int64 PgcSeasonId = 18;
- // 播放按钮
- string play_icon = 19;
- // 时长
- int64 duration = 20;
- // 跳转地址
- string jump_url = 21;
- // 番剧是否为预览视频
- bool is_preview = 22;
- // 新角标,多个角标之前没有间距
- repeated VideoBadge badge_category = 23;
- // 当前是否是pgc正片
- bool is_feature = 24;
- // 是否是预约召回
- ReserveType reserve_type = 25;
- // bvid
- string bvid = 26;
- // 播放数
- int32 view = 27;
- //
- bool show_premiere_badge = 28;
- //
- bool premiere_card = 29;
- //
- bool show_progress = 30;
- //
- int64 part_duration = 31;
- //
- int64 part_progress = 32;
-}
-
-// 动态列表渲染部分-详情模块-专栏模块
-message MdlDynArticle {
- // 专栏id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 标题
- string title = 3;
- // 文案部分
- string desc = 4;
- // 配图
- repeated string covers = 5;
- // 阅读量标签
- string label = 6;
- // 模板类型
- int32 templateID = 7;
-}
-
-// 动态列表渲染部分-详情模块-通用
-message MdlDynCommon {
- // 物料id
- int64 oid = 1;
- // 跳转地址
- string uri = 2;
- // 标题
- string title = 3;
- // 描述 漫画卡标题下第一行
- string desc = 4;
- // 封面
- string cover = 5;
- // 标签1 漫画卡标题下第二行
- string label = 6;
- // 所属业务类型
- int32 bizType = 7;
- // 镜像数据ID
- int64 sketchID = 8;
- // 卡片样式
- MdlDynCommonType style = 9;
- // 角标
- repeated VideoBadge badge = 10;
- //
- AdditionalButton button = 11;
-}
-
-//
-enum MdlDynCommonType {
- mdl_dyn_common_none = 0; //
- mdl_dyn_common_square = 1; //
- mdl_dyn_common_vertica = 2; //
-}
-
-// 动态-详情模块-付费课程批次
-message MdlDynCourBatch {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 跳转地址
- string uri = 3;
- // 展示项 1(本集标题)
- string text_1 = 4;
- // 展示项 2(更新了多少个视频)
- string text_2 = 5;
- // 角标
- VideoBadge badge = 6;
- // 播放按钮
- string play_icon = 7;
- //
- bool can_play = 8;
- //
- bool is_preview = 9;
- //
- string cover_left_text_1 = 10;
- //
- string cover_left_text_2 = 11;
- //
- string cover_left_text_3 = 12;
- //
- int64 avid = 13;
- //
- int64 cid = 14;
- //
- int64 epid = 15;
- //
- int64 duration = 16;
- //
- int64 season_id = 17;
-}
-
-// 动态-详情模块-付费课程系列
-message MdlDynCourSeason {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 跳转地址
- string uri = 3;
- // 展示项 1(更新信息)
- string text_1 = 4;
- // 描述信息
- string desc = 5;
- // 角标
- VideoBadge badge = 6;
- // 播放按钮
- string play_icon = 7;
- //
- bool can_play = 8;
- //
- bool is_preview = 9;
- //
- int64 avid = 10;
- //
- int64 cid = 11;
- //
- int64 epid = 12;
- //
- int64 duration = 13;
- //
- int64 season_id = 14;
-}
-
-//
-message MdlDynCourUp {
- //
- string title = 1;
- //
- string desc = 2;
- //
- string cover = 3;
- //
- string uri = 4;
- //
- string text_1 = 5;
- //
- VideoBadge badge = 6;
- //
- string play_icon = 7;
- //
- bool can_play = 8;
- //
- bool is_preview = 9;
- //
- int64 avid = 10;
- //
- int64 cid = 11;
- //
- int64 epid = 12;
- //
- int64 duration = 13;
- //
- int64 season_id = 14;
-}
-
-// 动态列表渲染部分-详情模块-图文模块
-message MdlDynDraw {
- // 图片
- repeated MdlDynDrawItem items = 1;
- // 跳转地址
- string uri = 2;
- // 图文ID
- int64 id = 3;
- //
- bool is_draw_first = 4;
- //
- bool is_big_cover = 5;
- //
- bool is_article_cover = 6;
-}
-
-// 动态列表渲染部分-详情模块-图文
-message MdlDynDrawItem {
- // 图片链接
- string src = 1;
- // 图片宽度
- int64 width = 2;
- // 图片高度
- int64 height = 3;
- // 图片大小
- float size = 4;
- // 图片标签
- repeated MdlDynDrawTag tags = 5;
-}
-
-// 动态列表渲染部分-详情模块-图文-标签
-message MdlDynDrawTag {
- // 标签类型
- MdlDynDrawTagType type = 1;
- // 标签详情
- MdlDynDrawTagItem item = 2;
-}
-
-// 动态列表部分-详情模块-图文-标签详情
-message MdlDynDrawTagItem {
- // 跳转链接
- string url = 1;
- // 标签内容
- string text = 2;
- // 坐标-x
- int64 x = 3;
- // 坐标-y
- int64 y = 4;
- // 方向
- int32 orientation = 5;
- // 来源
- // 0:未知 1:淘宝 2:自营
- int32 source = 6;
- // 商品id
- int64 item_id = 7;
- // 用户mid
- int64 mid = 8;
- // 话题id
- int64 tid = 9;
- // lbs信息
- string poi = 10;
- // 商品标签链接
- string schema_url = 11;
-}
-
-// 图文标签类型
-enum MdlDynDrawTagType {
- mdl_draw_tag_none = 0; // 占位
- mdl_draw_tag_common = 1; // 普通标签
- mdl_draw_tag_goods = 2; // 商品标签
- mdl_draw_tag_user = 3; // 用户昵称
- mdl_draw_tag_topic = 4; // 话题名称
- mdl_draw_tag_lbs = 5; // lbs标签
-}
-
-// 动态列表渲染部分-详情模块-转发模块
-message MdlDynForward {
- // 动态转发核心模块 套娃
- DynamicItem item = 1;
- // 透传类型
- // 0:分享 1:转发
- int32 rtype = 2;
-}
-
-// 动态列表渲染部分-详情模块-直播
-message MdlDynLive {
- // 房间号
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 直播间标题
- string title = 3;
- // 直播间封面
- string cover = 4;
- // 标题1 例: 陪伴学习
- string cover_label = 5;
- // 标题2 例: 54.6万人气
- string cover_label2 = 6;
- // 直播状态
- LiveState live_state = 7;
- // 直播角标
- VideoBadge badge = 8;
- // 是否是预约召回
- ReserveType reserve_type = 9;
-}
-
-// 动态列表渲染部分-详情模块-直播推荐
-message MdlDynLiveRcmd {
- // 直播数据
- string content = 1;
- // 是否是预约召回
- ReserveType reserve_type = 2;
- //
- LivePendant pendant = 3;
-}
-
-// 动态列表渲染部分-详情模块-播单
-message MdlDynMedialist {
- // 播单id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 主标题
- string title = 3;
- // 副标题
- string sub_title = 4;
- // 封面图
- string cover = 5;
- // 封面类型
- int32 cover_type = 6;
- // 角标
- VideoBadge badge = 7;
-}
-
-// 动态列表渲染部分-详情模块-音频模块
-message MdlDynMusic {
- // 音频id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // upId
- int64 up_id = 3;
- // 歌名
- string title = 4;
- // 专辑封面
- string cover = 5;
- // 展示项1
- string label1 = 6;
- // upper
- string upper = 7;
-}
-
-// 动态-详情模块-pgc
-message MdlDynPGC {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // cid
- int64 cid = 7;
- // season_id
- int64 season_id = 8;
- // epid
- int64 epid = 9;
- // aid
- int64 aid = 10;
- // 视频源类型
- MediaType media_type = 11;
- // 番剧类型
- VideoSubType sub_type = 12;
- // 番剧是否为预览视频
- bool is_preview = 13;
- // 尺寸信息
- Dimension dimension = 14;
- // 角标,多个角标之前有间距
- repeated VideoBadge badge = 15;
- // 是否能够自动播放
- bool can_play= 16;
- // season
- PGCSeason season = 17;
- // 播放按钮
- string play_icon = 18;
- // 时长
- int64 duration = 19;
- // 跳转地址
- string jump_url = 20;
- // 新角标,多个角标之前没有间距
- repeated VideoBadge badge_category = 21;
- // 当前是否是pgc正片
- bool is_feature = 22;
-}
-
-// 动态列表渲染部分-详情模块-订阅卡
-message MdlDynSubscription {
- // 卡片物料id
- int64 id = 1;
- // 广告创意id
- int64 ad_id = 2;
- // 跳转地址
- string uri = 3;
- // 标题
- string title = 4;
- // 封面图
- string cover = 5;
- // 广告标题
- string ad_title = 6;
- // 角标
- VideoBadge badge = 7;
- // 小提示
- string tips = 8;
-}
-
-// 动态新附加卡
-message MdlDynSubscriptionNew {
- //样式类型
- MdlDynSubscriptionNewStyle style = 1;
- // 新订阅卡数据
- oneof item {
- //
- MdlDynSubscription dyn_subscription = 2;
- // 直播推荐
- MdlDynLiveRcmd dyn_live_rcmd = 3;
- }
-}
-
-//
-enum MdlDynSubscriptionNewStyle {
- mdl_dyn_subscription_new_style_nont = 0; // 占位
- mdl_dyn_subscription_new_style_live = 1; // 直播
- mdl_dyn_subscription_new_style_draw = 2; // 图文
-}
-
-//
-message MdlDynTopicSet {
- //
- repeated TopicItem topics = 1;
- //
- IconButton more_btn = 2;
- //
- int64 topic_set_id = 3;
- //
- int64 push_id = 4;
-}
-
-// 动态列表渲染部分-UGC合集
-message MdlDynUGCSeason {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // 卡片物料id
- int64 id = 7;
- // inline播放地址
- string inlineURL = 8;
- // 是否能够自动播放
- bool can_play= 9;
- // 播放按钮
- string play_icon = 10;
- // avid
- int64 avid = 11;
- // cid
- int64 cid = 12;
- // 尺寸信息
- Dimension dimension = 13;
- // 时长
- int64 duration = 14;
- // 跳转地址
- string jump_url = 15;
-}
-
-// 播放器类型
-enum MediaType {
- MediaTypeNone = 0; // 本地
- MediaTypeUGC = 1; // UGC
- MediaTypePGC = 2; // PGC
- MediaTypeLive = 3; // 直播
- MediaTypeVCS = 4; // 小视频
-}
-
-// 查看更多-列表单条数据
-message MixUpListItem {
- // 用户mid
- int64 uid = 1;
- // 特别关注
- // 0:否 1:是
- int32 special_attention = 2;
- // 小红点状态
- // 0:没有 1:有
- int32 reddot_state = 3;
- // 直播信息
- MixUpListLiveItem live_info = 4;
- // 昵称
- string name = 5;
- // 头像
- string face = 6;
- // 认证信息
- OfficialVerify official = 7;
- // 大会员信息
- VipInfo vip = 8;
- // 关注状态
- Relation relation = 9;
- //
- int32 permire_state = 10;
- //
- string uri = 11;
-}
-
-message MixUpListLiveItem {
- // 直播状态
- // 0:未直播 1:直播中
- bool status = 1;
- // 房间号
- int64 room_id = 2;
- // 跳转地址
- string uri = 3;
-}
-
-// 动态模块
-message Module {
- // 类型
- DynModuleType module_type = 1;
- oneof module_item {
- // 用户模块 1
- ModuleAuthor module_author = 2;
- // 争议黄条模块 2
- ModuleDispute module_dispute = 3;
- // 动态正文模块 3
- ModuleDesc module_desc = 4;
- // 动态卡模块 4
- ModuleDynamic module_dynamic = 5;
- // 点赞外露(废弃)
- ModuleLikeUser module_likeUser = 6;
- // 小卡模块 6
- ModuleExtend module_extend = 7;
- // 大卡模块 5
- ModuleAdditional module_additional = 8;
- // 计数模块 8
- ModuleStat module_stat = 9;
- // 折叠模块 9
- ModuleFold module_fold = 10;
- // 评论外露(废弃)
- ModuleComment module_comment = 11;
- // 外露交互模块(点赞、评论) 7
- ModuleInteraction module_interaction = 12;
- // 转发卡-原卡用户模块
- ModuleAuthorForward module_author_forward = 13;
- // 广告卡
- ModuleAd module_ad = 14;
- // 通栏
- ModuleBanner module_banner = 15;
- // 获取物料失败
- ModuleItemNull module_item_null = 16;
- // 分享组件
- ModuleShareInfo module_share_info = 17;
- // 相关推荐模块
- ModuleRecommend module_recommend = 18;
- // 顶部模块
- ModuleTop module_top = 19;
- // 底部模块
- ModuleButtom module_buttom = 20;
- // 转发卡计数模块
- ModuleStat module_stat_forward = 21;
- //
- ModuleStory module_story = 22;
- //
- ModuleTopic module_topic = 23;
- //
- ModuleTopicDetailsExt module_topic_details_ext = 24;
- //
- ModuleTopTag module_top_tag = 25;
- //
- ModuleTopicBrief module_topic_brief = 26;
- //
- ModuleTitle module_title = 27;
- //
- ModuleButton module_button = 28;
- //
- ModuleNotice module_notice = 29;
- //
- ModuleOpusSummary module_opus_summary = 30;
- //
- ModuleCopyright module_copyright = 31;
- //
- ModuleParagraph module_paragraph = 32;
- //
- ModuleBlocked module_blocked = 33;
- //
- ModuleTextNotice module_text_notice = 34;
- //
- ModuleOpusCollection module_opus_collection = 35;
- }
-}
-
-// 动态列表-用户模块-广告卡
-message ModuleAd {
- // 广告透传信息
- google.protobuf.Any source_content = 1;
- // 用户模块
- ModuleAuthor module_author = 2;
- //
- int32 ad_content_type = 3;
- //
- string cover_left_text1 = 4;
- //
- string cover_left_text2 = 5;
- //
- string cover_left_text3 = 6;
-}
-
-// 动态-附加卡模块
-message ModuleAdditional {
- // 类型
- AdditionalType type = 1;
- oneof item {
- // 废弃
- AdditionalPGC pgc = 2;
- //
- AdditionGoods goods = 3;
- // 废弃
- AdditionVote vote = 4;
- //
- AdditionCommon common = 5;
- //
- AdditionEsport esport = 6;
- // 投票
- AdditionVote2 vote2 = 8;
- //
- AdditionUgc ugc = 9;
- // up主预约发布卡
- AdditionUP up = 10;
- //
- AdditionArticle article = 12;
- //
- AdditionLiveRoom live = 13;
- }
- // 附加卡物料ID
- int64 rid = 7;
- //
- bool need_write_calender = 11;
-}
-
-// 动态-发布人模块
-message ModuleAuthor {
- // 用户mid
- int64 mid = 1;
- // 时间标签
- string ptime_label_text = 2;
- // 用户详情
- UserInfo author = 3;
- // 装扮卡片
- DecorateCard decorate_card = 4;
- // 点击跳转链接
- string uri = 5;
- // 右侧操作区域 - 三点样式
- repeated ThreePointItem tp_list = 6;
- // 右侧操作区域样式枚举
- ModuleAuthorBadgeType badge_type = 7;
- // 右侧操作区域 - 按钮样式
- ModuleAuthorBadgeButton badge_button = 8;
- // 是否关注
- // 1:关注 0:不关注 默认0,注:点赞列表使用,其他场景不使用该字段
- int32 attend = 9;
- // 关注状态
- Relation relation = 10;
- // 右侧操作区域 - 提权样式
- Weight weight = 11;
- // 是否展示关注
- bool show_follow = 12;
- // 是否置顶
- bool is_top = 13;
- // ip属地
- string ptime_location_text = 14;
- //
- bool show_level = 15;
- //
- OnlyFans only_fans = 16;
-}
-
-// 动态列表渲染部分-用户模块-按钮
-message ModuleAuthorBadgeButton {
- // 图标
- string icon = 1;
- // 文案
- string title = 2;
- // 状态
- int32 state = 3;
- // 物料ID
- int64 id = 4;
-}
-
-// 右侧操作区域样式枚举
-enum ModuleAuthorBadgeType {
- module_author_badge_type_none = 0; // 占位
- module_author_badge_type_threePoint = 1; // 三点
- module_author_badge_type_button = 2; // 按钮类型
- module_author_badge_type_weight = 3; // 提权
-}
-
-// 动态列表-用户模块-转发模板
-message ModuleAuthorForward {
- // 展示标题
- repeated ModuleAuthorForwardTitle title = 1;
- // 源卡片跳转链接
- string url = 2;
- // 用户uid
- int64 uid = 3;
- // 时间标签
- string ptime_label_text = 4;
- // 是否展示关注
- bool show_follow = 5;
- // 源up主头像
- string face_url = 6;
- // 双向关系
- Relation relation = 7;
- // 右侧操作区域 - 三点样式
- repeated ThreePointItem tp_list = 8;
-}
-
-// 动态列表-用户模块-转发模板-title部分
-message ModuleAuthorForwardTitle {
- // 文案
- string text = 1;
- // 跳转链接
- string url = 2;
-}
-
-// 动态列表-通栏
-message ModuleBanner {
- // 模块标题
- string title = 1;
- // 卡片类型
- ModuleBannerType type = 2;
- // 卡片
- oneof item{
- ModuleBannerUser user = 3;
- }
- // 不感兴趣文案
- string dislike_text = 4;
- // 不感兴趣图标
- string dislike_icon = 5;
-}
-
-// 动态列表-通栏类型
-enum ModuleBannerType {
- module_banner_type_none = 0; //
- module_banner_type_user = 1; //
-}
-
-// 动态通栏-用户
-message ModuleBannerUser {
- // 卡片列表
- repeated ModuleBannerUserItem list = 1;
-}
-
-// 动态通栏-推荐用户卡
-message ModuleBannerUserItem {
- // up主头像
- string face = 1;
- // up主昵称
- string name = 2;
- // up主uid
- int64 uid = 3;
- // 直播状态
- LiveState live_state = 4;
- // 认证信息
- OfficialVerify official = 5;
- // 大会员信息
- VipInfo vip = 6;
- // 标签信息
- string label = 7;
- // 按钮
- AdditionalButton button = 8;
- // 跳转地址
- string uri = 9;
- //
- Relation relation = 10;
-}
-
-//
-message ModuleBlocked {
- //
- ImageSet icon = 1;
- //
- ImageSet bg_img = 2;
- //
- string hint_message = 3;
- //
- IconButton act_btn = 4;
- //
- MdlBlockedStyle block_style = 5;
- //
- string sub_hint_message = 6;
- //
- OneLineText video_bottom_text_upper = 7;
- //
- OneLineText video_bottom_text_lower = 8;
- //
- string archive_title = 9;
- //
- OneLineText hint_message_one_line = 10;
-}
-
-// 底部模块
-message ModuleButtom {
- enum InteractionIcon {
- ICON_INVALID = 0;
- ICON_FORWARD = 1;
- ICON_COMMENT = 2;
- ICON_FAVORITE = 3;
- ICON_LIKE = 4;
- }
- // 计数模块
- ModuleStat module_stat = 1;
- //
- bool comment_box = 2;
- //
- string comment_box_msg = 3;
- //
- repeated InteractionIcon interaction_icons = 4;
- //
- repeated InteractionFace faces = 5;
-}
-
-//
-message ModuleButton {
- //
- IconButton btn = 1;
-}
-
-// 评论外露模块
-message ModuleComment {
- // 评论外露展示项
- repeated CmtShowItem cmtShowItem = 1;
-}
-
-//
-message ModuleCopyright {
- //
- string left_text = 1;
- //
- string right_text = 2;
-}
-
-// 动态-描述文字模块
-message ModuleDesc {
- // 描述信息(已按高亮拆分)
- repeated Description desc = 1;
- // 点击跳转链接
- string jump_uri = 2;
- // 文本原本
- string text = 3;
-}
-
-// 正文商品卡参数
-message ModuleDescGoods {
- // 商品类型
- // 1:淘宝 2:会员购
- int32 source_type = 1;
- // 跳转链接
- string jump_url = 2;
- // schema_url
- string schema_url = 3;
- // item_id
- int64 item_id = 4;
- // open_white_list
- repeated string open_white_list = 5;
- // use_web_v2
- bool user_web_v2 = 6;
- // ad mark
- string ad_mark = 7;
- // schemaPackageName(Android用)
- string schema_package_name = 8;
- //
- int32 jump_type = 9;
- //
- string app_name = 10;
-}
-
-// 动态-争议小黄条模块
-message ModuleDispute {
- // 标题
- string title = 1;
- // 描述内容
- string desc = 2;
- // 跳转链接
- string uri = 3;
-}
-
-// 动态-详情模块
-message ModuleDynamic {
- // 类型
- ModuleDynamicType type = 1;
- oneof module_item {
- //稿件
- MdlDynArchive dyn_archive = 2;
- //pgc
- MdlDynPGC dyn_pgc = 3;
- //付费课程-系列
- MdlDynCourSeason dyn_cour_season = 4;
- //付费课程-批次
- MdlDynCourBatch dyn_cour_batch = 5;
- //转发卡
- MdlDynForward dyn_forward = 6;
- //图文
- MdlDynDraw dyn_draw = 7;
- //专栏
- MdlDynArticle dyn_article = 8;
- //音频
- MdlDynMusic dyn_music = 9;
- //通用卡方
- MdlDynCommon dyn_common = 10;
- //直播卡
- MdlDynLive dyn_common_live = 11;
- //播单
- MdlDynMedialist dyn_medialist = 12;
- //小程序卡
- MdlDynApplet dyn_applet = 13;
- //订阅卡
- MdlDynSubscription dyn_subscription = 14;
- //直播推荐卡
- MdlDynLiveRcmd dyn_live_rcmd = 15;
- //UGC合集
- MdlDynUGCSeason dyn_ugc_season = 16;
- //订阅卡
- MdlDynSubscriptionNew dyn_subscription_new = 17;
- //课程
- MdlDynCourUp dyn_cour_batch_up = 18;
- //话题集合
- MdlDynTopicSet dyn_topic_set = 19;
- }
-}
-
-// 动态详情模块类型
-enum ModuleDynamicType {
- mdl_dyn_archive = 0; // 稿件
- mdl_dyn_pgc = 1; // pgc
- mdl_dyn_cour_season = 2; // 付费课程-系列
- mdl_dyn_cour_batch = 3; // 付费课程-批次
- mdl_dyn_forward = 4; // 转发卡
- mdl_dyn_draw = 5; // 图文
- mdl_dyn_article = 6; // 专栏
- mdl_dyn_music = 7; // 音频
- mdl_dyn_common = 8; // 通用卡方
- mdl_dyn_live = 9; // 直播卡
- mdl_dyn_medialist = 10; // 播单
- mdl_dyn_applet = 11; // 小程序卡
- mdl_dyn_subscription = 12; // 订阅卡
- mdl_dyn_live_rcmd = 13; // 直播推荐卡
- mdl_dyn_ugc_season = 14; // UGC合集
- mdl_dyn_subscription_new = 15; // 订阅卡
- mdl_dyn_cour_batch_up = 16; // 课程
- mdl_dyn_topic_set = 17; // 话题集合
-}
-
-// 动态-小卡模块
-message ModuleExtend {
- // 详情
- repeated ModuleExtendItem extend = 1;
- // 模块整体跳转uri
- string uri = 2; // 废弃
-}
-
-// 动态-拓展小卡模块
-message ModuleExtendItem {
- // 类型
- DynExtendType type = 1;
- // 卡片详情
- oneof extend {
- // 废弃
- ExtInfoTopic ext_info_topic = 2;
- // 废弃
- ExtInfoLBS ext_info_lbs = 3;
- // 废弃
- ExtInfoHot ext_info_hot = 4;
- // 废弃
- ExtInfoGame ext_info_game = 5;
- //
- ExtInfoCommon ext_info_common = 6;
- //
- ExtInfoOGV ext_info_ogv = 7;
- }
-}
-
-// 动态-折叠模块
-message ModuleFold {
- // 折叠分类
- FoldType fold_type = 1;
- // 折叠文案
- string text = 2;
- // 被折叠的动态
- string fold_ids = 3;
- // 被折叠的用户信息
- repeated UserInfo fold_users = 4;
- //
- TopicMergedResource topic_merged_resource = 5;
-}
-
-// 外露交互模块
-message ModuleInteraction {
- // 外露交互模块
- repeated InteractionItem interaction_item = 1;
-}
-
-// 获取物料失败模块
-message ModuleItemNull {
- // 图标
- string icon = 1;
- // 文案
- string text = 2;
-}
-
-// 动态-点赞用户模块
-message ModuleLikeUser {
- // 点赞用户
- repeated LikeUser like_users = 1;
- // 文案
- string display_text = 2;
-}
-
-//
-message ModuleNotice {
- //
- string identity = 1;
- //
- string icon = 2;
- //
- string title = 3;
- //
- string url = 4;
- //
- int32 notice_type = 5;
-}
-
-//
-message ModuleOpusCollection {
- //
- OpusCollection collection_info = 1;
- //
- string title_upper = 2;
- //
- string title = 3;
- //
- string title_prefix_icon = 4;
- //
- string total_text = 5;
-}
-
-//
-message ModuleOpusSummary {
- //
- Paragraph title = 1;
- //
- Paragraph summary = 2;
- //
- string summary_jump_btn_text = 3;
- //
- repeated MdlDynDrawItem covers = 4;
-}
-
-//
-message ModuleParagraph {
- //
- Paragraph paragraph = 1;
- //
- bool is_article_title = 2;
- //
- ParaSpacing para_spacing = 3;
-}
-
-// 推荐模块
-message ModuleRcmd {
- // 用户头像
- RcmdAuthor author = 1;
- // 推荐卡片列表
- repeated RcmdItem items = 2;
- // 透传到客户端的埋点字段
- string server_info = 3;
-}
-
-// 相关推荐模块
-message ModuleRecommend {
- // 模块标题
- string module_title = 1;
- // 图片
- string image = 2;
- // 标签
- string tag = 3;
- // 标题
- string title = 4;
- // 跳转链接
- string jump_url = 5;
- // 序列化的广告信息
- repeated google.protobuf.Any ad = 6;
-}
-
-// 分享模块
-message ModuleShareInfo {
- // 展示标题
- string title = 1;
- // 分享组件列表
- repeated ShareChannel share_channels = 2;
- // share_origin
- string share_origin = 3;
- // 业务id
- string oid = 4;
- // sid
- string sid = 5;
-}
-
-// 动态-计数模块
-message ModuleStat {
- // 转发数
- int64 repost = 1;
- // 点赞数
- int64 like = 2;
- // 评论数
- int64 reply = 3;
- // 点赞拓展信息
- LikeInfo like_info = 4;
- // 禁评
- bool no_comment = 5;
- // 禁转
- bool no_forward = 6;
- // 点击评论跳转链接
- string reply_url = 7;
- // 禁评文案
- string no_comment_text = 8;
- // 禁转文案
- string no_forward_text = 9;
-}
-
-//
-message ModuleStory {
- //
- string title = 1;
- //
- repeated StoryItem items = 2;
- //
- bool show_publish_entrance = 3;
- //
- int64 fold_state = 4;
- //
- string uri = 5;
- //
- string cover = 6;
- //
- string publish_text = 7;
-}
-
-//
-message ModuleTextNotice {
- //
- OneLineText notice = 1;
-}
-
-//
-message ModuleTitle {
- //
- string title = 1;
- //
- IconButton right_btn = 2;
- //
- int32 title_style = 3;
-}
-
-// 顶部模块
-message ModuleTop {
- // 三点模块
- repeated ThreePointItem tp_list = 1;
- //
- MdlDynArchive archive = 2;
- //
- ModuleAuthor author = 3;
- //
- bool hidden_nav_bar = 4;
-}
-
-//
-message ModuleTopic {
- //
- int64 id = 1;
- //
- string name = 2;
- //
- string url = 3;
-}
-
-//
-message ModuleTopicBrief {
- //
- TopicItem topic = 1;
-}
-
-//
-message ModuleTopicDetailsExt {
- //
- string comment_guide = 1;
-}
-
-//
-message ModuleTopTag {
- //
- string tag_name = 1;
-}
-
-// 认证名牌
-message Nameplate {
- // nid
- int64 nid = 1;
- // 名称
- string name = 2;
- // 图片地址
- string image = 3;
- // 小图地址
- string image_small = 4;
- // 等级
- string level = 5;
- // 获取条件
- string condition = 6;
-}
-
-enum NetworkType {
- NT_UNKNOWN = 0; //
- WIFI = 1; //
- CELLULAR = 2; //
- OFFLINE = 3; //
- OTHERNET = 4; //
- ETHERNET = 5; //
-}
-
-// 最新ep
-message NewEP {
- // 最新话epid
- int32 id = 1;
- // 更新至XX话
- string index_show = 2;
- // 更新剧集的封面
- string cover = 3;
-}
-
-//
-message NFTInfo {
- //
- NFTRegionType region_type = 1;
- //
- string region_icon = 2;
- //
- NFTShowStatus region_show_status = 3;
-}
-
-//
-enum NFTRegionType {
- nft_region_default = 0;
- nft_region_mainlang = 1;
- nft_region_gat = 2;
-}
-
-//
-enum NFTShowStatus {
- nft_show_default = 0;
- nft_show_zoominmainlang = 1;
- nft_show_raw = 2;
-}
-
-// 空响应
-message NoReply {
-
-}
-
-// 空请求
-message NoReq {
-
-}
-
-//
-message NoteVideoTS {
- //
- int64 cid = 1;
- //
- int64 oid_type = 2;
- //
- int64 status = 3;
- //
- int64 index = 4;
- //
- int64 seconds = 5;
- //
- int64 cid_count = 6;
- //
- string key = 7;
- //
- int64 epid = 9;
- //
- string title = 8;
- //
- string desc = 10;
-}
-
-//
-message OfficialAccountInfo {
- //
- UserInfo author = 1;
- //
- int64 mid = 2;
- //
- string uri = 3;
- //
- Relation relation = 4;
- //
- string desc_text1 = 5;
- //
- string desc_text2 = 6;
-}
-
-//
-message OfficialAccountsReply {
- //
- repeated OfficialAccountInfo items = 1;
- //
- bool has_more = 2;
- //
- int64 offset = 3;
-}
-
-//
-message OfficialAccountsReq {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- int64 offset = 3;
-}
-
-//
-message OfficialDynamicsReply {
- //
- repeated OfficialItem items = 1;
- //
- int64 offset = 2;
- //
- bool has_more = 3;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
-}
-
-//
-message OfficialDynamicsReq {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- int64 offset = 3;
-}
-
-message OfficialItem {
- int32 type = 1;
- oneof rcmd_item {
- OfficialRcmdArchive rcmd_archive = 2;
- OfficialRcmdDynamic rcmd_dynamic = 3;
- };
-}
-
-//
-message OfficialRcmdArchive {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string cover_right_text = 3;
- //
- int32 desc_icon1 = 4;
- //
- string desc_text1 = 5;
- //
- int32 desc_icon2 = 6;
- //
- string desc_text2 = 7;
- //
- string reason = 8;
- //
- bool show_three_point = 9;
- //
- string uri = 10;
- //
- int64 aid = 11;
- //
- int64 mid = 12;
- //
- string name = 13;
- //
- int64 dynamic_id = 14;
- //
- int64 cid = 15;
-}
-
-//
-message OfficialRcmdDynamic {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string cover_right_top_text = 3;
- //
- int32 desc_icon1 = 4;
- //
- string desc_text1 = 5;
- //
- int32 desc_icon2 = 6;
- //
- string desc_text2 = 7;
- //
- string reason = 8;
- //
- string uri = 9;
- //
- int64 dynamic_id = 10;
- //
- int64 mid = 11;
- //
- string user_name = 12;
- //
- int64 rid = 13;
-}
-
-// 认证信息
-message OfficialVerify {
- // 127:未认证 0:个人 1:机构
- int32 type = 1;
- // 认证描述
- string desc = 2;
- // 是否关注
- int32 is_atten = 3;
-}
-
-//
-message OneLineText {
- //
- repeated TextWithPriority texts = 1;
-}
-
-//
-message OnlyFans {
- //
- bool is_only_fans = 1;
- //
- IconBadge badge = 2;
-}
-
-//
-message OnlyFansProperty {
- //
- bool has_privilege = 1;
- //
- bool is_only_fans = 2;
-}
-
-//
-message OpusCollection {
- //
- int64 collection_id = 1;
- //
- OneLineText title = 2;
- //
- string detail_uri = 3;
- //
- string intro = 4;
- //
- repeated OpusCollectionItem all_items = 5;
-}
-
-//
-message OpusCollectionItem {
- //
- int64 opus_id = 1;
- //
- string title = 2;
- //
- string pub_time = 3;
- //
- string uri = 4;
- //
- bool is_selected_highlight = 5;
-}
-
-//
-message Paragraph {
- //
- message ListFormat {
- //
- int32 level = 1;
- //
- int32 order = 2;
- //
- string theme = 3;
- }
- enum ParagraphAlign {
- LEFT = 0;
- MIDDLE = 1;
- RIGHT = 2;
- }
- //
- message ParagraphFormat {
- //
- ParagraphAlign align = 1;
- //
- ListFormat list_format = 2;
- }
- //
- enum ParagraphType {
- INVALID = 0;
- TEXT = 1;
- PICTURES = 2;
- LINE = 3;
- REFERENCE = 4;
- SORTED_LIST = 5;
- UNSORTED_LIST = 6;
- LINK_CARD = 7;
- }
- //
- ParagraphType para_type = 1;
- //
- ParagraphFormat para_format = 2;
- //
- oneof content {
- TextParagraph text = 3;
- PicParagraph pic = 4;
- LineParagraph line = 5;
- CardParagraph link_card = 6;
- }
-}
-
-//
-message ParaSpacing {
- //
- double spacing_before_para = 1;
- //
- double spacing_after_para = 2;
- //
- double line_spacing = 3;
-}
-
-// PGC单季信息
-message PGCSeason {
- // 是否完结
- int32 is_finish = 1;
- // 标题
- string title = 2;
- // 类型
- int32 type = 3;
-}
-
-//
-message PicParagraph {
- //
- enum PicParagraphStyle {
- INVALID = 0;
- NINE_CELL = 1;
- BIG_SCROLL = 2;
- }
- //
- MdlDynDraw pics = 1;
- //
- PicParagraphStyle style = 2;
-}
-
-// 秒开通用参数
-message PlayurlParam {
- // 清晰度
- int32 qn = 1;
- // 流版本
- int32 fnver = 2;
- // 流类型
- int32 fnval = 3;
- // 是否强制使用域名
- int32 force_host = 4;
- // 是否4k
- int32 fourk = 5;
-}
-
-//
-message Popup {
- //
- string title = 1;
- //
- string desc = 2;
- //
- string uri = 3;
-}
-
-//
-message RcmdArchive {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 视频封面展示项 1
- CoverIcon cover_left_icon_1 = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 秒开地址
- string uri = 5;
- // 是否PGC
- bool is_pgc = 6;
- // aid
- int64 aid = 7;
- //
- IconBadge badge = 8;
- //
- int32 cover_left_icon2 = 9;
- //
- string cover_left_text2 = 10;
- //
- int32 cover_left_icon3 = 11;
- //
- string cover_left_text3 = 12;
-}
-
-// 推荐UP主用户模块
-message RcmdAuthor {
- // 用户详情
- UserInfo author = 1;
- // 描述:粉丝数、推荐理由
- string desc = 2;
- // 关注状态
- Relation relation = 3;
-}
-
-//
-message RcmdCampusBrief {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- string campus_badge = 4;
- //
- string url = 5;
-}
-
-// 推荐卡片列表
-message RcmdItem {
- // 卡片类型
- RcmdType type = 1;
- // 卡片列表
- oneof rcmd_item {
- //
- RcmdArchive rcmd_archive = 2;
- }
-}
-
-// 分区聚类推荐选项
-message RcmdOption{
- // 视频是否展示标题
- bool show_title = 1;
-}
-
-//
-message RcmdReason {
- //
- string campus_name = 1;
- //
- RcmdReasonStyle style = 2;
- //
- string rcmd_reason = 3;
- //
- string up_name = 4;
-}
-
-//
-enum RcmdReasonStyle {
- rcmd_reason_style_none = 0;
- rcmd_reason_style_campus_nearby = 1;
- rcmd_reason_style_campus_up = 2;
- rcmd_reason_style_campus_near_up_mix = 3;
-}
-
-//
-message RcmdTopButton {
- //
- string text = 1;
- //
- string url = 2;
-}
-
-// 推荐模块数据类型
-enum RcmdType {
- rcmd_archive = 0; // 稿件
- rcmd_dynamic = 1; // 动态
-}
-
-// 推荐up主入参
-message RcmdUPsParam {
- int64 dislike_ts = 1;
-}
-
-message ReactionListItem {
- // 用户信息
- UserInfo user = 1;
- // 关注关系
- Relation relation = 2;
- // 显示文字
- string act_text = 3;
- //
- string rcmd_reason = 4;
-}
-
-
-// 新版动态转发点赞列表-响应
-message ReactionListReply {
- // 标题
- string title = 1;
- // 列表
- repeated ReactionListItem list = 2;
- // 偏移
- string offset = 3;
- // 是否还有更多
- bool has_more = 4;
-}
-
-// 新版动态转发点赞列表-请求
-message ReactionListReq {
- // 动态ID
- int64 dynamic_id = 1;
- // 动态类型
- int64 dyn_type = 2;
- // 业务方资源id
- int64 rid = 3;
- // 偏移,使用上一页回包中的offset字段;第一页不传。
- string offset = 4;
-}
-
-// 刷新方式
-enum Refresh {
- refresh_new = 0; // 刷新列表
- refresh_history = 1; // 请求历史
-}
-
-// 关注关系
-message Relation {
- // 关注状态
- RelationStatus status = 1;
- // 关注
- int32 is_follow = 2;
- // 被关注
- int32 is_followed = 3;
- // 文案
- string title = 4;
-}
-
-// 关注关系 枚举
-enum RelationStatus {
- // 1-未关注 2-关注 3-被关注 4-互相关注 5-特别关注
- relation_status_none = 0;
- relation_status_nofollow = 1;
- relation_status_follow = 2;
- relation_status_followed = 3;
- relation_status_mutual_concern = 4;
- relation_status_special = 5;
-}
-
-// 转发列表-请求
-message RepostListReq {
- // 动态ID
- string dynamic_id = 1;
- // 动态类型
- int64 dyn_type = 2;
- // 业务方资源id
- int64 rid = 3;
- // 偏移,使用上一页回包中的offset字段;第一页不传。
- string offset = 4;
- // 来源
- string from = 5;
- // 评论类型
- RepostType repost_type = 6;
-}
-
-// 转发列表-响应
-message RepostListRsp {
- // 列表
- repeated DynamicItem list = 1;
- // 偏移
- string offset = 2;
- // 是否还有更多
- bool has_more = 3;
- // 转发总数
- int64 total_count = 4;
- // 评论类型
- RepostType repost_type = 5;
-}
-
-// 评论类型
-enum RepostType {
- repost_hot = 0; // 热门评论
- repost_general = 1; // 普通评论
-}
-
-//
-enum ReserveRelationLotteryType {
- reserve_relation_lottery_type_default = 0; //
- reserve_relation_lottery_type_cron = 1; //
-}
-
-//
-enum ReserveType {
- reserve_none = 0; // 占位
- reserve_recall = 1; // 预约召回
-}
-
-enum RouterAction {
- OPEN = 0;
- EMBED = 1;
-}
-
-//
-message SchoolRecommendReply {
- //
- repeated CampusInfo items = 1;
-}
-
-//
-message SchoolRecommendReq {
- //
- float lat = 1;
- //
- float lng = 2;
- //
- CampusReqFromType from_type = 3;
-}
-
-//
-message SchoolSearchReply {
- //
- repeated CampusInfo items = 1;
- //
- SearchToast toast = 2;
-}
-
-//
-message SchoolSearchReq {
- //
- string keyword = 1;
- //
- CampusReqFromType from_type = 2;
-}
-
-//
-message SearchChannel {
- //
- string title = 1;
- //
- SearchTopicButton more_button = 2;
- //
- repeated ChannelInfo channels = 3;
-}
-
-//
-message SearchInfo {
- //
- string title = 1;
- //
- repeated DynamicItem list = 2;
- //
- string track_id = 3;
- //
- int64 total = 4;
- //
- bool has_more = 5;
- //
- string version = 6;
-}
-
-//
-message SearchToast {
- //
- string desc_text1 = 1;
- //
- string desc_text2 = 2;
-}
-
-//
-message SearchTopic {
- //
- string title = 1;
- //
- SearchTopicButton more_button = 2;
- //
- repeated SearchTopicItem items = 3;
-}
-
-//
-message SearchTopicButton {
- //
- string title = 1;
- //
- string jump_uri = 2;
-}
-
-//
-message SearchTopicItem {
- //
- int64 topic_id = 1;
- //
- string topic_name = 2;
- //
- string desc = 3;
- //
- string url = 4;
- //
- bool is_activity = 5;
-}
-
-//
-message SetDecisionReq {
- //
- int32 result = 1;
- //
- CampusReqFromType from_type = 2;
-}
-
-//
-message SetRecentCampusReq {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- CampusReqFromType from_type = 3;
-}
-
-// 分享渠道组件
-message ShareChannel {
- // 分享名称
- string name = 1;
- // 分享按钮图片
- string image = 2;
- // 分享渠道
- string channel = 3;
- // 预约卡分享图信息,仅分享有预约信息的动态时存在
- ShareReserve reserve = 4;
-}
-
-// 预约卡分享图信息
-message ShareReserve {
- // 展示标题
- string title = 1;
- // 描述(时间+类型)
- string desc = 2;
- // 二维码附带icon
- string qr_code_icon = 3;
- // 二维码附带文本
- string qr_code_text = 4;
- // 二维码url
- string qr_code_url = 5;
- //
- AdditionUserInfo user_info = 6;
-}
-
-//
-enum ShowType {
- show_type_none = 0; //
- show_type_backup = 1; //
-}
-
-// 排序类型
-message SortType {
- // 排序策略
- // 1:推荐排序 2:最常访问 3:最近关注
- int32 sort_type = 1;
- // 排序策略名称
- string sort_type_name = 2;
-}
-
-//
-message StoryArchive {
- //
- string cover = 1;
- //
- int64 aid = 2;
- //
- string uri = 3;
- //
- Dimension dimension = 4;
-}
-
-//
-message StoryItem {
- //
- UserInfo author = 1;
- //
- string desc = 2;
- //
- int64 status = 3;
- //
- int32 type = 4;
- oneof rcmd_item {
- //
- StoryArchive story_archive = 5;
- }
-}
-
-//
-enum StyleType {
- STYLE_TYPE_NONE = 0; //
- STYLE_TYPE_LIVE = 1; //
- STYLE_TYPE_DYN_UP = 2; //
-}
-
-//
-message SubscribeCampusReq {
- //
- int64 campus_id = 1;
- //
- string campus_name = 2;
- //
- CampusReqFromType from_type = 3;
-}
-
-//
-message TextNode {
- enum TextNodeType {
- INVALID = 0;
- WORDS = 1;
- EMOTE = 2;
- AT = 3;
- BIZ_LINK = 4;
- }
- //
- TextNodeType node_type = 1;
- string raw_text = 2;
- //
- oneof text {
- WordNode word = 3;
- EmoteNode emote = 4;
- LinkNode link = 5;
- }
-}
-
-//
-message TextParagraph {
- //
- repeated TextNode nodes = 1;
-}
-
-//
-message TextWithPriority {
- //
- string text = 1;
- //
- int64 priority = 2;
-}
-
-// 免流类型
-enum TFType {
- TF_UNKNOWN = 0; // 未知
- U_CARD = 1; // 联通卡
- U_PKG = 2; // 联通免流包
- C_CARD = 3; // 移动卡
- C_PKG = 4; // 移动免流包
- T_CARD = 5; // 电信卡
- T_PKG = 6; // 电信免流包
-}
-
-// 三点-关注
-message ThreePointAttention {
- // attention icon
- string attention_icon = 1;
- // 关注时显示的文案
- string attention_text = 2;
- // not attention icon
- string not_attention_icon = 3;
- // 未关注时显示的文案
- string not_attention_text = 4;
- // 当前关注状态
- ThreePointAttentionStatus status = 5;
-}
-
-// 枚举-三点关注状态
-enum ThreePointAttentionStatus {
- tp_not_attention = 0; //
- tp_attention = 1; //
-}
-
-// 三点-自动播放 旧版不维护
-message ThreePointAutoPlay {
- // open icon
- string open_icon = 1;
- // 开启时显示文案
- string open_text = 2;
- // close icon
- string close_icon = 3;
- // 关闭时显示文案
- string close_text = 4;
- // 开启时显示文案v2
- string open_text_v2 = 5;
- // 关闭时显示文案v2
- string close_text_v2 = 6;
- // 仅wifi/免流 icon
- string only_icon = 7;
- // 仅wifi/免流 文案
- string only_text = 8;
- // open icon v2
- string open_icon_v2 = 9;
- // close icon v2
- string close_icon_v2 = 10;
-}
-
-// 三点-评论
-message ThreePointComment {
- // 精选评论区功能
- CommentDetail up_selection = 1;
- // up关闭评论区功能
- CommentDetail up_close = 2;
- // icon
- string icon = 3;
- // 标题
- string title = 4;
-}
-
-// 三点-默认结构(使用此背景、举报、删除)
-message ThreePointDefault {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
- // 跳转链接
- string uri = 3;
- // id
- string id = 4;
- //
- ThreePointDefaultToast toast = 5;
-}
-
-//
-message ThreePointDefaultToast {
- //
- string title = 1;
- //
- string desc = 2;
-}
-
-// 三点-不感兴趣
-message ThreePointDislike {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
-}
-
-// 三点-收藏
-message ThreePointFavorite {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
- // 物料ID
- int64 id = 3;
- // 是否订阅
- bool is_favourite = 4;
- // 取消收藏图标
- string cancel_icon = 5;
- // 取消收藏文案
- string cancel_title = 6;
-}
-
-//
-message ThreePointHide {
- //
- string icon = 1;
- //
- string title = 2;
- //
- ThreePointHideInteractive interactive = 3;
- //
- int64 blook_fid = 4;
- //
- string blook_type = 5;
-}
-
-//
-message ThreePointHideInteractive {
- //
- string title = 1;
- //
- string confirm = 2;
- //
- string cancel = 3;
- //
- string toast = 4;
-}
-
-// 三点Item
-message ThreePointItem {
- //类型
- ThreePointType type = 1;
- oneof item {
- // 默认结构
- ThreePointDefault default = 2;
- // 自动播放
- ThreePointAutoPlay auto_player = 3;
- // 分享
- ThreePointShare share = 4;
- // 关注
- ThreePointAttention attention = 5;
- // 稍后在看
- ThreePointWait wait = 6;
- // 不感兴趣
- ThreePointDislike dislike = 7;
- // 收藏
- ThreePointFavorite favorite = 8;
- // 置顶
- ThreePointTop top = 9;
- // 评论
- ThreePointComment comment = 10;
- //
- ThreePointHide hide = 11;
- //
- ThreePointTopicIrrelevant topic_irrelevant = 12;
- }
-}
-
-// 三点-分享
-message ThreePointShare {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
- // 分享渠道
- repeated ThreePointShareChannel channel = 3;
- // 分享渠道名
- string channel_name = 4;
- // 预约卡分享图信息,仅分享有预约信息的动态时存在
- ShareReserve reserve = 5;
-}
-
-// 三点-分享渠道
-message ThreePointShareChannel {
- // icon
- string icon = 1;
- // 名称
- string title = 2;
-}
-
-// 三点-置顶
-message ThreePointTop {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
- // 状态
- TopType type = 3;
-}
-
-//
-message ThreePointTopicIrrelevant {
- //
- string icon = 1;
- //
- string title = 2;
- //
- string toast = 3;
- //
- int64 topic_id = 4;
- //
- int64 res_id = 5;
- //
- int64 res_type = 6;
- //
- string reason = 7;
-}
-
-// 三点类型
-enum ThreePointType {
- tp_none = 0; // 占位
- background = 1; // 使用此背景
- auto_play = 2; // 自动播放
- share = 3; // 分享
- wait = 4; // 稍后再播
- attention = 5; // 关注
- report = 6; // 举报
- delete = 7; // 删除
- dislike = 8; // 不感兴趣
- favorite = 9; // 收藏
- top = 10; // 置顶
- comment = 11; // 评论
- hide = 12; //
- campus_delete = 13; //
- topic_irrelevant = 14; //
-}
-
-// 三点-稍后在看
-message ThreePointWait {
- // addition icon
- string addition_icon = 1;
- // 已添加时的文案
- string addition_text = 2;
- // no addition icon
- string no_addition_icon = 3;
- // 未添加时的文案
- string no_addition_text = 4;
- // avid
- int64 id = 5;
-}
-
-//
-enum ThumbType {
- cancel = 0; //
- thumb = 1; //
-}
-
-// 顶部预约卡
-message TopAdditionUP {
- // 预约卡
- repeated AdditionUP up = 1;
- // 折叠数量,大于多少个进行折叠
- int32 has_fold = 2;
-}
-
-// 话题广场操作按钮
-message TopicButton {
- // 按钮图标
- string icon = 1;
- // 按钮文案
- string title = 2;
- // 跳转
- string jump_uri = 3;
- //
- bool red_dot = 4;
-}
-
-//
-message TopicItem {
- //
- int64 topic_id = 1;
- //
- string topic_name = 2;
- //
- string url = 3;
- //
- string desc = 4;
- //
- string desc2 = 5;
- //
- string rcmd_desc = 6;
-}
-
-// 综合页-话题广场
-message TopicList {
- // 模块标题
- string title = 1;
- // 话题列表
- repeated TopicListItem topic_list_item = 2;
- // 发起活动
- TopicButton act_button = 3;
- // 查看更多
- TopicButton more_button = 4;
- // 透传服务端上报
- string server_info = 5;
-}
-
-// 综合页-话题广场-话题
-message TopicListItem {
- // 前置图标
- string icon = 1;
- // 前置图标文案
- string icon_title = 2;
- // 话题id
- int64 topic_id = 3;
- // 话题名
- string topic_name = 4;
- // 跳转链接
- string url = 5;
- // 卡片位次
- int64 pos = 6;
- // 透传服务端上报
- string server_info = 7;
- //
- string head_icon_url = 8;
- //
- int64 up_mid = 9;
- //
- string tail_icon_url = 10;
- //
- string extension = 11;
-}
-
-//
-message TopicListReply {
- //
- repeated TopicItem items = 1;
- //
- bool has_more = 2;
- //
- string offset = 3;
-}
-
-//
-message TopicListReq {
- //
- int64 campus_id = 1;
- //
- string offset = 2;
-}
-
-//
-message TopicMergedResource {
- //
- int32 merge_type = 1;
- //
- int32 merged_res_cnt = 2;
-}
-
-//
-message TopicRcmdCard {
- //
- int64 topic_id = 1;
- //
- string topic_name = 2;
- //
- string url = 3;
- //
- CampusLabel button = 4;
- //
- string desc1 = 5;
- //
- string desc2 = 6;
- //
- string update_desc = 7;
-}
-
-//
-message TopicSquareInfo {
- //
- string title = 1;
- //
- CampusLabel button = 2;
- //
- TopicRcmdCard rcmd = 3;
-}
-
-//
-message TopicSquareReply {
- //
- TopicSquareInfo info = 1;
-}
-
-//
-message TopicSquareReq {
- //
- int64 campus_id = 1;
-}
-
-// 状态
-enum TopType {
- top_none = 0; // 默认 置顶
- top_cancel = 1; // 取消置顶
-}
-
-// 综合页-无关注列表
-message Unfollow {
- // 标题展示文案
- string title = 1;
- // 无关注列表
- repeated UnfollowUserItem list = 2;
- // trackID
- string TrackId = 3;
-}
-
-//
-message UnfollowMatchReq {
- //
- int64 cid = 1;
-}
-
-// 综合页-无关注列表
-message UnfollowUserItem {
- // 是否有更新
- bool has_update = 1;
- // up主头像
- string face = 2;
- // up主昵称
- string name = 3;
- // up主uid
- int64 uid = 4;
- // 排序字段 从1开始
- int32 pos = 5;
- // 直播状态
- LiveState live_state = 6;
- // 认证信息
- OfficialVerify official = 7;
- // 大会员信息
- VipInfo vip = 8;
- // up介绍
- string sign = 9;
- // 标签信息
- string label = 10;
- // 按钮
- AdditionalButton button = 11;
- // 跳转地址
- string uri = 12;
-}
-
-//
-message UpdateTabSettingReq {
- //
- HomePageTabSttingStatus status = 1;
-}
-
-// 动态顶部up列表-up主信息
-message UpListItem {
- // 是否有更新
- bool has_update = 1;
- // up主头像
- string face = 2;
- // up主昵称
- string name = 3;
- // up主uid
- int64 uid = 4;
- // 排序字段 从1开始
- int64 pos = 5;
- // 用户类型
- UserItemType user_item_type = 6;
- // 直播头像样式-日
- UserItemStyle display_style_day = 7;
- // 直播头像样式-夜
- UserItemStyle display_style_night = 8;
- // 直播埋点
- int64 style_id = 9;
- // 直播状态
- LiveState live_state = 10;
- // 分割线
- bool separator = 11;
- // 跳转
- string uri = 12;
- // UP主预约上报使用
- bool is_recall = 13;
- //
- IconBadge update_icon = 14;
- //
- string live_rcmd_reason = 15;
- //
- string live_cover = 16;
- //
- string personal_extra = 17;
-}
-
-// 最常访问-查看更多
-message UpListMoreLabel {
- // 文案
- string title = 1;
- // 跳转地址
- string uri = 2;
-}
-
-// 用户信息
-message UserInfo {
- // 用户mid
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- // 用户头像
- string face = 3;
- // 认证信息
- OfficialVerify official = 4;
- // 大会员信息
- VipInfo vip = 5;
- // 直播信息
- LiveInfo live = 6;
- // 空间页跳转链接
- string uri = 7;
- // 挂件信息
- UserPendant pendant = 8;
- // 认证名牌
- Nameplate nameplate = 9;
- // 用户等级
- int32 level = 10;
- // 用户简介
- string sign = 11;
- //
- int32 face_nft = 12;
- //
- int32 face_nft_new = 13;
- //
- NFTInfo nft_info = 14;
- //
- int32 is_senior_member = 15;
- //
- bilibili.dagw.component.avatar.v1.AvatarItem avatar = 16;
-}
-
-// 直播头像样式
-message UserItemStyle {
- //
- string rect_text = 1;
- //
- string rect_text_color = 2;
- //
- string rect_icon = 3;
- //
- string rect_bg_color = 4;
- //
- string outer_animation = 5;
-}
-
-// 用户类型
-enum UserItemType {
- user_item_type_none = 0; //
- user_item_type_live = 1; //
- user_item_type_live_custom = 2; //
- user_item_type_normal = 3; //
- user_item_type_extend = 4; //
- user_item_type_premiere_reserve = 5;
- user_item_type_premiere = 6;
- user_item_type_live_card = 7;
- user_item_type_ogv_season = 8;
- user_item_type_ugc_season = 9;
-}
-
-// 头像挂件信息
-message UserPendant {
- // pid
- int64 pid = 1;
- // 名称
- string name = 2;
- // 图片链接
- string image = 3;
- // 有效期
- int64 expire = 4;
-}
-
-// 角标信息
-message VideoBadge {
- // 文案
- string text = 1;
- // 文案颜色-日间
- string text_color = 2;
- // 文案颜色-夜间
- string text_color_night = 3;
- // 背景颜色-日间
- string bg_color = 4;
- // 背景颜色-夜间
- string bg_color_night = 5;
- // 边框颜色-日间
- string border_color = 6;
- // 边框颜色-夜间
- string border_color_night = 7;
- // 样式
- int32 bg_style = 8;
- // 背景透明度-日间
- int32 bg_alpha = 9;
- // 背景透明度-夜间
- int32 bg_alpha_night = 10;
-}
-
-// 番剧类型
-enum VideoSubType {
- VideoSubTypeNone = 0; // 没有子类型
- VideoSubTypeBangumi = 1; // 番剧
- VideoSubTypeMovie = 2; // 电影
- VideoSubTypeDocumentary = 3; // 纪录片
- VideoSubTypeDomestic = 4; // 国创
- VideoSubTypeTeleplay = 5; // 电视剧
-}
-
-// 视频类型
-enum VideoType {
- video_type_general = 0; //普通视频
- video_type_dynamic = 1; //动态视频
- video_type_playback = 2; //直播回放视频
- video_type_story = 3; //
-}
-
-// 大会员信息
-message VipInfo {
- // 大会员类型
- int32 Type = 1;
- // 大会员状态
- int32 status = 2;
- // 到期时间
- int64 due_date = 3;
- // 标签
- VipLabel label = 4;
- // 主题
- int32 theme_type = 5;
- // 大会员角标
- // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
- int32 avatar_subscript = 6;
- // 昵称色值,可能为空,色值示例:#FFFB9E60
- string nickname_color = 7;
-}
-
-// 大会员标签
-message VipLabel {
- // 图片地址
- string path = 1;
- // 文本值
- string text = 2;
- // 对应颜色类型
- string label_theme = 3;
-}
-
-// 状态
-enum VoteStatus {
- normal = 0; // 正常
- anonymous = 1; // 匿名
-}
-
-// 提权样式
-message Weight {
- // 提权展示标题
- string title = 1;
- // 下拉框内容
- repeated WeightItem items = 2;
- // icon
- string icon = 3;
-}
-
-// 热门默认跳转按钮
-message WeightButton {
- string jump_url = 1;
- // 展示文案
- string title = 2;
-}
-
-// 提权不感兴趣
-message WeightDislike {
- // 负反馈业务类型 作为客户端调用负反馈接口的参数
- string feed_back_type = 1;
- // 展示文案
- string title = 2;
-}
-
-// 提权样式
-message WeightItem {
- // 类型
- WeightType type = 1;
- oneof item {
- // 热门默认跳转按钮
- WeightButton button = 2;
- // 提权不感兴趣
- WeightDislike dislike = 3;
- }
-}
-
-// 枚举-提权类型
-enum WeightType {
- weight_none = 0; // 默认 占位
- weight_dislike = 1; // 不感兴趣
- weight_jump = 2; // 跳链
-}
-
-//
-enum WFItemType {
- WATER_FLOW_TYPE_NONE = 0;
- WATER_FLOW_TYPE_ARCHIVE = 1;
- WATER_FLOW_TYPE_DYNAMIC = 2;
-}
-
-//
-message WordNode {
- //
- message WordNodeStyle {
- //
- bool bold = 1;
- //
- bool italic = 2;
- //
- bool strikethrough = 3;
- //
- bool underline = 4;
- }
- //
- string words = 1;
- //
- double font_size = 2;
- //
- Colors color = 3;
- //
- WordNodeStyle style = 4;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/dynamic/v2/opus.proto b/bili-api-grpc/proto/bilibili/app/dynamic/v2/opus.proto
deleted file mode 100644
index 50a89fd5e..000000000
--- a/bili-api-grpc/proto/bilibili/app/dynamic/v2/opus.proto
+++ /dev/null
@@ -1,60 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.dynamic.v2;
-
-option java_multiple_files = true;
-
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/app/dynamic/v2/dynamic.proto";
-
-service Opus {
- //
- rpc OpusDetail (OpusDetailReq) returns (OpusDetailResp);
-}
-
-//
-message OpusDetailReq {
- //
- OpusType opus_type = 1;
- //
- int64 oid = 2;
- //
- int64 dyn_type = 3;
- //
- string share_id = 4;
- //
- int32 share_mode = 9;
- //
- int32 local_time = 10;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 11;
- //
- Config config = 12;
-}
-
-//
-message OpusDetailResp {
- //
- OpusItem opus_item = 1;
-}
-
-//
-message OpusItem {
- //
- int64 opus_id = 1;
- //
- OpusType opus_type = 2;
- //
- int64 oid = 3;
- //
- repeated Module modules = 4;
- //
- Extend extend = 5;
-}
-
-enum OpusType {
- OPUS_TYPE_DYN = 0;
- OPUS_TYPE_ARTICLE = 1;
- OPUS_TYPE_NOTE = 2;
- OPUS_TYPE_WORD = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/interfaces/v1/history.proto b/bili-api-grpc/proto/bilibili/app/interfaces/v1/history.proto
deleted file mode 100644
index c4901dd46..000000000
--- a/bili-api-grpc/proto/bilibili/app/interfaces/v1/history.proto
+++ /dev/null
@@ -1,379 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.interface.v1;
-
-option java_package = "bilibili.app.interfaces.v1";
-option java_multiple_files = true;
-
-import "bilibili/app/archive/middleware/v1/preload.proto";
-
-// 历史记录
-service History {
- // 获取历史记录tab
- rpc HistoryTab (HistoryTabReq) returns (HistoryTabReply);
- // 获取历史记录列表(旧版)
- rpc Cursor (CursorReq) returns (CursorReply);
- // 获取历史记录列表
- rpc CursorV2 (CursorV2Req) returns (CursorV2Reply);
- // 删除历史记录
- rpc Delete (DeleteReq) returns (NoReply);
- // 搜索历史记录
- rpc Search (SearchReq) returns (SearchReply);
- // 清空历史记录
- rpc Clear (ClearReq) returns (NoReply);
- // 获取最新的历史记录
- rpc LatestHistory (LatestHistoryReq) returns (LatestHistoryReply);
-}
-
-// 专栏卡片
-message CardArticle {
- // 封面url
- repeated string covers = 1;
- // UP主昵称
- string name = 2;
- // UP主mid
- int64 mid = 3;
- // 是否展示关注按钮
- bool displayAttention = 4;
- // 角标
- string badge = 5;
- // 关系信息
- Relation relation = 6;
-}
-
-// 课程卡片
-message CardCheese {
- // 封面url
- string cover = 1;
- // 观看进度
- int64 progress = 2;
- // 总计时长
- int64 duration = 3;
- // 单集标题
- string subtitle = 4;
- //
- int64 state = 5;
-}
-
-// 直播卡片
-message CardLive {
- // 封面url
- string cover = 1;
- // 主播昵称
- string name = 2;
- // 主播mid
- int64 mid = 3;
- // 直播分区名
- string tag = 4;
- // 直播状态
- int32 ststus = 5;
- // 是否展示关注按钮
- bool display_attention = 6;
- // 关系信息
- Relation relation = 7;
-}
-
-// pgc稿件卡片
-message CardOGV {
- // 封面url
- string cover = 1;
- // 观看进度
- int64 progress = 2;
- // 总计时长
- int64 duration = 3;
- // 单集标题
- string subtitle = 4;
- //
- string badge = 5;
- //
- int64 state = 6;
-}
-
-// ugc稿件卡片
-message CardUGC {
- // 封面url
- string cover = 1;
- // 观看进度
- int64 progress = 2;
- // 视频长度
- int64 duration = 3;
- // UP主昵称
- string name = 4;
- // UP主mid
- int64 mid = 5;
- // 是否展示关注按钮
- bool display_attention = 6;
- // 历史观看视频cid
- int64 cid = 7;
- // 历史观看视频分P
- int32 page = 8;
- // 历史观看视频分P的标题
- string subtitle = 9;
- // 关系信息
- Relation relation = 10;
- // 稿件bvid
- string bvid = 11;
- // 总分P数
- int64 videos = 12;
- // 短链接
- string short_link = 13;
- // 分享副标题
- string share_subtitle = 14;
- // 播放数
- int64 view = 15;
- //
- int64 state = 16;
-}
-
-// 清空历史记录-请求
-message ClearReq {
- // 业务类型
- // archive:视频 live:直播 article:专栏 goods:商品 show:展演
- string business = 1;
-}
-
-// 游标信息
-message Cursor {
- // 本页最大值游标值
- int64 max = 1;
- // 本页最大值游标类型
- int32 maxTp = 2;
-}
-
-// 历史记录卡片信息
-message CursorItem {
- // 主体数据
- oneof card_item {
- // ugc稿件
- CardUGC card_ugc = 1;
- // pgc稿件
- CardOGV card_ogv = 2;
- // 专栏
- CardArticle card_article = 3;
- // 直播
- CardLive card_live = 4;
- // 课程
- CardCheese card_cheese = 5;
- }
- // 标题
- string title = 6;
- // 目标uri/url
- string uri = 7;
- // 观看时间
- int64 viewAt = 8;
- // 历史记录id
- int64 kid = 9;
- // 业务id
- int64 oid = 10;
- // 业务类型
- // archive:视频 live:直播 article:专栏 goods:商品 show:展演
- string business = 11;
- // 业务类型代码
- int32 tp = 12;
- // 设备标识
- DeviceType dt = 13;
- // 是否有分享按钮
- bool has_share = 14;
-}
-
-// 获取历史记录列表(旧版)-响应
-message CursorReply {
- // 卡片内容
- repeated CursorItem items = 1;
- // 顶部tab
- repeated CursorTab tab = 2;
- // 游标信息
- Cursor cursor = 3;
- // 是否未拉取完
- bool hasMore = 4;
-}
-
-// 获取历史记录列表(旧版)-请求
-message CursorReq {
- // 游标信息
- Cursor cursor = 1;
- // 业务类型
- // all:全部 archive:视频 live:直播 article:专栏
- string business = 2;
- // 秒开参数(旧版)
- PlayerPreloadParams player_preload = 3;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
-}
-
-// 业务分类表
-message CursorTab {
- // 业务类型
- string business = 1;
- // 名称
- string name = 2;
- // 路由uri
- string router = 3;
- // tab定位
- bool focus = 4;
-}
-
-// 获取历史记录列表-响应
-message CursorV2Reply {
- // 卡片内容
- repeated CursorItem items = 1;
- // 游标信息
- Cursor cursor = 2;
- // 是否未拉取完
- bool hasMore = 3;
- //
- string empty_link = 4;
-}
-
-// 获取历史记录列表-请求
-message CursorV2Req {
- // 游标信息
- Cursor cursor = 1;
- // 业务类型
- // archive:视频 live:直播 article:专栏 goods:商品 show:展演
- string business = 2;
- // 秒开参数(旧版)
- PlayerPreloadParams player_preload = 3;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
- // 是否选择本机的播放历史
- bool is_local = 5;
-}
-
-// 设备标识代码
-enum DT {
- Unknown = 0; // 未知
- Phone = 1; // 手机端
- Pad = 2; // ipad端
- PC = 3; // web端
- TV = 4; // TV端
- Car = 5; // 车机端
- Iot = 6; // 物联设备
- AndPad = 7; // apad端
-}
-
-// 删除历史记录-请求
-message DeleteReq {
- // 历史记录信息
- HisInfo his_info = 1;
-}
-
-// 设备类型
-message DeviceType {
- // 设备标识代码
- DT type = 1;
- // 图标url
- string icon = 2;
-}
-
-// 历史记录信息
-message HisInfo {
- // 业务类型
- // archive:视频 live:直播 article:专栏 goods:商品 show:展演
- string business = 1;
- // 历史记录id
- int64 kid = 2;
-}
-
-// 搜索历史记录来源
-enum HistorySource {
- history_VALUE = 0; // 主站历史记录页
- shopping_VALUE = 1; // 会员购浏览记录
-}
-
-// 获取历史记录tab-响应
-message HistoryTabReply {
- // tab列表
- repeated CursorTab tab = 1;
-}
-
-// 获取历史记录tab-请求
-message HistoryTabReq {
- // 业务类型
- // archive:视频 live:直播 article:专栏 goods:商品 show:展演
- string business = 1;
- // 查询请求来源
- HistorySource source = 2;
- // 搜索关键词
- string keyword = 3;
-}
-
-// 获取最新的历史记录-响应
-message LatestHistoryReply {
- // 卡片内容
- CursorItem items = 1;
- // 场景
- string scene = 2;
- // 弹窗停留时间
- int64 rtime = 3;
- // 分组的标志(客户端埋点上报)
- string flag = 4;
-}
-
-// 获取最新的历史记录-请求
-message LatestHistoryReq {
- // 业务类型
- // archive:视频 live:直播 article:专栏 goods:商品 show:展演
- string business = 1;
- // 秒开参数
- PlayerPreloadParams player_preload = 2;
-}
-
-// 空响应
-message NoReply {
-
-}
-
-// 页面信息
-message Page {
- // 当前页码
- int64 pn = 1;
- // 总计条目数
- int64 total = 2;
-}
-
-// 秒开参数
-message PlayerPreloadParams {
- //清晰度
- int64 qn = 1;
- // 流版本
- int64 fnver = 2;
- // 流类型
- int64 fnval = 3;
- // 是否强制域名
- int64 forceHost = 4;
- // 是否4K
- int64 fourk = 5;
-}
-
-// 关系信息
-message Relation {
- // 关系状态
- // 1:未关注 2:已关注 3:被关注 4:互关
- int32 status = 1;
- // 用户关注UP主
- int32 is_follow = 2;
- // UP主关注用户
- int32 is_followed = 3;
-}
-
-// 搜索历史记录-响应
-message SearchReply {
- // 卡片内容
- repeated CursorItem items = 1;
- // 是否未拉取完
- bool hasMore = 2;
- // 页面信息
- Page page = 3;
-}
-
-// 搜索历史记录-请求
-message SearchReq {
- // 关键词
- string keyword = 1;
- // 页码
- int64 pn = 2;
- // 业务类型
- // archive:视频 live:直播 article:专栏 goods:商品 show:展演
- string business = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/interfaces/v1/media.proto b/bili-api-grpc/proto/bilibili/app/interfaces/v1/media.proto
deleted file mode 100644
index 24beacd92..000000000
--- a/bili-api-grpc/proto/bilibili/app/interfaces/v1/media.proto
+++ /dev/null
@@ -1,331 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.interface.v1;
-
-option java_package = "bilibili.app.interfaces.v1";
-option java_multiple_files = true;
-
-//
-service Media {
- //
- rpc MediaTab(MediaTabReq) returns (MediaTabReply);
- //
- rpc MediaDetail(MediaDetailReq) returns (MediaDetailReply);
- //
- rpc MediaVideo(MediaVideoReq) returns (MediaVideoReply);
- //
- rpc MediaRelation(MediaRelationReq) returns (MediaRelationReply);
- //
- rpc MediaFollow(MediaFollowReq) returns (MediaFollowReply);
-}
-
-//
-message BigItem {
- //
- string title = 1;
- //
- string cover_image_uri = 2;
- //
- string uri = 3;
- //
- string cover_right_text = 4;
- //
- string cover_left_text1 = 5;
- //
- int64 cover_left_icon1 = 6;
- //
- string cover_left_text2 = 7;
- //
- int64 cover_left_icon2 = 8;
- //
- UserCard user_card = 9;
- //
- LikeButton like_button = 10;
- //
- int64 param = 11;
-}
-
-//
-message Button {
- //
- string title = 1;
- //
- string link = 2;
- //
- string id = 3;
- //
- int64 icon = 4;
- //
- ButType but_type = 5;
- //
- int32 follow_state = 6;
- //
- string has_title = 7;
-}
-
-//
-enum ButType {
- BUT_INVALID = 0; //
- BUT_REDIRECT = 1; //
- BUT_LIKE = 2; //
-}
-
-//
-message Cast {
- //
- repeated MediaPerson person = 1;
- //
- string title = 2;
-}
-
-//
-message ChannelInfo {
- //
- int64 channel_id = 1;
- //
- bool subscribed = 2;
-}
-
-//
-message LikeButton {
- //
- int64 aid = 1;
- //
- int32 count = 2;
- //
- bool show_count = 3;
- //
- string event = 4;
- //
- int32 selected = 5;
- //
- string event_v2 = 6;
- //
- LikeButtonResource like_resource = 7;
- //
- LikeButtonResource dis_like_resource = 8;
- //
- LikeButtonResource like_night_resource = 9;
- //
- LikeButtonResource dis_like_night_resource = 10;
-}
-
-//
-message LikeButtonResource {
- //
- string url = 1;
- //
- string hash = 2;
-}
-
-//
-message LikeCard {
- //
- int64 like = 1;
- //
- bool is_follow = 2;
-}
-
-//
-message MediaCard {
- //
- string cover = 1;
- //
- string cur_title = 2;
- //
- string style = 3;
- //
- string label = 4;
- //
- Button but_first = 5;
-}
-
-//
-message MediaDetailReply {
- //
- Cast cast = 1;
- //
- Staff staff = 2;
- //
- Overview overview = 3;
-}
-
-//
-message MediaDetailReq {
- //
- int64 biz_id = 1;
- //
- int64 biz_type = 2;
-}
-
-//
-message MediaFollowReply {
-
-}
-
-//
-message MediaFollowReq {
- //
- string id = 1;
- //
- int32 type = 2;
-}
-
-//
-message MediaPerson {
- //
- string real_name = 1;
- //
- string square_url = 2;
- //
- string character = 3;
- //
- int64 person_id = 4;
- //
- string type = 5;
-}
-
-//
-message MediaRelationReply {
- //
- string offset = 1;
- //
- bool has_more = 2;
- //
- repeated SmallItem list = 3;
-}
-
-//
-message MediaRelationReq {
- //
- int64 biz_id = 1;
- //
- int64 biz_type = 2;
- //
- int64 feed_id = 3;
- //
- string offset = 5;
- //
- int32 ps = 6;
-}
-
-//
-message MediaTabReply {
- //
- MediaCard media_card = 1;
- //
- repeated ShowTab tab = 2;
- //
- int64 default_tab_index = 3;
- //
- ChannelInfo channel_info = 4;
-}
-
-//
-message MediaTabReq {
- //
- int64 biz_id = 1;
- //
- int64 biz_type = 2;
- //
- string source = 3;
- //
- string spmid = 4;
- //
- map args = 5;
-}
-
-//
-message MediaVideoReply {
- //
- string offset = 1;
- //
- bool has_more = 2;
- //
- repeated BigItem list = 3;
-}
-
-//
-message MediaVideoReq {
- //
- int64 biz_id = 1;
- //
- int64 biz_type = 2;
- //
- int64 feed_id = 3;
- //
- string offset = 5;
- //
- int32 ps = 6;
-}
-
-//
-message Overview {
- //
- string title = 1;
- //
- string text = 2;
-}
-
-//
-message ShowTab {
- //
- TabType tab_type = 1;
- //
- string title = 2;
- //
- string url = 3;
-}
-
-//
-message SmallItem {
- //
- string title = 1;
- //
- string cover_image_uri = 2;
- //
- string uri = 3;
- //
- string cover_right_text = 4;
- //
- string cover_left_text1 = 5;
- //
- int64 cover_left_icon1 = 6;
- //
- string cover_left_text2 = 7;
- //
- int64 cover_left_icon2 = 8;
- //
- int64 param = 9;
- //
- int64 mid = 10;
-}
-
-//
-message Staff {
- //
- string title = 1;
- //
- string text = 2;
-}
-
-//
-enum TabType {
- TAB_INVALID = 0; //
- TAB_OGV_DETAIL = 6; //
- TAB_OGV_REPLY = 7; //
- TAB_FEED_BID = 8; //
- TAB_FEED_SMALL = 9; //
-}
-
-//
-message UserCard {
- //
- string user_name = 1;
- //
- string user_face = 2;
- //
- string user_url = 3;
- //
- int64 mid = 4;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/interfaces/v1/search.proto b/bili-api-grpc/proto/bilibili/app/interfaces/v1/search.proto
deleted file mode 100644
index df9e78b48..000000000
--- a/bili-api-grpc/proto/bilibili/app/interfaces/v1/search.proto
+++ /dev/null
@@ -1,190 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.interface.v1;
-
-option java_package = "bilibili.app.interfaces.v1";
-option java_multiple_files = true;
-
-// 搜索
-service Search {
- // 获取搜索建议
- rpc Suggest3 (SuggestionResult3Req) returns (SuggestionResult3Reply);
- //
- rpc DefaultWords(DefaultWordsReq) returns (DefaultWordsReply);
-}
-
-//
-service SearchTest {
- //
- rpc NotExist(SuggestionResult3Req) returns (SuggestionResult3Reply);
-}
-
-//
-message DefaultWordsReply {
- //
- string trackid = 1;
- //
- string param = 2;
- //
- string show = 3;
- //
- string word = 4;
- //
- int64 show_front = 5;
- //
- string exp_str = 6;
- //
- string goto = 7;
- //
- string value = 8;
- //
- string uri = 9;
-}
-
-//
-message NftFaceIcon {
- //
- int32 region_type = 1;
- //
- string icon = 2;
- //
- int32 show_status = 3;
-}
-
-//
-message DefaultWordsReq {
- //
- int64 from = 1;
- //
- int64 login_event = 2;
- //
- int32 teenagers_mode = 3;
- //
- int32 lessons_mode = 4;
- //
- string tab = 5;
- //
- string event_id = 6;
- //
- string avid = 7;
- //
- string query = 8;
- //
- int64 an = 9;
- //
- int64 is_fresh = 10;
-}
-
-// 获取搜索建议-响应
-message SuggestionResult3Reply {
- // 搜索追踪id
- string trackid = 1;
- // 搜索建议条目列表
- repeated ResultItem list = 2;
- // 搜索的abtest 实验信息
- string exp_str = 3;
-}
-
-// 获取搜索建议-请求
-message SuggestionResult3Req {
- // 关键字
- string keyword = 1;
- // 是否语法高亮
- // 0:不显示 1:显示
- int32 highlight = 2;
- // 是否青少年模式
- // 1:开启青少年模式
- int32 teenagers_mode = 3;
-}
-
-// 搜索建议条目
-message ResultItem {
- // 来源
- string from = 1;
- // 显示结果(语法高亮)
- string title = 2;
- // 搜索关键字
- string keyword = 3;
- // 序号
- int32 position = 4;
- // 图片
- string cover = 5;
- // 图片尺寸
- double cover_size = 6;
- // sug词类型
- string sug_type = 7;
- // 词条大类型
- int32 term_type = 8;
- // 跳转类型
- string goto = 9;
- // 跳转uri
- string uri = 10;
- // 认证信息
- OfficialVerify official_verify = 11;
- // 跳转参数
- string param = 12;
- // up主mid
- int64 mid = 13;
- // 粉丝数
- int32 fans = 14;
- // up主等级
- int32 level = 15;
- // up主稿件数
- int32 archives = 16;
- // 投稿时间
- int64 ptime = 17;
- // season类型名称
- string season_type_name = 18;
- // 地区
- string area = 19;
- // 作品风格
- string style = 20;
- // 描述信息
- string label = 21;
- // 评分
- double rating = 22;
- // 投票数
- int32 vote = 23;
- // 角标
- repeated ReasonStyle badges = 24;
- //
- string styles = 25;
- //
- int64 module_id = 26;
- //
- string live_link = 27;
- //
- int32 face_nft_new = 28;
- //
- NftFaceIcon nft_face_icon = 29;
-}
-
-// 认证信息
-message OfficialVerify {
- // 认证类型
- // 127:未认证 0:个人 1:机构
- int32 type = 1;
- // 认证描述
- string desc = 2;
-}
-
-// 角标
-message ReasonStyle {
- // 角标文案
- string text = 1;
- // 文案日间色值
- string text_color = 2;
- // 文案夜间色值
- string text_color_night = 3;
- // 背景日间色值
- string bg_color = 4;
- // 背景夜间色值
- string bg_color_night = 5;
- // 边框日间色值
- string border_color = 6;
- // 边框夜间色值
- string border_color_night = 7;
- // 角标样式
- // 1:填充模式 2:镂空模式
- int32 bg_style = 8;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/interfaces/v1/space.proto b/bili-api-grpc/proto/bilibili/app/interfaces/v1/space.proto
deleted file mode 100644
index 1083ec4d5..000000000
--- a/bili-api-grpc/proto/bilibili/app/interfaces/v1/space.proto
+++ /dev/null
@@ -1,109 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.interface.v1;
-
-option java_package = "bilibili.app.interfaces.v1";
-option java_multiple_files = true;
-
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/app/archive/v1/archive.proto";
-import "bilibili/app/dynamic/v2/dynamic.proto";
-
-//
-service Space {
- //
- rpc SearchTab(SearchTabReq) returns (SearchTabReply);
- //
- rpc SearchArchive(SearchArchiveReq) returns (SearchArchiveReply);
- //
- rpc SearchDynamic(SearchDynamicReq) returns (SearchDynamicReply);
-}
-
-//
-message Arc {
- //
- bilibili.app.archive.v1.Arc archive = 1;
- //
- string uri = 2;
-}
-
-//
-message Dynamic {
- //
- bilibili.app.dynamic.v2.DynamicItem dynamic = 1;
-}
-
-enum From {
- ArchiveTab = 0; //
- DynamicTab = 1; //
-}
-
-//
-message SearchTabReply {
- //
- int64 focus = 1;
- //
- repeated Tab tabs = 2;
-}
-
-//
-message SearchTabReq {
- //
- string keyword = 1;
- //
- int64 mid = 2;
- //
- int32 from = 3;
-}
-
-//
-message SearchArchiveReply {
- //
- repeated Arc archives = 1;
- //
- int64 total = 2;
-}
-
-//
-message SearchArchiveReq {
- //
- string keyword = 1;
- //
- int64 mid = 2;
- //
- int64 pn = 3;
- //
- int64 ps = 4;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
-}
-
-//
-message SearchDynamicReply {
- //
- repeated Dynamic dynamics = 1;
- //
- int64 total = 2;
-}
-
-//
-message SearchDynamicReq {
- //
- string keyword = 1;
- //
- int64 mid = 2;
- //
- int64 pn = 3;
- //
- int64 ps = 4;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
-}
-
-//
-message Tab {
- //
- string title = 1;
- //
- string uri = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/listener/v1/listener.proto b/bili-api-grpc/proto/bilibili/app/listener/v1/listener.proto
deleted file mode 100644
index 6f47ca8f1..000000000
--- a/bili-api-grpc/proto/bilibili/app/listener/v1/listener.proto
+++ /dev/null
@@ -1,1331 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.listener.v1;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/app/interfaces/v1/history.proto";
-import "bilibili/app/playurl/v1/playurl.proto";
-
-// 听视频
-service Listener {
- //
- rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty);
- // 获取音频URL
- rpc PlayUrl (PlayURLReq) returns (PlayURLResp);
- //
- rpc BkarcDetails (BKArcDetailsReq) returns (BKArcDetailsResp);
- //
- rpc Playlist (PlaylistReq) returns (PlaylistResp);
- //
- rpc PlaylistAdd (PlaylistAddReq) returns (google.protobuf.Empty);
- //
- rpc PlaylistDel (PlaylistDelReq) returns (google.protobuf.Empty);
- // 推荐列表
- rpc RcmdPlaylist (RcmdPlaylistReq) returns (RcmdPlaylistResp);
- //
- rpc PlayHistory (PlayHistoryReq) returns (PlayHistoryResp);
- // 添加历史记录
- rpc PlayHistoryAdd (PlayHistoryAddReq) returns (google.protobuf.Empty);
- //
- rpc PlayHistoryDel (PlayHistoryDelReq) returns (google.protobuf.Empty);
- // 播放上报
- rpc PlayActionReport (PlayActionReportReq) returns (google.protobuf.Empty);
- // 三联
- rpc TripleLike (TripleLikeReq) returns (TripleLikeResp);
- // 点赞
- rpc ThumbUp (ThumbUpReq) returns (ThumbUpResp);
- // 投币
- rpc CoinAdd (CoinAddReq) returns (CoinAddResp);
- //
- rpc FavItemAdd (FavItemAddReq) returns (FavItemAddResp);
- //
- rpc FavItemDel (FavItemDelReq) returns (FavItemDelResp);
- // 批量处理收藏
- rpc FavItemBatch (FavItemBatchReq) returns (FavItemBatchResp);
- //
- rpc FavoredInAnyFolders (FavoredInAnyFoldersReq) returns (FavoredInAnyFoldersResp);
- // 用户收藏夹列表
- rpc FavFolderList (FavFolderListReq) returns (FavFolderListResp);
- // 收藏夹详细信息
- rpc FavFolderDetail (FavFolderDetailReq) returns (FavFolderDetailResp);
- // 创建收藏夹
- rpc FavFolderCreate (FavFolderCreateReq) returns (FavFolderCreateResp);
- //
- rpc FavFolderDelete (FavFolderDeleteReq) returns (FavFolderDeleteResp);
- // 每日播单列表
- rpc PickFeed (PickFeedReq) returns (PickFeedResp);
- // 每日播单详情
- rpc PickCardDetail (PickCardDetailReq) returns (PickCardDetailResp);
- //
- rpc Medialist(MedialistReq) returns (MedialistResp);
- //
- rpc Event(EventReq) returns (EventResp);
-}
-
-//
-service Music {
- //
- rpc FavTabShow(FavTabShowReq) returns (FavTabShowResp);
- //
- rpc MainFavMusicSubTabList(MainFavMusicSubTabListReq) returns (MainFavMusicSubTabListResp);
- //
- rpc MainFavMusicMenuList(MainFavMusicMenuListReq) returns (MainFavMusicMenuListResp);
- //
- rpc MenuEdit(MenuEditReq) returns (MenuEditResp);
- //
- rpc MenuDelete(MenuDeleteReq) returns (MenuDeleteResp);
- //
- rpc MenuSubscribe(MenuSubscribeReq) returns (MenuSubscribeResp);
- //
- rpc Click(ClickReq) returns (ClickResp);
-}
-
-//
-message Author {
- //
- int64 mid = 1;
- //
- string name = 2;
- //
- string avatar = 3;
- //
- FollowRelation relation = 4;
-}
-
-//
-message BKArcDetailsReq {
- //
- repeated PlayItem items = 1;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs playerArgs = 2;
-}
-
-//
-message BKArcDetailsResp {
- //
- repeated DetailItem list = 1;
-}
-
-//
-message BKArchive {
- //
- int64 oid = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- string desc = 4;
- //
- int64 duration = 5;
- //
- int32 rid = 6;
- //
- string rname = 7;
- //
- int64 publish = 8;
- //
- string displayed_oid = 9;
- //
- int32 copyright = 10;
- //
- BKArcRights rights = 11;
-}
-
-//
-message BKArcPart {
- //
- int64 oid = 1;
- //
- int64 sub_id = 2;
- //
- string title = 3;
- //
- int64 duration = 4;
- //
- int32 page = 5;
-}
-
-//
-message BKArcRights {
- //
- int32 no_reprint = 1;
-}
-
-//
-message BKStat {
- //
- int32 like = 1;
- //
- int32 coin = 2;
- //
- int32 favourite = 3;
- //
- int32 reply = 4;
- //
- int32 share = 5;
- //
- int32 view = 6;
- //
- bool has_like = 7;
- //
- bool has_coin = 8;
- //
- bool has_fav = 9;
-}
-
-//
-message CardModule {
- //
- int32 module_type = 1;
- oneof module {
- //
- PkcmHeader module_header = 2;
- //
- PkcmArchive module_archive = 3;
- //
- PkcmCenterButton module_cbtn = 4;
- }
-}
-
-//
-enum CardModuleType {
- Module_invalid = 0;
- Module_header = 1;
- Module_archive = 2;
- Module_cbtn = 3;
-}
-
-//
-message ClickReq {
- //
- int64 sid = 1;
- //
- int32 action = 2;
-}
-
-//
-message ClickResp {
-
-}
-
-//
-message CoinAddReq {
- //
- PlayItem item = 1;
- //
- int32 num = 2;
- //
- bool thumb_up = 3;
-}
-
-//
-message CoinAddResp {
- //
- string message = 1;
-}
-
-//
-message DashItem {
- //
- int32 id = 1;
- //
- string base_url = 2;
- //
- repeated string backup_url = 3;
- //
- int32 bandwidth = 4;
- //
- string mime_type = 5;
- //
- string codecs = 6;
- //
- DashSegmentBase segment_base = 12;
- //
- int32 codecid = 13;
- //
- string md5 = 14;
- //
- int64 size = 15;
-}
-
-//
-message DashSegmentBase {
- //
- string initialization = 1;
- //
- string index_range = 2;
-}
-
-//
-message DetailItem {
- //
- PlayItem item = 1;
- //
- BKArchive arc = 2;
- //
- repeated BKArcPart parts = 3;
- //
- Author owner = 4;
- //
- BKStat stat = 5;
- //
- int64 last_part = 6;
- //
- int64 progress = 7;
- //
- int32 playable = 8;
- //
- string message = 9;
- //
- map player_info = 10;
- //
- PlayItem associated_item = 11;
- //
- int64 last_play_time = 12;
- //
- string history_tag = 13;
- //
- bilibili.app.interface.v1.DeviceType device_type = 14;
- //
- FavFolder ugc_season_info = 15;
-}
-
-//
-message EventReq {
- //
- int32 event_type = 1;
- //
- PlayItem item = 2;
-}
-
-//
-message EventResp {
-
-}
-
-//
-message EventTracking {
- //
- string operator = 1;
- //
- string batch = 2;
- //
- string track_id = 3;
- //
- string entity_type = 4;
- //
- string entity_id = 5;
- //
- string track_json = 6;
-}
-
-//
-message FavFolder {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
- //
- FavFolderAuthor owner = 3;
- //
- string name = 4;
- //
- string cover = 5;
- //
- string desc = 6;
- //
- int32 count = 7;
- //
- int32 attr = 8;
- //
- int32 state = 9;
- //
- int32 favored = 10;
- //
- int64 ctime = 11;
- //
- int64 mtime = 12;
- //
- int32 stat_fav_cnt = 13;
- //
- int32 stat_share_cnt = 14;
- //
- int32 stat_like_cnt = 15;
- //
- int32 stat_Play_cnt = 16;
- //
- int32 stat_reply_cnt = 17;
- //
- int32 fav_state = 18;
-}
-
-//
-message FavFolderAction {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
- //
- int32 action = 3;
-}
-
-//
-message FavFolderAuthor {
- //
- int64 mid = 1;
- //
- string name = 2;
-}
-
-//
-message FavFolderCreateReq {
- //
- string name = 1;
- //
- string desc = 2;
- //
- int32 public = 3;
- //
- int32 folder_type = 4;
-}
-
-//
-message FavFolderCreateResp {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
- //
- string message = 3;
-}
-
-//
-message FavFolderDeleteReq {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
-}
-
-//
-message FavFolderDeleteResp {
- //
- string message = 1;
-}
-
-//
-message FavFolderDetailReq {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
- //
- int64 fav_mid = 3;
- //
- FavItem last_item = 4;
- //
- int32 page_size = 5;
- //
- bool need_folder_info = 6;
-}
-
-//
-message FavFolderDetailResp {
- //
- int32 total = 1;
- //
- bool reach_end = 2;
- //
- repeated FavItemDetail list = 3;
- //
- FavFolder folder_info = 4;
-}
-
-//
-message FavFolderListReq {
- //
- repeated int32 folder_types = 1;
- //
- PlayItem item = 2;
-}
-
-//
-message FavFolderListResp {
- //
- repeated FavFolder list = 1;
-}
-
-//
-message FavFolderMeta {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
-}
-
-//
-message FavItem {
- //
- int32 item_type = 1;
- //
- int64 oid = 2;
- //
- int64 fid = 3;
- //
- int64 mid = 4;
- //
- int64 mtime = 5;
- //
- int64 ctime = 6;
- //
- EventTracking et = 7;
-}
-
-//
-message FavItemAddReq {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
- oneof item {
- //
- PlayItem play = 3;
- //
- FavItem fav = 4;
- }
-}
-
-//
-message FavItemAddResp {
- //
- string message = 1;
-}
-
-//
-message FavItemAuthor {
- //
- int64 mid = 1;
- //
- string name = 2;
-}
-
-//
-message FavItemBatchReq {
- //
- repeated FavFolderAction actions = 1;
- oneof item {
- //
- PlayItem play = 2;
- //
- FavItem fav = 3;
- }
-}
-
-//
-message FavItemBatchResp {
- //
- string message = 1;
-}
-
-//
-message FavItemDelReq {
- //
- int64 fid = 1;
- //
- int32 folder_type = 2;
- oneof item {
- //
- PlayItem play = 3;
- //
- FavItem fav = 4;
- }
-}
-
-//
-message FavItemDelResp {
- //
- string message = 1;
-}
-
-//
-message FavItemDetail {
- //
- FavItem item = 1;
- //
- FavItemAuthor owner = 2;
- //
- FavItemStat stat = 3;
- //
- string cover = 4;
- //
- string name = 5;
- //
- int64 duration = 6;
- //
- int32 state = 7;
- //
- string message = 8;
- //
- int32 parts = 9;
-}
-
-//
-message FavItemStat {
- //
- int32 view = 1;
- //
- int32 reply = 2;
-}
-
-//
-message FavoredInAnyFoldersReq {
- //
- repeated int32 folder_types = 1;
- //
- PlayItem item = 2;
-}
-
-//
-message FavoredInAnyFoldersResp {
- //
- repeated FavFolderMeta folders = 1;
- //
- PlayItem item = 2;
-}
-
-//
-message FavTabShowReq {
- //
- int64 mid = 1;
-}
-
-//
-message FavTabShowResp {
- //
- bool show_menu = 1;
-}
-
-//
-message FollowRelation {
- //
- int32 status = 1;
-}
-
-//
-message FormatDescription {
- //
- int32 quality = 1;
- //
- string format = 2;
- //
- string description = 3;
- //
- string display_desc = 4;
- //
- string superscript = 5;
-}
-
-//
-enum ListOrder {
- NO_ORDER = 0; //
- ORDER_NORMAL = 1; //
- ORDER_REVERSE = 2; //
- ORDER_RANDOM = 3; //
-}
-
-//
-enum ListSortField {
- NO_SORT = 0; //
- SORT_CTIME = 1; //
- SORT_VIEWCNT = 2; //
- SORT_FAVCNT = 3; //
-}
-
-//
-message MainFavMusicMenuListReq {
- //
- int32 tab_type = 1;
- //
- string offset = 2;
-}
-
-//
-message MainFavMusicMenuListResp {
- //
- int32 tab_type = 1;
- //
- repeated MusicMenu menu_list = 2;
- //
- bool has_more = 3;
- //
- string offset = 4;
-}
-
-//
-message MainFavMusicSubTabListReq {
-
-}
-
-//
-message MainFavMusicSubTabListResp {
- //
- repeated MusicSubTab tabs = 1;
- //
- MainFavMusicMenuListResp default_tab_res = 2;
- //
- map first_page_res = 3;
-}
-
-//
-message MedialistItem {
- //
- PlayItem item = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- int64 duration = 4;
- //
- int32 parts = 5;
- //
- int64 up_mid = 6;
- //
- string up_name = 7;
- //
- int32 state = 8;
- //
- string message = 9;
- //
- int64 stat_view = 10;
- //
- int64 stat_reply = 11;
-}
-
-//
-message MedialistReq {
- //
- int64 list_type = 1;
- //
- int64 biz_id = 2;
- //
- string offset = 3;
-}
-
-//
-message MedialistResp {
- //
- int64 total = 1;
- //
- bool has_more = 2;
- //
- string offset = 3;
- //
- repeated MedialistItem items = 4;
- //
- MedialistUpInfo up_info = 5;
-}
-
-//
-message MedialistUpInfo {
- //
- int64 mid = 1;
- //
- string avatar = 2;
- //
- int64 fans = 3;
- //
- string name = 4;
-}
-
-//
-message MenuDeleteReq {
- //
- int64 id = 1;
-}
-
-//
-message MenuDeleteResp {
- //
- string message = 1;
-}
-
-//
-message MenuEditReq {
- //
- int64 id = 1;
- //
- string title = 2;
- //
- string desc = 3;
- //
- int32 is_public = 4;
-}
-
-//
-message MenuEditResp {
- //
- string message = 1;
-}
-
-//
-message MenuSubscribeReq {
- //
- int32 action = 1;
- //
- int64 target_id = 2;
-}
-
-//
-message MenuSubscribeResp {
- //
- string message = 1;
-}
-
-//
-message MusicMenu {
- //
- int64 id = 1;
- //
- int32 menu_type = 2;
- //
- string title = 3;
- //
- string desc = 4;
- //
- string cover = 5;
- //
- MusicMenuAuthor owner = 6;
- //
- int32 state = 7;
- //
- int64 attr = 8;
- //
- MusicMenuStat stat = 9;
- //
- int64 total = 10;
- //
- int64 ctime = 11;
- //
- string uri = 12;
-}
-
-//
-message MusicMenuAuthor {
- //
- int64 mid = 1;
- //
- string name = 2;
- //
- string avatar = 3;
-}
-
-//
-message MusicMenuStat {
- //
- int64 play = 1;
- //
- int64 reply = 2;
-}
-
-//
-message MusicSubTab {
- //
- string name = 1;
- //
- int32 tab_type = 2;
- //
- int64 total = 3;
-}
-
-//
-message PageOption {
- //
- int32 page_size = 1;
- //
- int32 direction = 2;
- //
- PlayItem last_item = 3;
-}
-
-//
-message PickArchive {
- //
- PlayItem item = 1;
- //
- string title = 2;
- //
- PickArchiveAuthor owner = 3;
- //
- string cover = 4;
- //
- int64 duration = 5;
- //
- int32 parts = 6;
- //
- int32 stat_view = 7;
- //
- int32 stat_reply = 8;
- //
- int32 state = 9;
- //
- string message = 10;
-}
-
-//
-message PickArchiveAuthor {
- //
- int64 mid = 1;
- //
- string name = 2;
-}
-
-//
-message PickCard {
- //
- int64 pick_id = 1;
- //
- int64 card_id = 2;
- //
- string card_name = 3;
- //
- repeated CardModule modules = 4;
-}
-
-//
-message PickCardDetailReq {
- //
- int64 card_id = 1;
- //
- int64 pick_id = 2;
-}
-
-//
-message PickCardDetailResp {
- //
- int64 card_id = 1;
- //
- int64 pick_id = 2;
- //
- repeated CardModule modules = 3;
-}
-
-//
-message PickFeedReq {
- //
- int64 offset = 1;
-}
-
-//
-message PickFeedResp {
- //
- int64 offset = 1;
- //
- repeated PickCard cards = 2;
-}
-
-//
-message PkcmArchive {
- //
- PickArchive arc = 1;
- //
- string pick_reason = 2;
-}
-
-//
-message PkcmCenterButton {
- //
- string icon_head = 1;
- //
- string icon_tail = 2;
- //
- string title = 3;
- //
- string uri = 4;
-}
-
-//
-message PkcmHeader {
- //
- string title = 1;
- //
- string desc = 2;
- //
- string btn_icon = 3;
- //
- string btn_text = 4;
- //
- string btn_uri = 5;
-}
-
-//
-message PlayActionReportReq {
- //
- PlayItem item = 1;
- //
- string from_spmid = 2;
-}
-
-//
-message PlayDASH {
- //
- int32 duration = 1;
- //
- float min_buffer_time = 2;
- //
- repeated DashItem audio = 3;
-}
-
-//
-message PlayHistoryAddReq {
- //
- PlayItem item = 1;
- //
- int64 progress = 2;
- //
- int64 duration = 3;
- //
- int32 play_style = 4;
-}
-
-//
-message PlayHistoryDelReq {
- //
- repeated PlayItem items = 1;
- //
- bool truncate = 2;
-}
-
-//
-message PlayHistoryReq {
- //
- PageOption page_opt = 1;
- //
- int64 local_today_zero = 2;
-}
-
-//
-message PlayHistoryResp {
- //
- int32 total = 1;
- //
- bool reach_end = 2;
- //
- repeated DetailItem list = 3;
-}
-
-//
-message PlayInfo {
- //
- int32 qn = 1;
- //
- string format = 2;
- //
- int32 qn_type = 3;
- oneof info {
- //
- PlayURL play_url = 4;
- //
- PlayDASH play_dash = 5;
- }
- int32 fnver = 6;
- //
- int32 fnval = 7;
- //
- repeated int32 formats = 8;
- //
- int32 video_codecid = 9;
- //
- int64 length = 10;
- //
- int32 code = 11;
- //
- string message = 12;
- //
- int64 expire_time = 13;
- //
- bilibili.app.playurl.v1.VolumeInfo volume = 14;
-}
-
-//
-message PlayItem {
- //
- int32 item_type = 1;
- //
- int64 oid = 3;
- //
- repeated int64 sub_id = 4;
- //
- EventTracking et = 5;
-}
-
-//
-message PlaylistAddReq {
- //
- repeated PlayItem items = 1;
- oneof pos {
- //
- PlayItem after = 2;
- //
- bool head = 3;
- //
- bool tail = 4;
- }
-}
-
-//
-message PlaylistDelReq {
- //
- repeated PlayItem items = 1;
- //
- bool truncate = 2;
-}
-
-//
-message PlaylistReq {
- //
- int32 from = 1;
- //
- int64 id = 2;
- //
- PlayItem anchor = 3;
- //
- PageOption page_opt = 4;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
- //
- int64 extra_id = 6;
- //
- SortOption sort_opt = 7;
-}
-
-//
-message PlaylistResp {
- //
- int32 total = 1;
- //
- bool reach_start = 2;
- //
- bool reach_end = 3;
- //
- repeated DetailItem list = 4;
- //
- PlayItem last_play = 5;
- //
- int64 last_progress = 6;
-}
-
-//
-enum PlaylistSource {
- DEFAULT = 0; //
- MEM_SPACE = 1; //
- AUDIO_COLLECTION = 2; //
- AUDIO_CARD = 3; //
- USER_FAVOURITE = 4; //
- UP_ARCHIVE = 5; //
- AUDIO_CACHE = 6; //
- PICK_CARD = 7; //
- MEDIA_LIST = 8; //
-}
-
-//
-message PlayURL {
- //
- repeated ResponseUrl durl = 1;
-}
-
-//
-message PlayURLReq {
- //
- PlayItem item = 1;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 2;
-}
-
-//
-message PlayURLResp {
- //
- PlayItem item = 1;
- //
- int32 playable = 2;
- //
- string message = 3;
- //
- map playerInfo = 4;
-}
-
-//
-message RcmdPlaylistReq {
- //
- int32 from = 1;
- //
- int64 id = 2;
- //
- bool need_history = 3;
- //
- bool need_top_cards = 4;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
-}
-
-//
-message RcmdPlaylistResp {
- //
- repeated DetailItem list = 1;
- //
- int64 history_len = 2;
- //
- repeated TopCard top_cards = 3;
-}
-
-//
-message ResponseUrl {
- //
- int32 order = 1;
- //
- int64 length = 2;
- //
- int64 size = 3;
- //
- string ahead = 4;
- //
- string vhead = 5;
- //
- string url = 6;
- //
- repeated string backup_url = 7;
- //
- string md5 = 8;
-}
-
-//
-message SortOption {
- //
- int32 order = 1;
- //
- int32 sort_field = 2;
-}
-
-//
-message ThumbUpReq {
- //
- PlayItem item = 1;
- //
- int32 action = 2;
-}
-
-//
-message ThumbUpResp {
- //
- string message = 1;
-}
-
-//
-message TopCard {
- //
- string title = 1;
- //
- int32 play_style = 2;
- //
- int32 card_type = 3;
- //
- oneof card {
- //
- TpcdHistory listen_history = 4;
- //
- TpcdFavFolder fav_folder = 5;
- //
- TpcdUpRecall up_recall = 6;
- //
- TpcdPickToday pick_today = 7;
- }
- //
- int64 pos = 8;
- //
- string title_icon = 9;
-}
-
-//
-enum TopCardType {
- UNSPECIFIED = 0; //
- LISTEN_HISTORY = 1; //
- FAVORITE_FOLDER = 2; //
- UP_RECALL = 3; //
- PICK_TODAY = 4; //
-}
-
-//
-message TpcdFavFolder {
- //
- DetailItem item = 1;
- //
- string text = 2;
- //
- string pic = 3;
- //
- int64 fid = 4;
- //
- int32 folder_type = 5;
-}
-
-//
-message TpcdHistory {
- //
- DetailItem item = 1;
- //
- string text = 2;
- //
- string pic = 3;
-}
-
-//
-message TpcdPickToday {
- //
- DetailItem item = 1;
- //
- string text = 2;
- //
- string pic = 3;
- //
- int64 pick_id = 4;
- //
- int64 pick_card_id = 5;
-}
-
-//
-message TpcdUpRecall {
- //
- int64 up_mid = 1;
- //
- string text = 2;
- //
- string avatar = 3;
- //
- int64 medialist_type = 4;
- //
- int64 medialist_biz_id = 5;
- //
- DetailItem item = 6;
-}
-
-//
-message TripleLikeReq {
- //
- PlayItem item = 1;
-}
-
-//
-message TripleLikeResp {
- //
- string message = 1;
- //
- bool thumb_ok = 2;
- //
- bool coin_ok = 3;
- //
- bool fav_ok = 4;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/playeronline/v1/playeronline.proto b/bili-api-grpc/proto/bilibili/app/playeronline/v1/playeronline.proto
deleted file mode 100644
index ffa8957e6..000000000
--- a/bili-api-grpc/proto/bilibili/app/playeronline/v1/playeronline.proto
+++ /dev/null
@@ -1,72 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.playeronline.v1;
-
-option java_multiple_files = true;
-
-// 在线人数
-service PlayerOnline {
- // 获取在线人数
- rpc PlayerOnline (PlayerOnlineReq) returns (PlayerOnlineReply);
- //
- rpc PremiereInfo(PremiereInfoReq) returns (PremiereInfoReply);
- //
- rpc ReportWatch(ReportWatchReq) returns (NoReply);
-}
-
-// 空回复
-message NoReply {}
-
-// 获取在线人数-回复
-message PlayerOnlineReply {
- //
- string total_text = 1;
- // 下次轮询间隔时间
- int64 sec_next = 2;
- // 是否底部显示
- bool bottom_show = 3;
- //
- bool sdm_show = 4;
- //
- string sdm_text = 5;
- //
- int64 total_number = 6;
- //
- string total_number_text = 7;
-}
-
-// 获取在线人数-请求
-message PlayerOnlineReq {
- // 稿件 avid
- int64 aid = 1;
- // 视频 cid
- int64 cid = 2;
- // 是否在播放中
- bool play_open = 3;
-}
-
-//
-message PremiereInfoReply {
- //
- string premiere_over_text = 1;
- //
- int64 participant = 2;
- //
- int64 interaction = 3;
-}
-
-//
-message PremiereInfoReq {
- //
- int64 aid = 1;
-}
-
-//
-message ReportWatchReq {
- //
- int64 aid = 1;
- //
- string biz = 2;
- //
- string buvid = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/playerunite/v1/playerunite.proto b/bili-api-grpc/proto/bilibili/app/playerunite/v1/playerunite.proto
deleted file mode 100644
index 1fd6f4bd9..000000000
--- a/bili-api-grpc/proto/bilibili/app/playerunite/v1/playerunite.proto
+++ /dev/null
@@ -1,51 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.playerunite.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/playershared/playershared.proto";
-
-import "google/protobuf/any.proto";
-
-// 统一视频url
-service Player {
- // 视频地址
- rpc PlayViewUnite (PlayViewUniteReq) returns (PlayViewUniteReply);
-}
-
-//
-message PlayViewUniteReq {
- // 请求资源VOD信息
- bilibili.playershared.VideoVod vod = 1;
- //
- string spmid = 2;
- //
- string from_spmid = 3;
- // 补充信息, 如ep_id等
- map extra_content = 4;
- //
- string bvid = 5;
-}
-
-//
-message PlayViewUniteReply {
- // 音视频流信息
- bilibili.playershared.VodInfo vod_info = 1;
- //
- bilibili.playershared.PlayArcConf play_arc_conf = 2;
- //
- bilibili.playershared.PlayDeviceConf play_device_conf = 3;
- //
- bilibili.playershared.Event event = 4;
- // 使用 pgcanymodel / ugcanymodel 进行proto any转换成对应业务码结构体
- google.protobuf.Any supplement = 5;
- //
- bilibili.playershared.PlayArc play_arc = 6;
- //
- bilibili.playershared.QnTrialInfo qn_trial_info = 7;
- //
- bilibili.playershared.History history = 8;
- //
- bilibili.playershared.ViewInfo view_info = 9;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/playurl/v1/playurl.proto b/bili-api-grpc/proto/bilibili/app/playurl/v1/playurl.proto
deleted file mode 100644
index 1678554a1..000000000
--- a/bili-api-grpc/proto/bilibili/app/playurl/v1/playurl.proto
+++ /dev/null
@@ -1,673 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.playurl.v1;
-
-option java_multiple_files = true;
-
-// 视频url
-service PlayURL {
- // 视频地址
- rpc PlayURL (PlayURLReq) returns (PlayURLReply);
- // 投屏地址
- rpc Project (ProjectReq) returns (ProjectReply);
- // 播放页信息
- rpc PlayView (PlayViewReq) returns (PlayViewReply);
- // 编辑播放界面配置
- rpc PlayConfEdit (PlayConfEditReq) returns (PlayConfEditReply);
- // 获取播放界面配置
- rpc PlayConf (PlayConfReq) returns (PlayConfReply);
-}
-
-//
-message AB {
- //
- Glance glance = 1;
- //
- int32 group = 2;
-}
-
-// 配置项
-message ArcConf {
- // 是否支持
- bool is_support = 1;
- //
- bool disabled = 2;
- //
- ExtraContent extra_content = 3;
-}
-
-// 业务类型
-enum Business {
- UNKNOWN = 0; // 未知类型
- STORY = 1; // story业务
-}
-
-// Chronos灰度管理
-message Chronos {
- // 资源md5
- string md5 = 1;
- // 资源文件
- string file = 2;
-}
-
-//
-message ButtonStyle {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string bg_color = 3;
- //
- string jump_link = 4;
-}
-
-//
-message CloudConf {
- // 是否展示功能
- bool show = 1;
- // 设置类型
- ConfType conf_type = 2;
- //
- FieldValue field_value = 3;
- //
- ConfValue conf_value = 4;
-}
-
-// 编码类型
-enum CodeType {
- NOCODE = 0; // 默认
- CODE264 = 1; // H.264
- CODE265 = 2; // H.265
- CODEAV1 = 3; // av1
-}
-
-// 设置类型
-enum ConfType {
- NoType = 0; //
- FLIPCONF = 1; // 镜像反转
- CASTCONF = 2; // 视频投屏
- FEEDBACK = 3; // 反馈
- SUBTITLE = 4; // 字幕
- PLAYBACKRATE = 5; // 播放速度
- TIMEUP = 6; // 定时停止播放
- PLAYBACKMODE = 7; // 播放方式
- SCALEMODE = 8; // 画面尺寸
- BACKGROUNDPLAY = 9; // 后台播放
- LIKE = 10; // 顶
- DISLIKE = 11; // 踩
- COIN = 12; // 投币
- ELEC = 13; // 充电
- SHARE = 14; // 分享
- SCREENSHOT = 15; // 截图
- LOCKSCREEN = 16; // 锁屏
- RECOMMEND = 17; // 推荐
- PLAYBACKSPEED = 18; // 倍速
- DEFINITION = 19; // 清晰度
- SELECTIONS = 20; // 选集
- NEXT = 21; // 下一集
- EDITDM = 22; // 编辑弹幕
- SMALLWINDOW = 23; // 小窗
- SHAKE = 24; // 播放震动
- OUTERDM = 25; // 外层面板弹幕设置
- INNERDM = 26; // 三点内弹幕设置
- PANORAMA = 27; // 全景
- DOLBY = 28; // 杜比
- COLORFILTER = 29; // 颜色滤镜
-}
-
-//
-message ConfValue {
- oneof value {
- //
- bool switch_val = 1;
- //
- int64 selected_val = 2;
- }
-}
-
-// dash条目
-message DashItem {
- // 清晰度
- uint32 id = 1;
- // 主线流
- string baseUrl = 2;
- // 备用流
- repeated string backup_url = 3;
- // 带宽
- uint32 bandwidth = 4;
- // 编码id
- uint32 codecid = 5;
- // md5
- string md5 = 6;
- // 大小
- uint64 size = 7;
- // 帧率
- string frame_rate = 8;
- //
- string widevine_pssh = 9;
-}
-
-// dash视频流
-message DashVideo {
- // 主线流
- string base_url = 1;
- // 备用流
- repeated string backup_url = 2;
- // 带宽
- uint32 bandwidth = 3;
- // 编码id
- uint32 codecid = 4;
- // md5
- string md5 = 5;
- // 大小
- uint64 size = 6;
- // 伴音质量id
- uint32 audioId = 7;
- // 是否非全二压
- bool no_rexcode = 8;
- // 码率
- string frame_rate = 9;
- // 宽度
- int32 width = 10;
- // 高度
- int32 height = 11;
- //
- string widevine_pssh = 12;
-}
-
-// 杜比伴音信息
-message DolbyItem {
- enum Type {
- NONE = 0; // NONE
- COMMON = 1; // 普通杜比音效
- ATMOS = 2; // 全景杜比音效
- }
- // 杜比类型
- Type type = 1;
- // 音频流
- DashItem audio = 2;
-}
-
-// 事件
-message Event {
- // 震动
- Shake shake = 1;
-}
-
-//
-message ExtraContent {
- //
- string disabled_reason = 1;
- //
- int64 disabled_code = 2;
-}
-
-// 配置字段值
-message FieldValue {
- oneof value {
- // 开关
- bool switch = 1;
- }
-}
-
-// 清晰度描述
-message FormatDescription {
- // 清晰度
- int32 quality = 1;
- // 清晰度格式
- string format = 2;
- // 清晰度描述
- string description = 3;
- // 新描述
- string new_description = 4;
- // 选中态的清晰度描述
- string display_desc = 5;
- // 选中态的清晰度描述的角标
- string superscript = 6;
-}
-
-//
-message Glance {
- //
- bool can_watch = 1;
- //
- int64 times = 2;
- //
- int64 duration = 3;
-}
-
-//
-enum Group {
- UnknownGroup = 0; //
- A = 1; //
- B = 2; //
- C = 3; //
-}
-
-// 禁用功能配置
-message PlayAbilityConf {
- CloudConf background_play_conf = 1; // 后台播放
- CloudConf flip_conf = 2; // 镜像反转
- CloudConf cast_conf = 3; // 投屏
- CloudConf feedback_conf = 4; // 反馈
- CloudConf subtitle_conf = 5; // 字幕
- CloudConf playback_rate_conf = 6; // 播放速度
- CloudConf time_up_conf = 7; // 定时停止
- CloudConf playback_mode_conf = 8; // 播放方式
- CloudConf scale_mode_conf = 9; // 画面尺寸
- CloudConf like_conf = 10; // 赞
- CloudConf dislike_conf = 11; // 踩
- CloudConf coin_conf = 12; // 投币
- CloudConf elec_conf = 13; // 充电
- CloudConf share_conf = 14; // 分享
- CloudConf screen_shot_conf = 15; // 截图
- CloudConf lock_screen_conf = 16; // 锁定
- CloudConf recommend_conf = 17; // 相关推荐
- CloudConf playback_speed_conf = 18; // 播放速度
- CloudConf definition_conf = 19; // 清晰度
- CloudConf selections_conf = 20; // 选集
- CloudConf next_conf = 21; // 下一集
- CloudConf edit_dm_conf = 22; // 编辑弹幕
- CloudConf small_window_conf = 23; // 小窗
- CloudConf shake_conf = 24; // 震动
- CloudConf outer_dm_conf = 25; // 外层面板弹幕设置
- CloudConf innerDmDisable = 26; // 三点内弹幕设置
- CloudConf inner_dm_conf = 27; // 一起看入口
- CloudConf dolby_conf = 28; // 杜比音效
- CloudConf color_filter_conf = 29; // 颜色滤镜
-}
-
-// 播放控件稿件配置
-message PlayArcConf {
- ArcConf background_play_conf = 1; // 后台播放
- ArcConf flip_conf = 2; // 镜像反转
- ArcConf cast_conf = 3; // 投屏
- ArcConf feedback_conf = 4; // 反馈
- ArcConf subtitle_conf = 5; // 字幕
- ArcConf playback_rate_conf = 6; // 播放速度
- ArcConf time_up_conf = 7; // 定时停止
- ArcConf playback_mode_conf = 8; // 播放方式
- ArcConf scale_mode_conf = 9; // 画面尺寸
- ArcConf like_conf = 10; // 赞
- ArcConf dislike_conf = 11; // 踩
- ArcConf coin_conf = 12; // 投币
- ArcConf elec_conf = 13; // 充电
- ArcConf share_conf = 14; // 分享
- ArcConf screen_shot_conf = 15; // 截图
- ArcConf lock_screen_conf = 16; // 锁定
- ArcConf recommend_conf = 17; // 相关推荐
- ArcConf playback_speed_conf = 18; // 播放速度
- ArcConf definition_conf = 19; // 清晰度
- ArcConf selections_conf = 20; // 选集
- ArcConf next_conf = 21; // 下一集
- ArcConf edit_dm_conf = 22; // 编辑弹幕
- ArcConf small_window_conf = 23; // 小窗
- ArcConf shake_conf = 24; // 震动
- ArcConf outer_dm_conf = 25; // 外层面板弹幕设置
- ArcConf inner_dm_conf = 26; // 三点内弹幕设置
- ArcConf panorama_conf = 27; // 一起看入口
- ArcConf dolby_conf = 28; // 杜比音效
- ArcConf screen_recording_conf = 29; // 屏幕录制
- ArcConf color_filter_conf = 30; // 颜色滤镜
-}
-
-// 编辑播放界面配置-响应
-message PlayConfEditReply {
-
-}
-
-// 编辑播放界面配置-请求
-message PlayConfEditReq {
- // 播放界面配置
- repeated PlayConfState play_conf = 1;
-}
-
-// 获取播放界面配置-响应
-message PlayConfReply {
- //播放控件用户自定义配置
- PlayAbilityConf play_conf = 1;
-}
-
-// 获取播放界面配置-请求
-message PlayConfReq {
-
-}
-
-// 播放界面配置
-message PlayConfState {
- // 设置类型
- ConfType conf_type = 1;
- // 是否隐藏
- bool show = 2;
- // 配置字段值
- FieldValue field_value = 3;
- //
- ConfValue conf_value = 4;
-}
-
-// 错误码
-enum PlayErr {
- NoErr = 0; //
- WithMultiDeviceLoginErr = 1; // 管控类型的错误码
-}
-
-//
-message PlayLimit {
- //
- PlayLimitCode code = 1;
- //
- string message = 2;
- //
- string sub_message = 3;
- //
- ButtonStyle button = 4;
-}
-
-//
-enum PlayLimitCode {
- PLCUnkown = 0; //
- PLCUgcNotPayed = 1; //
-}
-
-// 视频地址-回复
-message PlayURLReply {
- // 清晰的
- uint32 quality = 1;
- // 格式
- string format = 2;
- // 总时长(单位为ms)
- uint64 timelength = 3;
- // 编码id
- uint32 video_codecid = 4;
- // 视频流版本
- uint32 fnver = 5;
- // 视频流格式
- uint32 fnval = 6;
- // 是否支持投影
- bool video_project = 7;
- // 分段视频流列表
- repeated ResponseUrl durl = 8;
- // dash数据
- ResponseDash dash = 9;
- // 是否非全二压
- int32 no_rexcode = 10;
- // 互动视频升级提示
- UpgradeLimit upgrade_limit = 11;
- // 清晰度描述列表
- repeated FormatDescription support_formats = 12;
- // 视频格式
- VideoType type = 13;
-}
-
-// 视频地址-请求
-message PlayURLReq {
- // 稿件avid
- int64 aid = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string from_spmid = 10;
-}
-
-// 播放页信息-回复
-message PlayViewReply {
- // 视频流信息
- VideoInfo video_info = 1;
- // 播放控件用户自定义配置
- PlayAbilityConf play_conf = 2;
- // 互动视频升级提示
- UpgradeLimit upgrade_limit = 3;
- // Chronos灰度管理
- Chronos chronos = 4;
- // 播放控件稿件配置
- PlayArcConf play_arc = 5;
- // 事件
- Event event = 6;
- //
- AB ab = 7;
- //
- PlayLimit play_limit = 8;
-}
-
-// 播放页信息-请求
-message PlayViewReq {
- // 稿件avid
- int64 aid = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string from_spmid = 10;
- // 青少年模式
- int32 teenagers_mode = 11;
- // 编码
- CodeType prefer_codec_type = 12;
- // 业务类型
- Business business = 13;
- //
- int64 voice_balance = 14;
-}
-
-// 投屏地址-响应
-message ProjectReply {
- PlayURLReply project = 1;
-}
-
-// 投屏地址-请求
-message ProjectReq {
- // 稿件avid
- int64 aid = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string from_spmid = 10;
- // 使用协议
- // 0:默认乐播 1:自建协议 2:云投屏 3:airplay
- int32 protocol = 11;
- // 投屏设备
- // 0:默认其他 1:OTT设备
- int32 device_type = 12;
-}
-
-// dash数据
-message ResponseDash {
- // dash视频流
- repeated DashItem video = 1;
- // dash伴音流
- repeated DashItem audio = 2;
-}
-
-// 分段流条目
-message ResponseUrl {
- // 分段序号
- uint32 order = 1;
- // 分段时长
- uint64 length = 2;
- // 分段大小
- uint64 size = 3;
- // 主线流
- string url = 4;
- // 备用流
- repeated string backup_url = 5;
- // md5
- string md5 = 6;
-}
-
-//分段视频流
-message SegmentVideo {
- //分段视频流列表
- repeated ResponseUrl segment = 1;
-}
-
-// 震动
-message Shake {
- // 文件地址
- string file = 1;
-}
-
-// 视频流信息
-message Stream {
- // 元数据
- StreamInfo stream_info = 1;
- // 流数据
- oneof content {
- // dash流
- DashVideo dash_video = 2;
- // 分段流
- SegmentVideo segment_video = 3;
- }
-}
-
-// 流媒体元数据
-message StreamInfo {
- // 清晰度
- uint32 quality = 1;
- // 格式
- string format = 2;
- // 格式描述
- string description = 3;
- // 错误码
- PlayErr err_code = 4;
- // 不满足条件信息
- StreamLimit limit = 5;
- // 是否需要vip
- bool need_vip = 6;
- // 是否需要登录
- bool need_login = 7;
- // 是否完整
- bool intact = 8;
- // 是否非全二压
- bool no_rexcode = 9;
- // 清晰度属性位
- int64 attribute = 10;
- // 新版格式描述
- string new_description = 11;
- // 格式文字
- string display_desc = 12;
- // 新版格式描述备注
- string superscript = 13;
-}
-
-// 清晰度不满足条件信息
-message StreamLimit {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 提示信息
- string msg = 3;
-}
-
-// 互动视频升级按钮信息
-message UpgradeButton {
- // 标题
- string title = 1;
- // 链接
- string link = 2;
-}
-
-// 互动视频升级提示
-message UpgradeLimit {
- // 错误码
- int32 code = 1;
- // 错误信息
- string message = 2;
- // 图片url
- string image = 3;
- // 按钮信息
- UpgradeButton button = 4;
-}
-
-// 视频url信息
-message VideoInfo {
- // 视频清晰度
- uint32 quality = 1;
- // 视频格式
- string format = 2;
- // 视频时长
- uint64 timelength = 3;
- // 视频编码id
- uint32 video_codecid = 4;
- // 视频流
- repeated Stream stream_list = 5;
- // 伴音流
- repeated DashItem dash_audio = 6;
- // 杜比伴音流
- DolbyItem dolby = 7;
- //
- VolumeInfo volume = 8;
-}
-
-// 视频类型
-enum VideoType {
- Unknown_VALUE = 0; //
- FLV_VALUE = 1; // flv格式
- DASH_VALUE = 2; // dash格式
- MP4_VALUE = 3; // mp4格式
-}
-
-//
-message VolumeInfo {
- //
- double measured_i = 1;
- //
- double measured_lra = 2;
- //
- double measured_tp = 3;
- //
- double measured_threshold = 4;
- //
- double target_offset = 5;
- //
- double target_i = 6;
- //
- double target_tp = 7;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/resource/v1/module.proto b/bili-api-grpc/proto/bilibili/app/resource/v1/module.proto
deleted file mode 100644
index 7a4e0a1b0..000000000
--- a/bili-api-grpc/proto/bilibili/app/resource/v1/module.proto
+++ /dev/null
@@ -1,130 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.resource.v1;
-
-option java_multiple_files = true;
-
-//
-service Module {
- //
- rpc List(ListReq) returns (ListReply);
-}
-
-//
-enum CompressType {
- Unzip = 0; // unzip
- Original = 1; // 不操作
-}
-
-//
-enum EnvType {
- Unknown = 0; //
- Release = 1; //
- Test = 2; //
-}
-
-//
-enum IncrementType {
- Total = 0; // 全量包
- Incremental = 1; // 增量包
-}
-
-//
-enum LevelType {
- Undefined = 0; //
- High = 1; // 高 需立即下载
- Middle = 2; // 中 可以延迟下载
- Low = 3; // 低 仅在业务方使用到时由业务方手动进行下载
-}
-
-message ListReply {
- //
- string env = 1;
- //
- repeated PoolReply pools = 2;
- //
- int64 list_version = 3;
-}
-
-//
-message ListReq {
- //
- string pool_name = 1;
- //
- string module_name = 2;
- //
- repeated VersionListReq version_list = 3;
- //
- EnvType env = 4;
- //
- int32 sys_ver = 5;
- //
- int32 scale = 6;
- //
- int32 arch = 7;
- //
- int64 list_version = 8;
-}
-
-//
-message ModuleReply {
- //
- string name = 1;
- //
- int64 version = 2;
- //
- string url = 3;
- //
- string md5 = 4;
- //
- string total_md5 = 5;
- //
- IncrementType increment = 6;
- //
- bool is_wifi = 7;
- //
- LevelType level = 8;
- //
- string filename = 9;
- //
- string file_type = 10;
- //
- int64 file_size = 11;
- //
- CompressType compress = 12;
- //
- int64 publish_time = 13;
- // 上报使用
- int64 pool_id = 14;
- //
- int64 module_id = 15;
- //
- int64 version_id = 16;
- //
- int64 file_id = 17;
- //
- bool zip_check = 18;
-}
-
-message PoolReply {
- //
- string name = 1;
- //
- repeated ModuleReply modules = 2;
-}
-
-//
-message VersionListReq {
- //
- string pool_name = 1;
- //
- repeated VersionReq versions = 2;
-}
-
-//
-message VersionReq {
- //
- string module_name = 1;
- //
- int64 version = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/search/v2/search.proto b/bili-api-grpc/proto/bilibili/app/search/v2/search.proto
deleted file mode 100644
index 1b9fc30b5..000000000
--- a/bili-api-grpc/proto/bilibili/app/search/v2/search.proto
+++ /dev/null
@@ -1,112 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.search.v2;
-
-option java_multiple_files = true;
-
-import "bilibili/broadcast/message/main/search.proto";
-
-service Search {
- //
- rpc CancelChatTask (CancelChatTaskReq) returns (CancelChatTaskReply);
- //
- rpc GetChatResult (GetChatResultReq) returns (bilibili.broadcast.message.main.ChatResult);
- //
- rpc SearchEgg (SearchEggReq) returns (SearchEggReply);
- //
- rpc SubmitChatTask (SubmitChatTaskReq) returns (SubmitChatTaskReply);
-}
-
-//
-message CancelChatTaskReq {
- //
- string session_id = 1;
- //
- string from_source = 2;
-}
-
-//
-message CancelChatTaskReply {
- //
- int32 code = 1;
-}
-
-//
-message GetChatResultReq {
- //
- string query = 1;
- //
- string session_id = 2;
- //
- string from_source = 3;
-}
-
-//
-message SearchEggInfo {
- //
- int32 egg_type = 1;
- //
- int64 id = 2;
- //
- int32 is_commercial = 3;
- //
- string mask_color = 4;
- //
- int64 mask_transparency = 5;
- //
- string md5 = 6;
- //
- int32 re_type = 7;
- //
- string re_url = 8;
- //
- string re_value = 9;
- //
- int32 show_count = 10;
- //
- int64 size = 11;
- //
- int64 source = 12;
- //
- string url = 13;
-}
-
-//
-message SearchEggInfos {
- //
- repeated SearchEggInfo egg_info = 1;
-}
-
-//
-message SearchEggReply {
- //
- int32 code = 1;
- //
- string seid = 2;
- //
- SearchEggInfos result = 3;
-}
-
-//
-message SearchEggReq {
-
-}
-
-//
-message SubmitChatTaskReply {
- //
- int32 code = 1;
- //
- string session_id = 2;
-}
-
-//
-message SubmitChatTaskReq {
- //
- string query = 1;
- //
- string track_id = 2;
- //
- string from_source = 3;
-}
-
diff --git a/bili-api-grpc/proto/bilibili/app/show/mixture/v1/mixture.proto b/bili-api-grpc/proto/bilibili/app/show/mixture/v1/mixture.proto
deleted file mode 100644
index 6af47f663..000000000
--- a/bili-api-grpc/proto/bilibili/app/show/mixture/v1/mixture.proto
+++ /dev/null
@@ -1,55 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.show.mixture.v1;
-
-option java_multiple_files = true;
-
-//
-service Mixture {
- //
- rpc Widget(WidgetReq) returns (WidgetReply);
-}
-
-//
-message RcmdReason {
- //
- string content = 1;
- //
- uint32 corner_mark = 2;
-}
-
-//
-message WidgetItem {
- //
- string cover = 1;
- //
- string view = 2;
- //
- RcmdReason rcmd_reason = 3;
- //
- string title = 4;
- //
- string name = 5;
- //
- string uri = 6;
- //
- string goto = 7;
- //
- int64 id = 8;
- //
- int32 view_icon = 9;
-}
-
-//
-message WidgetReply {
- //
- repeated WidgetItem item = 1;
-}
-
-//
-message WidgetReq {
- //
- string from_spmid = 1;
- //
- uint32 page_no = 2;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/show/popular/v1/popular.proto b/bili-api-grpc/proto/bilibili/app/show/popular/v1/popular.proto
deleted file mode 100644
index c387e1bd3..000000000
--- a/bili-api-grpc/proto/bilibili/app/show/popular/v1/popular.proto
+++ /dev/null
@@ -1,118 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.show.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/card/v1/card.proto";
-import "bilibili/app/archive/middleware/v1/preload.proto";
-
-// 热门
-service Popular {
- // 热门列表
- rpc Index (PopularResultReq) returns (PopularReply);
-}
-
-// 气泡信息
-message Bubble {
- // 文案
- string bubble_content = 1;
- // 版本
- int32 version = 2;
- // 起始时间
- int64 stime = 3;
-}
-
-// 配置信息
-message Config {
- // 标题
- string item_title = 1;
- // 底部文案
- string bottom_text = 2;
- // 底部图片url
- string bottom_text_cover = 3;
- // 底部跳转页url
- string bottom_text_url = 4;
- // 顶部按钮信息列表
- repeated EntranceShow top_items = 5;
- // 头图url
- string head_image = 6;
- // 当前页按钮信息
- repeated EntranceShow page_items = 7;
- //
- int32 hit = 8;
-}
-
-// 按钮信息
-message EntranceShow {
- // 按钮图标url
- string icon = 1;
- // 按钮名
- string title = 2;
- // 入口模块id
- string module_id = 3;
- // 跳转uri
- string uri = 4;
- // 气泡信息
- Bubble bubble = 5;
- // 入口id
- int64 entrance_id = 6;
- // 头图url
- string top_photo = 7;
- // 入口类型
- int32 entrance_type = 8;
-}
-
-// 热门列表-响应
-message PopularReply {
- // 卡片列表
- repeated bilibili.app.card.v1.Card items = 1;
- // 配置信息
- Config config = 2;
- // 版本
- string ver = 3;
-}
-
-// 热门列表-请求
-message PopularResultReq {
- // 排位索引id,为上此请求末尾项的idx
- int64 idx = 1;
- // 登录标识
- // 1:未登陆用户第一页 2:登陆用户第一页
- int32 login_event = 2;
- // 清晰度(旧版)
- int32 qn = 3;
- // 视频流版本(旧版)
- int32 fnver = 4;
- // 视频流功能(旧版)
- int32 fnval = 5;
- // 是否强制使用域名(旧版)
- int32 force_host = 6;
- // 是否4K(旧版)
- int32 fourk = 7;
- // 当前页面spm
- string spmid = 8;
- // 上此请求末尾项的param
- string last_param = 9;
- // 上此请求的ver
- string ver = 10;
- // 分品类热门的入口ID
- int64 entrance_id = 11;
- // 热门定位id集合
- string location_ids = 12;
- // 0:tag页 1:中间页
- int32 source_id = 13;
- // 数据埋点上报
- // 0:代表手动刷新 1:代表自动刷新
- int32 flush = 14;
- // 秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 15;
-}
-
-
-
-
-
-
-
-
diff --git a/bili-api-grpc/proto/bilibili/app/show/rank/v1/rank.proto b/bili-api-grpc/proto/bilibili/app/show/rank/v1/rank.proto
deleted file mode 100644
index 5ee50b080..000000000
--- a/bili-api-grpc/proto/bilibili/app/show/rank/v1/rank.proto
+++ /dev/null
@@ -1,122 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.show.v1;
-
-option java_multiple_files = true;
-
-// 排行榜
-service Rank {
- // 全站排行榜
- rpc RankAll (RankAllResultReq) returns (RankListReply);
- // 分区排行榜
- rpc RankRegion (RankRegionResultReq) returns (RankListReply);
-}
-
-// 排行榜列表项
-message Item {
- // 标题
- string title = 1;
- // 封面url
- string cover = 2;
- // 参数(稿件avid)
- string param = 3;
- // 跳转uri
- string uri = 4;
- // 重定向url
- string redirect_url = 5;
- // 跳转类型
- // av:视频稿件
- string goto = 6;
- // 播放数
- int32 play = 7;
- // 弹幕数
- int32 danmaku = 8;
- // UP主mid
- int64 mid = 9;
- // UP主昵称
- string name = 10;
- // UP主头像url
- string face = 11;
- // 评论数
- int32 reply = 12;
- // 收藏数
- int32 favourite = 13;
- // 发布时间
- int64 pub_date = 14;
- // 分区tid
- int32 rid = 15;
- // 子分区名
- string rname = 16;
- // 视频总时长
- int64 duration = 17;
- // 点赞数
- int32 like = 18;
- // 1P cid
- int64 cid = 19;
- // 综合评分
- int64 pts = 20;
- // 合作视频文案
- string cooperation = 21;
- // 属性位
- // 0:未关注 1:已关注
- int32 attribute = 22;
- // UP主粉丝数
- int64 follower = 23;
- // UP主认证信息
- OfficialVerify official_verify = 24;
- // 同一UP收起子项列表
- repeated Item children = 25;
- // 关系信息
- Relation relation = 26;
-}
-
-// 认证信息
-message OfficialVerify {
- // 认证类型
- // -1:无认证 0:个人认证 1:机构认证
- int32 type = 1;
- // 认证描述
- string desc = 2;
-}
-
-// 全站排行榜-请求
-message RankAllResultReq {
- // 必须为"all"
- string order = 1;
- // 页码
- // 默认1页
- int32 pn = 2;
- // 每页项数
- // 默认100项,最大100
- int32 ps = 3;
-}
-
-// 排行榜信息-响应
-message RankListReply {
- // 排行榜列表
- repeated Item items = 1;
-}
-
-// 分区排行榜-请求
-message RankRegionResultReq {
- // 一级分区tid(二级分区不可用)
- // 0:全站
- int32 rid = 1;
- // 页码
- // 默认1页
- int32 pn = 2;
- // 每页项数
- // 默认100项,最大100
- int32 ps = 3;
-}
-
-// 关系信息
-message Relation {
- // 关系状态id
- // 1:未关注 2:已关注 3:被关注 4:互相关注
- int32 status = 1;
- // 是否关注
- int32 is_follow = 2;
- // 是否粉丝
- int32 is_followed = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/show/region/v1/region.proto b/bili-api-grpc/proto/bilibili/app/show/region/v1/region.proto
deleted file mode 100644
index e85367053..000000000
--- a/bili-api-grpc/proto/bilibili/app/show/region/v1/region.proto
+++ /dev/null
@@ -1,57 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.show.region.v1;
-
-option java_multiple_files = true;
-
-//
-service Region {
- //
- rpc Region (RegionReq) returns (RegionReply);
-}
-
-//
-message RegionConfig {
- //
- string scenes_name = 1;
- //
- string scenes_type = 2;
-}
-
-//
-message RegionInfo {
- //
- int32 tid = 1;
- //
- int32 reid = 2;
- //
- string name = 3;
- //
- string logo = 4;
- //
- string goto = 5;
- //
- string param = 6;
- //
- string uri = 7;
- //
- int32 type = 8;
- //
- int32 is_bangumi = 9;
- //
- repeated RegionInfo children = 10;
- //
- repeated RegionConfig config = 11;
-}
-
-//
-message RegionReply {
- //
- repeated RegionInfo regions = 1;
-}
-
-//
-message RegionReq {
- //
- string lang = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/space/v1/space.proto b/bili-api-grpc/proto/bilibili/app/space/v1/space.proto
deleted file mode 100644
index 2a91c08a0..000000000
--- a/bili-api-grpc/proto/bilibili/app/space/v1/space.proto
+++ /dev/null
@@ -1,109 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.space.v1;
-
-option java_multiple_files = true;
-
-//
-service Space {
- //
- rpc Archive (ArchiveReq) returns (ArchiveReply);
-}
-
-//-响应
-message ArchiveReply {
- //
- repeated BiliSpaceVideo item = 1;
- //
- int32 count = 2;
- //
- EpisodicButton episodic_button = 3;
- //
- repeated OrderConfig order = 4;
-}
-
-//-请求
-message ArchiveReq {
- //
- int64 vmid = 1;
- //
- int32 pn = 2;
- //
- int32 ps = 3;
- //
- string order = 4;
-}
-
-//
-message Badge {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
- //
- string border_color = 6;
- //
- string border_color_night = 7;
- //
- int32 bg_style = 8;
-}
-
-//
-message BiliSpaceVideo {
- //
- string title = 1;
- //
- string tname = 2;
- //
- int64 duration = 3;
- //
- string cover = 4;
- //
- string uri = 5;
- //
- string param = 6;
- //
- string danmaku = 7;
- //
- int32 play = 8;
- //
- int64 ctime = 9;
- //
- bool state = 10;
- //
- bool is_popular = 11;
- //
- repeated Badge badges = 12;
- //
- string cover_right = 13;
- //
- string bvid = 14;
- //
- bool is_steins = 15;
- //
- bool is_ugcpay = 16;
- //
- bool is_cooperation = 17;
-}
-
-//
-message EpisodicButton {
- //
- string text = 1;
- //
- string uri = 2;
-}
-
-//
-message OrderConfig {
- //
- string title = 1;
- //
- string value = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/splash/v1/splash.proto b/bili-api-grpc/proto/bilibili/app/splash/v1/splash.proto
deleted file mode 100644
index 66a394eb4..000000000
--- a/bili-api-grpc/proto/bilibili/app/splash/v1/splash.proto
+++ /dev/null
@@ -1,133 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.splash.v1;
-
-option java_multiple_files = true;
-
-import "google/protobuf/any.proto";
-
-//
-service Splash {
- //
- rpc List (SplashReq) returns (SplashReply);
-}
-
-//
-message ShowStrategy {
- //
- int32 id = 1;
- //
- int64 stime = 2;
- //
- int64 etime = 3;
-}
-
-//
-message SplashItem {
- //
- int32 id = 1;
- //
- int32 type = 2;
- //
- int32 card_type = 3;
- //
- int32 duration = 4;
- //
- int64 begin_time = 5;
- //
- int64 end_time = 6;
- //
- string thumb = 7;
- //
- string hash = 8;
- //
- string logo_url = 9;
- //
- string logo_hash = 10;
- //
- string video_url = 11;
- //
- string video_hash = 12;
- //
- int32 video_width = 13;
- //
- int32 video_height = 14;
- //
- string schema = 15;
- //
- string schema_title = 16;
- //
- string schema_package_name = 17;
- //
- repeated string schema_callup_whiteList = 18;
- //
- int32 skip = 19;
- //
- string uri = 20;
- //
- string uri_title = 21;
- //
- int32 source = 22;
- //
- int32 cm_mark = 23;
- //
- string ad_cb = 24;
- //
- int64 resource_id = 25;
- //
- string request_id = 26;
- //
- string client_ip = 27;
- //
- bool is_ad = 28;
- //
- bool is_ad_loc = 29;
- //
- google.protobuf.Any extra = 30;
- //
- int64 card_index = 31;
- //
- int64 server_type = 32;
- //
- int64 index = 33;
- //
- string click_url = 34;
- //
- string show_url = 35;
- //
- int32 time_target = 36;
- //
- int32 encryption = 37;
- //
- bool enable_pre_download = 38;
- //
- bool enable_background_download = 39;
-}
-
-//-响应
-message SplashReply {
- //
- int32 max_time = 1;
- //
- int32 min_interval = 2;
- //
- int32 pull_interval = 3;
- //
- repeated SplashItem list = 4;
- //
- repeated ShowStrategy show = 5;
-}
-
-//-请求
-message SplashReq {
- //
- int32 width = 1;
- //
- int32 height = 2;
- //
- string birth = 3;
- //
- string ad_extra = 4;
- //
- string network = 5;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/topic/v1/topic.proto b/bili-api-grpc/proto/bilibili/app/topic/v1/topic.proto
deleted file mode 100644
index 4c4f9ce19..000000000
--- a/bili-api-grpc/proto/bilibili/app/topic/v1/topic.proto
+++ /dev/null
@@ -1,582 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.topic.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/dynamic/v2/dynamic.proto";
-import "bilibili/app/card/v1/common.proto";
-import "bilibili/app/archive/middleware/v1/preload.proto";
-
-//
-service Topic {
- //
- rpc TopicDetailsAll(TopicDetailsAllReq) returns (TopicDetailsAllReply);
- //
- rpc TopicDetailsFold(TopicDetailsFoldReq) returns (TopicDetailsFoldReply);
- //
- rpc TopicSetDetails(TopicSetDetailsReq) returns (TopicSetDetailsReply);
-}
-
-//
-message ButtonMeta {
- //
- string text = 1;
- //
- string icon = 2;
-}
-
-//
-message DetailsTopInfo {
- //
- TopicInfo topic_info = 1;
- //
- User user = 2;
- //
- string stats_desc = 3;
- //
- bool has_create_jurisdiction = 4;
- //
- OperationContent operation_content = 5;
- //
- string head_img_url = 6;
- //
- string head_img_backcolor = 7;
- //
- int32 word_color = 8;
- //
- int32 mission_page_show_type = 9;
- //
- string mission_url = 10;
- //
- string mission_text = 11;
- //
- TopicSet topic_set = 12;
-}
-
-//
-message FoldCardItem {
- //
- int32 is_show_fold = 1;
- //
- int64 fold_count = 2;
- //
- string card_show_desc = 3;
- //
- string fold_desc = 4;
-}
-
-//
-message FunctionalCard {
- //
- repeated TopicCapsule capsules = 1;
- //
- TrafficCard traffic_card = 2;
- //
- GameCard game_card = 3;
-}
-
-//
-message GameCard {
- //
- int64 game_id = 1;
- //
- string game_icon = 2;
- //
- string game_name = 3;
- //
- string score = 4;
- //
- string game_tags = 5;
- //
- string notice = 6;
- //
- string game_link = 7;
-}
-
-//
-message InlineProgressBar {
- //
- string icon_drag = 1;
- //
- string icon_drag_hash = 2;
- //
- string icon_stop = 3;
- //
- string icon_stop_hash = 4;
-}
-
-//
-message LargeCoverInline {
- //
- bilibili.app.card.v1.Base base = 1;
- //
- string cover_left_text1 = 2;
- //
- int32 cover_left_icon1 = 3;
- //
- string cover_left_text2 = 4;
- //
- int32 cover_left_icon2 = 5;
- //
- RightTopLiveBadge right_top_live_badge = 6;
- //
- string extra_uri = 7;
- //
- InlineProgressBar inline_progress_bar = 8;
- //
- TopicThreePoint topic_three_point = 9;
- //
- string cover_left_desc = 10;
- //
- bool hide_danmu_switch = 11;
- //
- bool disable_danmu = 12;
- //
- int32 can_play = 13;
- //
- string duration_text = 14;
- //
- RelationData relation_data = 15;
-}
-
-//
-message LiveBadgeResource {
- //
- string text = 1;
- //
- string animation_url = 2;
- //
- string animation_url_hash = 3;
- //
- string background_color_light = 4;
- //
- string background_color_night = 5;
- //
- int64 alpha_light = 6;
- //
- int64 alpha_night = 7;
- //
- string font_color = 8;
-}
-
-//
-message OperationCard {
- oneof card {
- //
- LargeCoverInline large_cover_inline = 1;
- }
-}
-
-//
-message OperationContent {
- //
- OperationCard operation_card = 1;
-}
-
-//
-message PubLayer {
- //
- int32 show_type = 1;
- //
- string jump_link = 2;
- //
- ButtonMeta button_meta = 3;
- //
- bool close_pub_layer_entry = 4;
-}
-
-//
-message RelationData {
- //
- bool is_fav = 1;
- //
- bool is_coin = 2;
- //
- bool is_follow = 3;
- //
- bool is_like = 4;
- //
- int64 like_count = 5;
-}
-
-//
-message RightTopLiveBadge {
- //
- int64 live_status = 1;
- //
- LiveBadgeResource in_live = 2;
- //
- string live_stats_desc = 3;
-}
-
-//
-message SortContent {
- //
- int64 sort_by = 1;
- //
- string sort_name = 2;
-}
-
-//
-message ThreePointItem {
- //
- string title = 1;
- //
- string jump_url = 2;
-}
-
-//
-message TimeLineEvents {
- //
- int64 event_id = 1;
- //
- string title = 2;
- //
- string time_desc = 3;
- //
- string jump_link = 4;
-}
-
-//
-message TimeLineResource {
- //
- int64 time_line_id = 1;
- //
- string time_line_title = 2;
- //
- repeated TimeLineEvents time_line_events = 3;
- //
- bool has_more = 4;
-}
-
-//
-message TopicActivities {
- //
- repeated TopicActivity activity = 1;
- //
- string act_list_title = 2;
-}
-
-//
-message TopicActivity {
- //
- int64 activity_id = 1;
- //
- string activity_name = 2;
- //
- string jump_url = 3;
- //
- string icon_url = 4;
-}
-
-//
-message TopicCapsule {
- //
- string name = 1;
- //
- string jump_url = 2;
- //
- string icon_url = 3;
-}
-
-//
-message TopicCardItem {
- //
- int32 type = 1;
- //
- bilibili.app.dynamic.v2.DynamicItem dynamic_item = 2;
- //
- FoldCardItem ford_card_item = 3;
- //
- VideoSmallCardItem video_small_card_item = 4;
-}
-
-//
-message TopicCardList {
- //
- repeated TopicCardItem topic_card_items = 1;
- //
- string offset = 2;
- //
- bool has_more = 3;
- //
- TopicSortByConf topic_sort_by_conf = 4;
-}
-
-//
-enum TopicCardType {
- ILLEGAL_TYPE = 0; //
- DYNAMIC = 1; //
- FOLD = 2; //
- VIDEO_SMALL_CARD = 3; //
-}
-
-//
-message TopicDetailsAllReply {
- //
- DetailsTopInfo details_top_info = 1;
- //
- TopicActivities topic_activities = 2;
- //
- TopicCardList topic_card_list = 3;
- //
- FunctionalCard functional_card = 4;
- //
- PubLayer pub_layer = 5;
- //
- TimeLineResource time_line_resource = 6;
- //
- TopicServerConfig topic_server_config = 7;
-}
-
-//
-message TopicDetailsAllReq {
- //
- int64 topic_id = 1;
- //
- int64 sort_by = 2;
- //
- string offset = 3;
- //
- int32 page_size = 4;
- //
- int32 local_time = 5;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
- //
- int32 need_refresh = 7;
- //
- string source = 8;
- //
- int32 topic_details_ext_mode = 9;
-}
-
-//
-enum TopicDetailsExtMode {
- MODE_ILLEGAL_TYPE = 0; //
- STORY = 1; //
-}
-
-//
-message TopicDetailsFoldReply {
- //
- TopicCardList topic_card_list = 1;
- //
- int64 fold_count = 2;
-}
-
-//
-message TopicDetailsFoldReq {
- //
- int64 topic_id = 1;
- //
- string offset = 2;
- //
- int32 page_size = 3;
- //
- int32 local_time = 4;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
- //
- int64 from_sort_by = 6;
-}
-
-//
-message TopicInfo {
- //
- int64 id = 1;
- //
- string name = 2;
- //
- int64 uid = 3;
- //
- int64 view = 4;
- //
- int64 discuss = 5;
- //
- int64 fav = 6;
- //
- int64 dynamics = 7;
- //
- int32 state = 8;
- //
- string jump_url = 9;
- //
- string backcolor = 10;
- //
- bool is_fav = 11;
- //
- string description = 12;
- //
- int32 create_source = 13;
- //
- string share_pic = 14;
- //
- int64 share = 15;
- //
- int64 like = 16;
- //
- string share_url = 17;
- //
- bool is_like = 18;
- //
- int32 type = 19;
- //
- string stats_desc = 20;
- //
- string fixed_topic_icon = 21;
-}
-
-//
-message TopicServerConfig {
- //
- int64 pub_events_increase_threshold = 1;
- //
- int64 pub_events_hidden_timeout_threshold = 2;
- //
- int64 vert_online_refresh_time = 3;
-}
-
-//
-message TopicSet {
- //
- int64 set_id = 1;
- //
- string set_name = 2;
- //
- string jump_url = 3;
- //
- string desc = 4;
-}
-
-//
-message TopicSetDetailsReply {
- //
- TopicSetHeadInfo topic_set_head_info = 1;
- //
- repeated TopicInfo topic_info = 2;
- //
- bool has_more = 3;
- //
- string offset = 4;
- //
- TopicSetSortCfg sort_cfg = 5;
-}
-
-//
-message TopicSetDetailsReq {
- //
- int64 set_id = 1;
- //
- int64 sort_by = 2;
- //
- string offset = 3;
- //
- int32 page_size = 4;
-}
-
-message TopicSetHeadInfo {
- //
- TopicSet topic_set = 1;
- //
- string topic_cnt_text = 2;
- //
- string head_img_url = 3;
- //
- string mission_url = 4;
- //
- string mission_text = 5;
- //
- string icon_url = 6;
- //
- bool is_fav = 7;
- //
- bool is_first_time = 8;
-}
-
-//
-message TopicSetSortCfg {
- //
- int64 default_sort_by = 1;
- //
- repeated SortContent all_sort_by = 2;
-}
-
-//
-message TopicSortByConf {
- //
- int64 default_sort_by = 1;
- //
- repeated SortContent all_sort_by = 2;
- //
- int64 show_sort_by = 3;
-}
-
-//
-message TopicThreePoint {
- //
- repeated ThreePointItem dyn_three_point_items = 1;
-}
-
-//
-message TrafficCard {
- //
- string name = 1;
- //
- string jump_url = 2;
- //
- string icon_url = 3;
- //
- string base_pic = 4;
- //
- string benefit_point = 5;
- //
- string card_desc = 6;
- //
- string jump_title = 7;
-}
-
-//
-message User {
- //
- int64 uid = 1;
- //
- string face = 2;
- //
- string name = 3;
- //
- string name_desc = 4;
-}
-
-//
-message VideoCardBase {
- //
- string cover = 1;
- //
- string title = 2;
- //
- string up_name = 3;
- //
- int64 play = 4;
- //
- string jump_link = 5;
- //
- int64 aid = 6;
-}
-
-//
-message VideoSmallCardItem {
- //
- VideoCardBase video_card_base = 1;
- //
- string cover_left_badge_text = 2;
- //
- int64 card_stat_icon1 = 3;
- //
- string card_stat_text1 = 4;
- //
- int64 card_stat_icon2 = 5;
- //
- string card_stat_text2 = 6;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/view/v1/view.proto b/bili-api-grpc/proto/bilibili/app/view/v1/view.proto
deleted file mode 100644
index fd6fb7fa8..000000000
--- a/bili-api-grpc/proto/bilibili/app/view/v1/view.proto
+++ /dev/null
@@ -1,2668 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.view.v1;
-
-option java_multiple_files = true;
-
-import "google/protobuf/any.proto";
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/app/archive/v1/archive.proto";
-import "bilibili/pagination/pagination.proto";
-import "bilibili/app/viewunite/common.proto";
-
-service View {
- // 视频页详情页
- rpc View (ViewReq) returns (ViewReply);
- //
- rpc ViewTag(ViewTagReq) returns (ViewTagReply);
- //
- rpc ViewMaterial(ViewMaterialReq) returns (ViewMaterialReply);
- // 视频播放过程中的数据
- rpc ViewProgress (ViewProgressReq) returns (ViewProgressReply);
- // 短视频下载
- rpc ShortFormVideoDownload (ShortFormVideoDownloadReq) returns (ShortFormVideoDownloadReply);
- // 点击播放器卡片事件
- rpc ClickPlayerCard (ClickPlayerCardReq) returns (NoReply);
- // 点击大型活动页预约
- rpc ClickActivitySeason (ClickActivitySeasonReq) returns (NoReply);
- // 合集详情页
- rpc Season (SeasonReq) returns (SeasonReply);
- // 播放器卡片曝光
- rpc ExposePlayerCard (ExposePlayerCardReq) returns (NoReply);
- // 点击签订契约
- rpc AddContract (AddContractReq) returns (NoReply);
- // 资源包
- rpc ChronosPkg(ChronosPkgReq) returns (Chronos);
- //
- rpc CacheView(CacheViewReq) returns (CacheViewReply);
- //
- rpc ContinuousPlay(ContinuousPlayReq) returns (ContinuousPlayReply);
- // 播放页推荐IFS
- rpc RelatesFeed(RelatesFeedReq) returns (RelatesFeedReply);
- //
- rpc PremiereArchive(PremiereArchiveReq) returns (PremiereArchiveReply);
- //
- rpc Reserve(ReserveReq) returns (ReserveReply);
- //
- rpc PlayerRelates(PlayerRelatesReq) returns (PlayerRelatesReply);
- //
- rpc SeasonActivityRecord(SeasonActivityRecordReq) returns (SeasonActivityRecordReply);
- //
- rpc SeasonWidgetExpose(SeasonWidgetExposeReq) returns (SeasonWidgetExposeReply);
- //
- rpc GetArcsPlayer(GetArcsPlayerReq) returns (GetArcsPlayerReply);
-}
-
-// 活动页资源包
-message ActivityResource {
- // mod资源池名称
- string mod_pool_name = 1;
- // mod资源名称
- string mod_resource_name = 2;
- // 背景色
- string bg_color = 3;
- // 选中背景色
- string selected_bg_color = 4;
- // 文字颜色
- string text_color = 5;
- // 浅字色
- string light_text_color = 6;
- // 深字色
- string dark_text_color = 7;
- // 分割线色
- string divider_color = 8;
-}
-
-// 大型活动合集
-message ActivitySeason {
- // 稿件信息
- bilibili.app.archive.v1.Arc arc = 1;
- // 分P信息
- repeated ViewPage pages = 2;
- //("OnwerExt"为源码中拼写错误)
- OnwerExt owner_ext = 3;
- // 稿件用户操作状态
- ReqUser req_user = 4;
- // 充电排行
- ElecRank elec_rank = 5;
- // 历史观看进度
- History history = 6;
- // 稿件bvid
- string bvid = 7;
- // 获得荣誉信息
- Honor honor = 8;
- // 联合投稿成员列表
- repeated Staff staff = 9;
- // UGC视频合集信息
- UgcSeason ugc_season = 10;
- // 播放页定制tab
- Tab tab = 11;
- // 排行榜
- Rank rank = 12;
- // 预约模块
- Order order = 13;
- // 是否支持点踩
- bool support_dislike = 14;
- // 相关推荐(运营配置+AI推荐)
- OperationRelate operation_relate = 15;
- // 活动页资源包
- ActivityResource activity_resource = 16;
- // 短链接
- string short_link = 17;
- // 标签
- Label label = 18;
- // 不感兴趣原因
- Dislike dislike = 19;
- // 播放图标动画配置档
- PlayerIcon player_icon = 20;
- // 分享副标题(已观看xxx次)
- string share_subtitle = 21;
- // 广告配置
- CMConfig cm_config = 22;
- // 免流面板定制
- TFPanelCustomized tf_panel_customized = 23;
- // 争议信息
- string argue_msg = 24;
- // 错误码
- // DEFAULT:正常 CODE404:视频被UP主删除
- ECode ecode = 25;
- // 404页信息
- CustomConfig custom_config = 26;
- // 评论样式
- string badge_url = 27;
- // 稿件简介v2
- repeated DescV2 desc_v2 = 28;
- //
- Config config = 29;
- //
- Online online = 30;
- //
- ArcExtra arc_extra = 31;
- //
- ReplyStyle reply_preface = 32;
-}
-
-// 点击签订契约-请求
-message AddContractReq {
- // 稿件avid
- int64 aid = 1;
- // UP主mid
- int64 up_mid = 2;
- // 当前页面spm
- string spmid = 3;
-}
-
-//
-message AdInfo {
- //
- int64 creative_id = 1;
- //
- int64 creative_type = 2;
- //
- CreativeContent creative_content = 3;
- //
- string ad_cb = 4;
- //
- int32 card_type = 5;
- //
- bytes extra = 6;
-}
-
-//
-message ArcExtra {
- //
- string arc_pub_location = 1;
-}
-
-//
-message ArcsPlayer {
- //
- int64 aid = 1;
- //
- map player_info = 2;
-}
-
-//
-message Asset {
- //
- int32 paid = 1;
- //
- int64 price = 2;
- //
- AssetMsg msg = 3;
- //
- AssetMsg preview_msg = 4;
-}
-
-//
-message AssetMsg {
- //
- string desc1 = 1;
- //
- string desc2 = 2;
-}
-
-// 关注按钮卡片
-message Attention {
- // 开始时间
- int32 start_time = 1;
- // 结束时间
- int32 end_time = 2;
- // 位置x坐标
- double pos_x = 3;
- // 位置y坐标
- double pos_y = 4;
-}
-
-// 音频稿件信息
-message Audio {
- // 音频标题
- string title = 1;
- // 音频封面url
- string cover_url = 2;
- // 音频auid
- int64 song_id = 3;
- // 音频播放量
- int64 play_count = 4;
- // 音频评论数
- int64 reply_count = 5;
- // 音频作者UID
- int64 upper_id = 6;
- // 进入按钮文案
- string entrance = 7;
- //
- int64 song_attr = 8;
-}
-
-//
-message BadgeStyle {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
- //
- string border_color = 6;
- //
- string border_color_night = 7;
- //
- int32 bg_style = 8;
-}
-
-// 视频引用的bgm音频
-message Bgm {
- // 音频auid
- int64 sid = 1;
- // 音频作者mid
- int64 mid = 2;
- // 音频标题
- string title = 3;
- // 音频作者昵称
- string author = 4;
- // bgm页面url
- string jumpUrl = 5;
- // 音频封面url
- string cover = 6;
-}
-
-// 收藏合集参数
-message BizFavSeasonParam {
- // 合集id
- int64 season_id = 1;
-}
-
-//
-message BizFollowVideoParam {
- //
- int64 season_id = 1;
-}
-
-//
-message BizJumpLinkParam {
- // 链接
- string url = 1;
-}
-
-// 预约活动参数
-message BizReserveActivityParam {
- // 活动id
- int64 activity_id = 1;
- // 场景
- string from = 2;
- // 类型
- string type = 3;
- // 资源id
- int64 oid = 4;
- //
- int64 reserve_id = 5;
-}
-
-//
-message BizReserveGameParam {
- // 游戏id
- int64 game_id = 1;
-}
-
-// 业务类型
-enum BizType {
- BizTypeNone = 0; //
- BizTypeFollowVideo = 1; // 追番追剧
- BizTypeReserveActivity = 2; // 预约活动
- BizTypeJumpLink = 3; // 跳转链接
- BizTypeFavSeason = 4; // 收藏合集
- BizTypeReserveGame = 5; // 预约游戏
-}
-
-//
-message Button {
- // 按钮文案
- string title = 1;
- // 跳转uri
- string uri = 2;
- //
- string icon = 3;
-}
-
-//
-message ButtonStyle {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
- //
- string jump_link = 6;
-}
-
-//
-message BuzzwordConfig {
- //
- string name = 1;
- //
- string schema = 2;
- //
- int32 source = 3;
- //
- int64 start = 4;
- //
- int64 end = 5;
- //
- bool follow_control = 6;
- //
- int64 id = 7;
- //
- int64 buzzword_id = 8;
- //
- int32 schema_type = 9;
- //
- string picture = 10;
-}
-
-//
-message CacheViewReply {
- //
- bilibili.app.archive.v1.Arc arc = 1;
- //
- repeated ViewPage pages = 2;
- //
- OnwerExt owner_ext = 3;
- //
- ReqUser req_user = 4;
- //
- Season season = 5;
- //
- ElecRank elec_rank = 6;
- //
- History history = 7;
- //
- Dislike dislike = 8;
- //
- PlayerIcon player_icon = 9;
- //
- string bvid = 10;
- //
- string short_link = 11;
- //
- string share_subtitle = 12;
- //
- TFPanelCustomized tf_panel_customized = 13;
- //
- Online online = 14;
-}
-
-//
-message CacheViewReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- string from = 3;
- //
- string trackid = 4;
- //
- string ad_extra = 5;
- //
- string spmid = 6;
- //
- string from_spmid = 7;
-}
-
-//
-enum Category {
- CategoryUnknown = 0; //
- CategorySeason = 1; //
-}
-
-// Chronos灰度管理
-message Chronos {
- // 资源包md5
- string md5 = 1;
- // 资源包
- string file = 2;
- //
- string sign = 3;
-}
-
-//
-message ChronosPkgReq {
- //
- string service_key = 1;
- //
- string engine_version = 2;
- //
- string message_protocol = 3;
-}
-
-// 点击大型活动页预约-请求
-message ClickActivitySeasonReq {
- // 预约类型
- BizType order_type = 1;
- // 当前页面spm
- string spmid = 2;
- // 业务参数
- oneof order_param {
- // 预约活动参数
- BizReserveActivityParam reserve = 3;
- // 收藏合集参数
- BizFavSeasonParam fav_season = 4;
- }
- // 操作
- // 0:操作 1:取消操作
- int64 action = 5;
-}
-
-// 点击播放器卡片-响应
-message ClickPlayerCardReply {
- //
- string message = 1;
-}
-
-// 点击播放器卡片-请求
-message ClickPlayerCardReq {
- // 卡片id
- int64 id = 1;
- // 稿件avid
- int64 aid = 2;
- // 视频cid
- int64 cid = 3;
- //操作
- //0:操作 1:取消操作
- int64 action = 4;
- // 当前页面spm
- string spmid = 5;
-}
-
-// 广告
-message CM {
- // 广告数据(需解包)
- google.protobuf.Any source_content = 1;
-}
-
-// 广告配置
-message CMConfig {
- // 广告配置数据(需要二次解包)
- google.protobuf.Any ads_control = 1;
-}
-
-//
-message CmIpad {
- //
- CM cm = 1;
- //
- bilibili.app.archive.v1.Author author = 2;
- //
- bilibili.app.archive.v1.Stat stat = 3;
- //
- int64 duration = 4;
- //
- int64 aid = 5;
-}
-
-//
-message CoinCustom {
- //
- string toast = 1;
-}
-
-// 互动弹幕条目信息
-message CommandDm {
- // 弹幕id
- int64 id = 1;
- // 对象视频cid
- int64 oid = 2;
- // 发送者mid
- int64 mid = 3;
- // 互动弹幕指令
- string command = 4;
- // 互动弹幕正文
- string content = 5;
- // 出现时间
- int32 progress = 6;
- // 创建时间
- string ctime = 7;
- // 发布时间
- string mtime = 8;
- // 扩展json数据
- string extra = 9;
- // 弹幕id str类型
- string id_str = 10;
-}
-
-//
-message Config {
- // 下方推荐项标题
- string relates_title = 1;
- //
- int32 relates_style = 2;
- //
- int32 relate_gif_exp = 3;
- //
- int32 end_page_half = 4;
- //
- int32 end_page_full = 5;
- // 退出是否自动小窗
- bool auto_swindow = 6;
- //
- bool popup_info = 7;
- //
- string abtest_small_window = 8;
- //
- int32 rec_three_point_style = 9;
- //
- bool is_absolute_time = 10;
- //
- bool new_swindow = 11;
- //
- bool relates_biserial = 12;
- //
- ListenerConfig listener_conf = 13;
- //
- string relates_feed_style = 14;
- //
- bool relates_feed_popup = 15;
- //
- bool relates_has_next = 16;
- //
- int32 local_play = 17;
- //
- bool play_story = 18;
- //
- bool arc_play_story = 19;
- //
- string story_icon = 20;
- //
- bool landscape_story = 21;
- //
- bool arc_landscape_story = 22;
- //
- string landscape_icon = 23;
- //
- bool show_listen_button = 24;
-}
-
-//
-message ContinuousPlayReply {
- //
- repeated Relate relates = 1;
-}
-
-//
-message ContinuousPlayReq {
- //
- int64 aid = 1;
- //
- string from = 2;
- //
- string trackid = 3;
- //
- string spmid = 4;
- //
- string from_spmid = 5;
- //
- int32 autoplay = 6;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 7;
- //
- int64 device_type = 8;
- //
- string session_id = 9;
- //
- int64 display_id = 10;
-}
-
-// 契约卡
-message ContractCard {
- // 需要触发的播放进度百分比
- float display_progress = 1;
- // 触发位置的前后误差(单位ms)
- int64 display_accuracy = 2;
- // 展示持续时间(单位ms)
- int64 display_duration = 3;
- // 弹出模式
- // 0: 原有模式 1: 半屏弹出 2: 全屏、半屏均弹出
- int32 show_mode = 4;
- // 提示页面
- // 0: 原有页面 1: 6.23版本新页面
- int32 page_type = 5;
- // UP主信息
- UpperInfos upper = 6;
- //
- int32 is_follow_display = 7;
- //
- ContractText text = 8;
- //
- int64 follow_display_end_duration = 9;
- //
- int32 is_play_display = 10;
- //
- int32 is_interact_display = 11;
- //
- bool play_display_switch = 12;
-}
-
-//
-message ContractText {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- string inline_title = 3;
-}
-
-//
-message CreativeContent {
- //
- string title = 1;
- //
- string description = 2;
- //
- string button_title = 3;
- //
- int64 video_id = 4;
- //
- string username = 5;
- //
- string image_url = 6;
- //
- string image_md5 = 7;
- //
- string log_url = 8;
- //
- string log_md5 = 9;
- //
- string url = 10;
- //
- string click_url = 11;
- //
- string show_url = 12;
-}
-
-// 404页信息
-message CustomConfig {
- // 重定向页面url
- string redirect_url = 1;
-}
-
-// 枚举-文本类型
-enum DescType {
- DescTypeUnknown = 0; // 占位
- DescTypeText = 1; // 文本
- DescTypeAt = 2; // @
-}
-
-// 特殊稿件简介
-message DescV2 {
- // 文本内容
- string text = 1;
- // 文本类型
- DescType type = 2;
- // 点击跳转链接
- string uri = 3;
- // 资源ID
- int64 rid = 4;
-}
-
-// 不喜欢原因
-message Dislike {
- // 标题
- string title = 1;
- //
- string subtitle = 2;
- // 原因项列表
- repeated DislikeReasons reasons = 3;
-}
-
-// 不喜欢原因项
-message DislikeReasons {
- // 类型
- // 1:全部类型 3:TAG 4:UP主
- int64 id = 1;
- // 相关UP主mid
- int64 mid = 2;
- // 相关分区tid
- int32 rid = 3;
- // 相关TAG id
- int64 tag_id = 4;
- // 相关名称
- string name = 5;
-}
-
-// 分P弹幕信息
-message DM {
- // 分P是否关闭弹幕
- // 0:正常 1:关闭
- bool closed = 1;
- //
- bool real_name = 2;
- // 分P弹幕总数
- int64 count = 3;
-}
-
-// 错误代码
-enum ECode {
- DEFAULT = 0; // 正常
- CODE404 = 1; // 稿件被UP主删除
-}
-
-// 充电排行信息
-message ElecRank {
- // 充电排行列表
- repeated ElecRankItem list = 1;
- // 充电用户数
- int64 count = 2;
- //
- string text = 3;
-}
-
-// 充电用户信息
-message ElecRankItem {
- // 用户头像url
- string avatar = 1;
- // 用户昵称
- string nickname = 2;
- // 充电留言
- string message = 3;
- // 用户mid
- int64 mid = 4;
-}
-
-// 视频合集单话信息
-message Episode {
- // 合集单话id
- int64 id = 1;
- // 稿件avid
- int64 aid = 2;
- // 视频1P cid
- int64 cid = 3;
- // 稿件标题
- string title = 4;
- // 稿件封面url
- string cover = 5;
- // 投稿时间显示文案
- string coverRightText = 6;
- // 视频分P信息
- bilibili.app.archive.v1.Page page = 7;
- // 视频状态数
- bilibili.app.archive.v1.Stat stat = 8;
- // 稿件bvid
- string bvid = 9;
- // 稿件UP主信息
- bilibili.app.archive.v1.Author author = 10;
- //
- string author_desc = 11;
- //
- BadgeStyle badge_style = 12;
- //
- bool need_pay = 13;
- //
- bool episode_pay = 14;
- //
- bool free_watch = 15;
- //
- string first_frame = 16;
- //
- ArchiveStat stat_v2 = 17;
- //
- repeated bilibili.app.archive.v1.Page pages = 18;
-}
-
-//
-message ArchiveStat {
- //
- bilibili.app.viewunite.common.StatInfo view_vt = 11;
-}
-
-// 播放器卡片曝光-请求
-message ExposePlayerCardReq {
- // 卡片类型
- PlayerCardType card_type = 1;
- // 稿件avid
- int64 aid = 2;
- // 视频cid
- int64 cid = 3;
- // 当前页面spm
- string spmid = 4;
-}
-
-//
-message FeedViewItem {
- //
- ViewReply view = 1;
- //
- string goto = 2;
- //
- string uri = 3;
- //
- string track_id = 4;
-}
-
-//
-message FeedViewReply {
- //
- repeated FeedViewItem list = 1;
- //
- bool has_next = 2;
-}
-
-//
-message FeedViewReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- string from = 3;
- //
- string spmid = 4;
- //
- string from_spmid = 5;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
- //
- int64 display_id = 7;
- //
- string session_id = 8;
- //
- string page_version = 9;
- //
- string from_track_id = 10;
-}
-
-//
-message GetArcsPlayerReply {
- //
- repeated ArcsPlayer arcs_player = 1;
-}
-
-//
-message GetArcsPlayerReq {
- //
- repeated PlayAv play_avs = 1;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 2;
-}
-
-//
-message GoodsInfo {
- //
- string goods_id = 1;
- //
- int32 category = 2;
- //
- int64 goods_price = 3;
- //
- PayState pay_state = 4;
- //
- string goods_name = 5;
- //
- string price_fmt = 6;
-}
-
-// 稿件观看进度
-message History {
- // 播放进度分P cid
- int64 cid = 1;
- // 播放进度时间
- // 0:未观看 -1:已看完 正整数:播放时间进度
- int64 progress = 2;
-}
-
-// 稿件获得荣誉信息
-message Honor {
- // 荣誉栏图标url
- string icon = 1;
- // 荣誉栏图标url 夜间模式
- string icon_night = 2;
- // 荣誉文案
- string text = 3;
- // 荣誉副文案
- string text_extra = 4;
- // 标题颜色
- string text_color = 5;
- // 标题颜色 夜间模式
- string text_color_night = 6;
- // 背景颜色
- string bg_color = 7;
- // 背景颜色 夜间模式
- string bg_color_night = 8;
- // 跳转uri
- string url = 9;
- // 跳转角标文案
- string url_text = 10;
-}
-
-//
-message IconData {
- //
- string meta_json = 1;
- //
- string sprits_img = 2;
-}
-
-//
-message Interaction {
- //
- Node history_node = 1;
- //
- int64 graph_version = 2;
- //
- string msg = 3;
- //
- string evaluation = 4;
- //
- int64 mark = 5;
-}
-
-//
-message Label {
- //
- int32 type = 1;
- //
- string uri = 2;
- //
- string icon = 3;
- //
- string icon_night = 4;
- //
- int64 icon_width = 5;
- //
- int64 icon_height = 6;
- //
- string lottie = 7;
- //
- string lottie_night = 8;
-}
-
-//
-message LikeAnimation {
- //
- string like_icon = 1;
- //
- string liked_icon = 2;
- //
- string like_animation = 3;
-}
-
-//
-message LikeCustom {
- //
- bool like_switch = 1;
- //
- int64 full_to_half_progress = 2;
- //
- int64 non_full_progress = 3;
- //
- int64 update_count = 4;
-}
-
-//
-message ListenerConfig {
- //
- int64 jump_style = 1;
- //
- ListenerGuideBar guide_bar = 2;
-}
-
-//
-message ListenerGuideBar {
- //
- int64 show_strategy = 1;
- //
- string icon = 2;
- //
- string text = 3;
- //
- string btn_text = 4;
- //
- int64 show_time = 5;
- //
- int64 background_time = 6;
-}
-
-// 直播信息
-message Live {
- // 主播UID
- int64 mid = 1;
- // 直播间id
- int64 roomid = 2;
- // 直播间url
- string uri = 3;
- //
- string endpage_uri = 4;
-}
-
-// 直播预约信息
-message LiveOrderInfo {
- // 预约id
- int64 sid = 1;
- // 预约条文案
- string text = 2;
- // 直播开始时间
- int64 live_plan_start_time = 3;
- // 是否预约
- bool is_follow = 4;
-}
-
-//
-message MaterialLeft {
- //
- string icon = 1;
- //
- string text = 2;
- //
- string url = 3;
- //
- string left_type = 4;
- //
- string param = 5;
- //
- string operational_type = 6;
- //
- string static_icon = 7;
-}
-
-//
-message MaterialRes {
- //
- int64 id = 1;
- //
- string icon = 2;
- //
- string url = 3;
- //
- MaterialSource type = 4;
- //
- string name = 5;
- //
- string bg_color = 6;
- //
- string bg_pic = 7;
- //
- int32 jump_type = 8;
-}
-
-//
-enum MaterialSource {
- Default = 0; //
- BiJian = 1; // 必剪
-}
-
-//
-message Node {
- //
- int64 node_id = 1;
- //
- string title = 2;
- //
- int64 cid = 3;
-}
-
-// 空回复
-message NoReply {}
-
-//
-message Notice {
- //
- string title = 1;
- //
- string desc = 2;
-}
-
-// 认证信息
-message OfficialVerify {
- // 认证类型
- // 0:个人认证 1:官方认证
- int32 type = 1;
- //认证名称
- string desc = 2;
-}
-
-//
-message Online {
- //
- bool online_show = 1;
- //
- string player_online_logo = 2;
-}
-
-// UP主扩展信息 ("OnwerExt"为源码中拼写错误)
-message OnwerExt {
- // 认证信息
- OfficialVerify official_verify = 1;
- // 直播信息
- Live live = 2;
- // 会员信息
- Vip vip = 3;
- //
- repeated int64 assists = 4;
- // 粉丝数
- int64 fans = 5;
- // 总投稿数
- string arc_count = 6;
-}
-
-// 老运营卡片
-message OperationCard {
- // 开始时间(单位为秒)
- int32 start_time = 1;
- // 结束时间(单位为秒)
- int32 end_time = 2;
- // 图标
- string icon = 3;
- // 标题
- string title = 4;
- // 按钮文案
- string button_text = 5;
- // 跳转链接
- string url = 6;
- // 内容描述
- string content = 7;
-}
-
-// 内嵌操作按钮卡片
-message OperationCardNew {
- // 卡片id
- int64 id = 1;
- // 开始时间
- int32 from = 2;
- // 结束时间
- int32 to = 3;
- // 用户操作态
- // true已操作 false未操作
- bool status = 4;
- // 卡片类型
- OperationCardType card_type = 5;
- // 卡片渲染
- oneof render {
- // 标准卡
- StandardCard standard = 6;
- // 老运营卡片(原B剪跳转卡)
- OperationCard skip = 7;
- }
- //
- BizType biz_type = 8;
- //
- oneof param {
- // 追番追剧参数
- BizFollowVideoParam follow = 9;
- // 预约活动参数
- BizReserveActivityParam reserve = 10;
- // 跳转参数
- BizJumpLinkParam jump = 11;
- // 预约游戏参数
- BizReserveGameParam game = 12;
- }
-}
-
-// 卡片样式
-enum OperationCardType {
- CardTypeNone = 0; //
- CardTypeStandard = 1; // 标准卡
- CardTypeSkip = 2; // 原跳转卡
-}
-
-//
-message OperationCardV2 {
- //
- int64 id = 1;
- //
- int32 from = 2;
- //
- int32 to = 3;
- //
- bool status = 4;
- //
- int32 biz_type = 5;
- //
- OperationCardV2Content content = 6;
- //
- oneof param {
- //
- BizFollowVideoParam BizFollowVideoParam = 7;
- //
- BizReserveActivityParam BizReserveActivityParam = 8;
- //
- BizJumpLinkParam BizJumpLinkParam = 9;
- //
- BizReserveGameParam BizReserveGameParam = 10;
- }
-}
-
-//
-message OperationCardV2Content {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- string icon = 3;
- //
- string button_title = 4;
- //
- string button_selected_title = 5;
- //
- bool show_selected = 6;
-}
-
-// 相关推荐(运营配置+AI推荐)
-message OperationRelate {
- // 模块标题
- string title = 1;
- // 相关推荐模块内容
- repeated RelateItem relate_item = 2;
- // AI相关推荐
- repeated Relate ai_relate_item = 3;
-}
-
-// 预约模块
-message Order {
- // 用户操作态
- bool status = 1;
- // 模块标题
- string title = 2;
- // 按钮文字 未操作
- string button_title = 3;
- // 按钮文字 已操作
- string button_selected_title = 4;
- // 合集播放数
- int64 season_stat_view = 5;
- // 合集弹幕数
- int64 season_stat_danmaku = 6;
- // 预约类型(点击时透传,直播开始前预约活动,直播开始后收藏合集)
- BizType order_type = 7;
- // 预约业务参数
- oneof order_param {
- // 预约活动参数
- BizReserveActivityParam reserve = 8;
- // 收藏合集参数
- BizFavSeasonParam fav_season = 9;
- }
- // 合集简介
- string intro = 10;
-}
-
-// 游戏礼包信息
-message PackInfo {
- // 礼包标题
- string title = 1;
- // 礼包页uri
- string uri = 2;
-}
-
-//
-enum PayState {
- PayStateUnknown = 0; //
- PayStateActive = 1; //
-}
-
-//
-message PlayAv {
- //
- int64 aid = 1;
- //
- int64 cid = 2;
-}
-
-// 卡片类型
-enum PlayerCardType {
- PlayerCardTypeNone_VALUE = 0; //
- PlayerCardTypeAttention_VALUE = 1; // 关注卡
- PlayerCardTypeOperation_VALUE = 2; // 运营卡
- PlayerCardTypeContract_VALUE = 3; // 契约卡
-}
-
-// 进度条动画配置
-message PlayerIcon {
- // 拖动动画配置档url
- string url1 = 1;
- // 拖动动画配置档hash
- string hash1 = 2;
- // 松手动画配置档url
- string url2 = 3;
- // 松手动画配置档hash
- string hash2 = 4;
- //
- string drag_left_png = 5;
- //
- string middle_png = 6;
- //
- string drag_right_png = 7;
- //
- IconData drag_data = 8;
- //
- IconData nodrag_data = 9;
-}
-
-//
-message PlayerRelatesReply {
- //
- repeated Relate list = 1;
-}
-
-//
-message PlayerRelatesReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- string from = 3;
- //
- string spmid = 4;
- //
- string from_spmid = 5;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
- //
- string session_id = 7;
- //
- string from_track_id = 8;
-}
-
-//
-message PointMaterial {
- //
- string url = 1;
- //
- int32 material_source = 2;
-}
-
-//
-message PowerIconStyle {
- //
- string icon_url = 1;
- //
- string icon_night_url = 2;
- //
- int64 icon_width = 3;
- //
- int64 icon_height = 4;
-}
-
-//
-message Premiere {
- //
- PremiereState premiere_state = 1;
- //
- int64 start_time = 2;
- //
- int64 service_time = 3;
- //
- int64 room_id = 4;
-}
-
-//
-message PremiereArchiveReply {
- //
- Premiere premiere = 1;
- //
- bool risk_status = 2;
- //
- string risk_reason = 3;
-}
-
-//
-message PremiereArchiveReq {
- //
- int64 aid = 1;
-}
-
-//
-message PremiereReserve {
- //
- int64 reserve_id = 1;
- //
- int64 count = 2;
- //
- bool is_follow = 3;
-}
-
-//
-message PremiereResource {
- //
- Premiere premiere = 1;
- //
- PremiereReserve reserve = 2;
- //
- PremiereText text = 3;
-}
-
-//
-enum PremiereState {
- premiere_none = 0; //
- premiere_before = 1; //
- premiere_in = 2; //
- premiere_after = 3; //
-}
-
-//
-message PremiereText {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- string online_text = 3;
- //
- string online_icon = 4;
- //
- string online_icon_dark = 5;
- //
- string intro_title = 6;
- //
- string intro_icon = 7;
- //
- string guidance_pulldown = 8;
- //
- string guidance_entry = 9;
- //
- string intro_icon_night = 10;
-}
-
-//
-message PullClientAction {
- //
- string type = 1;
- //
- bool pull_action = 2;
- //
- string params = 3;
-}
-
-// 排行榜
-message Rank {
- // 排行榜icon
- string icon = 1;
- // 排行榜icon 夜间模式
- string icon_night = 2;
- // 排行榜文案
- string text = 3;
-}
-
-//
-message RankInfo {
- //
- string icon_url_night = 1;
- //
- string icon_url_day = 2;
- //
- string bkg_night_color = 3;
- //
- string bkg_day_color = 4;
- //
- string font_night_color = 5;
- //
- string font_day_color = 6;
- //
- string rank_content = 7;
- //
- string rank_link = 8;
-}
-
-// 推荐理由样式
-message ReasonStyle {
- //
- string text = 1;
- // 日间模式文字
- string text_color = 2;
- //
- string bg_color = 3;
- //
- string border_color = 4;
- // 夜间模式文字
- string text_color_night = 5;
- //
- string bg_color_night = 6;
- //
- string border_color_night = 7;
- // 1:填充 2:描边 3:填充 + 描边 4:背景不填充 + 背景不描边
- int32 bg_style = 8;
- //
- int32 selected = 9;
-}
-
-//
-message RecDislike {
- //
- string title = 1;
- //
- string sub_title = 2;
- //
- string closed_sub_title = 3;
- //
- string paste_text = 4;
- //
- string closed_paste_text = 5;
- //
- repeated DislikeReasons dislike_reason = 6;
- //
- string toast = 7;
- //
- string closed_toast = 8;
-}
-
-//
-message RecThreePoint {
- //
- RecDislike dislike = 1;
- //
- RecDislike feedback = 2;
- //
- bool watch_later = 3;
-}
-
-//
-message RefreshPage {
- //
- int32 refreshable = 1;
- //
- int32 refresh_icon = 2;
- //
- string refresh_text = 3;
- //
- float refresh_show = 4;
-}
-
-// 相关推荐项
-message Relate {
- //
- int64 aid = 1;
- // 封面url
- string pic = 2;
- // 标题
- string title = 3;
- // UP主信息
- bilibili.app.archive.v1.Author author = 4;
- // 稿件状态数
- bilibili.app.archive.v1.Stat stat = 5;
- // 时长
- int64 duration = 6;
- // 跳转类型
- // special:pgc视频 av:稿件视频 cm:广告 game:游戏
- string goto = 7;
- // 参数(如av号等)
- string param = 8;
- // 跳转uri
- string uri = 9;
- //
- string jump_url = 10;
- // 评分
- double rating = 11;
- //
- string reserve = 12;
- // 来源标识
- // operation:管理员添加
- string from = 13;
- // 备注
- string desc = 14;
- //
- string rcmd_reason = 15;
- // 标志文字
- string badge = 16;
- // 1P cid
- int64 cid = 17;
- //
- int32 season_type = 18;
- //
- int32 rating_count = 19;
- // 标签文案
- string tag_name = 20;
- // 游戏礼包信息
- PackInfo pack_info = 21;
- //
- Notice notice = 22;
- // 按钮信息
- Button button = 23;
- // spm追踪id
- string trackid = 24;
- // 游戏卡片新样式
- int32 new_card = 25;
- // 推荐理由样式
- ReasonStyle rcmd_reason_style = 26;
- //
- string cover_gif = 27;
- // 广告
- CM cm = 28;
- // 游戏卡字段
- // 0:下载 1:预约(跳过详情) 2:预约 3:测试 4:测试+预约 5:跳过详情页
- int64 reserve_status = 29;
- //
- string rcmd_reason_extra = 30;
- //
- RecThreePoint rec_three_point = 31;
- //
- string unique_id = 32;
- //
- int64 material_id = 33;
- //
- int64 from_source_type = 34;
- //
- string from_source_id = 35;
- //
- bilibili.app.archive.v1.Dimension dimension = 36;
- //
- string cover = 37;
- //
- ReasonStyle badge_style = 38;
- //
- PowerIconStyle power_icon_style = 39;
- //
- string reserve_status_text = 40;
- //
- string dislike_report_data = 41;
- //
- RankInfo rank_info_game = 42;
- //
- string first_frame = 43;
-}
-
-// 相关推荐内容
-message RelateItem {
- // 跳链
- string url = 1;
- // 封面
- string cover = 2;
-}
-
-// 播放页推荐IFS-响应
-message RelatesFeedReply {
- //
- repeated Relate list = 1;
- //
- bool has_next = 2;
- //
- bilibili.pagination.PaginationReply pagination = 3;
-}
-
-// 播放页推荐IFS-请求
-message RelatesFeedReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- string from = 3;
- //
- string spmid = 4;
- //
- string from_spmid = 5;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
- //
- int64 relates_page = 7;
- //
- string session_id = 8;
- //
- int32 autoplay = 9;
- //
- string from_track_id = 10;
- //
- string biz_extra = 11;
- //
- int64 device_type = 12;
- //
- string ad_extra = 13;
- //
- bilibili.pagination.Pagination pagination = 14;
- //
- int32 refresh_num = 15;
-}
-
-//
-message RelateTab {
- //
- string id = 1;
- //
- string title = 2;
-}
-
-//
-message ReplyStyle {
- //
- string badge_url = 1;
- //
- string badge_text = 2;
- //
- int64 badge_type = 3;
-}
-
-// 用户操作状态
-message ReqUser {
- // 用户是否关注UP
- int32 attention = 1;
- // UP是否关注用户
- int32 guest_attention = 2;
- // 是否收藏
- int32 favorite = 3;
- // 是否点赞
- int32 like = 4;
- // 是否点踩
- int32 dislike = 5;
- // 是否投币
- int32 coin = 6;
- // 关注等级
- int32 attention_level = 7;
- // 是否收藏合集
- int32 fav_season = 8;
- //
- Button elec_plus_btn = 9;
-}
-
-//
-message ReserveReply {
- //
- int64 reserve_id = 1;
-}
-
-//
-message ReserveReq {
- //
- int64 reserve_id = 1;
- //
- int64 reserve_action = 2;
- //
- int64 up_id = 3;
-}
-
-//
-message Restriction {
- //
- bool is_teenagers = 1;
- //
- bool is_lessons = 2;
- //
- bool is_review = 3;
- //
- bool disable_rcmd = 4;
-}
-
-// 剧集信息
-message Season {
- //
- string allow_download = 1;
- // 剧集ssid
- int64 season_id = 2;
- // 是否重定向跳转
- int32 is_jump = 3;
- // 剧集标题
- string title = 4;
- // 剧集封面url
- string cover = 5;
- // 剧集是否完结
- int32 is_finish = 6;
- // 最新一话epid
- int64 newest_ep_id = 7;
- // 最新一话标题
- string newest_ep_index = 8;
- // 总集数
- int64 total_count = 9;
- // 更新星期日
- int32 weekday = 10;
- // 用户追番标志
- UserSeason user_season = 11;
- //
- SeasonPlayer player = 12;
- // 单集页面url
- string ogv_playurl = 13;
-}
-
-//
-message SeasonActivityRecordReply {
- //
- UgcSeasonActivity activity = 1;
-}
-
-//
-message SeasonActivityRecordReq {
- //
- int64 season_id = 1;
- //
- int64 activity_id = 2;
- //
- int32 action = 3;
- //
- int64 aid = 4;
- //
- int64 cid = 5;
- //
- int64 scene = 6;
- //
- string spmid = 7;
-}
-
-//
-message SeasonPlayer {
- //
- int64 aid = 1;
- //
- string vid = 2;
- //
- int64 cid = 3;
- //
- string from = 4;
-}
-
-// 合集详情页-响应
-message SeasonReply {
- // 合集信息
- UgcSeason season = 1;
-}
-
-// 合集详情页-请求
-message SeasonReq {
- // 合集id
- int64 season_id = 1;
-}
-
-//
-message SeasonShow {
- //
- string button_text = 1;
- //
- string join_text = 2;
- //
- string rule_text = 3;
- //
- string checkin_text = 4;
- //
- string checkin_prompt = 5;
-}
-
-//
-enum SeasonType {
- Unknown = 0; //
- Base = 1; //
- Good = 2; //
-}
-
-//
-message SeasonWidgetExposeReply {
- //
- int64 season_id = 1;
- //
- int64 activity_id = 2;
-}
-
-//
-message SeasonWidgetExposeReq {
- //
- int64 mid = 1;
- //
- int32 type = 2;
- //
- int64 season_id = 3;
- //
- int64 activity_id = 4;
- //
- int64 aid = 5;
- //
- int64 cid = 6;
- //
- int64 scene = 7;
-}
-
-// 视频合集小节信息
-message Section {
- // 小节id
- int64 id = 1;
- // 小节标题
- string title = 2;
- // 小节类型
- // 0:其他 1:正片
- int64 type = 3;
- // 单话列表
- repeated Episode episodes = 4;
-}
-
-// 短视频下载-响应
-message ShortFormVideoDownloadReply {
- // 是否有下载分享按钮
- bool has_download_url = 1;
- // 下载url
- string download_url = 2;
- // 文件md5
- string md5 = 3;
- // 文件大小(单位为Byte)
- int64 size = 4;
- //
- string backup_download_url = 5;
-}
-
-// 短视频下载-请求
-message ShortFormVideoDownloadReq {
- // 稿件avid
- int64 aid = 1;
- // 视频cid
- int64 cid = 2;
- // 用户mid
- int64 mid = 3;
- // 设备buvid
- string buvid = 4;
- // 移动端包类型
- string mobi_app = 5;
- // 移动端版本号
- int64 build = 6;
- // 运行设备
- string device = 7;
- // 平台
- string platform = 8;
- // 当前页面spm
- string spmid = 9;
- //
- Restriction restriction = 10;
- //
- string tf_isp = 11;
-}
-
-//
-message SpecialCell {
- //
- string icon = 1;
- //
- string icon_night = 2;
- //
- string text = 3;
- //
- string text_color = 4;
- //
- string text_color_night = 5;
- //
- string jump_url = 6;
- //
- string cell_type = 7;
- //
- string cell_bgcolor = 8;
- //
- string cell_bgcolor_night = 9;
- //
- string param = 10;
- //
- string page_title = 11;
- //
- string jump_type = 12;
- //
- string end_icon = 13;
- //
- string end_icon_night = 14;
- //
- int64 notes_count = 15;
-}
-
-// 合作成员信息
-message Staff {
- // 成员mid
- int64 mid = 1;
- // 成员角色
- string title = 2;
- // 成员头像url
- string face = 3;
- // 成员昵称
- string name = 4;
- // 成员官方信息
- OfficialVerify official_verify = 5;
- // 成员会员信息
- Vip vip = 6;
- // 是否关注该成员
- int32 attention = 7;
- //
- int32 label_style = 8;
-}
-
-// 标准卡
-message StandardCard {
- // 卡片文案
- string title = 1;
- // 按钮文字 未操作
- string button_title = 2;
- // 按钮文字 已操作
- string button_selected_title = 3;
- // 已操作态是否显示
- bool show_selected = 4;
-}
-
-// 免流子面板定制化配置
-message subTFPanel {
- // 右侧按钮素材
- string right_btn_img = 1;
- // 右侧按钮文案
- string right_btn_text = 2;
- // 右侧按钮字体颜色
- string right_btn_text_color = 3;
- // 右侧按钮跳转链接
- string right_btn_link = 4;
- // 中心主文案内容
- string main_label = 5;
- // 运营商
- string operator = 6;
-}
-
-// TAB
-message Tab {
- // 背景图片
- string background = 1;
- // 跳转类型
- TabOtype otype = 2;
- // 类型id
- int64 oid = 3;
- // 跳转url
- string uri = 4;
- // 样式
- TabStyle style = 5;
- // 文字
- string text = 6;
- // 未选中态字色
- string text_color = 7;
- // 选中态字色
- string text_color_selected = 8;
- // 图片
- string pic = 9;
- // 后台配置自增
- int64 id = 10;
- //
- google.protobuf.Any ad_tab_info = 11;
-}
-
-// TAB跳转类型
-enum TabOtype {
- UnknownOtype = 0; // 未知类型
- URL = 1; // url链接
- TopicNA = 2; // native话题活动
- CmURI = 3; // 广告url
-}
-
-// TAB样式
-enum TabStyle {
- UnknownStyle = 0; // 未知样式
- Text = 1; // 文字样式
- Pic = 2; // 图片样式
-}
-
-// TAG信息
-message Tag {
- // TAD id
- int64 id = 1;
- // TAG名
- string name = 2;
- //
- int64 likes = 3;
- //
- int64 hates = 4;
- //
- int32 liked = 5;
- //
- int32 hated = 6;
- // TAG页面uri
- string uri = 7;
- // TAG类型
- // common:普通 new:话题 act:活动
- string tag_type = 8;
-}
-
-// 免流面板定制
-message TFPanelCustomized {
- // 右侧按钮素材
- string right_btn_img = 1;
- // 右侧按钮文案
- string right_btn_text = 2;
- // 右侧按钮字体颜色
- string right_btn_text_color = 3;
- // 右侧按钮跳转链接
- string right_btn_link = 4;
- // 中心主文案内容
- string main_label = 5;
- // 运营商(cm ct cu)
- string operator = 6;
- // 子面板定制化配置
- map sub_panel = 7;
-}
-
-// TAG图标信息
-message TIcon {
- // TAG图标url
- string icon = 1;
-}
-
-// UGC视频合集信息
-message UgcSeason {
- // 合集id
- int64 id = 1;
- // 合集标题
- string title = 2;
- // 合集封面url
- string cover = 3;
- // 合集简介
- string intro = 4;
- // 小节列表
- repeated Section sections = 5;
- // 合集状态数
- UgcSeasonStat stat = 6;
- // 标签字色
- string label_text = 7;
- // 标签背景色
- string label_text_color = 8;
- // 标签夜间字色
- string label_bg_color = 9;
- // 标签夜间背景色
- string label_text_night_color = 10;
- // 右侧描述文案
- string label_bg_night_color = 11;
- // 按钮文案
- string descRight = 12;
- // 分集总数
- int64 ep_count = 13;
- // 合集类型
- SeasonType season_type = 14;
- //
- bool show_continual_button = 15;
- //
- int64 ep_num = 16;
- //
- bool season_pay = 17;
- //
- GoodsInfo goods_info = 18;
- //
- ButtonStyle pay_button = 19;
- //
- string label_text_new = 20;
- //
- UgcSeasonActivity activity = 21;
- //
- repeated string season_ability = 22;
-}
-
-//
-message UgcSeasonActivity {
- //
- int32 type = 1;
- //
- int64 oid = 2;
- //
- int64 activity_id = 3;
- //
- string title = 4;
- //
- string intro = 5;
- //
- int32 day_count = 6;
- //
- int32 user_count = 7;
- //
- int64 join_deadline = 8;
- //
- int64 activity_deadline = 9;
- //
- int32 checkin_view_time = 10;
- //
- bool new_activity = 11;
- //
- UserActivity user_activity = 12;
- //
- SeasonShow season_show = 13;
-}
-
-// ugc视频合集状态数
-message UgcSeasonStat {
- // 合集id
- int64 season_id = 1;
- // 观看数
- int32 view = 2;
- // 弹幕数
- int32 danmaku = 3;
- // 评论数
- int32 reply = 4;
- // 收藏数
- int32 fav = 5;
- // 投币数
- int32 coin = 6;
- // 分享数
- int32 share = 7;
- // 当前排名
- int32 now_rank = 8;
- // 历史最高排名
- int32 his_rank = 9;
- // 总计点赞
- int32 like = 10;
-}
-
-//
-message UpAct {
- //
- int64 sid = 1;
- //
- int64 mid = 2;
- //
- string title = 3;
- //
- string statement = 4;
- //
- string image = 5;
- //
- string url = 6;
- //
- string button = 7;
-}
-
-//
-message UpLikeImg {
- //
- string pre_img = 1;
- //
- string suc_img = 2;
- //
- string content = 3;
- //
- int64 type = 4;
-}
-
-// UP主信息
-message UpperInfos {
- // 粉丝数
- int64 fans_count = 1;
- // 近半年投稿数
- int64 arc_count_last_half_year = 2;
- // 成为UP主时间
- int64 first_up_dates = 3;
- // 总播放量
- int64 total_play_count = 4;
-}
-
-//
-message UserActivity {
- //
- int32 user_state = 1;
- //
- int64 last_checkin_date = 2;
- //
- int32 checkin_today = 3;
- //
- int32 user_day_count = 4;
- //
- int32 user_view_time = 5;
- //
- string portrait = 6;
-}
-
-// 用户装扮信息
-message UserGarb {
- // 点赞动画url
- string url_image_ani_cut = 1;
- //
- string like_toast = 2;
-}
-
-// 用户追番标志
-message UserSeason {
- // 关注状态
- // 0:未关注 1:已关注
- string attention = 1;
-}
-
-// 视频引导信息
-message VideoGuide {
- // 关注按钮卡片
- repeated Attention attention = 1;
- // 互动弹幕
- repeated CommandDm commandDms = 2;
- // 运营卡片
- repeated OperationCard operation_card = 3;
- // 运营卡片新版
- repeated OperationCardNew operation_card_new = 4;
- // 契约卡
- ContractCard contract_card = 5;
- //
- repeated OperationCardV2 cards_second = 6;
-}
-
-//
-message VideoPoint {
- //
- int32 type = 1;
- //
- int64 from = 2;
- //
- int64 to = 3;
- //
- string content = 4;
- //
- string cover = 5;
- //
- string logo_url = 6;
-}
-
-//
-message VideoShot {
- //
- string pv_data = 1;
- //
- int32 img_x_len = 2;
- //
- int32 img_y_len = 3;
- //
- int32 img_x_size = 4;
- //
- int32 img_y_size = 5;
- //
- repeated string image = 6;
-}
-
-//
-message ViewMaterial {
- //
- int64 oid = 1;
- //
- int64 mid = 2;
- //
- string title = 3;
- //
- string author = 4;
- //
- string jump_url = 5;
-}
-
-//
-message ViewMaterialReply {
- //
- repeated MaterialRes material_res = 1;
- //
- MaterialLeft material_left = 2;
-}
-
-//
-message ViewMaterialReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- int64 cid = 3;
-}
-
-// 分P信息
-message ViewPage {
- // 分P基本信息
- bilibili.app.archive.v1.Page page = 1;
- // 分P对应的音频稿件
- Audio audio = 2;
- // 分P弹幕信息
- DM dm =3;
- // 下载文案
- string download_title = 4;
- // 分P完整标题(视频标题+分P标题)
- string download_subtitle = 5;
-}
-
-// 稿件播放中数据-回复
-message ViewProgressReply {
- // 视频引导信息
- VideoGuide video_guide = 1;
- // Chronos灰度管理
- Chronos chronos = 2;
- // 视频快照
- VideoShot arc_shot = 3;
- //
- repeated VideoPoint points = 4;
- //
- PointMaterial point_material = 5;
- //
- bool point_permanent = 6;
- // 名词解释列表
- repeated BuzzwordConfig buzzword_periods = 7;
-}
-
-// 稿件播放中数据-请求
-message ViewProgressReq {
- // 稿件avid
- int64 aid = 1;
- // 视频cid
- int64 cid = 2;
- // UP主mid
- int64 up_mid = 3;
- //
- string engine_version = 4;
- //
- string message_protocol = 5;
- //
- string service_key = 6;
-}
-
-// 视频页信息-响应
-message ViewReply {
- // 稿件信息
- bilibili.app.archive.v1.Arc arc = 1;
- // 分P信息
- repeated ViewPage pages = 2;
- // UP主扩展信息 ("OnwerExt"为源码中拼写错误)
- OnwerExt owner_ext = 3;
- // 稿件用户操作状态
- ReqUser req_user = 4;
- // 稿件TAG
- repeated Tag tag = 5;
- // TAG对应的图标
- map t_icon = 6;
- // 稿件映射的PGC剧集信息
- Season season = 7;
- // 充电排行
- ElecRank elec_rank = 8;
- // 历史观看进度
- History history = 9;
- // 视频相关推荐列表
- repeated Relate relates = 10;
- // 不感兴趣原因
- Dislike dislike = 11;
- // 播放图标动画配置档
- PlayerIcon player_icon = 12;
- //
- string vip_active = 13;
- // 稿件bvid
- string bvid = 14;
- // 获得荣誉信息
- Honor honor = 15;
- // 相关推荐顶部tab
- repeated RelateTab relate_tab = 16;
- // 参与的活动页面url
- string activity_url = 17;
- // 稿件引用bgm列表
- repeated Bgm bgm = 18;
- // 联合投稿成员列表
- repeated Staff staff = 19;
- // 争议信息
- string argue_msg = 20;
- // 短链接
- string short_link = 21;
- // 播放实验
- // 1:相关推荐自动播放
- int32 play_param = 22;
- // 标签
- Label label = 23;
- // UGC视频合集信息
- UgcSeason ugc_season = 24;
- // 配置信息
- Config config = 25;
- // 分享副标题(已观看xxx次)
- string share_subtitle = 26;
- // 互动视频信息
- Interaction interaction = 27;
- // 错误码
- // DEFAULT:正常 CODE404:视频被UP主删除
- ECode ecode = 28;
- // 404页信息
- CustomConfig custom_config = 29;
- // 广告
- repeated CM cms = 30;
- // 广告配置
- CMConfig cm_config = 31;
- // 播放页定制tab
- Tab tab = 32;
- // 排行榜
- Rank rank = 33;
- // 免流面板定制
- TFPanelCustomized tf_panel_customized = 34;
- // UP主发起活动
- UpAct up_act = 35;
- // 用户装扮
- UserGarb user_garb = 36;
- // 大型活动合集
- ActivitySeason activity_season = 37;
- // 评论样式
- string badge_url = 38;
- // 直播预约信息
- LiveOrderInfo live_order_info = 39;
- // 稿件简介v2
- repeated DescV2 desc_v2 = 40;
- //
- CmIpad cm_ipad = 41;
- //
- repeated ViewMaterial sticker = 42;
- //
- UpLikeImg up_like_img = 43;
- //
- LikeCustom like_custom = 44;
- //
- repeated Tag desc_tag = 45;
- //
- SpecialCell special_cell = 46;
- //
- Online online = 47;
- //
- google.protobuf.Any cm_under_player = 48;
- //
- repeated ViewMaterial video_source = 49;
- //
- repeated SpecialCell special_cell_new = 50;
- //
- PremiereResource premiere = 51;
- //
- bool refresh_special_cell = 52;
- //
- MaterialLeft material_left = 53;
- //
- int64 notes_count = 54;
- //
- PullClientAction pull_action = 55;
- //
- ArcExtra arc_extra = 56;
- //
- bilibili.pagination.PaginationReply pagination = 57;
- //
- LikeAnimation like_animation = 58;
- //
- ReplyStyle reply_preface = 59;
- //
- RefreshPage refresh_page = 60;
- //
- CoinCustom coin_custom = 61;
-}
-
-// 视频页详情页-请求
-message ViewReq {
- // 稿件avid(av/bv任选其一)
- int64 aid = 1;
- // 稿件bvid(av/bv任选其一)
- string bvid = 2;
- // 来源
- string from = 3;
- // AI trackid
- string trackid = 4;
- // 广告扩展数据
- string ad_extra = 5;
- // 清晰度(旧版)
- int32 qn = 6;
- // 流版本(旧版)
- int32 fnver = 7;
- // 流类型(旧版)
- int32 fnval = 8;
- // 是否强制使用域名(旧版)
- int32 force_host = 9;
- // 是否允许4K(旧版)
- int32 fourk = 10;
- // 当前页面spm
- string spmid = 11;
- // 上一页面spm
- string from_spmid = 12;
- //
- int32 autoplay = 13;
- // 视频秒开参数
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 14;
- //
- string page_version = 15;
- //
- string biz_extra = 16;
- //
- int64 device_type = 17;
- //
- int64 relates_page = 18;
- //
- string session_id = 19;
- //
- int32 in_feed_play = 20;
- //
- string play_mode = 21;
- //
- bilibili.pagination.Pagination pagination = 22;
- //
- int32 refresh = 23;
- //
- int32 refresh_num = 24;
-}
-
-//
-message ViewTagReply {
- //
- repeated SpecialCell special_cell_new = 1;
- //
- MaterialLeft material_left = 2;
-}
-
-//
-message ViewTagReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- int64 cid = 3;
- //
- string spmid = 4;
-}
-
-// 会员信息
-message Vip {
- //会员类型
- int32 type = 1;
- //到期时间
- int64 due_date = 2;
- //
- string due_remark = 3;
- //
- int32 access_status = 4;
- //会员状态
- int32 vip_status = 5;
- //
- string vip_status_warn = 6;
- //
- int32 theme_type = 7;
- //
- VipLabel label = 8;
-}
-
-// 会员类型标签
-message VipLabel {
- //
- string path = 1;
- //
- string text = 2;
- //
- string label_theme = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/app/viewunite/common.proto b/bili-api-grpc/proto/bilibili/app/viewunite/common.proto
deleted file mode 100644
index ee12ea525..000000000
--- a/bili-api-grpc/proto/bilibili/app/viewunite/common.proto
+++ /dev/null
@@ -1,2011 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.viewunite.common;
-
-option java_multiple_files = true;
-
-import "bilibili/dagw/component/avatar/v1/avatar.proto";
-import "bilibili/pagination/pagination.proto";
-import "google/protobuf/any.proto";
-
-//
-message Activity {
- //
- int32 id = 1;
- //
- string title = 2;
- //
- string link = 3;
- //
- string cover = 4;
- //
- int32 type = 5;
- //
- string ab = 6;
- //
- string show_name = 7;
- //
- string picurl = 8;
- //
- string picurl_selected = 9;
- //
- string h5_link = 10;
- //
- string jump_mode = 11;
- //
- repeated Item items = 12;
-}
-
-//
-message ActivityEntrance {
- //
- string activity_cover = 1;
- //
- string activity_title = 2;
- //
- string word_tag = 3;
- //
- string activity_subtitle = 4;
- //
- string activity_link = 5;
- //
- int32 activity_type = 6;
- //
- int32 reserve_id = 7;
- //
- int32 status = 8;
- //
- repeated User upper_list = 9;
- //
- map report = 10;
-}
-
-//
-message ActivityEntranceModule {
- //
- repeated ActivityEntrance activity_entrance = 1;
-}
-
-//
-message ActivityReserve {
- //
- string title = 1;
- //
- StatInfo vt = 2;
- //
- StatInfo danmaku = 3;
- //
- ReserveButton button = 4;
-}
-
-//
-message ActivityResource {
- //
- string mod_pool_name = 1;
- //
- string mod_resource_name = 2;
-}
-
-//
-message ActivityTab {
- //
- int32 id = 1;
- //
- string title = 2;
- //
- int32 type = 3;
- //
- string show_name = 4;
- //
- string picurl = 5;
- //
- string picurl_selected = 6;
- //
- string h5_link = 7;
- //
- string link = 8;
- //
- int32 link_type = 9;
- //
- int64 biz_key = 10;
- //
- string desc = 11;
- //
- string act_ext = 12;
- //
- map report = 13;
-}
-
-//
-message AggEpCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string icon = 3;
- //
- int32 num = 4;
- //
- string jump_url = 5;
-}
-
-//
-message AggEps {
- //
- repeated AggEpCard agg_ep_cards = 1;
- //
- int32 place_index = 2;
-}
-
-//
-message AttentionRecommend {}
-
-//
-enum AttentionRelationStatus {
- //
- ARS_NONE = 0;
- //
- ARS_N0RELATION = 1;
- //
- ARS_FOLLOWHIM = 2;
- //
- ARS_FOLLOWME = 3;
- //
- ARS_BUDDY = 4;
- //
- ARS_SPECIAL = 5;
- //
- ARS_CANCELBLOCK = 6;
-}
-
-//
-message Audio {
- //
- map audio_info = 1;
-}
-
-//
-message AudioInfo {
- //
- string title = 1;
- //
- string cover_url = 2;
- //
- int64 song_id = 3;
- //
- int64 play_count = 4;
- //
- int64 reply_count = 5;
- //
- int64 upper_id = 6;
- //
- string entrance = 7;
- //
- int64 song_attr = 8;
-}
-
-//
-message BadgeInfo {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
- //
- string border_color = 6;
- //
- string border_color_night = 7;
- //
- int32 bg_style = 8;
- //
- string img = 9;
- //
- int32 type = 10;
-}
-
-//
-message Banner {
- //
- string title = 1;
- //
- repeated RelateItem relate_item = 2;
-}
-
-//
-message BizFavParam {
- //
- int64 season_id = 1;
-}
-
-//
-message BizReserveActivityParam {
- //
- int64 activity_id = 1;
- //
- string from = 2;
- //
- string type = 3;
- //
- int64 oid = 4;
- //
- int64 reserve_id = 5;
-}
-
-//
-message Button {
- //
- string title = 1;
- //
- string left_strikethrough_text = 2;
- //
- string type = 3;
- //
- string link = 4;
- //
- BadgeInfo badge_info = 5;
- //
- string sub_title = 6;
-}
-
-//
-message CardBasicInfo {
- //
- string title = 1;
- //
- string desc = 2;
- //
- string cover = 3;
- //
- string uri = 4;
- //
- string track_id = 5;
- //
- string unique_id = 6;
- //
- int64 from_source_type = 7;
- //
- string from_source_id = 8;
- //
- int64 material_id = 9;
- //
- string cover_gif = 10;
- //
- Owner author = 11;
- //
- int64 id = 12;
- //
- string from = 13;
- //
- string from_spmid_suffix = 14;
- //
- string report_flow_data = 15;
-}
-
-//
-message CardStyle {
- //
- int32 id = 1;
- //
- string name = 2;
-}
-
-//
-message Celebrity {
- //
- int32 id = 1;
- //
- string name = 2;
- //
- string role = 3;
- //
- string avatar = 4;
- //
- string short_desc = 5;
- //
- string desc = 6;
- //
- string character_avatar = 7;
- //
- string link = 8;
- //
- int64 mid = 9;
- //
- int32 is_follow = 10;
- //
- string occupation_name = 11;
- //
- int32 occupation_type = 12;
- //
- int32 relate_attr = 13;
- //
- string small_avatar = 14;
- //
- map report = 15;
-}
-
-//
-message CharacterGroup {
- //
- string title = 1;
- //
- repeated Celebrity characters = 2;
-}
-
-//
-message Characters {
- //
- repeated CharacterGroup groups = 1;
-}
-
-//
-message CoinExtend {
- //
- string coin_app_zip_icon = 1;
- //
- string coin_app_icon_1 = 2;
- //
- string coin_app_icon_2 = 3;
- //
- string coin_app_icon_3 = 4;
- //
- string coin_app_icon_4 = 5;
-}
-
-//
-message CombinationEp {
- //
- int32 id = 1;
- //
- int32 section_id = 2;
- //
- string title = 3;
- //
- int32 can_ord_desc = 4;
- //
- string more = 5;
- //
- repeated int32 episode_ids = 6;
- //
- repeated ViewEpisode episodes = 7;
- //
- string split_text = 8;
- //
- Style module_style = 9;
- //
- repeated SerialSeason serial_season = 10;
- //
- SectionData section_data = 11;
-}
-
-//
-message Covenanter {}
-
-//
-message DeliveryData {
- //
- string title = 1;
- //
- Style module_style = 2;
- //
- string more = 3;
- //
- oneof data {
- //
- Activity activity = 4;
- //
- Characters characters = 5;
- //
- TheatreHotTopic theatre_hot_topic = 6;
- //
- AggEps agg_eps = 7;
- }
- //
- int32 id = 8;
- //
- map report = 9;
-}
-
-//
-message Desc {
- //
- string info = 1;
- //
- string title = 2;
-}
-
-enum DescType {
- //
- DescTypeUnknown = 0;
- //
- DescTypeText = 1;
- //
- DescTypeAt = 2;
-}
-
-//
-message DescV2 {
- //
- string text = 1;
- //
- int32 type = 2;
- //
- string uri = 3;
- //
- int64 rid = 4;
-}
-
-//
-message Dimension {
- //
- int64 width = 1;
- //
- int64 height = 2;
- //
- int64 rotate = 3;
-}
-
-//
-message DislikeReasons {
- //
- int64 id = 1;
- //
- int64 mid = 2;
- //
- int32 rid = 3;
- //
- int64 tag_id = 4;
- //
- string name = 5;
-}
-
-//
-message FollowLayer {
- //
- Staff staff = 1;
- //
- Desc desc = 2;
- //
- map report = 3;
-}
-
-//
-message Headline {
- //
- Label label = 1;
- //
- string content = 2;
-}
-
-//
-message HistoryNode {
- //
- int64 node_id = 1;
- //
- string title = 2;
- //
- int64 cid = 3;
-}
-
-// 荣誉 Banner
-message Honor {
- //
- string icon = 1;
- //
- string icon_night = 2;
- //
- string text = 3;
- //
- string text_extra = 4;
- //
- string text_color = 5;
- //
- string text_color_night = 6;
- //
- string bg_color = 7;
- //
- string bg_color_night = 8;
- //
- string url = 9;
- //
- string url_text = 10;
- //
- HonorType type = 11;
- //
- HonorJumpType honor_jump_type = 12;
- //
- map report = 13;
-}
-
-// 荣誉 Banner 跳转类型
-enum HonorJumpType {
- //
- HONOR_JUMP_TYPE_UNKNOWN = 0;
- //
- HONOR_OPEN_URL = 1;
- //
- HONOR_HALF_SCREEN = 2;
-}
-
-// 荣誉类型
-enum HonorType {
- //
- HONOR_NONE = 0;
- //
- PLAYLET = 1;
- // 视频存在争议
- ARGUE = 2;
- //
- NOTICE = 3;
- //
- GUIDANCE = 4;
- // 哔哩哔哩榜
- HONOR_BILI_RANK = 5;
- // 周榜
- HONOR_WEEKLY_RANK = 6;
- // 日榜
- HONOR_DAILY_RANK = 7;
- //
- HONOR_CHANNEL = 8;
- // 音乐榜?
- HONOR_MUSIC = 9;
- //
- HONOR_REPLY = 10;
-}
-
-//
-message IconFont {
- //
- string name = 1;
- //
- string text = 2;
-}
-
-//
-message Interaction {
- //
- int64 ep_id = 1;
- //
- HistoryNode history_node = 2;
- //
- int64 graph_version = 3;
- //
- string msg = 4;
- //
- bool is_interaction = 5;
-}
-
-//
-message Item {
- //
- string link = 1;
- //
- string cover = 2;
-}
-
-//
-message KingPos {
- //
- bool disable = 1;
- //
- string icon = 2;
- //
- KingPositionType type = 3;
- //
- string disable_toast = 4;
- //
- string checked_post = 5;
- //
- oneof extend {
- //
- LikeExtend like = 6;
- //
- CoinExtend coin = 7;
- }
-}
-
-//
-message KingPosition {
- //
- repeated KingPos king_pos = 1;
- //
- repeated KingPos extenf = 2;
-}
-
-//
-enum KingPositionType {
- //
- KING_POS_UNSPECIFIED = 0;
- //
- LIKE = 1;
- //
- DISLIKE = 2;
- //
- COIN = 3;
- //
- FAV = 4;
- //
- SHARE = 5;
- //
- CACHE = 6;
- //
- DANMAKU = 7;
-}
-
-//
-message Label {
- //
- int32 type = 1;
- //
- string uri = 2;
- //
- string icon = 3;
- //
- string icon_night = 4;
- //
- int64 icon_width = 5;
- //
- int64 icon_height = 6;
- //
- string lottie = 7;
- //
- string lottie_night = 8;
-}
-
-//
-message LikeComment {
- //
- string reply = 1;
- //
- string title = 2;
-}
-
-//
-message LikeExtend {
- //
- UpLikeImg triple_like = 1;
- //
- string like_animation = 2;
- //
- PlayerAnimation player_animation = 3;
- //
- ActivityResource resource = 4;
-}
-
-//
-message Live {
- //
- int64 mid = 1;
- //
- int64 room_id = 2;
- //
- string uri = 3;
- //
- string endpage_uri = 4;
-}
-
-// 直播预约信息
-message LiveOrder {
- //
- int64 sid = 1;
- //
- string text = 2;
- //
- int64 live_plan_start_time = 3;
- //
- bool is_follow = 4;
- //
- int64 follow_count = 5;
-}
-
-//
-message Mine {
- //
- double amount = 1;
- //
- int32 rank = 2;
- //
- string msg = 3;
-}
-
-//
-message Module {
- //
- ModuleType type = 1;
- //
- oneof data {
- //
- OgvIntroduction ogv_introduction = 2;
- //
- UgcIntroduction ugc_introduction = 3;
- //
- KingPosition king_position = 4;
- //
- Headline head_line = 5;
- //
- OgvTitle ogv_title = 6;
- //
- Honor honor = 7;
- //
- UserList list = 8;
- //
- Staffs staffs = 9;
- //
- ActivityReserve activity_reserve = 10;
- //
- LiveOrder live_order = 11;
- //
- SectionData section_data = 12;
- //
- DeliveryData delivery_data = 13;
- //
- FollowLayer follow_layer = 14;
- //
- OgvSeasons ogv_seasons = 15;
- //
- UgcSeasons ugc_season = 16;
- //
- OgvLiveReserve ogv_live_reserve = 17;
- //
- CombinationEp combination_ep = 18;
- //
- Sponsor sponsor = 19;
- //
- ActivityEntranceModule activity_entrance_module = 20;
- //
- SerialSeason serial_season = 21;
- //
- Relates relates = 22;
- //
- Banner banner = 23;
- //
- Audio audio = 24;
- //
- LikeComment like_comment = 25;
- //
- AttentionRecommend attention_recommend = 26;
- //
- Covenanter covenanter = 27;
- }
-}
-
-enum ModuleType {
- //
- UNKNOWN = 0;
- //
- OGV_INTRODUCTION = 1;
- //
- OGV_TITLE = 2;
- //
- UGC_HEADLINE = 3;
- //
- UGC_INTRODUCTION = 4;
- //
- KING_POSITION = 5;
- //
- MASTER_USER_LIST = 6;
- //
- STAFFS = 7;
- //
- HONOR = 8;
- //
- OWNER = 9;
- //
- PAGE = 10;
- //
- ACTIVITY_RESERVE = 11;
- //
- LIVE_ORDER = 12;
- //
- POSITIVE = 13;
- //
- SECTION = 14;
- //
- RELATE = 15;
- //
- PUGV = 16;
- //
- COLLECTION_CARD = 17;
- //
- ACTIVITY = 18;
- //
- CHARACTER = 19;
- //
- FOLLOW_LAYER = 20;
- //
- OGV_SEASONS = 21;
- //
- UGC_SEASON = 22;
- //
- OGV_LIVE_RESERVE = 23;
- //
- COMBINATION_EPISODE = 24;
- //
- SPONSOR = 25;
- //
- ACTIVITY_ENTRANCE = 26;
- //
- THEATRE_HOT_TOPIC = 27;
- //
- RELATED_RECOMMEND = 28;
- //
- PAY_BAR = 29;
- //
- BANNER = 30;
- //
- AUDIO = 31;
- //
- AGG_CARD = 32;
- //
- SINGLE_EP = 33;
- //
- LIKE_COMMENT = 34;
- //
- ATTENTION_RECOMMEND = 35;
- //
- COVENANTER = 36;
-}
-
-//
-message MultiViewEp {
- //
- int64 ep_id =1;
-}
-
-//
-message NewEp {
- //
- int32 id = 1;
- //
- string title = 2;
- //
- string desc = 3;
- //
- int32 is_new = 4;
- //
- string more = 5;
- //
- string cover = 6;
- //
- string index_show = 7;
-}
-
-//
-enum OccupationType {
- //
- STAFF = 0;
- //
- CAST = 1;
-}
-
-//
-message OfficialVerify {
- //
- int32 type = 1;
- //
- string desc = 2;
-}
-
-//
-message OgvIntroduction {
- //
- string followers = 1;
- //
- string score = 2;
- //
- StatInfo play_data = 3;
-}
-
-//
-message OgvLiveReserve {
- //
- int64 reserve_id = 1;
- //
- string title = 2;
- //
- string icon = 3;
- //
- string night_icon = 4;
- //
- string click_button = 5;
- //
- string link = 6;
- //
- int32 follow_video_is_reserve_live = 7;
- //
- string bg_color = 8;
- //
- string night_bg_color = 9;
- //
- string text_color = 10;
- //
- string night_text_color = 11;
- //
- string bt_bg_color = 12;
- //
- string bt_frame_color = 13;
- //
- string night_bt_bg_color = 14;
- //
- string night_bt_frame_color = 15;
- //
- int32 active_type = 16;
- //
- int32 reserve_status = 17;
- //
- string bt_text_color = 18;
- //
- string night_bt_text_color = 19;
- //
- map report = 20;
-}
-
-//
-message OgvSeasons {
- //
- string title = 1;
- //
- repeated SerialSeason serial_season = 2;
- //
- SerialSeasonCoverStyle style = 3;
-}
-
-//
-message OgvTitle {
- //
- string title = 1;
- //
- BadgeInfo badge_info = 2;
- //
- int32 is_show_btn_animation = 3;
- //
- int32 follow_video_is_reserve_live = 4;
- //
- int64 reserve_id = 5;
- //
- TitleDeliveryButton title_delivery_button = 6;
-}
-
-//
-message Owner {
- bilibili.dagw.component.avatar.v1.AvatarItem avatar = 1;
- //
- string url = 2;
- //
- string title = 3;
- //
- string fans = 4;
- //
- string arc_count = 5;
- //
- int32 attention = 6;
- //
- int32 attention_relation = 7;
- //
- string pub_location = 8;
- //
- Vip vip = 9;
- //
- string title_url = 10;
- //
- string face = 11;
- //
- int64 mid = 12;
- //
- OfficialVerify official_verify = 13;
- //
- Live live = 14;
- //
- int64 fans_num = 15;
- //
- repeated int64 assists = 16;
-}
-
-//
-message Page {
- //
- int64 cid = 1;
- //
- string part = 2;
- //
- int64 duration = 3;
- //
- string desc = 4;
- //
- Dimension dimension = 5;
- //
- string dl_title = 6;
- //
- string dl_subtitle = 7;
-}
-
-//
-message Pendant {
- //
- int32 pid = 1;
- //
- string name = 2;
- //
- string image = 3;
-}
-
-//
-message PlayerAnimation {
- //
- string player_icon = 1;
- //
- string player_triple_icon = 2;
-}
-
-//
-message PointActivity {
- //
- string tip = 1;
- //
- string content = 2;
- //
- string link = 3;
-}
-
-//
-message PowerIconStyle {
- //
- string icon_url = 1;
- //
- string icon_night_url = 2;
- //
- int64 icon_width = 3;
- //
- int64 icon_height = 4;
-}
-
-//
-message Rank {
- //
- string icon = 1;
- //
- string icon_night = 2;
- //
- string text = 3;
-}
-
-//
-message RankInfo {
- //
- string icon_url_night = 1;
- //
- string icon_url_day = 2;
- //
- string bkg_night_color = 3;
- //
- string bkg_day_color = 4;
- //
- string font_night_color = 5;
- //
- string font_day_color = 6;
- //
- string rank_content = 7;
- //
- string rank_link = 8;
-}
-
-//
-message Rating {
- //
- string score = 1;
- //
- int32 count = 2;
-}
-
-// 视频详情下方推荐卡子类型: 普通视频
-message RelateAVCard {
- //
- int64 duration = 1;
- //
- int64 cid = 2;
- //
- Dimension dimension = 3;
- //
- Stat stat = 4;
- //
- string jump_url = 5;
- //
- bool show_up_name = 6;
- //
- BadgeInfo rcmd_reason = 7;
-}
-
-// 视频详情下方推荐卡子类型: 番剧(小卡?)
-message RelateBangumiAvCard {
- //
- BadgeInfo badge = 1;
- //
- Stat stat = 2;
- //
- Rating rating = 3;
-}
-
-// 视频详情下方推荐卡子类型: 番剧(大卡?)
-message RelateBangumiCard {
- //
- int32 season_id = 1;
- //
- int32 season_type = 2;
- //
- NewEp new_ep = 3;
- //
- Stat stat = 4;
- //
- Rating rating = 5;
- //
- string rcmd_reason = 6;
- //
- BadgeInfo badge_info = 7;
- //
- string goto_type = 8;
- //
- map report = 9;
-}
-
-// 视频详情下方推荐卡子类型: 番剧集?
-message RelateBangumiResourceCard {
- //
- int32 type = 1;
- //
- string scover = 2;
- //
- int32 re_type = 3;
- //
- string re_value = 4;
- //
- string corner = 5;
- //
- int32 card = 6;
- //
- string siz = 7;
- //
- int32 position = 8;
- //
- string rcmd_reason = 9;
- //
- string label = 10;
- //
- map report = 11;
- //
- string goto_type = 12;
-}
-
-// 视频详情下方推荐卡子类型: UGC 番剧?
-message RelateBangumiUgcCard {
- //
- BadgeInfo badge = 1;
- //
- Stat stat = 2;
- //
- Rating rating = 3;
-}
-
-// 视频详情下方推荐卡
-message RelateCard {
- //
- RelateCardType relate_card_type = 1;
- //
- oneof card {
- //
- RelateAVCard av = 2;
- //
- RelateBangumiCard bangumi = 3;
- //
- RelateBangumiResourceCard resource = 4;
- //
- RelateGameCard game = 5;
- //
- RelateCMCard cm = 6;
- //
- RelateLiveCard live = 7;
- //
- RelateBangumiAvCard bangumi_av = 8;
- //
- RelatedAICard ai_card = 9;
- //
- RelateBangumiUgcCard bangumi_ugc = 13;
- //
- RelateSpecial special = 14;
- }
- //
- RelateThreePoint three_point = 10;
- //
- google.protobuf.Any cm_stock = 11;
- //
- CardBasicInfo basic_info = 12;
-}
-
-// 视频详情下方推荐卡子类型
-enum RelateCardType {
- //
- CARD_TYPE_UNKNOWN = 0;
- //
- AV = 1;
- //
- BANGUMI = 2;
- //
- RESOURCE = 3;
- //
- GAME = 4;
- //
- CM = 5;
- //
- LIVE = 6;
- //
- AI_RECOMMEND = 7;
- //
- BANGUMI_AV = 8;
- //
- BANGUMI_UGC = 9;
- //
- SPECIAL = 10;
-}
-
-// 视频详情下方推荐卡子类型: 广告推广
-message RelateCMCard {
- //
- int64 aid = 1;
- //
- google.protobuf.Any source_content = 2;
- //
- int64 duration = 3;
- //
- Stat stat = 4;
-}
-
-// 视频详情下方推荐配置
-message RelateConfig {
- //
- int64 valid_show_m = 1;
- //
- int64 valid_show_n = 2;
- //
- bilibili.pagination.Pagination pagination = 3;
- //
- bool can_load_more = 4;
-}
-
-// 视频详情下方推荐卡子类型: AI 推荐?
-message RelatedAICard {
- //
- int64 aid = 1;
- //
- int64 duration = 2;
- //
- Staff up_info = 3;
- //
- Stat stat = 4;
- //
- map report = 5;
- //
- string goto_type = 6;
-}
-
-// 视频详情下方推荐卡子类型: 点击不喜欢后占位卡片
-message RelateDislike {
- //
- string title = 1;
- //
- string sub_title = 2;
- //
- string closed_sub_title = 3;
- //
- string paste_text = 4;
- //
- string closed_paste_text = 5;
- //
- repeated DislikeReasons dislike_reason = 6;
- //
- string toast = 7;
- //
- string closed_toast = 8;
-}
-
-// 视频详情下方推荐卡子类型: 游戏推广
-message RelateGameCard {
- //
- int64 reserve_status = 1;
- //
- string reserve_status_text = 2;
- //
- string reserve = 3;
- //
- float rating = 4;
- //
- string tag_name = 5;
- //
- RankInfo rank_info = 6;
- //
- Button pack_info = 7;
- //
- Button notice = 8;
- //
- PowerIconStyle power_icon_style = 9;
- //
- string game_rcmd_reason = 10;
- //
- WikiInfo wiki_info = 11;
- //
- BadgeInfo badge = 12;
-}
-
-//
-message RelateItem {
- //
- string url = 1;
- //
- string cover = 2;
- //
- bool use_default_browser = 3;
-}
-
-// 视频详情下方推荐卡子类型: 直播
-message RelateLiveCard {
- //
- int64 icon_type = 1;
- //
- string area_name = 2;
- //
- int64 watched_show = 3;
- //
- int64 live_status = 4;
-}
-
-// 视频下方推荐区
-message Relates {
- //
- repeated RelateCard cards = 1;
- //
- RelateConfig config = 2;
-}
-
-// 视频详情下方推荐卡子类型: 其他特殊
-message RelateSpecial {
- //
- BadgeInfo badge = 1;
- //
- BadgeInfo rcmd_reason = 2;
-}
-
-// 视频详情下方推荐卡右上角三点的内容
-message RelateThreePoint {
- //
- RelateDislike dislike = 1;
- //
- RelateDislike feedback = 2;
- //
- bool watch_later = 3;
- //
- string dislike_report_data = 4;
-}
-
-//
-enum ReserveBizType {
- //
- BizTypeNone = 0;
- //
- BizTypeReserveActivity = 1;
- //
- BizTypeFavSeason = 2;
-}
-
-//
-message ReserveButton {
- //
- bool status = 1;
- //
- string text = 3;
- //
- string selected_text = 4;
- //
- ReserveBizType order_type = 7;
- //
- oneof order_param {
- //
- BizReserveActivityParam reserve = 8;
- //
- BizFavParam fav = 9;
- }
-}
-
-//
-message Rights {
- //
- int32 allow_download = 1;
- //
- int32 allow_review = 2;
- //
- int32 can_watch = 3;
- //
- string resource = 4;
- //
- int32 allow_dm = 5;
- //
- int32 allow_demand = 6;
- // 区域限制
- int32 area_limit = 7;
-}
-
-//
-message SeasonHead {
- //
- string title = 1;
- //
- string intro = 2;
- //
- StatInfo vt = 3;
- //
- StatInfo danmaku = 4;
-}
-
-//
-message SeasonShow {
- //
- string button_text = 1;
- //
- string join_text = 2;
- //
- string rule_text = 3;
- //
- string checkin_text = 4;
- //
- string checkin_prompt = 5;
-}
-
-enum SeasonType {
- //
- Unknown = 0;
- //
- Base = 1;
- //
- Good = 2;
-}
-
-//
-message SectionData {
- //
- int32 id = 1;
- //
- int32 section_id = 2;
- //
- string title = 3;
- //
- int32 can_ord_desc = 4;
- //
- string more = 5;
- //
- repeated int32 episode_ids = 6;
- //
- repeated ViewEpisode episodes = 7;
- //
- string split_text = 8;
- //
- Style module_style = 9;
- //
- string more_bottom_desc = 10;
- //
- repeated SerialSeason seasons = 11;
- //
- Button more_left = 12;
- //
- int32 type = 13;
- //
- map report = 14;
-}
-
-//
-message SerialSeason {
- //
- int32 season_id = 1;
- //
- string title = 2;
- //
- string season_title = 3;
- //
- int32 is_new = 4;
- //
- string cover = 5;
- //
- string badge = 6;
- //
- int32 badge_type = 7;
- //
- BadgeInfo badge_info = 8;
- //
- string link = 9;
- //
- string resource = 10;
- //
- NewEp new_ep = 11;
-}
-
-enum SerialSeasonCoverStyle {
- //
- TITLE = 0;
- //
- PICTURE = 1;
-}
-
-//
-message SkipRange {
- //
- int32 start = 1;
- //
- int32 end = 2;
-}
-
-//
-message Sponsor {
- //
- int64 total = 1;
- //
- int64 week = 2;
- //
- repeated SponsorRank rank_list = 3;
- //
- Mine mine = 4;
- //
- PointActivity point_activity = 5;
- //
- repeated Pendant pendants = 6;
- //
- repeated Threshold threshold = 7;
-}
-
-//
-message SponsorRank {
- //
- int64 uid = 1;
- //
- string msg = 2;
- //
- string uname = 3;
- //
- string face = 4;
- //
- Vip vip = 5;
-}
-
-//
-message Staff {
- //
- int64 mid = 1;
- //
- int32 attention = 2;
- //
- string title = 3;
- //
- string name = 4;
- //
- string face = 5;
- //
- OfficialVerify official = 6;
- //
- Vip vip = 7;
- //
- int32 label_style = 8;
- //
- string fans = 9;
-}
-
-//
-message Staffs {
- //
- repeated Staff staff = 1;
- //
- string title = 2;
-}
-
-//
-message Stat {
- // 视频观看时长
- StatInfo vt = 1;
- // 弹幕
- StatInfo danmaku = 2;
- // 回复数
- int64 reply = 3;
- // 收藏数
- int64 fav = 4;
- // 硬币数
- int64 coin = 5;
- // 分享数
- int64 share = 6;
- // 点赞数
- int64 like = 7;
- // 关注数
- int64 follow = 8;
-}
-
-//
-message StatInfo {
- //
- int64 value = 1;
- //
- string text = 2;
- //
- string pure_text = 3;
- //
- string icon = 4;
-}
-
-//
-message Style {
- //
- int32 line = 1;
- //
- int32 hidden = 2;
- //
- repeated string show_pages = 3;
-}
-
-//
-message Tag {
- //
- int64 tag_id = 1;
- //
- string name = 2;
- //
- string uri = 3;
- //
- string tag_type = 4;
-}
-
-//
-message TheatreHotTopic {
- //
- int64 theatre_id = 1;
- //
- int64 theatre_set_id = 2;
- //
- string theatre_title = 3;
- //
- string background_image_url = 4;
- //
- string theatre_url = 5;
- //
- int64 hot_topic_id = 6;
- // Original one is hottopicsetid, here renamed
- int64 hot_topic_set_id = 7;
- // Original one is hottopictitle, here renamed
- string hot_topic_title = 8;
- //
- string hot_topic_url = 9;
- //
- int32 is_subscribe = 10;
- //
- map report = 11;
-}
-
-//
-message Threshold {
- //
- int32 bp = 1;
- //
- int32 days = 2;
- //
- string days_text = 3;
-}
-
-//
-message TitleDeliveryButton {
- //
- string icon = 1;
- //
- string title = 2;
- //
- string link = 3;
- //
- map report = 4;
-}
-
-//
-message UgcEpisode {
- //
- int64 id = 1;
- //
- int64 aid = 2;
- //
- int64 cid = 3;
- //
- string title = 4;
- //
- string cover = 5;
- //
- string cover_right_text = 6;
- //
- Page page = 7;
- //
- StatInfo vt = 8;
- //
- StatInfo danmaku = 9;
-}
-
-//
-message UgcIntroduction {
- //
- repeated Tag tags = 1;
- //
- Rating rating = 2;
- //
- Rank rank = 3;
- //
- repeated ViewMaterial bgm = 4;
- //
- repeated ViewMaterial sticker = 5;
- //
- repeated ViewMaterial video_source = 6;
- //
- int64 pubdate = 7;
- //
- repeated DescV2 desc = 8;
-}
-
-//
-message UgcSeasonActivity {
- //
- int32 type = 1;
- //
- int64 oid = 2;
- //
- int64 activity_id = 3;
- //
- string title = 4;
- //
- string intro = 5;
- //
- int32 day_count = 6;
- //
- int32 user_count = 7;
- //
- int64 join_deadline = 8;
- //
- int64 activity_deadline = 9;
- //
- int32 checkin_view_time = 10;
- //
- bool new_activity = 11;
- //
- UserActivity user_activity = 12;
- //
- SeasonShow season_show = 13;
-}
-
-//
-message UgcSeasons {
- //
- int64 id = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- string supernatant_title = 4;
- //
- repeated UgcSection section = 5;
- //
- string union_title = 6;
- //
- SeasonHead head = 7;
- //
- int64 ep_count = 8;
- //
- int32 season_type = 9;
- //
- UgcSeasonActivity activity = 10;
- //
- repeated string season_ability = 11;
- //
- string season_title = 12;
-}
-
-//
-message UgcSection {
- //
- int64 id = 1;
- //
- string title = 2;
- //
- int64 type = 3;
- //
- repeated UgcEpisode episodes = 4;
-}
-
-//
-message UpLikeImg {
- //
- string pre_img = 1;
- //
- string suc_img = 2;
- //
- string content = 3;
- //
- int64 type = 4;
-}
-
-//
-message User {
- //
- int64 mid = 1;
- //
- string name = 2;
- //
- string face = 3;
- //
- int64 follower = 4;
-}
-
-//
-message UserActivity {
- //
- int32 user_state = 1;
- //
- int64 last_checkin_date = 2;
- //
- int32 checkin_today = 3;
- //
- int32 user_day_count = 4;
- //
- int32 user_view_time = 5;
- //
- string portrait = 6;
-}
-
-//
-message UserList {
- //
- repeated User list = 1;
- //
- string title = 2;
-}
-
-//
-message UserStatus {
- //
- int32 show = 1;
- //
- int32 follow = 2;
-}
-
-//
-message ViewEpisode {
- //
- int64 ep_id = 1;
- //
- string badge = 2;
- //
- int32 badge_type = 3;
- //
- BadgeInfo badge_info = 4;
- //
- int32 duration = 5;
- //
- int32 status = 6;
- //
- string cover = 7;
- //
- int64 aid = 8;
- //
- string title = 9;
- //
- string movie_title = 10;
- //
- string subtitle = 11;
- //
- string long_title = 12;
- //
- string toast_title = 13;
- //
- int64 cid = 14;
- //
- string from = 15;
- //
- string share_url = 16;
- //
- string share_copy = 17;
- //
- string short_link = 18;
- //
- string vid = 19;
- //
- string release_date = 20;
- //
- Dimension dimension = 21;
- //
- Rights rights = 22;
- //
- Interaction interaction = 23;
- //
- string bvid = 24;
- //
- int32 archive_attr = 25;
- //
- string link = 26;
- //
- string link_type = 27;
- //
- string bmid = 28;
- //
- int64 pub_time = 29;
- //
- int32 pv = 30;
- //
- int32 ep_index = 31;
- //
- int32 section_index = 32;
- //
- repeated Staff up_infos = 33;
- //
- Staff up_info = 34;
- //
- string dialog_type = 35;
- //
- string toast_type = 36;
- //
- repeated MultiViewEp multi_view_eps = 37;
- //
- bool is_sub_view = 38;
- //
- bool is_view_hide = 39;
- //
- string jump_link = 40;
- //
- Stat stat_for_unity = 41;
- //
- map report = 42;
-}
-
-//
-message ViewMaterial {
- //
- int64 oid = 1;
- //
- int64 mid = 2;
- //
- string title = 3;
- //
- string author = 4;
- //
- string jump_url = 5;
-}
-
-//
-message Vip {
- //
- int32 type = 1;
- //
- int32 vip_status = 2;
- //
- int32 theme_type = 3;
- //
- VipLabel label = 4;
- //
- int32 is_vip = 5;
-}
-
-//
-message VipLabel {
- //
- string path = 1;
- //
- string text = 2;
- //
- string label_theme = 3;
-}
-
-//
-message WikiInfo {
- //
- string wiki_label = 1;
- //
- string wiki_url = 2;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/viewunite/pgcanymodel.proto b/bili-api-grpc/proto/bilibili/app/viewunite/pgcanymodel.proto
deleted file mode 100644
index a5458df98..000000000
--- a/bili-api-grpc/proto/bilibili/app/viewunite/pgcanymodel.proto
+++ /dev/null
@@ -1,247 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.viewunite.pgcanymodel;
-
-option java_multiple_files = true;
-
-import "bilibili/app/viewunite/common.proto";
-
-//
-message Earphone {
- //
- string product_model = 1;
- //
- string like_toast_text = 2;
- //
- string switch_toast_text = 3;
- //
- string like_toast_voice = 4;
-}
-
-//
-message EarphoneConf {
- //
- repeated Earphone sp_phones = 1;
-}
-
-//
-message MultiViewInfo {
- //
- bool is_multi_view_season = 1;
- //
- string changing_dance = 2;
-}
-
-//
-message OgvData {
- //
- int32 media_id = 1;
- //
- int64 season_id = 2;
- //
- int32 season_type = 3;
- //
- int32 show_season_type = 4;
- //
- Rights rights = 5;
- //
- UserStatus user_status = 6;
- //
- int64 aid = 7;
- //
- Stat stat = 8;
- //
- int32 mode = 9;
- //
- Publish publish = 10;
- //
- PlayStrategy play_strategy = 11;
- //
- MultiViewInfo multi_view_info = 12;
- //
- OgvSwitch ogv_switch = 13;
- //
- int32 total_ep = 14;
- //
- bilibili.app.viewunite.common.NewEp new_ep = 15;
- //
- Reserve reserve = 16;
- //
- int32 status = 17;
- //
- repeated PlayFloatLayerActivity activity_float_layer = 18;
- //
- EarphoneConf earphone_conf = 19;
- //
- string cover = 20;
- //
- string square_cover = 21;
- //
- string share_url = 22;
- //
- string short_link = 23;
- //
- string title = 24;
- //
- string horizontal_cover169 = 25;
- //
- string horizontal_cover1610 = 26;
- //
- int32 has_can_play_ep = 27;
-}
-
-//
-message OgvSwitch {
- //
- int32 reduce_short_title_spacing = 1;
- //
- int32 merge_position_section_for_cinema = 2;
- //
- int32 merge_preview_section = 3;
- //
- int32 enable_show_vt_info = 4;
-}
-
-// 播放器浮层广告(?)
-message PlayFloatLayerActivity {
- //
- int32 id = 1;
- //
- string title = 2;
- //
- int32 type = 3;
- //
- int32 ad_badge_type = 4;
- //
- string link = 5;
- //
- string pic_url = 6;
- //
- string pic_anima_url = 7;
- //
- bilibili.app.viewunite.common.BadgeInfo badge = 8;
- //
- int64 show_rate_time = 9;
-}
-
-//
-message PlayStrategy {
- //
- repeated string strategies = 1;
- //
- int32 recommend_show_strategy = 2;
- //
- string auto_play_toast = 3;
-}
-
-//
-message Publish {
- //
- string pub_time = 1;
- //
- string pub_time_show = 2;
- //
- int32 is_started = 3;
- //
- int32 is_finish = 4;
- //
- int32 weekday = 5;
- //
- string release_date_show = 6;
- //
- string time_length_show = 7;
- //
- int32 unknow_pub_date = 8;
- //
- string update_info_desc = 9;
-}
-
-//
-message Reserve {
- //
- repeated bilibili.app.viewunite.common.ViewEpisode episodes = 1;
- //
- string tip = 2;
-}
-
-// 权限相关信息
-message Rights {
- //
- int32 allow_download = 1;
- //
- int32 allow_review = 2;
- //
- int32 can_watch = 3;
- //
- int32 is_cover_show = 4;
- //
- string copyright = 5;
- //
- string copyright_name = 6;
- //
- int32 allow_bp = 7;
- //
- int32 area_limit = 8;
- //
- int32 is_preview = 9;
- //
- int32 ban_area_show = 10;
- //
- int32 watch_platform = 11;
- //
- int32 allow_bp_rank = 12;
- //
- string resource = 13;
- //
- int32 forbid_pre = 14;
- //
- int32 only_vip_download = 15;
- //
- int32 new_allow_download = 16;
-}
-
-//
-message Stat {
- //
- string followers = 1;
- //
- bilibili.app.viewunite.common.StatInfo play_data = 2;
-}
-
-//
-message UserStatus {
- //
- int32 show = 1;
- //
- int32 follow = 2;
- //
- int32 follow_status = 3;
- //
- int32 pay = 4;
- //
- int32 sponsor = 5;
- //
- int32 vip = 6;
- // vip 是否被冻结
- int32 vip_frozen = 7;
- //
- WatchProgress watch_progress = 8;
-}
-
-//
-message ViewPgcAny {
- //
- OgvData ogv_data = 1;
- //
- map all_up_info = 2;
-}
-
-//
-message WatchProgress {
- //
- int64 last_ep_id = 1;
- //
- string last_ep_index = 2;
- //
- int64 last_time = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/viewunite/ugcanymodel.proto b/bili-api-grpc/proto/bilibili/app/viewunite/ugcanymodel.proto
deleted file mode 100644
index c25989412..000000000
--- a/bili-api-grpc/proto/bilibili/app/viewunite/ugcanymodel.proto
+++ /dev/null
@@ -1,136 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.viewunite.ugcanymodel;
-
-option java_multiple_files = true;
-
-import "bilibili/app/viewunite/common.proto";
-
-//
-message Dislike {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- repeated DislikeReason reasons = 3;
-}
-
-//
-message DislikeReason {
- //
- int64 id = 1;
- //
- int64 mid = 2;
- //
- int32 rid = 3;
- //
- int64 tag_id = 4;
- //
- string name = 5;
-}
-
-//
-message ElecRank {
- //
- repeated ElecRankItem list = 1;
- //
- int64 count = 2;
- //
- string text = 3;
-}
-
-//
-message ElecRankItem {
- //
- string avatar = 1;
- //
- string nickname = 2;
- //
- string message = 3;
- //
- int64 mid = 4;
-}
-
-//
-message Premiere {
- //
- PremiereState premiere_state = 1;
- //
- int64 start_time = 2;
- //
- int64 service_time = 3;
- //
- int64 room_id = 4;
-}
-
-//
-message PremiereReserve {
- //
- int64 reserve_id = 1;
- //
- int64 count = 2;
- //
- bool is_follow = 3;
-}
-
-//
-message PremiereResource {
- //
- Premiere premiere = 1;
- //
- PremiereReserve reserve = 2;
- //
- PremiereText text = 3;
-}
-
-enum PremiereState {
- //
- premiere_none = 0;
- //
- premiere_before = 1;
- //
- premiere_in = 2;
- //
- premiere_after = 3;
-}
-
-//
-message PremiereText {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- string online_text = 3;
- //
- string online_icon = 4;
- //
- string online_icon_dark = 5;
- //
- string intro_title = 6;
- //
- string intro_icon = 7;
- //
- string guidance_pulldown = 8;
- //
- string guidance_entry = 9;
- //
- string intro_icon_night = 10;
-}
-
-//
-message ViewUgcAny {
- //
- PremiereResource premiere = 1;
- //
- Dislike dislike = 2;
- //
- string short_link = 3;
- //
- string share_subtitle = 4;
- //
- repeated bilibili.app.viewunite.common.Page pages = 5;
- //
- ElecRank elec_rank = 6;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/viewunite/v1/viewunite.proto b/bili-api-grpc/proto/bilibili/app/viewunite/v1/viewunite.proto
deleted file mode 100644
index 4f5aa260a..000000000
--- a/bili-api-grpc/proto/bilibili/app/viewunite/v1/viewunite.proto
+++ /dev/null
@@ -1,837 +0,0 @@
-syntax = "proto3";
-
-package bilibili.app.viewunite.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/app/viewunite/common.proto";
-import "bilibili/pagination/pagination.proto";
-import "google/protobuf/any.proto";
-
-// 统一视频信息接口 (7.41.0+)
-service View {
- //
- rpc ArcRefresh(ArcRefreshReq) returns (ArcRefreshReply);
- // 视频详情页下方推荐
- rpc RelatesFeed(RelatesFeedReq) returns (RelatesFeedReply);
- //
- rpc View(ViewReq) returns (ViewReply);
- //
- rpc ViewProgress(ViewProgressReq) returns (ViewProgressReply);
-}
-
-//
-message ActivityResource {
- //
- string dark_text_color = 1;
- //
- string divider_color = 2;
- //
- string bg_color = 3;
- //
- string selected_bg_color = 4;
- //
- string text_color = 5;
- //
- string light_text_color = 6;
-}
-
-// 业务信息
-message Arc {
- //
- int64 aid = 1;
- //
- int64 cid = 2;
- //
- int64 duration = 3;
- //
- bilibili.app.viewunite.common.Stat stat = 4;
- //
- string bvid = 5;
- //
- int32 copyright = 6;
- //
- Rights right = 7;
- //
- string cover = 8;
- //
- int64 type_id = 9;
- //
- string title = 10;
-}
-
-//
-message ArcRefreshReply {
- //
- bilibili.app.viewunite.common.Stat stat = 1;
- //
- SimpleReqUser req_user = 2;
- //
- SimpleArc arc = 3;
- //
- Online online = 4;
- //
- LikeConfig like_config = 5;
-}
-
-//
-message ArcRefreshReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
-}
-
-//
-message AttentionCard {
- //
- repeated ShowTime show_time = 1;
-}
-
-//
-message BizFollowVideoParam {
- //
- int64 season_id = 1;
-}
-
-//
-message BizJumpLinkParam {
- //
- string url = 1;
-}
-
-//
-message BizReserveActivityParam {
- //
- int64 activity_id = 1;
- //
- string from = 2;
- //
- string type = 3;
- //
- int64 oid = 4;
- //
- int64 reserve_id = 5;
-}
-
-//
-message BizReserveGameParam {
- //
- int64 game_id = 1;
-}
-
-enum BizType {
- //
- BizTypeNone = 0;
- //
- BizTypeFollowVideo = 1;
- //
- BizTypeReserveActivity = 2;
- //
- BizTypeJumpLink = 3;
- //
- BizTypeFavSeason = 4;
- //
- BizTypeReserveGame = 5;
-}
-
-//
-message Button {
- //
- string title = 1;
- //
- string uri = 2;
- //
- string icon = 3;
- //
- JumpShowType jump_show_type = 4;
-}
-
-//
-message ChargingPlus {
- //
- bool pass = 1;
- //
- repeated PlayToast play_toast = 2;
-}
-
-//
-message Chronos {
- //
- string md5 = 1;
- //
- string file = 2;
- //
- string sign = 3;
-}
-
-//
-message ChronosParam {
- //
- string engine_version = 1;
- //
- string message_protocol = 2;
- //
- string service_key = 3;
-}
-
-// 推广信息
-message CM {
- //
- google.protobuf.Any cm_under_player = 1;
- //
- google.protobuf.Any ads_control = 2;
- //
- repeated google.protobuf.Any source_content = 3;
-}
-
-//
-message CommandDm {
- //
- int64 id = 1;
- //
- int64 oid = 2;
- //
- int64 mid = 3;
- //
- string command = 4;
- //
- string content = 5;
- //
- int32 progress = 6;
- //
- string ctime = 7;
- //
- string mtime = 8;
- //
- string extra = 9;
- //
- string idstr = 10;
-}
-
-// 播放器配置
-message Config {
- //
- Online online = 1;
- //
- PlayerIcon player_icon = 2;
- //
- StoryEntrance story_entrance = 3;
-}
-
-// 视频播放时弹出的卡片
-message ContractCard {
- // 在第几秒弹出
- float display_progress = 1;
- //
- int64 display_accuracy = 2;
- // 弹出后停留的时间
- int64 display_duration = 3;
- // 展示方式, 暂未知对应关系
- int32 show_mode = 4;
- // 页面类型, 暂未知对应关系
- int32 page_type = 5;
- //
- UpperInfos upper = 6;
- //
- int32 is_follow_display = 7;
- // 卡片的文字说明信息
- ContractText text = 8;
- //
- int64 follow_display_end_duration = 9;
- //
- int32 is_play_display = 10;
- //
- int32 is_interact_display = 11;
-}
-
-// 视频播放时弹出的卡片的文字说明信息
-message ContractText {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- string inline_title = 3;
-}
-
-//
-message Control {
- //
- bool limit = 1;
-}
-
-//
-message DmResource {
- //
- repeated CommandDm command_dms = 1;
- //
- AttentionCard attention = 2;
- //
- repeated OperationCard cards = 3;
-}
-
-enum ECode {
- //
- CODE_DEFAULT = 0;
- //
- CODE_404 = 1;
- // 青少年限制
- CODE_TEENAGER = 78301;
-}
-
-//
-message ECodeConfig {
- //
- string redirect_url = 1;
-}
-
-//
-message IconData {
- //
- string meta_json = 1;
- //
- string sprits_img = 2;
-}
-
-// 视频介绍 Tab
-message IntroductionTab {
- //
- string title = 1;
- //
- repeated bilibili.app.viewunite.common.Module modules = 2;
-}
-
-enum JumpShowType {
- //
- JST_DEFAULT = 0;
- //
- JST_FULLSCREEN = 1;
- //
- JST_HALFSCREEN = 2;
-}
-
-//
-message LikeConfig {
- bilibili.app.viewunite.common.UpLikeImg triple_like = 1;
- //
- string like_animation = 2;
-}
-
-// 素材详情
-message Material {
- //
- string icon = 1;
- //
- string text = 2;
- //
- string url = 3;
- //
- MaterialBizType type = 4;
- //
- string param = 5;
- //
- string static_icon = 6;
- //
- string bg_color = 7;
- //
- string bg_pic = 8;
- //
- int32 jump_type = 9;
- //
- PageType page_type = 10;
- //
- bool need_login = 11;
-}
-
-// 素材类型
-enum MaterialBizType {
- //
- NONE = 0;
- //
- ACTIVITY = 1;
- //
- BGM = 2;
- //
- EFFECT = 3;
- //
- SHOOT_SAME = 4;
- //
- SHOOT_TOGETHER = 5;
- //
- ACTIVITY_ICON = 6;
- //
- NEW_BGM = 7;
-}
-
-// 素材来源
-enum MaterialSource {
- //
- DEFAULT = 0;
- // 必剪素材
- BIJIAN = 1;
-}
-
-//
-message Online {
- //
- bool online_show = 1;
-}
-
-//
-message OperationCard {
- //
- int64 id = 1;
- //
- int32 from = 2;
- //
- int32 to = 3;
- //
- bool status = 4;
- //
- BizType biz_type = 5;
- //
- OperationCardContent content = 6;
- //
- oneof param {
- //
- BizFollowVideoParam follow = 7;
- //
- BizReserveActivityParam reserve = 8;
- //
- BizJumpLinkParam jump = 9;
- //
- BizReserveGameParam game = 10;
- }
-}
-
-//
-message OperationCardContent {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- string icon = 3;
- //
- string button_title = 4;
- //
- string button_selected_title = 5;
- //
- bool show_selected = 6;
-}
-
-//
-enum PageCategory {
- //
- COMMON_PAGE = 0;
- //
- ACTIVITY_PAGE = 1;
-}
-
-//
-message PageControl {
- Control toast_show = 1;
- Control material_show = 2;
- Control up_show = 3;
-}
-
-// 页面类型
-enum PageType {
- // H5页面(Webview)
- H5 = 0;
- // 原生页面(native)
- NA = 1;
-}
-
-//
-message PlayerIcon {
- //
- string url1 = 1;
- //
- string hash1 = 2;
- //
- string url2 = 3;
- //
- string hash2 = 4;
- //
- string drag_left_png = 5;
- //
- string middle_png = 6;
- //
- string drag_right_png = 7;
- //
- IconData drag_data = 8;
- //
- IconData nodrag_data = 9;
-}
-
-//
-message PlayToast {
- //
- PlayToastEnum business = 1;
- //
- string icon_url = 2;
- //
- string text = 3;
-}
-
-enum PlayToastEnum {
- //
- PLAYTOAST_UNKNOWN = 0;
- //
- PLAYTOAST_CHARGINGPLUS = 1;
-}
-
-//
-message PointMaterial {
- //
- string url = 1;
- //
- MaterialSource material_source = 2;
-}
-
-//
-message Relate {
- //
- int64 device_type = 1;
- //
- bilibili.pagination.Pagination pagination = 2;
-}
-
-// 视频详情页下方推荐 Reply
-message RelatesFeedReply {
- //
- repeated bilibili.app.viewunite.common.RelateCard relates = 1;
- //
- bilibili.pagination.Pagination pagination = 2;
-}
-
-// 视频详情页下方推荐 Req
-message RelatesFeedReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- string from = 3;
- //
- string spmid = 4;
- //
- string from_spmid = 5;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
- //
- bilibili.pagination.Pagination pagination = 7;
- //
- string session_id = 8;
- //
- int64 auto_play = 9;
- //
- string from_track_id = 10;
-}
-
-//
-message ReplyStyle {
- //
- string badge_url = 1;
- //
- string badge_text = 2;
- //
- int64 badge_type = 3;
-}
-
-//
-message ReplyTab {
- //
- ReplyStyle reply_style = 1;
- //
- string title = 2;
- //
- TabControl control = 3;
-}
-
-//
-message ReqUser {
- //
- int32 favorite = 1;
- //
- int32 like = 2;
- //
- int32 coin = 3;
- //
- int32 fav_season = 4;
- //
- int32 follow = 5;
- //
- int32 dislike = 6;
- // 头像旁充电按钮
- Button elec_plus_btn = 7;
- //
- ChargingPlus charging_plus = 8;
-}
-
-//
-message Rights {
- //
- bool only_vip_download = 1;
- //
- bool no_reprint = 2;
- //
- bool download = 3;
-}
-
-//
-message ShowTime {
- //
- int32 start_time = 1;
- //
- int32 end_time = 2;
- //
- double pos_x = 3;
- //
- double pos_y = 4;
-}
-
-//
-message SimpleArc {
- //
- int32 copyright = 1;
-}
-
-//
-message SimpleReqUser {
- //
- int32 favorite = 1;
- //
- int32 like = 2;
- //
- int32 coin = 3;
-}
-
-//
-message StoryEntrance {
- //
- bool arc_play_story = 1;
- //
- string story_icon = 2;
- //
- bool arc_landscape_story = 3;
- //
- string landscape_icon = 4;
- //
- bool play_story = 5;
-}
-
-//
-message Tab {
- //
- repeated TabModule tab_module = 1;
- //
- string tab_bg = 2;
- //
- TabControl danmaku_entrance = 3;
-}
-
-// 评论区/弹幕 Tab 控制
-message TabControl {
- //
- bool limit = 1;
- //
- bool disable = 2;
- //
- string disable_click_tip = 3;
-}
-
-//
-message TabModule {
- //
- TabType tab_type = 1;
- //
- oneof tab {
- //
- IntroductionTab introduction = 2;
- //
- ReplyTab reply = 3;
- //
- bilibili.app.viewunite.common.ActivityTab activity_tab = 4;
- }
-}
-
-enum TabType {
- //
- TAB_NONE = 0;
- // 详情 Tab
- TAB_INTRODUCTION = 1;
- // 评论区 Tab
- TAB_REPLY = 2;
- // OGV 活动信息 Tab
- TAB_OGV_ACTIVITY = 3;
-}
-
-//
-enum UnionType {
- //
- UGC = 0;
- //
- OGV = 1;
-}
-
-// UP主信息(可是Upper这个... 程序员英文不过关吧? )
-message UpperInfos {
- // 粉丝数
- uint64 fans_count = 1;
- // 过去半年内的稿件数
- uint64 arc_count_last_half_year = 2;
- //
- int64 first_up_dates = 3;
- // UP稿件总播放数
- uint64 total_play_count = 4;
-}
-
-//
-message VideoGuide {
- //
- repeated Material material = 1;
- //
- VideoViewPoint video_point = 2;
- //
- ContractCard contract_card = 3;
-}
-
-//
-message VideoPoint {
- //
- int32 type = 1;
- //
- int64 from = 2;
- //
- int64 to = 3;
- //
- string content = 4;
- //
- string cover = 5;
- //
- string logo_url = 6;
-}
-
-//
-message VideoShot {
- //
- string pv_data = 1;
- //
- int32 img_x_len = 2;
- //
- int32 imd_x_size = 3;
- //
- int32 img_y_len = 4;
- //
- int32 img_y_size = 5;
- //
- repeated string image = 6;
-}
-
-//
-message VideoViewPoint {
- //
- repeated VideoPoint points = 1;
- //
- PointMaterial point_material = 2;
- //
- bool point_permanent = 3;
-}
-
-//
-message ViewBase {
- //
- UnionType union_type = 1;
- //
- PageType page_type = 2;
- //
- PageControl control = 3;
- //
- ActivityResource activity_resource = 4;
- //
- Config config = 5;
-}
-
-//
-message ViewProgressReply {
- //
- VideoGuide video_guide = 1;
- //
- Chronos chronos = 2;
- //
- VideoShot arc_shot = 3;
- //
- DmResource dm = 4;
-}
-
-//
-message ViewProgressReq {
- //
- uint64 aid = 1;
- //
- uint64 cid = 2;
- //
- uint64 up_mid = 3;
- //
- ChronosParam chronos_param = 4;
- //
- UnionType type = 5;
-}
-
-//
-message ViewReply {
- //
- ViewBase view_base = 1;
- //
- Arc arc = 2;
- //
- ReqUser req_user = 3;
- //
- bilibili.app.viewunite.common.Owner owner = 4;
- //
- Tab tab = 5;
- //
- google.protobuf.Any supplement = 6;
- //
- CM cm = 7;
- //
- ECode ecode = 8;
- //
- ECodeConfig ecode_config = 9;
- //
- map report = 10;
-}
-
-//
-message ViewReq {
- //
- uint64 aid = 1;
- //
- string bvid = 2;
- //
- string from = 3;
- //
- string spmid = 4;
- //
- string from_spmid = 5;
- //
- string session_id = 6;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 7;
- //
- string track_id = 8;
- //
- map extra_content = 9;
- //
- string play_mode = 10;
- //
- Relate relate = 11;
- //
- string biz_extra = 12;
- //
- string ad_extra = 13;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/editor/notify.proto b/bili-api-grpc/proto/bilibili/broadcast/message/editor/notify.proto
deleted file mode 100644
index 931f92be5..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/editor/notify.proto
+++ /dev/null
@@ -1,32 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.editor;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-//
-service OperationNotify {
- //
- rpc OperationNotify(google.protobuf.Empty) returns (stream Notify);
-}
-
-message Notify {
- // 消息唯一标示
- int64 msg_id = 1;
- // 消息类型
- int32 msg_type = 2;
- // 接收方uid
- int64 receiver_uid = 3;
- //接收方类型
- int32 receiver_type = 4;
- // 故事的版本
- int64 story_version = 5;
- // 操作结果的hash值
- int64 op_hash = 6;
- // 操作产生用户的uid
- int64 op_sender = 7;
- // patch内容
- string op_content = 8;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/im/notify.proto b/bili-api-grpc/proto/bilibili/broadcast/message/im/notify.proto
deleted file mode 100644
index 4debc6bb2..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/im/notify.proto
+++ /dev/null
@@ -1,101 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.im;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-//
-service Notify {
- //
- rpc WatchNotify(google.protobuf.Empty) returns (stream NotifyRsp);
-}
-
-//
-enum PLType {
- //
- EN_PAYLOAD_NORMAL = 0;
- //
- EN_PAYLOAD_BASE64 = 1;
-}
-
-//
-enum CmdId {
- // 非法cmd
- EN_CMD_ID_INVALID = 0;
- // 服务端主动发起
- EN_CMD_ID_MSG_NOTIFY = 1;
- //
- EN_CMD_ID_KICK_OUT = 2;
-}
-
-//
-message NotifyRsp {
- //
- uint64 uid=1;
- // 命令id
- uint64 cmd=2;
- //
- bytes payload=3;
- //
- PLType payload_type=4;
-}
-
-//
-message Msg {
- // 发送方uid
- uint64 sender_uid = 1;
- // 接收方类型
- int32 receiver_type = 2;
- // 接收方id
- uint64 receiver_id = 3;
- // 客户端的序列id 用于服务端去重
- uint64 cli_msg_id = 4;
- // 消息类型
- int32 msg_type = 5;
- // 消息内容
- string content = 6;
- // 服务端的序列号
- uint64 msg_seqno = 7;
- // 消息发送时间(服务端时间)
- uint64 timestamp = 8;
- // at用户列表
- repeated uint64 at_uids = 9;
- // 多人消息
- repeated uint64 recver_ids = 10;
- // 消息唯一标示
- uint64 msg_key = 11;
- // 消息状态
- uint32 msg_status = 12;
- // 是否为系统撤销
- bool sys_cancel = 13;
- // 是否是多聊消息 目前群通知管理员的部分通知属于该类消息
- uint32 is_multi_chat = 14;
- // 表示撤回的消息的session_seqno 用以后续的比较 实现未读数的正确显示
- uint64 withdraw_seqno = 15;
- // 通知码
- string notify_code =16;
- // 消息来源
- uint32 msg_source = 17;
-}
-
-//
-message NotifyInfo {
- //
- uint32 msg_type = 1;
- //
- uint64 talker_id = 2;
- //
- uint32 session_type =3;
-}
-
-//
-message ReqServerNotify {
- // 最新序列号
- uint64 lastest_seqno = 1;
- // 即时消息 该类消息主要用于系统通知 当客户端sync msg时 不会sync到此类消息
- Msg instant_msg = 2;
- //
- NotifyInfo notify_info = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/main/dm.proto b/bili-api-grpc/proto/bilibili/broadcast/message/main/dm.proto
deleted file mode 100644
index de3174f26..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/main/dm.proto
+++ /dev/null
@@ -1,65 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.main;
-
-option java_multiple_files = true;
-
-// 实时弹幕事件
-message DanmukuEvent {
- // 弹幕列表
- repeated DanmakuElem elems = 1;
-}
-
-// 弹幕条目
-message DanmakuElem {
- // 弹幕dmid
- int64 id = 1;
- // 弹幕出现位置(单位为ms)
- int32 progress = 2;
- // 弹幕类型
- int32 mode = 3;
- // 弹幕字号
- int32 fontsize = 4;
- // 弹幕颜色
- uint32 color = 5;
- // 发送着mid hash
- string mid_hash = 6;
- // 弹幕正文
- string content = 7;
- // 发送时间
- int64 ctime = 8;
- // 弹幕动作
- string action = 9;
- // 弹幕池
- int32 pool = 10;
- // 弹幕id str
- string id_str = 11;
-}
-
-// 互动弹幕
-message CommandDm {
- // 弹幕id
- int64 id = 1;
- // 对象视频cid
- int64 oid = 2;
- // 发送者mid
- int64 mid = 3;
- //
- int32 type = 4;
- // 互动弹幕指令
- string command = 5;
- // 互动弹幕正文
- string content = 6;
- // 弹幕状态
- int32 state = 7;
- // 出现时间
- int32 progress = 8;
- // 创建时间
- string ctime = 9;
- // 发布时间
- string mtime = 10;
- // 扩展json数据
- string extra = 11;
- // 弹幕id str类型
- string idStr = 12;
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/main/native.proto b/bili-api-grpc/proto/bilibili/broadcast/message/main/native.proto
deleted file mode 100644
index f57ef51f4..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/main/native.proto
+++ /dev/null
@@ -1,38 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.main;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-//
-service NativePage {
- //
- rpc WatchNotify(google.protobuf.Empty) returns (stream NativePageEvent);
-}
-
-//
-message NativePageEvent {
- // Native页ID
- int64 PageID = 1;
- //
- repeated EventItem Items = 2;
-}
-
-//
-message EventItem {
- // 组件标识
- int64 ItemID = 1;
- // 组件类型
- string Type = 2;
- // 进度条数值
- int64 Num = 3;
- // 进度条展示数值
- string DisplayNum = 4;
- // h5的组件标识
- string WebKey = 5;
- // 活动统计维度
- // 0:用户维度 1:规则维度
- int64 dimension = 6;
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/main/resource.proto b/bili-api-grpc/proto/bilibili/broadcast/message/main/resource.proto
deleted file mode 100644
index d71f35678..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/main/resource.proto
+++ /dev/null
@@ -1,63 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.main;
-
-import "google/protobuf/empty.proto";
-
-option java_multiple_files = true;
-
-//
-service Resource {
- //
- rpc TopActivity(google.protobuf.Empty) returns (stream TopActivityReply);
-}
-
-//
-message TopActivityReply {
- // 当前生效的资源
- TopOnline online = 1;
- // 对online内容进行hash和上次结果一样则不重新加载
- string hash = 2;
-}
-
-// 当前生效的资源
-message TopOnline {
- // 活动类型
- // 1:七日活动 2:后台配置
- int32 type = 1;
- // 图标
- string icon = 2;
- // 跳转链接
- string uri = 3;
- // 资源状态标识(后台配置)
- string unique_id = 4;
- // 动画资源
- Animate animate = 5;
- // 红点
- RedDot red_dot = 6;
- // 活动名称
- string name = 7;
- // 轮询间隔 单位秒
- int64 interval = 8;
-}
-
-// 动画资源
-message Animate {
- // 动效结束展示icon
- string icon = 1;
- // 7日活动动画
- string json = 2;
- // s10活动svg动画
- string svg = 3;
- // 循环次数(默认0不返回 表示无限循环)
- int32 loop = 4;
-}
-
-// 红点
-message RedDot {
- // 红点类型
- // 1:纯红点 2:数字红点
- int32 type = 1;
- // 如果是数字红点 显示的数字
- int32 number = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/main/search.proto b/bili-api-grpc/proto/bilibili/broadcast/message/main/search.proto
deleted file mode 100644
index 75ee915dd..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/main/search.proto
+++ /dev/null
@@ -1,31 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.main;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-import "bilibili/app/dynamic/v2/dynamic.proto";
-
-service Search {
- rpc ChatResultPush (google.protobuf.Empty) returns (stream ChatResult);
-}
-
-//
-message Bubble {
- repeated bilibili.app.dynamic.v2.Paragraph paragraphs = 1;
-}
-
-//
-message ChatResult {
- //
- int32 code = 1;
- //
- string session_id = 2;
- //
- repeated Bubble bubble = 3;
- //
- string rewrite_word = 4;
- //
- string title = 5;
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/ogv/freya.proto b/bili-api-grpc/proto/bilibili/broadcast/message/ogv/freya.proto
deleted file mode 100644
index f6151e0c9..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/ogv/freya.proto
+++ /dev/null
@@ -1,230 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.ogv;
-
-option java_multiple_files = true;
-
-// 播放状态
-enum PlayStatus {
- // 暂停
- Pause = 0;
- // 播放
- Play = 1;
- // 终止
- End = 2;
-}
-
-// 房间类型
-enum RoomType {
- // 私密
- Private = 0;
- // 公开
- Open = 1;
-}
-
-// 信息通知发送领域
-enum MessageDomain {
- // 默认
- DefaultDomain = 0;
- // 房间用户
- RoomMid = 1;
- // 系统通知
- SystemInfo = 2;
-}
-
-// 通知信息类型
-enum MessageType {
- // 默认
- DefaultType = 0;
- // 房间用户
- ChatMessage = 1;
- // 系统通知
- SystemMessage = 2;
-}
-
-// 触发通知类型
-enum TriggerType {
- // 默认
- DefaultTrigger = 0;
- // 关注、取消关注
- Relation = 1;
-}
-
-// 房间人员变更事件
-message RoomMemberChangeEvent {
- // 房间id
- int64 room_id = 1;
- // 房主id
- int64 owner_id = 2;
- // 房间成员列表
- repeated UserInfoProto members = 3;
- // 提示信息
- MessageProto message = 4;
-}
-
-// 播放进度同步事件
-message ProgressSyncEvent {
- // 房间id
- int64 room_id = 1;
- // 播放中的season_id
- int64 season_id = 2;
- // 播放中的episode_id
- int64 episode_id = 3;
- // 播放状态
- PlayStatus status = 4;
- // 房主播放进度
- int64 progress = 5;
- // 提示信息
- MessageProto message = 6;
-}
-
-// 房间状态更新
-message RoomUpdateEvent {
- // 房间id
- int64 room_id = 1;
- // 房间变更状态
- RoomType type = 2;
- // 提示信息
- MessageProto message = 3;
-}
-
-// 房间销毁通知
-message RoomDestroyEvent {
- // 房间id
- int64 room_id = 1;
- // 提示信息
- MessageProto message = 4;
-}
-
-// 房间触发通知
-message RoomTriggerEvent {
- // 操作人
- int64 mid = 1;
- // 提示信息
- MessageProto message = 2;
- // 触发类型
- TriggerType trigger = 3;
-}
-
-//用户信息
-message UserInfoProto {
- // 用户id
- int64 mid = 1;
- // 用户头像url
- string face = 2;
- // 昵称
- string nickname = 3;
- // 等级
- int32 level = 4;
- // 签名
- string sign = 5;
- // 大会员信息
- VipProto vip = 6;
- // 身份认证信息
- OfficialProto official = 7;
- // 挂件信息
- PendantProto pendant = 8;
- // 设备buvid
- string buvid = 9;
-}
-
-//通知信息
-message MessageProto {
- // 可带占位符匹配的消息体 ep "还没有其他小伙伴,[去邀请>]"
- string content = 1;
- // 消息体类型
- // 0:json格式的文本消息 1:支持全文本可点(破冰)
- int32 content_type = 2;
-}
-
-//大会员信息
-message VipProto {
- int32 type = 1;
- int32 status = 2;
- int64 due_date = 3;
- int32 vip_pay_type = 4;
- int32 theme_type = 5;
- // 大会员角标
- // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
- int32 avatar_subscript = 6;
- // 昵称色值,可能为空,色值示例:#FFFB9E60
- string nickname_color = 7;
-}
-
-//认证信息
-message OfficialProto {
- int32 role = 1;
- string title = 2;
- string desc = 3;
- int32 type = 4;
-}
-
-//挂件信息
-message PendantProto {
- int32 pid = 1;
- string name = 2;
- string image = 3;
- int64 expire = 4;
- string image_enhance = 5;
-}
-
-// 通用信息通知
-message MessageEvent {
- // 房间id
- int64 room_id = 1;
- // 消息id
- int64 msg_id = 2;
- // 消息发送服务端时间 时间戳 单位秒
- int64 ts = 3;
- // 信息通知发送主体id
- int64 oid = 4;
- // 信息通知发送领域
- MessageDomain domain = 5;
- // 通知信息类型
- MessageType type = 6;
- // 提示信息
- MessageProto message = 7;
- // 消息发送用户信息
- UserInfoProto user = 8;
- // 消息id str类型
- string msg_id2 = 9;
-}
-
-// 聊天信息清除通知
-message RemoveChatEvent {
- // 房间id
- int64 room_id = 1;
- // 撤回的聊天信息id
- int64 msg_id = 2;
- // 提示信息
- MessageProto message = 3;
-}
-
-// "一起看"房间事件
-message FreyaEventBody {
- // 房间id
- int64 room_id = 1;
- // 接收事件消息的白名单用户
- repeated int64 white_mid = 2;
- // 不处理信息的黑名单用户 优先级低于白名单 当白名单有数据时 忽略黑名单
- repeated int64 ignore_mid = 3;
- //命令类型
- oneof event {
- // 房间人员变更事件
- RoomMemberChangeEvent member_change = 4;
- // 播放进度同步事件
- ProgressSyncEvent progress = 5;
- // 房间状态更新
- RoomUpdateEvent room_update = 6;
- // 通用信息通知
- MessageEvent message = 7;
- // 聊天信息清除通知
- RemoveChatEvent remove_chat = 8;
- // 房间销毁通知
- RoomDestroyEvent room_destroy = 9;
- // 房间触发通知
- RoomTriggerEvent room_trigger = 10;
- }
- // 消息序列号
- int64 sequence_id = 100;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/ogv/live.proto b/bili-api-grpc/proto/bilibili/broadcast/message/ogv/live.proto
deleted file mode 100644
index af95baed4..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/ogv/live.proto
+++ /dev/null
@@ -1,46 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.ogv;
-
-option java_multiple_files = true;
-
-// 开播事件
-message LiveStartEvent {}
-
-// 直播中止事件
-message LiveEndEvent {}
-
-// 在线人数事件
-message LiveOnlineEvent {
- //在线人数
- int64 online = 1;
-}
-
-// 变更通知
-message LiveUpdateEvent {
- // 直播后状态
- // 1:下线 2:转点播
- int32 after_premiere_type = 1;
- // 直播开始绝对时间 单位ms
- int64 start_time = 2;
- // id
- string id = 3;
- // 服务端播放进度,未打散,负数表示距离开播时间,正数表示已开播时间,单位:毫秒
- // 用户实际播放进度:progress - delay_time
- int64 progress = 4;
-}
-
-// 直播间事件
-message CMDBody {
- //命令类型
- oneof event {
- // 开播事件
- LiveStartEvent start = 1;
- // 直播中止事件
- LiveEndEvent emergency = 2;
- // 在线人数事件
- LiveOnlineEvent online = 3;
- // 变更通知
- LiveUpdateEvent update = 4;
- }
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/tv/proj.proto b/bili-api-grpc/proto/bilibili/broadcast/message/tv/proj.proto
deleted file mode 100644
index 2d43af8e3..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/message/tv/proj.proto
+++ /dev/null
@@ -1,79 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.message.tv;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-//
-service Tv {
- // 投屏
- rpc Proj(google.protobuf.Empty) returns (stream ProjReply);
- // 直播状态
- rpc LiveStatus(google.protobuf.Empty) returns (stream LiveStatusNotify);
- // 赛事比分通知
- rpc Esports(google.protobuf.Empty) returns (stream EsportsNotify);
- // 直播插卡
- rpc Publicity(google.protobuf.Empty) returns (stream PublicityNotify);
- // 直转点
- rpc LiveSkip(google.protobuf.Empty) returns (stream LiveSkipNotify);
-}
-
-// 投屏
-message ProjReply {
- // 投屏命令
- // 1:起播 2:快进 3:快退 4:seek播放进度 5:暂停 6:暂停恢复
- int64 cmd_type = 1;
- // 用户id
- int64 mid = 2;
- // 稿件id
- int64 aid = 3;
- // 视频id
- int64 cid = 4;
- // 视频类型
- // 0:ugc 1:pgc 2:pugv
- int64 video_type = 5;
- // 单集id,pgc和pugv需要传
- int64 ep_id = 6;
- // 剧集id
- int64 season_id = 7;
- // seek 的位置,cmd位seek时有值,单位秒
- int64 seek_ts = 8;
- // 其他指令对应内容
- string extra = 9;
-}
-
-// 直播状态
-message LiveStatusNotify {
- // 直播状态
- // 1:开播 2:关播 3:截流 4:截流恢复
- int64 status = 1;
- // 文案
- string msg = 2;
- // 直播房间号
- int64 cid = 3;
-}
-
-//
-message EsportsNotify {
- // 直播房间号
- int64 cid = 1;
-}
-
-// 直播插卡
-message PublicityNotify {
- // 插卡id
- int64 publicity_id = 1;
- // 直播房间号
- int64 room_id = 2;
- // 直播间状态
- // 0:未开播 1:直播中 2:轮播中
- int64 status = 3;
-}
-
-// 直转点
-message LiveSkipNotify {
- // 直播id
- int64 live_id = 1;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/broadcast/v1/broadcast.proto b/bili-api-grpc/proto/bilibili/broadcast/v1/broadcast.proto
deleted file mode 100644
index 2c352e51d..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/v1/broadcast.proto
+++ /dev/null
@@ -1,113 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/rpc/status.proto";
-import "google/protobuf/any.proto";
-import "google/protobuf/empty.proto";
-
-// broadcast操作,对应每个target_path
-service Broadcast {
- // 用户鉴权
- rpc Auth(AuthReq) returns (AuthResp);
- // 心跳保活:成功心跳为4分45秒,重试心跳为30s,三次收不到进行重连(不超过5分45)
- rpc Heartbeat(HeartbeatReq) returns (HeartbeatResp);
- // 订阅target_path
- rpc Subscribe(TargetPath) returns (google.protobuf.Empty);
- // 取消订阅target_path
- rpc Unsubscribe(TargetPath) returns (google.protobuf.Empty);
- // 消息回执
- rpc MessageAck(MessageAckReq) returns (google.protobuf.Empty);
-}
-
-// broadcast连接隧道
-service BroadcastTunnel {
- // 创建双向stream连接隧道
- rpc CreateTunnel(stream BroadcastFrame) returns (stream BroadcastFrame);
-}
-
-//
-enum Action {
- UNKNOWN = 0; //
- UPDATE = 1; //
- DELETE = 2; //
-}
-
-// 鉴权请求,通过authorization验证绑定用户mid
-message AuthReq {
- // 冷启动id,算法uuid,重新起启会变
- string guid = 1;
- // 连接id,算法uuid,重连会变
- string conn_id = 2;
- // 最后收到的消息id,用于过虑重连后获取未读的消息
- int64 last_msg_id = 3;
-}
-
-// 鉴权返回
-message AuthResp {
-
-}
-
-// target_path:
-// "/" Service-Name "/" {method name} 参考 gRPC Request Path
-message BroadcastFrame {
- // 请求消息信息
- FrameOption options = 1;
- // 业务target_path
- string target_path = 2;
- // 业务pb内容
- google.protobuf.Any body = 3;
-}
-
-// message_id:
-// client: 本次连接唯一的消息id,可用于回执
-// server: 唯一消息id,可用于上报或者回执
-// sequence:
-// client: 客户端应该每次请求时frame seq++,会返回对应的对称req/resp
-// server: 服务端下行消息,只会返回默认值:0
-message FrameOption {
- // 消息id
- int64 message_id = 1;
- // frame序号
- int64 sequence = 2;
- // 是否进行消息回执(发出MessageAckReq)
- // downstream 上只有服务端设置为true,客户端响应
- // upstream 上只有客户端设置为true,服务端响应
- // 响应帧禁止设置is_ack,协议上禁止循环
- // 通常只有业务帧才可能设置is_ack, 因为协议栈(例如心跳、鉴权)另有响应约定
- bool is_ack = 3;
- // 业务状态码
- bilibili.rpc.Status status = 4;
- // 业务ack来源, 仅downstream时候由服务端填写.
- string ack_origin = 5;
- //
- int64 timestamp = 6;
-}
-
-// 心跳请求
-message HeartbeatReq{
-
-}
-
-// 心跳返回
-message HeartbeatResp{
-
-}
-
-// 消息回执
-message MessageAckReq {
- // 消息id
- int64 ack_id = 1;
- // ack来源,由业务指定用于埋点跟踪
- string ack_origin = 2;
- // 消息对应的target_path,方便业务区分和监控统计
- string target_path = 3;
-}
-
-// target_path
-message TargetPath {
- // 需要订阅的target_paths
- repeated string target_paths = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/v1/push.proto b/bili-api-grpc/proto/bilibili/broadcast/v1/push.proto
deleted file mode 100644
index 9aa5cd5ad..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/v1/push.proto
+++ /dev/null
@@ -1,132 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.v1;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-// Push
-service Push {
- rpc WatchMessage(google.protobuf.Empty) returns (stream PushMessageResp);
-}
-
-//
-enum LinkType {
- LINK_TYPE_UNKNOWN = 0; // 未知
- LINK_TYPE_BANGUMI = 1; // 番剧
- LINK_TYPE_VIDEO = 2; // 视频
- LINK_TYPE_LIVE = 3; // 直播
-}
-
-//
-message PageBlackList {
- //
- string id = 1;
-}
-
-//
-message PageView {
- //
- string id = 1;
-}
-
-//
-message PushMessageResp {
- // 业务类型
- enum Biz {
- // 未知
- BIZ_UNKNOWN = 0;
- // 视频
- BIZ_VIDEO = 1;
- // 直播
- BIZ_LIVE = 2;
- // 活动
- BIZ_ACTIVITY = 3;
- }
- // 消息类型
- enum Type {
- // 未知
- TYPE_UNKNOWN = 0;
- // 默认
- TYPE_DEFAULT = 1;
- // 热门
- TYPE_HOT = 2;
- // 实时
- TYPE_REALTIME = 3;
- // 推荐
- TYPE_RECOMMEND = 4;
- }
- // 展示未知
- enum Position {
- // 未知
- POS_UNKNOWN = 0;
- // 顶部
- POS_TOP = 1;
- }
- // Deprecated: 推送任务id,使用string
- int64 old_taskid = 1;
- // 业务
- // 1:是视频 2:是直播 3:是活动
- Biz biz = 2;
- // 类型
- // 1:是默认 2:是热门 3:是实时 4:是推荐
- Type type = 3;
- // 主标题
- string title = 4;
- // 副标题
- string summary = 5;
- // 图片地址
- string img = 6;
- // 跳转地址
- string link = 7;
- // 展示位置,1是顶部
- Position position = 8;
- // 展示时长(单位:秒),默认3秒
- int32 duration = 9;
- // 失效时间
- int64 expire = 10;
- // 推送任务id
- string taskid = 11;
- // 应用内推送黑名单
- // UGC: ugc-video-detail
- // PGC: pgc-video-detail
- // 一起看: pgc-video-detail-theater
- // 直播: live-room-detail
- // Story: ugc-video-detail-vertical
- // 播单黑名单 playlist-video-detail
- repeated PageBlackList page_blackList = 12;
- // 预留pvid
- repeated PageView page_view = 13;
- // 跳转资源
- TargetResource target_resource = 14;
- //
- int32 image_frame = 15;
- //
- int32 image_marker = 16;
- //
- int32 image_position = 17;
- //
- int64 job = 18;
-}
-
-//
-message TargetResource {
- //直播: roomid
- //UGC: avid
- //PGC: seasonid
- //Story: avid
- //举个例子
- //Type: LINK_TYPE_BANGUMI (番剧)
- //Resource: {"seasonid":"123"}
- //
- //Type: LINK_TYPE_VIDEO (视频)
- //Resource: {"avid":"123"}
- //
- //Type: LINK_TYPE_LIVE (直播)
- //Resource: {"roomid":"123"}
- //
- LinkType Type = 1;
- //
- map Resource = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/v1/room.proto b/bili-api-grpc/proto/bilibili/broadcast/v1/room.proto
deleted file mode 100644
index f73e63dbc..000000000
--- a/bili-api-grpc/proto/bilibili/broadcast/v1/room.proto
+++ /dev/null
@@ -1,80 +0,0 @@
-syntax = "proto3";
-
-package bilibili.broadcast.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/rpc/status.proto";
-import "google/protobuf/any.proto";
-
-//
-service BroadcastRoom {
- //
- rpc Enter(stream RoomReq) returns (stream RoomResp);
-}
-
-//
-message RoomErrorEvent {
- //
- bilibili.rpc.Status status = 1;
-}
-
-//
-message RoomJoinEvent {
-
-}
-
-//
-message RoomLeaveEvent {
-
-}
-
-//
-message RoomMessageEvent {
- //
- string target_path = 1;
- //
- google.protobuf.Any body = 2;
-}
-
-//
-message RoomOnlineEvent {
- //
- int32 online = 1;
- //
- int32 all_online = 2;
-}
-
-//
-message RoomReq {
- // {type}://{room_id}
- string id = 1;
- oneof event {
- //
- RoomJoinEvent join = 2;
- //
- RoomLeaveEvent leave = 3;
- //
- RoomOnlineEvent online = 4;
- //
- RoomMessageEvent msg = 5;
- }
-}
-
-//
-message RoomResp {
- // {type}://{room_id}
- string id = 1;
- oneof event {
- //
- RoomJoinEvent join = 2;
- //
- RoomLeaveEvent leave = 3;
- //
- RoomOnlineEvent online = 4;
- //
- RoomMessageEvent msg = 5;
- //
- RoomErrorEvent err = 6;
- }
-}
diff --git a/bili-api-grpc/proto/bilibili/cheese/gateway/player/v1/playurl.proto b/bili-api-grpc/proto/bilibili/cheese/gateway/player/v1/playurl.proto
deleted file mode 100644
index 893da448a..000000000
--- a/bili-api-grpc/proto/bilibili/cheese/gateway/player/v1/playurl.proto
+++ /dev/null
@@ -1,123 +0,0 @@
-syntax = "proto3";
-
-package bilibili.cheese.gateway.player.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/playurl/v1/playurl.proto";
-
-// 课程视频url
-service PlayURL {
- // 播放页信息
- rpc PlayView (PlayViewReq) returns (PlayViewReply);
- // 投屏地址
- rpc Project (ProjectReq) returns (ProjectReply);
-}
-
-// 播放页信息-请求
-message PlayViewReq {
- // 课程epid(与番剧不互通)
- int64 ep_id = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string from_spmid = 10;
- // 青少年模式
- int32 teenagers_mode = 11;
- // 视频编码
- bilibili.app.playurl.v1.CodeType prefer_codec_type = 12;
- // 是否强制请求预览视频
- bool is_preview = 13;
-}
-
-// 投屏地址-请求
-message ProjectReq {
- // 课程epid(与番剧不互通)
- int64 ep_id = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string from_spmid = 10;
- // 投屏协议
- // 0:默认乐播 1:自建协议 2:云投屏
- int32 protocol = 11;
- // 投屏设备
- // 0:默认其他 1:OTT设备
- int32 device_type = 12;
- // 是否flv格式
- bool flv_proj = 13;
-}
-
-// 播放页信息-响应
-message PlayViewReply {
- // 视频url信息
- bilibili.app.playurl.v1.VideoInfo video_info = 1;
- // 禁用功能配置
- PlayAbilityConf play_conf = 2;
-}
-
-// 禁用功能配置
-message PlayAbilityConf {
- bool background_play_disable = 1; // 后台播放
- bool flip_disable = 2; // 镜像反转
- bool cast_disable = 3; // 支持投屏
- bool feedback_disable = 4; // 反馈
- bool subtitle_disable = 5; // 字幕
- bool playback_rate_disable = 6; // 播放速度
- bool time_up_disable = 7; // 定时停止播放
- bool playback_mode_disable = 8; // 播放方式
- bool scale_mode_disable = 9; // 画面尺寸
- bool like_disable = 10; // 顶
- bool dislike_disable = 11; // 踩
- bool coin_disable = 12; // 投币
- bool elec_disable = 13; // 充电
- bool share_disable = 14; // 分享
- bool screen_shot_disable = 15; // 截图
- bool lock_screen_disable = 16; // 锁屏
- bool recommend_disable = 17; // 相关推荐
- bool playback_speed_disable = 18; // 倍速
- bool definition_disable = 19; // 清晰度
- bool selections_disable = 20; // 选集
- bool next_disable = 21; // 下一集
- bool edit_dm_disable = 22; // 编辑弹幕
- bool outer_dm_disable = 25; // 外层面板弹幕设置
- bool inner_dm_disable = 26; // 三点内弹幕设置
- bool small_window_disable = 27; // 画中画
-}
-
-// 投屏地址-响应
-message ProjectReply {
- bilibili.app.playurl.v1.PlayURLReply project = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/community/service/dm/v1/dm.proto b/bili-api-grpc/proto/bilibili/community/service/dm/v1/dm.proto
deleted file mode 100644
index 8366763a1..000000000
--- a/bili-api-grpc/proto/bilibili/community/service/dm/v1/dm.proto
+++ /dev/null
@@ -1,892 +0,0 @@
-syntax = "proto3";
-
-package bilibili.community.service.dm.v1;
-
-option java_multiple_files = true;
-
-//弹幕
-service DM {
- // 获取分段弹幕
- rpc DmSegMobile (DmSegMobileReq) returns (DmSegMobileReply);
- // 客户端弹幕元数据 字幕、分段、防挡蒙版等
- rpc DmView(DmViewReq) returns (DmViewReply);
- // 修改弹幕配置
- rpc DmPlayerConfig (DmPlayerConfigReq) returns (Response);
- // ott弹幕列表
- rpc DmSegOtt(DmSegOttReq) returns(DmSegOttReply);
- // SDK弹幕列表
- rpc DmSegSDK(DmSegSDKReq) returns(DmSegSDKReply);
- //
- rpc DmExpoReport(DmExpoReportReq) returns (DmExpoReportRes);
-}
-
-//
-message Avatar {
- //
- string id = 1;
- //
- string url = 2;
- //
- AvatarType avatar_type = 3;
-}
-
-//
-enum AvatarType {
- AvatarTypeNone = 0; //
- AvatarTypeNFT = 1; //
-}
-
-//
-message Bubble {
- //
- string text = 1;
- //
- string url = 2;
-}
-
-//
-enum BubbleType {
- BubbleTypeNone = 0; //
- BubbleTypeClickButton = 1; //
- BubbleTypeDmSettingPanel = 2; //
-}
-
-//
-message BubbleV2 {
- //
- string text = 1;
- //
- string url = 2;
- //
- BubbleType bubble_type = 3;
- //
- bool exposure_once = 4;
- //
- ExposureType exposure_type = 5;
-}
-
-//
-message Button {
- //
- string text = 1;
- //
- int32 action = 2;
-}
-
-//
-message BuzzwordConfig {
- //
- repeated BuzzwordShowConfig keywords = 1;
-}
-
-//
-message BuzzwordShowConfig {
- //
- string name = 1;
- //
- string schema = 2;
- //
- int32 source = 3;
- //
- int64 id = 4;
- //
- int64 buzzword_id = 5;
- //
- int32 schema_type = 6;
-}
-
-//
-message CheckBox {
- //
- string text = 1;
- //
- CheckboxType type = 2;
- //
- bool default_value = 3;
- //
- bool show = 4;
-}
-
-//
-enum CheckboxType {
- CheckboxTypeNone = 0; //
- CheckboxTypeEncourage = 1; //
- CheckboxTypeColorDM = 2; //
-}
-
-//
-message CheckBoxV2 {
- //
- string text = 1;
- //
- int32 type = 2;
- //
- bool default_value = 3;
-}
-
-//
-message ClickButton {
- //
- repeated string portrait_text = 1;
- //
- repeated string landscape_text = 2;
- //
- repeated string portrait_text_focus = 3;
- //
- repeated string landscape_text_focus = 4;
- //
- RenderType render_type = 5;
- //
- bool show = 6;
- //
- Bubble bubble = 7;
-}
-
-//
-message ClickButtonV2 {
- //
- repeated string portrait_text = 1;
- //
- repeated string landscape_text = 2;
- //
- repeated string portrait_text_focus = 3;
- //
- repeated string landscape_text_focus = 4;
- //
- int32 render_type = 5;
- //
- bool text_input_post = 6;
- //
- bool exposure_once = 7;
- //
- int32 exposure_type = 8;
-}
-
-// 互动弹幕条目信息
-message CommandDm {
- // 弹幕id
- int64 id = 1;
- // 对象视频cid
- int64 oid = 2;
- // 发送者mid
- string mid = 3;
- // 互动弹幕指令
- string command = 4;
- // 互动弹幕正文
- string content = 5;
- // 出现时间
- int32 progress = 6;
- // 创建时间
- string ctime = 7;
- // 发布时间
- string mtime = 8;
- // 扩展json数据
- string extra = 9;
- // 弹幕id str类型
- string idStr = 10;
-}
-
-// 弹幕ai云屏蔽列表
-message DanmakuAIFlag {
- // 弹幕ai云屏蔽条目
- repeated DanmakuFlag dm_flags = 1;
-}
-
-// 弹幕条目
-message DanmakuElem {
- // 弹幕dmid
- int64 id = 1;
- // 弹幕出现位置(单位ms)
- int32 progress = 2;
- // 弹幕类型 1 2 3:普通弹幕 4:底部弹幕 5:顶部弹幕 6:逆向弹幕 7:高级弹幕 8:代码弹幕 9:BAS弹幕(pool必须为2)
- int32 mode = 3;
- // 弹幕字号
- int32 fontsize = 4;
- // 弹幕颜色
- uint32 color = 5;
- // 发送者mid hash
- string midHash = 6;
- // 弹幕正文
- string content = 7;
- // 发送时间
- int64 ctime = 8;
- // 权重 用于屏蔽等级 区间:[1,10]
- int32 weight = 9;
- // 动作
- string action = 10;
- // 弹幕池 0:普通池 1:字幕池 2:特殊池(代码/BAS弹幕)
- int32 pool = 11;
- // 弹幕dmid str
- string idStr = 12;
- // 弹幕属性位(bin求AND)
- // bit0:保护 bit1:直播 bit2:高赞
- int32 attr = 13;
- //
- string animation = 22;
- // 大会员专属颜色
- DmColorfulType colorful = 24;
-}
-
-// 弹幕ai云屏蔽条目
-message DanmakuFlag {
- // 弹幕dmid
- int64 dmid = 1;
- // 评分
- uint32 flag = 2;
-}
-
-// 云屏蔽配置信息
-message DanmakuFlagConfig {
- // 云屏蔽等级
- int32 rec_flag = 1;
- // 云屏蔽文案
- string rec_text = 2;
- // 云屏蔽开关
- int32 rec_switch = 3;
-}
-
-// 弹幕默认配置
-message DanmuDefaultPlayerConfig {
- bool player_danmaku_use_default_config = 1; // 是否使用推荐弹幕设置
- bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
- int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
- bool player_danmaku_blocktop = 6; // 是否屏蔽顶端弹幕
- bool player_danmaku_blockscroll = 7; // 是否屏蔽滚动弹幕
- bool player_danmaku_blockbottom = 8; // 是否屏蔽底端弹幕
- bool player_danmaku_blockcolorful = 9; // 是否屏蔽彩色弹幕
- bool player_danmaku_blockrepeat = 10; // 是否屏蔽重复弹幕
- bool player_danmaku_blockspecial = 11; // 是否屏蔽高级弹幕
- float player_danmaku_opacity = 12; // 弹幕不透明度
- float player_danmaku_scalingfactor = 13; // 弹幕缩放比例
- float player_danmaku_domain = 14; // 弹幕显示区域
- int32 player_danmaku_speed = 15; // 弹幕速度
- bool inline_player_danmaku_switch = 16; // 是否开启弹幕
- int32 player_danmaku_senior_mode_switch = 17; //
- int32 player_danmaku_ai_recommended_level_v2 = 18; //
- map player_danmaku_ai_recommended_level_v2_map = 19; //
-}
-
-// 弹幕配置
-message DanmuPlayerConfig {
- bool player_danmaku_switch = 1; // 是否开启弹幕
- bool player_danmaku_switch_save = 2; // 是否记录弹幕开关设置
- bool player_danmaku_use_default_config = 3; // 是否使用推荐弹幕设置
- bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
- int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
- bool player_danmaku_blocktop = 6; // 是否屏蔽顶端弹幕
- bool player_danmaku_blockscroll = 7; // 是否屏蔽滚动弹幕
- bool player_danmaku_blockbottom = 8; // 是否屏蔽底端弹幕
- bool player_danmaku_blockcolorful = 9; // 是否屏蔽彩色弹幕
- bool player_danmaku_blockrepeat = 10; // 是否屏蔽重复弹幕
- bool player_danmaku_blockspecial = 11; // 是否屏蔽高级弹幕
- float player_danmaku_opacity = 12; // 弹幕不透明度
- float player_danmaku_scalingfactor = 13; // 弹幕缩放比例
- float player_danmaku_domain = 14; // 弹幕显示区域
- int32 player_danmaku_speed = 15; // 弹幕速度
- bool player_danmaku_enableblocklist = 16; // 是否开启屏蔽列表
- bool inline_player_danmaku_switch = 17; // 是否开启弹幕
- int32 inline_player_danmaku_config = 18; //
- int32 player_danmaku_ios_switch_save = 19; //
- int32 player_danmaku_senior_mode_switch = 20; //
- int32 player_danmaku_ai_recommended_level_v2 = 21; //
- map player_danmaku_ai_recommended_level_v2_map = 22; //
-}
-
-//
-message DanmuPlayerConfigPanel {
- //
- string selection_text = 1;
-}
-
-// 弹幕显示区域自动配置
-message DanmuPlayerDynamicConfig {
- // 时间
- int32 progress = 1;
- // 弹幕显示区域
- float player_danmaku_domain = 14;
-}
-
-// 弹幕配置信息
-message DanmuPlayerViewConfig {
- // 弹幕默认配置
- DanmuDefaultPlayerConfig danmuku_default_player_config = 1;
- // 弹幕用户配置
- DanmuPlayerConfig danmuku_player_config = 2;
- // 弹幕显示区域自动配置列表
- repeated DanmuPlayerDynamicConfig danmuku_player_dynamic_config = 3;
- //
- DanmuPlayerConfigPanel danmuku_player_config_panel = 4;
-}
-
-// web端用户弹幕配置
-message DanmuWebPlayerConfig {
- bool dm_switch = 1; // 是否开启弹幕
- bool ai_switch = 2; // 是否开启智能云屏蔽
- int32 ai_level = 3; // 智能云屏蔽等级
- bool blocktop = 4; // 是否屏蔽顶端弹幕
- bool blockscroll = 5; // 是否屏蔽滚动弹幕
- bool blockbottom = 6; // 是否屏蔽底端弹幕
- bool blockcolor = 7; // 是否屏蔽彩色弹幕
- bool blockspecial = 8; // 是否屏蔽重复弹幕
- bool preventshade = 9; //
- bool dmask = 10; //
- float opacity = 11; //
- int32 dmarea = 12; //
- float speedplus = 13; //
- float fontsize = 14; // 弹幕字号
- bool screensync = 15; //
- bool speedsync = 16; //
- string fontfamily = 17; //
- bool bold = 18; // 是否使用加粗
- int32 fontborder = 19; //
- string draw_type = 20; // 弹幕渲染类型
- int32 senior_mode_switch = 21; //
- int32 ai_level_v2 = 22; //
- map ai_level_v2_map = 23; //
-}
-
-// 弹幕属性位值
-enum DMAttrBit {
- DMAttrBitProtect = 0; // 保护弹幕
- DMAttrBitFromLive = 1; // 直播弹幕
- DMAttrHighLike = 2; // 高赞弹幕
-}
-
-message DmColorful {
- DmColorfulType type = 1; // 颜色类型
- string src = 2; //
-}
-
-enum DmColorfulType {
- NoneType = 0; // 无
- VipGradualColor = 60001; // 渐变色
-}
-
-//
-message DmExpoReportReq {
- //
- string session_id = 1;
- //
- int64 oid = 2;
- //
- string spmid = 4;
-}
-
-//
-message DmExpoReportRes {}
-
-// 修改弹幕配置-请求
-message DmPlayerConfigReq {
- int64 ts = 1; //
- PlayerDanmakuSwitch switch = 2; // 是否开启弹幕
- PlayerDanmakuSwitchSave switch_save = 3; // 是否记录弹幕开关设置
- PlayerDanmakuUseDefaultConfig use_default_config = 4; // 是否使用推荐弹幕设置
- PlayerDanmakuAiRecommendedSwitch ai_recommended_switch = 5; // 是否开启智能云屏蔽
- PlayerDanmakuAiRecommendedLevel ai_recommended_level = 6; // 智能云屏蔽等级
- PlayerDanmakuBlocktop blocktop = 7; // 是否屏蔽顶端弹幕
- PlayerDanmakuBlockscroll blockscroll = 8; // 是否屏蔽滚动弹幕
- PlayerDanmakuBlockbottom blockbottom = 9; // 是否屏蔽底端弹幕
- PlayerDanmakuBlockcolorful blockcolorful = 10; // 是否屏蔽彩色弹幕
- PlayerDanmakuBlockrepeat blockrepeat = 11; // 是否屏蔽重复弹幕
- PlayerDanmakuBlockspecial blockspecial = 12; // 是否屏蔽高级弹幕
- PlayerDanmakuOpacity opacity = 13; // 弹幕不透明度
- PlayerDanmakuScalingfactor scalingfactor = 14; // 弹幕缩放比例
- PlayerDanmakuDomain domain = 15; // 弹幕显示区域
- PlayerDanmakuSpeed speed = 16; // 弹幕速度
- PlayerDanmakuEnableblocklist enableblocklist = 17; // 是否开启屏蔽列表
- InlinePlayerDanmakuSwitch inlinePlayerDanmakuSwitch = 18; // 是否开启弹幕
- PlayerDanmakuSeniorModeSwitch senior_mode_switch = 19; //
- PlayerDanmakuAiRecommendedLevelV2 ai_recommended_level_v2 = 20; //
-}
-
-//
-message DmSegConfig {
- //
- int64 page_size = 1;
- //
- int64 total = 2;
-}
-
-// 获取弹幕-响应
-message DmSegMobileReply {
- // 弹幕列表
- repeated DanmakuElem elems = 1;
- // 是否已关闭弹幕
- // 0:未关闭 1:已关闭
- int32 state = 2;
- // 弹幕云屏蔽ai评分值
- DanmakuAIFlag ai_flag = 3;
- repeated DmColorful colorfulSrc = 5;
-}
-
-// 获取弹幕-请求
-message DmSegMobileReq {
- // 稿件avid/漫画epid
- int64 pid = 1;
- // 视频cid/漫画cid
- int64 oid = 2;
- // 弹幕类型
- // 1:视频 2:漫画
- int32 type = 3;
- // 分段(6min)
- int64 segment_index = 4;
- // 是否青少年模式
- int32 teenagers_mode = 5;
- //
- int64 ps = 6;
- //
- int64 pe = 7;
- //
- int32 pull_mode = 8;
- //
- int32 from_scene = 9;
-}
-
-// ott弹幕列表-响应
-message DmSegOttReply {
- // 是否已关闭弹幕
- // 0:未关闭 1:已关闭
- bool closed = 1;
- // 弹幕列表
- repeated DanmakuElem elems = 2;
-}
-
-// ott弹幕列表-请求
-message DmSegOttReq {
- // 稿件avid/漫画epid
- int64 pid = 1;
- // 视频cid/漫画cid
- int64 oid = 2;
- // 弹幕类型
- // 1:视频 2:漫画
- int32 type = 3;
- // 分段(6min)
- int64 segment_index = 4;
-}
-
-// 弹幕SDK-响应
-message DmSegSDKReply {
- // 是否已关闭弹幕
- // 0:未关闭 1:已关闭
- bool closed = 1;
- // 弹幕列表
- repeated DanmakuElem elems = 2;
-}
-
-// 弹幕SDK-请求
-message DmSegSDKReq {
- // 稿件avid/漫画epid
- int64 pid = 1;
- // 视频cid/漫画cid
- int64 oid = 2;
- // 弹幕类型
- // 1:视频 2:漫画
- int32 type = 3;
- // 分段(6min)
- int64 segment_index = 4;
-}
-
-// 客户端弹幕元数据-响应
-message DmViewReply {
- // 是否已关闭弹幕
- // 0:未关闭 1:已关闭
- bool closed = 1;
- // 智能防挡弹幕蒙版信息
- VideoMask mask = 2;
- // 视频字幕
- VideoSubtitle subtitle = 3;
- // 高级弹幕专包url(bfs)
- repeated string special_dms = 4;
- // 云屏蔽配置信息
- DanmakuFlagConfig ai_flag = 5;
- // 弹幕配置信息
- DanmuPlayerViewConfig player_config = 6;
- // 弹幕发送框样式
- int32 send_box_style = 7;
- // 是否允许
- bool allow = 8;
- // check box 是否展示
- string check_box = 9;
- // check box 展示文本
- string check_box_show_msg = 10;
- // 展示文案
- string text_placeholder = 11;
- // 弹幕输入框文案
- string input_placeholder = 12;
- // 用户举报弹幕 cid维度屏蔽的正则规则
- repeated string report_filter_content = 13;
- //
- ExpoReport expo_report = 14;
- //
- BuzzwordConfig buzzword_config = 15;
- //
- repeated Expressions expressions = 16;
- //
- repeated PostPanel post_panel = 17;
- //
- repeated string activity_meta = 18;
- //
- repeated PostPanelV2 post_panel2 = 19;
-}
-
-// 客户端弹幕元数据-请求
-message DmViewReq {
- // 稿件avid/漫画epid
- int64 pid = 1;
- // 视频cid/漫画cid
- int64 oid = 2;
- // 弹幕类型
- // 1:视频 2:漫画
- int32 type = 3;
- // 页面spm
- string spmid = 4;
- // 是否冷启
- int32 is_hard_boot = 5;
-}
-
-// web端弹幕元数据-响应
-// https://api.bilibili.com/x/v2/dm/web/view
-message DmWebViewReply {
- // 是否已关闭弹幕
- // 0:未关闭 1:已关闭
- int32 state = 1;
- //
- string text = 2;
- //
- string text_side = 3;
- // 分段弹幕配置
- DmSegConfig dm_sge = 4;
- // 云屏蔽配置信息
- DanmakuFlagConfig flag = 5;
- // 高级弹幕专包url(bfs)
- repeated string special_dms = 6;
- // check box 是否展示
- bool check_box = 7;
- // 弹幕数
- int64 count = 8;
- // 互动弹幕
- repeated CommandDm commandDms = 9;
- // 用户弹幕配置
- DanmuWebPlayerConfig player_config = 10;
- // 用户举报弹幕 cid维度屏蔽
- repeated string report_filter_content = 11;
- //
- repeated Expressions expressions = 12;
- //
- repeated PostPanel post_panel = 13;
- //
- repeated string activity_meta = 14;
-}
-
-//
-message ExpoReport {
- //
- bool should_report_at_end = 1;
-}
-
-//
-enum ExposureType {
- ExposureTypeNone = 0; //
- ExposureTypeDMSend = 1; //
-}
-
-//
-message Expression {
- //
- repeated string keyword = 1;
- //
- string url = 2;
- //
- repeated Period period = 3;
-}
-
-//
-message Expressions {
- //
- repeated Expression data = 1;
-}
-
-// 是否开启弹幕
-message InlinePlayerDanmakuSwitch {
- //
- bool value = 1;
-}
-
-//
-message Label {
- //
- string title = 1;
- //
- repeated string content = 2;
-}
-
-//
-message LabelV2 {
- //
- string title = 1;
- //
- repeated string content = 2;
- //
- bool exposure_once = 3;
- //
- int32 exposure_type = 4;
-}
-
-//
-message Period {
- //
- int64 start = 1;
- //
- int64 end = 2;
-}
-
-message PlayerDanmakuAiRecommendedLevel {bool value = 1;} // 智能云屏蔽等级
-message PlayerDanmakuAiRecommendedLevelV2 {int32 value = 1;} //
-message PlayerDanmakuAiRecommendedSwitch {bool value = 1;} // 是否开启智能云屏蔽
-message PlayerDanmakuBlockbottom {bool value = 1;} // 是否屏蔽底端弹幕
-message PlayerDanmakuBlockcolorful {bool value = 1;} // 是否屏蔽彩色弹幕
-message PlayerDanmakuBlockrepeat {bool value = 1;} // 是否屏蔽重复弹幕
-message PlayerDanmakuBlockscroll {bool value = 1;} // 是否屏蔽滚动弹幕
-message PlayerDanmakuBlockspecial {bool value = 1;} // 是否屏蔽高级弹幕
-message PlayerDanmakuBlocktop {bool value = 1;} // 是否屏蔽顶端弹幕
-message PlayerDanmakuDomain {float value = 1;} // 弹幕显示区域
-message PlayerDanmakuEnableblocklist {bool value = 1;} // 是否开启屏蔽列表
-message PlayerDanmakuOpacity {float value = 1;} // 弹幕不透明度
-message PlayerDanmakuScalingfactor {float value = 1;} // 弹幕缩放比例
-message PlayerDanmakuSeniorModeSwitch {int32 value = 1;} //
-message PlayerDanmakuSpeed {int32 value = 1;} // 弹幕速度
-message PlayerDanmakuSwitch {bool value = 1; bool can_ignore = 2;} // 是否开启弹幕
-message PlayerDanmakuSwitchSave {bool value = 1;} // 是否记录弹幕开关设置
-message PlayerDanmakuUseDefaultConfig {bool value = 1;} // 是否使用推荐弹幕设置
-
-//
-message PostPanel {
- //
- int64 start = 1;
- //
- int64 end = 2;
- //
- int64 priority = 3;
- //
- int64 biz_id = 4;
- //
- PostPanelBizType biz_type = 5;
- //
- ClickButton click_button = 6;
- //
- TextInput text_input = 7;
- //
- CheckBox check_box = 8;
- //
- Toast toast = 9;
-}
-
-//
-enum PostPanelBizType {
- PostPanelBizTypeNone = 0; //
- PostPanelBizTypeEncourage = 1; //
- PostPanelBizTypeColorDM = 2; //
- PostPanelBizTypeNFTDM = 3; //
- PostPanelBizTypeFragClose = 4; //
- PostPanelBizTypeRecommend = 5; //
-}
-
-//
-message PostPanelV2 {
- //
- int64 start = 1;
- //
- int64 end = 2;
- //
- int32 biz_type = 3;
- //
- ClickButtonV2 click_button = 4;
- //
- TextInputV2 text_input = 5;
- //
- CheckBoxV2 check_box = 6;
- //
- ToastV2 toast = 7;
- //
- BubbleV2 bubble = 8;
- //
- LabelV2 label = 9;
- //
- int32 post_status = 10;
-}
-
-//
-enum PostStatus {
- PostStatusNormal = 0; //
- PostStatusClosed = 1; //
-}
-
-//
-enum RenderType {
- RenderTypeNone = 0; //
- RenderTypeSingle = 1; //
- RenderTypeRotation = 2; //
-}
-
-// 修改弹幕配置-响应
-message Response {
- //
- int32 code = 1;
- //
- string message = 2;
-}
-
-//
-enum SubtitleAiStatus {
- None = 0; //
- Exposure = 1; //
- Assist = 2; //
-}
-
-//
-enum SubtitleAiType {
- Normal = 0; //
- Translate = 1; //
-}
-
-// 单个字幕信息
-message SubtitleItem {
- // 字幕id
- int64 id = 1;
- // 字幕id str
- string id_str = 2;
- // 字幕语言代码
- string lan = 3;
- // 字幕语言
- string lan_doc = 4;
- // 字幕文件url
- string subtitle_url = 5;
- // 字幕作者信息
- UserInfo author = 6;
- // 字幕类型
- SubtitleType type = 7;
- //
- string lan_doc_brief = 8;
- //
- SubtitleAiType ai_type = 9;
- //
- SubtitleAiStatus ai_status = 10;
-}
-
-enum SubtitleType {
- CC = 0; // CC字幕
- AI = 1; // AI生成字幕
-}
-
-//
-message TextInput {
- //
- repeated string portrait_placeholder = 1;
- //
- repeated string landscape_placeholder = 2;
- //
- RenderType render_type = 3;
- //
- bool placeholder_post = 4;
- //
- bool show = 5;
- //
- repeated Avatar avatar = 6;
- //
- PostStatus post_status = 7;
- //
- Label label = 8;
-}
-
-//
-message TextInputV2 {
- //
- repeated string portrait_placeholder = 1;
- //
- repeated string landscape_placeholder = 2;
- //
- RenderType render_type = 3;
- //
- bool placeholder_post = 4;
- //
- repeated Avatar avatar = 5;
- //
- int32 text_input_limit = 6;
-}
-
-//
-message Toast {
- //
- string text = 1;
- //
- int32 duration = 2;
- //
- bool show = 3;
- //
- Button button = 4;
-}
-
-//
-message ToastButtonV2 {
- //
- string text = 1;
- //
- int32 action = 2;
-}
-
-//
-enum ToastFunctionType {
- ToastFunctionTypeNone = 0; //
- ToastFunctionTypePostPanel = 1; //
-}
-
-//
-message ToastV2 {
- //
- string text = 1;
- //
- int32 duration = 2;
- //
- ToastButtonV2 toast_button_v2 = 3;
-}
-
-// 字幕作者信息
-message UserInfo {
- // 用户mid
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- // 用户性别
- string sex = 3;
- // 用户头像url
- string face = 4;
- // 用户签名
- string sign = 5;
- // 用户等级
- int32 rank = 6;
-}
-
-// 智能防挡弹幕蒙版信息
-message VideoMask {
- // 视频cid
- int64 cid = 1;
- // 平台
- // 0:web端 1:客户端
- int32 plat = 2;
- // 帧率
- int32 fps = 3;
- // 间隔时间
- int64 time = 4;
- // 蒙版url
- string mask_url = 5;
-}
-
-// 视频字幕信息
-message VideoSubtitle {
- // 视频原语言代码
- string lan = 1;
- // 视频原语言
- string lanDoc = 2;
- // 视频字幕列表
- repeated SubtitleItem subtitles = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/dagw/component/avatar/common/common.proto b/bili-api-grpc/proto/bilibili/dagw/component/avatar/common/common.proto
deleted file mode 100644
index d270d131d..000000000
--- a/bili-api-grpc/proto/bilibili/dagw/component/avatar/common/common.proto
+++ /dev/null
@@ -1,110 +0,0 @@
-syntax = "proto3";
-
-package bilibili.dagw.component.avatar.common;
-
-option java_multiple_files = true;
-
-//
-message BasicRenderSpec {
- //
- double opacity = 1;
-}
-
-//
-message ColorConfig {
- //
- bool is_dark_mode_aware = 1;
- //
- ColorSpec day = 2;
- //
- ColorSpec night = 3;
-}
-
-//
-message ColorSpec {
- //
- string argb = 1;
-}
-
-//
-message LayerGeneralSpec {
- //
- PositionSpec pos_spec = 1;
- //
- SizeSpec size_spec = 2;
- //
- BasicRenderSpec render_spec = 3;
-}
-
-//
-message MaskProperty {
- //
- LayerGeneralSpec general_spec = 1;
- //
- ResourceSource mask_src = 2;
-}
-
-//
-message NativeDrawRes {
- //
- int32 draw_type = 1;
- //
- int32 fill_mode = 2;
- //
- ColorConfig color_config = 3;
- //
- double edge_weight = 4;
-}
-
-//
-message PositionSpec {
- //
- int32 coordinate_pos = 1;
- //
- double axis_x = 2;
- //
- double axis_y = 3;
-}
-
-//
-message RemoteRes {
- //
- string url = 1;
- //
- string bfs_style = 2;
-}
-
-//
-message ResourceSource {
- //
- enum LocalRes {
- LOCAL_RES_INVALID = 0;
- LOCAL_RES_ICON_VIP = 1;
- LOCAL_RES_ICON_SMALL_VIP = 2;
- LOCAL_RES_ICON_PERSONAL_VERIFY = 3;
- LOCAL_RES_ICON_ENTERPRISE_VERIFY = 4;
- LOCAL_RES_ICON_NFT_MAINLAND = 5;
- LOCAL_RES_DEFAULT_AVATAR = 6;
- }
- //
- int32 src_type = 1;
- //
- int32 placeholder = 2;
- //
- oneof res {
- //
- RemoteRes remote = 3;
- //
- LocalRes local = 4;
- //
- NativeDrawRes draw = 5;
- }
-}
-
-//
-message SizeSpec {
- //
- double width = 1;
- //
- double height = 2;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/dagw/component/avatar/v1/avatar.proto b/bili-api-grpc/proto/bilibili/dagw/component/avatar/v1/avatar.proto
deleted file mode 100644
index b2465eac3..000000000
--- a/bili-api-grpc/proto/bilibili/dagw/component/avatar/v1/avatar.proto
+++ /dev/null
@@ -1,114 +0,0 @@
-syntax = "proto3";
-
-package bilibili.dagw.component.avatar.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/dagw/component/avatar/common/common.proto";
-import "bilibili/dagw/component/avatar/v1/plugin.proto";
-
-//
-message AvatarItem {
- //
- bilibili.dagw.component.avatar.common.SizeSpec container_size = 1;
- //
- repeated LayerGroup layers = 2;
- //
- LayerGroup fallback_layers = 3;
- //
- int64 mid = 4;
-}
-
-//
-message BasicLayerResource {
- //
- int32 res_type = 1;
- //
- oneof payload {
- //
- ResImage res_image = 2;
- //
- ResAnimation res_animation = 3;
- ///
- ResNativeDraw res_native_draw = 4;
- };
-}
-
-//
-message GeneralConfig {
- //
- map web_css_style = 1;
-}
-
-//
-message Layer {
- //
- string layer_id = 1;
- //
- bool visible = 2;
- //
- bilibili.dagw.component.avatar.common.LayerGeneralSpec general_spec = 3;
- //
- LayerConfig layer_config = 4;
- //
- BasicLayerResource resource = 5;
-}
-
-//
-message LayerConfig {
- //
- map tags = 1;
- //
- bool is_critical = 2;
- //
- bool allow_over_paint = 3;
- //
- bilibili.dagw.component.avatar.common.MaskProperty layer_mask = 4;
-}
-
-//
-message LayerGroup {
- //
- string group_id = 1;
- //
- repeated Layer layers = 2;
- //
- bilibili.dagw.component.avatar.common.MaskProperty group_mask = 3;
- //
- bool is_critical_group = 4;
-}
-
-//
-message LayerTagConfig {
- //
- int32 config_type = 1;
- //
- oneof config {
- //
- GeneralConfig general_config = 2;
- //
- bilibili.dagw.component.avatar.v1.plugin.GyroConfig gyro_config = 3;
- //
- bilibili.dagw.component.avatar.v1.plugin.CommentDoubleClickConfig comment_doubleClick_config = 4;
- //
- bilibili.dagw.component.avatar.v1.plugin.LiveAnimeConfig live_anime_config = 5;
- };
-}
-
-//
-message ResAnimation {
- //
- bilibili.dagw.component.avatar.common.ResourceSource webp_src = 1;
-}
-
-//
-message ResImage {
- //
- bilibili.dagw.component.avatar.common.ResourceSource image_src = 1;
-}
-
-//
-message ResNativeDraw {
- //
- bilibili.dagw.component.avatar.common.ResourceSource draw_src = 1;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/dagw/component/avatar/v1/plugin.proto b/bili-api-grpc/proto/bilibili/dagw/component/avatar/v1/plugin.proto
deleted file mode 100644
index 85067bf3b..000000000
--- a/bili-api-grpc/proto/bilibili/dagw/component/avatar/v1/plugin.proto
+++ /dev/null
@@ -1,95 +0,0 @@
-syntax = "proto3";
-
-package bilibili.dagw.component.avatar.v1.plugin;
-
-option java_multiple_files = true;
-
-import "bilibili/dagw/component/avatar/common/common.proto";
-
-//
-message CommentDoubleClickConfig {
- //
- Interaction interaction = 1;
- //
- double animation_scale = 2;
-}
-
-//
-message GyroConfig {
- //
- NFTImageV2 gyroscope = 1;
-}
-
-//
-message GyroscopeContentV2 {
- //
- string file_url = 1;
- //
- float scale = 2;
- //
- repeated PhysicalOrientationV2 physical_orientation = 3;
-}
-
-//
-message GyroscopeEntityV2 {
- //
- string display_type = 1;
- //
- repeated GyroscopeContentV2 contents = 2;
-}
-
-//
-message Interaction {
- //
- string nft_id = 1;
- //
- bool enabled = 2;
- //
- string itype = 3;
- //
- string metadata_url = 4;
-}
-
-//
-message LiveAnimeConfig {
- //
- bool is_live = 1;
-}
-
-//
-message LiveAnimeItem {
- //
- bilibili.dagw.component.avatar.common.ColorConfig color = 1;
- //
- double start_ratio = 2;
- //
- double end_ratio = 3;
- //
- double start_stroke = 4;
- //
- double start_opacity = 5;
- //
- int64 phase = 6;
-}
-
-//
-message NFTImageV2 {
- //
- repeated GyroscopeEntityV2 gyroscope = 1;
-}
-
-//
-message PhysicalOrientationAnimation {
- //
- string type = 1;
- //
- string bezier = 3;
-}
-
-//
-message PhysicalOrientationV2 {
- //
- string type = 1;
- //
- repeated PhysicalOrientationAnimation animations = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/dynamic/common/dynamic.proto b/bili-api-grpc/proto/bilibili/dynamic/common/dynamic.proto
deleted file mode 100644
index f3cbc123f..000000000
--- a/bili-api-grpc/proto/bilibili/dynamic/common/dynamic.proto
+++ /dev/null
@@ -1,877 +0,0 @@
-syntax = "proto3";
-
-package bilibili.dynamic;
-
-option java_multiple_files = true;
-
-import "bilibili/app/dynamic/v2/dynamic.proto";
-
-// at分组信息
-message AtGroup {
- // 分组类型
- AtGroupType group_type = 1;
- // 分组名称
- string group_name = 2;
- // items
- repeated AtItem items = 3;
-}
-
-// at分组类型
-enum AtGroupType {
- AT_GROUP_TYPE_DEFAULT = 0; // 默认
- AT_GROUP_TYPE_RECENT = 1; // 最近联系
- AT_GROUP_TYPE_FOLLOW = 2; // 我的关注(互相关注 > 单向关注)
- AT_GROUP_TYPE_FANS = 3; // 我的粉丝
- AT_GROUP_TYPE_OTHERS = 4; // 其他
-}
-
-// at返回单条信息
-message AtItem {
- // mid
- int64 uid = 1;
- // 昵称
- string name = 2;
- // 头像
- string face = 3;
- // 粉丝数
- int32 fans = 4;
- // 认证信息
- int32 official_verify_type = 5;
-}
-
-// at列表-请求
-message AtListReq {
- // mid
- int64 uid = 1;
-}
-
-// at列表-响应
-message AtListRsp {
- // 分组信息
- repeated AtGroup groups = 1;
-}
-
-// at搜索-请求
-message AtSearchReq {
- // mid
- int64 uid = 1;
- // 关键字
- string keyword = 2;
-}
-
-//
-enum AttachCardType {
- ATTACH_CARD_NONE = 0; // 无
- ATTACH_CARD_GOODS = 1; // 商品卡
- ATTACH_CARD_VOTE = 2; // 投票卡
- ATTACH_CARD_UGC = 3; // ugc视频卡
- ATTACH_CARD_ACTIVITY = 4; // 帮推
- ATTACH_CARD_OFFICIAL_ACTIVITY = 5; // 官方活动
- ATTACH_CARD_TOPIC = 6; // 话题活动
- ATTACH_CARD_OGV = 7; // OGV
- ATTACH_CARD_AUTO_OGV = 8; // OGV自动出卡
- ATTACH_CARD_GAME = 9; // 游戏
- ATTACH_CARD_MANGA = 10; // 漫画
- ATTACH_CARD_DECORATION = 11; // 装扮
- ATTACH_CARD_MATCH = 12; // 赛事
- ATTACH_CARD_PUGV = 13; // 课程
- ATTACH_CARD_RESERVE = 14; // 预约
- ATTACH_CARD_UP_TOPIC = 15; // up主话题活动
-}
-
-//
-message BottomBusiness {
- // 业务方资源id
- int64 rid = 1;
- // 业务方类型,定义在BottomBizType中
- int64 type = 2;
-}
-
-//
-enum ContentType {
- CONTENT_TYPE_NONE = 0; // 占位
- TEXT = 1; // 文本,简单内容,biz_id就是文本
- AT = 2; // @用户,简单内容,biz_id是用户uid
- LOTTERY = 3; // 抽奖,简单内容,biz_id是抽奖id
- VOTE = 4; // 投票,简单内容,biz_id是投票id
- TOPIC = 5; // 话题,简单内容,biz_id是话题id
- GOODS = 6; // 商品文字链,复杂内容,定义在GoodsContent结构,biz_id为空
- BV = 7; // bv,简单内容,biz_id是bvid,包括"BV1"等内容
- AV = 8; // av,简单内容,biz_id是avid
- EMOJI = 9; // 表情,简单内容,biz_id为空
- USER = 10; // 外露用户,暂未使用
- CV = 11; // 专栏,简单内容,biz_id是cvid
- VC = 12; // 废弃业务,无用
- WEB = 13; // 网址,简单内容,biz_id是网页链接
- TAOBAO = 14; // 淘宝内容,暂时不用
- MAIL = 15; // 邮箱,简单内容,biz_id是邮箱地址
- OGV_SEASON = 16; // 番剧season,简单内容,biz_id是番剧的season_id
- OGV_EP = 17; // 番剧ep,简单内容,biz_id是番剧的epid
-}
-
-//
-message CreateActivity {
- //
- int64 activity_id = 1;
- //
- int32 activity_state = 2;
- //
- int32 is_new_activity = 3;
- //
- int32 action = 4;
-}
-
-// 动态附带的附加大卡
-message CreateAttachCard {
- // 商品大卡
- CreateGoodsCard goods = 1;
- // 通用附加大卡,目前仅限定Match,Game,Ugc,Pugv,Reserve,且同时只能有一个
- CreateCommonAttachCard common_card = 2;
-}
-
-// 发布页预校验-响应
-message CreateCheckResp {
- // 发布相关的配置项
- PublishSetting setting = 1;
- // 用户具有的发布权限
- UpPermission permission = 2;
- // 分享渠道信息
- ShareChannel share_info = 3;
- // 小黄条
- PublishYellowBar yellow_bar = 4;
- //
- PlusRedDot plus_red_dot = 5;
-}
-
-// 创建动态时附带的通用附加卡详情
-message CreateCommonAttachCard {
- // 通用附加卡的类型
- AttachCardType type = 1;
- // 通用附加卡的业务id
- int64 biz_id = 2;
- //
- int32 reserve_source = 3;
- //
- int32 reserve_lottery = 4;
-}
-
-// 动态-描述文字模块
-message CreateContent {
- // 描述信息(已按高亮拆分)
- repeated CreateContentItem contents = 1;
-}
-
-// 文本描述
-message CreateContentItem {
- // 原始文案
- string raw_text = 1;
- // 类型
- ContentType type = 2;
- // 简单内容,可能为文字,BVID,AVID,uid等;复杂内容需要单独定义结构体
- string biz_id = 3;
- // 商品内容
- GoodsContent goods = 4;
-}
-
-//
-message CreateDynVideo {
- // 投稿平台来源,具体写什么@产品
- string relation_from = 1;
- // 1 — 投稿入口 + 相册选择视频 2 — 投稿入口 + 拍摄 3 — 小视频入口 + 相册选择视频 4 — 小视频入口 + 拍摄
- int32 biz_from = 3;
- // 投稿类型: 2-转载、1-自制
- int32 copyright = 4;
- // 是否公开投稿 0允许公开,1不允许公开 默认 0公开
- int32 no_public = 5;
- // 是否允许转载字段 0允许,1不允许,默认为0 copyright = 1 自制的时候默认勾选上no_reprint=1
- int32 no_reprint = 6;
- // 转载的时候必须填写,非空字符串
- string source = 7;
- // 稿件封面必须填写,不能为空 封面不支持其他源站链接 请确保 cover 是 先经过上传接口
- string cover = 8;
- // 稿件标题
- string title = 9;
- // 稿件分区ID 必须是有效的二级分区ID
- int64 tid = 10;
- // 标签 多个标签请使用英文逗号连接
- string tag = 11;
- // 稿件描述
- string desc = 12;
- // 当前输入环境下有,就输入http://domain/x/app/archive/desc/format返回的desc_format值
- // 如果返回null就输入默认为0, 表示当前环境(分区+投稿类型)不参与简介格式化
- int64 desc_format_id = 13;
- // 稿件是否开启充电面板,1为是, 0为否
- int32 open_elec = 14;
- // 定时发布的时间
- int32 dtime = 15;
- // 分P聚合字段
- repeated DynVideoMultiP videos = 16;
- // 水印信息
- DynVideoWatermark watermark = 17;
- // 新增加通过tag来参加活动
- int64 mission_id = 18;
- // 新增加可以添加动态内容
- string dynamic = 19;
- // 序列化后的extend_info扩展信息
- string dynamic_extension = 20;
- // 客户端控制字段
- string dynamic_ctrl = 21;
- // 动态来源
- string dynamic_from = 22;
- // 抽奖服务生成的ID
- int64 lottery_id = 23;
- //
- DynVideoVote vote = 24;
- // 精选评论开关, true为开
- bool up_selection_reply = 25;
- // up主关闭评论
- bool up_close_reply = 26;
- // up主关闭弹幕
- bool up_close_danmu = 27;
- // 稿件投稿来源
- int64 up_from = 28;
- //
- int64 duration = 29;
-}
-
-// 创建动态视频的应答包(透传给客户端)
-message CreateDynVideoResult {
- // 稿件id
- int64 aid = 1;
- // 说明信息
- string message = 2;
- // 推荐的活动信息
- DynVideoSubmitActBanner submitact_banner = 3;
- //
- DynVideoPushIntro push_intro = 4;
-}
-
-// 创建动态时附带的商品大卡详情
-message CreateGoodsCard {
- // 商品大卡中的商品id
- repeated string item_id = 1;
-}
-
-// 发布页预校验场景
-enum CreateInitCheckScene {
- CREATE_INIT_CHECK_SCENE_INVALID = 0; //
- CREATE_INIT_CHECK_SCENE_NORMAL = 1; // 动态页面右上角点击进入发布页
- CREATE_INIT_CHECK_SCENE_REPOST = 2; // 动态feed流转发、三点分享,动态详情页转发
- CREATE_INIT_CHECK_SCENE_SHARE = 3; // 其他页面分享到动态
- CREATE_INIT_CHECK_SCENE_RESERVE_SHARE = 4; //
-}
-
-// 动态创建时的特殊选项
-message CreateOption {
- // 评论区展示UP自己精选的评论
- int32 up_choose_comment = 1;
- // 初始评论区是关闭状态
- int32 close_comment = 2;
- // 该动态不会被折叠
- // 目前仅抽奖开奖动态不会被折叠
- int32 fold_exclude = 3;
- // 审核等级,仅服务端发布时有效
- // 100:自动过审
- // 非100:默认的内网审核
- // 默认为0
- int32 audit_level = 4;
- // 根据转发内容同步生成一条源动态/资源的评论
- // 仅转发和分享时有效
- int32 sync_to_comment = 5;
- //
- VideoShareInfo video_share_info = 6;
- //
- CreateActivity activity = 7;
-}
-
-// 创建图文动态时的图片信息
-message CreatePic {
- // 上传图片URL
- string img_src = 1;
- // 图片宽度
- double img_width = 2;
- // 图片高度
- double img_height = 3;
- // 图片大小,单位KB
- double img_size = 4;
- //
- repeated CreatePicTag img_tags = 5;
-}
-
-//
-message CreatePicTag {
- //
- int64 item_id = 1;
- //
- int64 tid = 2;
- //
- int64 mid = 3;
- //
- string text = 4;
- //
- string text_string = 5;
- //
- int64 type = 6;
- //
- int64 source_type = 7;
- //
- string url = 8;
- //
- string schema_url = 9;
- //
- string jump_url = 10;
- //
- int64 orientation = 11;
- //
- int64 x = 12;
- //
- int64 y = 13;
- //
- string poi = 14;
-}
-
-// 创建动态-响应
-message CreateResp {
- // 动态id
- int64 dyn_id = 1;
- // 动态id str
- string dyn_id_str = 2;
- // 动态的类型
- int64 dyn_type = 3;
- // 动态id
- int64 dyn_rid = 4;
- // 假卡
- bilibili.app.dynamic.v2.DynamicItem fake_card = 5;
- // 视频
- CreateDynVideoResult video_result = 6;
-}
-
-// 发布类型(场景)
-enum CreateScene {
- CREATE_SCENE_INVALID = 0; //
- CREATE_SCENE_CREATE_WORD = 1; // 发布纯文字动态
- CREATE_SCENE_CREATE_DRAW = 2; // 发布图文动态
- CREATE_SCENE_CREATE_DYN_VIDEO = 3; // 发布动态视频
- CREATE_SCENE_REPOST = 4; // 转发动态
- CREATE_SCENE_SHARE_BIZ = 5; // 分享业务方资源
- CREATE_SCENE_SHARE_PAGE = 6; // 分享网页(通用模板)
- CREATE_SCENE_SHARE_PROGRAM = 7; // 分享小程序
- CREATE_SCENE_REPLY_SYNC = 8; // 评论同步到动态
- CREATE_SCENE_REPLY_CREATE_ACTIVITY = 9; // 评论同步到动态并且发起活动
-}
-
-// 动态附带的小卡
-message CreateTag {
- // lbs小卡
- ExtLbs lbs = 1;
- // 游戏通过SDK发布的动态需要带上游戏小卡
- BottomBusiness sdk_game = 2;
- // 必剪发布的动态需要带上必剪小卡
- BottomBusiness diversion = 3;
-}
-
-//
-message CreateTopic {
- //
- int64 id = 1;
- //
- string name = 2;
-}
-
-// 动态的标识
-message DynIdentity {
- // 动态id
- int64 dyn_id = 1;
- // 动态反向id,通过(type+rid组合)也可以唯一标识一个动态,与dyn_id出现任意一个即可
- DynRevsId revs_id = 2;
-}
-
-//
-message DynRevsId {
- // 动态类型
- int64 dyn_type = 1;
- // 业务id
- int64 rid = 2;
-}
-
-// 动态视频分P视频编辑环境上报信息
-message DynVideoEditor {
- //
- int64 cid = 1;
- //
- int32 upfrom = 2;
- // 滤镜
- string filters = 3;
- // 字体
- string fonts = 4;
- // 字幕
- string subtitles = 5;
- // bgm
- string bgms = 6;
- // 3d拍摄贴纸
- string stickers = 7;
- // 2d投稿贴纸
- string videoup_stickers = 8;
- // 视频转场特效
- string trans = 9;
- // 编辑器的主题使用相关
- string makeups = 10;
- // 整容之外科手术
- string surgerys = 11;
- // 美摄特定的videofx
- string videofxs = 12;
- // 编辑器的主题使用相关
- string themes = 13;
- // 拍摄之稿件合拍
- string cooperates = 14;
- // 拍摄之音乐卡点视频
- string rhythms = 15;
- // mvp特效
- string effects = 16;
- // mvp背景
- string backgrounds = 17;
- // mvp视频
- string videos = 18;
- // mvp音效
- string sounds = 19;
- // mvp花字
- string flowers = 20;
- // mvp封面模板
- string cover_templates = 21;
- // tts
- string tts = 22;
- // openings
- string openings = 23;
- // 录音题词
- bool record_text = 24;
- // 虚拟形象上报
- string vupers = 25;
- //
- string features = 26;
- //
- string bcut_features = 27;
- //
- int32 audio_record = 28;
- //
- int32 camera = 29;
- //
- int32 speed = 30;
- //
- int32 camera_rotate = 31;
- //
- int32 screen_record = 32;
- //
- int32 default_end = 33;
- //
- int32 duration = 34;
- //
- int32 pic_count = 35;
- //
- int32 video_count = 36;
- //
- int32 shot_duration = 37;
- //
- string shot_game = 38;
- //
- bool highlight = 39;
- //
- int32 highlight_cnt = 40;
- //
- int32 pip_count = 41;
-}
-
-//
-message DynVideoHotAct {
- //
- int64 act_id = 1;
- //
- int64 etime = 2;
- //
- int64 id = 3;
- //
- string pic = 4;
- //
- int64 stime = 5;
- //
- string title = 6;
- //
- string link = 7;
-}
-
-// 动态视频分P聚合字段
-message DynVideoMultiP {
- // 分P标题
- string title = 1;
- // 分P的文件名
- string filename = 2;
- //
- int64 cid = 3;
- // 编辑环境上报信息
- DynVideoEditor editor = 4;
-}
-
-//
-message DynVideoPushIntro {
- //
- int32 show = 1;
- //
- string text = 2;
-}
-
-//
-message DynVideoSubmitActBanner {
- //
- string hotact_text = 1;
- //
- string hotact_url = 2;
- //
- repeated DynVideoHotAct list = 3;
-}
-
-//
-message DynVideoVote {
- //
- int64 vote_id = 1;
- //
- string vote_title = 2;
- //
- int32 top_for_reply = 3;
-}
-
-// 动态视频水印信息
-message DynVideoWatermark {
- // 水印状态
- // 0-关闭 1-打开 2-预览
- int32 state = 1;
- // 类型
- // 1-用户昵称类型 2-用户id类型 3-用户名在logo下面
- int32 type = 2;
- // 位置
- // 1-左上 2-右上 3-左下 4-右下
- int32 position = 3;
-}
-
-//
-message ExtLbs {
- //
- string address = 1;
- //
- int64 distance = 2;
- //
- int64 type = 3;
- //
- string poi = 4;
- //
- LbsLoc location = 5;
- //
- string show_title = 6;
- //
- string title = 7;
- //
- string show_distance = 8;
-}
-
-// 根据name取uid-请求
-message GetUidByNameReq {
- // 查询昵称列表
- repeated string names = 1;
-}
-
-// 根据name取uid-响应
-message GetUidByNameRsp {
- // k:昵称 v:mid
- map uids = 1;
-}
-
-// 发布时附带的商品卡的详细内容
-message GoodsContent {
- // 商品类型
- // 1淘宝、2会员购
- int32 source_type = 1;
- // 商品的id
- int64 item_id = 2;
- // 店铺的id,兼容老版本
- int64 shop_id = 3;
-}
-
-// UP已经创建的活动列表
-message LaunchedActivity {
- // 模块名称,示例:"已创建的活动"
- string module_title = 1;
- // 已创建的活动列表
- repeated LaunchedActivityItem activities = 2;
- // 展示更多按钮
- // 已创建活动大于5个时下发
- ShowMoreLaunchedActivity show_more = 3;
-}
-
-// UP已经创建的活动详情
-message LaunchedActivityItem {
- // 活动id
- int64 activity_id = 1;
- // 活动名称
- string activity_name = 2;
- // 活动是否已上线
- // 0未上线 1已上线
- int32 activity_state = 3;
-}
-
-//
-message LbsLoc {
- // 经度
- double lat = 1;
- // 纬度
- double lng = 2;
-}
-
-//
-message MetaDataCtrl {
- // 客户端平台
- string platform = 1;
- // 客户端build号
- string build = 2;
- // 客户端移动设备类型
- string mobi_app = 3;
- // 客户端buvid
- string buvid = 4;
- // 用户设备信息
- string device = 5;
- // 请求来源页面的spmid
- string from_spmid = 6;
- // 请求来源页面
- string from = 7;
- // 请求的trace_id
- string trace_id = 8;
- // 青少年模式
- int32 teenager_mode = 9;
- // 0:正常 1:冷启动
- int32 cold_start = 10;
- // 客户端版本号
- string version = 11;
- // 网络状态
- // Unknown=0 WIFI=1 WWAN=2
- int32 network = 12;
- // 用户ip地址
- string ip = 13;
-}
-
-//
-message PlusRedDot {
- //
- int64 plus_has_red_dot = 1;
-}
-
-// 小程序内容定义
-message Program {
- // 标题
- string title = 1;
- // 描述文字
- string desc = 2;
- // 封面图
- string cover = 3;
- // 跳转链接
- string target_url = 4;
- // 小程序icon
- string icon = 5;
- // 小程序名称
- string program_text = 6;
- // 跳转链接文案,如:去看看
- string jump_text = 7;
-}
-
-// 发布相关的设置项
-message PublishSetting {
- // 提示转为专栏的最小字数,使用utf-16编码计算字符数
- int32 min_words_to_article = 1;
- // 提示转为专栏的最大字数,使用utf-16编码计算字符数
- int32 max_words_to_article = 2;
- // gif上传的最大值,单位:MB
- int32 upload_size = 3;
-}
-
-// 发布页小黄条
-message PublishYellowBar {
- // 展示文案
- string text = 1;
- // 跳转链接
- string url = 2;
- // 展示图标
- string icon = 3;
-}
-
-//
-message RepostInitCheck {
- //
- DynIdentity repost_src = 1;
- //
- string share_id = 2;
- //
- int32 share_mode = 3;
-}
-
-//
-enum ReserveSource {
- RESERVE_SOURCE_NEW = 0; //
- RESERVE_SOURCE_ASSOCIATED = 1; //
-}
-
-// 分享渠道信息
-message ShareChannel {
- // 业务类型,如动态是"dynamic"
- string share_origin = 1;
- // 业务资源id
- string oid = 2;
- // 辅助id, 非必返回字段
- string sid = 3;
- // 渠道列表
- repeated ShareChannelItem share_channels = 4;
-}
-
-// 渠道
-message ShareChannelItem {
- // 展示文案
- string name = 1;
- // 展示图标
- string picture = 2;
- // 渠道名称
- string share_channel = 3;
- // 预约卡分享图信息,仅分享有预约信息的动态时存在
- ShareReserve reserve = 4;
-}
-
-//
-message ShareReserve {
- // 标题
- string title = 1;
- // 描述(时间+类型)
- string desc = 2;
- // 二维码附带icon
- string qr_code_icon = 3;
- // 二维码附带文本
- string qr_code_text = 4;
- // 二维码链接
- string qr_code_url = 5;
- //
- string name = 6;
- //
- string face = 7;
- //
- ShareReservePoster poster = 8;
- //
- ShareReserveLottery reserve_lottery = 9;
-}
-
-//
-message ShareReserveLottery {
- //
- string icon = 1;
- //
- string text = 2;
-}
-
-//
-message ShareReservePoster {
- //
- string url = 1;
- //
- double width = 2;
- //
- double height = 3;
-}
-
-//
-message ShareResult {
- //
- int64 share_enable = 1;
- //
- string toast = 2;
-}
-
-// UP已经创建的活动列表中的展示更多按钮详情
-message ShowMoreLaunchedActivity {
- // 按钮的文案
- string button_text = 1;
- // 按钮的跳转链接
- string jump_url = 2;
-}
-
-// 通用模板的网页元内容(sketch结构)定义
-message Sketch {
- // 元内容标题,长度30限制
- string title = 1;
- // 描述文字(文本内容第二行),长度233限制
- string desc_text = 2;
- // 文本文字(文本内容第三行),仅限竖图通用卡片使用,长度233限制
- string text = 3;
- // 表示业务方的id表示,对于在业务方有唯一标示的必填
- int64 biz_id = 4;
- // 业务类型,与展示时的右上角标有关,需要业务方向动态申请
- int64 biz_type = 5;
- // 封面图片链接地址,域名需要符合白名单
- string cover_url = 6;
- // 跳转链接地址,域名需要符合白名单
- string target_url = 7;
-}
-
-// 发布相关的权限内容
-message UpPermission {
- // 通用权限列表
- repeated UpPermissionItem items = 1;
- // 已经创建的活动列表
- LaunchedActivity launched_activity = 2;
- //
- ShareResult share_result = 3;
-}
-
-// 通用发布权限内容的详细定义
-message UpPermissionItem {
- // 类型,enum UpPermissionType
- int32 type = 1;
- // UP是否有权限
- // 1-有,2-限制(展示但不可点,仅预约使用)
- int32 permission = 2;
- // 按钮文案
- string title = 3;
- // 功能开关的副标题
- string subtitle = 4;
- // 按钮图标的url地址
- string icon = 5;
- // 跳转链接,permission=1时点击按钮跳到此链接
- string jump_url = 6;
- // 错误提示,permission=2时点击按钮会弹出此提示,目前仅预约使用
- string toast = 7;
- //
- int64 has_red_dot = 8;
-}
-
-//
-enum UpPermissionType {
- UP_PERMISSION_TYPE_NONE = 0; // 占位
- UP_PERMISSION_TYPE_LOTTERY = 1; // 是否是抽奖的灰度用户,默认不是
- UP_PERMISSION_TYPE_CLIP_PUBLISHED = 2; // 之前是否发过小视频,默认没发过
- UP_PERMISSION_TYPE_UGC_ATTACH_CARD = 3; // 是否可以添加ugc附加卡,默认不可以
- UP_PERMISSION_TYPE_GOODS_ATTACH_CARD = 4; // 是否有权限添加商品附加卡
- UP_PERMISSION_TYPE_CHOOSE_COMMENT = 5; // 是否有权限自主精选评论白名单,默认没有
- UP_PERMISSION_TYPE_CONTROL_COMMENT = 6; // 是否有权限关闭评论区,默认有
- UP_PERMISSION_TYPE_CONTROL_DANMU = 7; // 是否有权限关闭弹幕(仅对动态视频生效),默认有
- UP_PERMISSION_TYPE_VIDEO_RESERVE = 8; // 是否可以发起稿件预约
- UP_PERMISSION_TYPE_LIVE_RESERVE = 9; // 是否可以发起直播预约
-}
-
-// 用户主动发布(app/web发布)时的meta信息
-message UserCreateMeta {
- // 用户发布客户端的meta信息
- MetaDataCtrl app_meta = 1;
- // 用户发布时的位置信息(经纬度)
- LbsLoc loc = 2;
- // 1-发布页转发 2-立即转发
- int32 repost_mode = 3;
-}
-
-//
-message VideoShareInfo {
- //
- int64 cid = 1;
- //
- int32 part = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/dynamic/gw/gateway.proto b/bili-api-grpc/proto/bilibili/dynamic/gw/gateway.proto
deleted file mode 100644
index d6d96e5d5..000000000
--- a/bili-api-grpc/proto/bilibili/dynamic/gw/gateway.proto
+++ /dev/null
@@ -1,2754 +0,0 @@
-syntax = "proto3";
-
-package bilibili.dynamic.gateway;
-
-option java_multiple_files = true;
-
-import "google/protobuf/any.proto";
-
-// 综合页请求广告所需字段,由客户端-网关透传
-message AdParam {
- // 综合页请求广告所需字段,由客户端-网关透传
- string ad_extra = 1;
- // request_id
- string request_id = 2;
-}
-
-//
-enum AddButtonBgStyle {
- fill = 0; // 默认填充
- stroke = 1; // 描边
- gray = 2; // 置灰
-}
-
-// 按钮类型
-enum AddButtonType {
- bt_none = 0; // 占位
- bt_jump = 1; // 跳转
- bt_button = 2; // 按钮
-}
-
-// 动态-附加卡-通用卡
-message AdditionCommon {
- // 头部说明文案
- string head_text = 1;
- // 标题
- string title = 2;
- // 展示图
- string image_url = 3;
- // 描述文字1
- string desc_text_1 = 4;
- // 描述文字2
- string desc_text_2 = 5;
- // 点击跳转链接
- string url = 6;
- // 按钮
- AdditionalButton button = 7;
- // 头部icon
- string head_icon = 8;
- // style
- ImageStyle style = 9;
- // 动态本身的类型 type
- string type = 10;
- // 附加卡类型
- string card_type = 11; // ogv manga
-}
-
-// 动态-附加卡-电竞卡
-message AdditionEsport {
- // 电竞类型
- EspaceStyle style = 1;
- oneof item {
- // moba类
- AdditionEsportMoba addition_esport_moba = 2;
- }
- // 动态本身的类型 type
- string type = 3;
- // 附加卡类型
- string card_type = 4; // ogv manga
-}
-
-// 动态-附加卡-电竞卡-moba类
-message AdditionEsportMoba {
- // 头部说明文案
- string head_text = 1;
- // 标题
- string title = 2;
- // 战队列表
- repeated MatchTeam match_team = 3;
- // 比赛信息
- AdditionEsportMobaStatus addition_esport_moba_status = 4;
- // 卡片跳转
- string uri = 5;
- // 按钮
- AdditionalButton button = 6;
- // 副标题
- string sub_title = 7;
- // 动态本身的类型 type
- string type = 10;
- // 附加卡类型
- string card_type = 11;
-}
-
-// 动态-附加卡-电竞卡-moba类-比赛信息
-message AdditionEsportMobaStatus {
- // 文案类
- repeated AdditionEsportMobaStatusDesc addition_esport_moba_status_desc = 1;
- // 比赛状态文案
- string title = 2;
- // 比赛状态状态
- int32 status = 3;
- // 日间色值
- string color = 4;
- // 夜间色值
- string night_color = 5;
-}
-
-// 动态-附加卡-电竞卡-moba类-比赛信息-文案类
-message AdditionEsportMobaStatusDesc {
- // 文案
- string title = 1;
- // 日间色值
- string color = 2;
- // 夜间色值
- string night_color = 3;
-}
-
-// 动态-附加卡-商品卡
-message AdditionGoods {
- // 推荐文案
- string rcmd_desc = 1;
- // 商品信息
- repeated GoodsItem goods_items = 2;
- // 附加卡类型
- string card_type = 3;
- // 头部icon
- string icon = 4;
- // 商品附加卡整卡跳转
- string uri = 5;
- // 商品类型
- // 1:淘宝 2:会员购,注:实际是获取的goods_items里面的第一个source_type
- int32 source_type = 6;
-}
-
-// up主预约发布卡
-message AdditionUP {
- // 标题
- string title = 1;
- // 高亮文本,描述文字1
- HighlightText desc_text_1 = 2;
- // 描述文字2
- string desc_text_2 = 3;
- // 点击跳转链接
- string url = 4;
- // 按钮
- AdditionalButton button = 5;
- // 附加卡类型
- string card_type = 6;
- // 预约人数(用于预约人数变化)
- int64 reserve_total = 7;
- // 活动皮肤
- AdditionalActSkin act_skin = 8;
-}
-
-// 动态-附加卡-UGC视频附加卡
-message AdditionUgc {
- // 说明文案
- string head_text = 1;
- // 稿件标题
- string title = 2;
- // 封面
- string cover = 3;
- // 描述文字1
- string desc_text_1 = 4;
- // 描述文字2
- string desc_text_2 = 5;
- // 接秒开
- string uri = 6;
- // 时长
- string duration = 7;
- // 标题支持换行-标题支持单行和双行,本期不支持填充up昵称,支持双行展示,字段默认为true
- bool line_feed = 8;
- // 附加卡类型
- string card_type = 9;
-}
-
-// 动态-附加卡-投票
-message AdditionVote {
- // 封面图
- string image_url = 1;
- // 标题
- string title = 2;
- // 展示项1
- string text_1 = 3;
- // button文案
- string button_text = 4;
- // 点击跳转链接
- string url = 5;
-}
-
-// 动态模块-投票
-message AdditionVote2 {
- // 投票类型
- AdditionVoteType addition_vote_type = 1;
- // 投票ID
- int64 vote_id = 2;
- // 标题
- string title = 3;
- // 已过期: xxx人参与· 投票已过期。button 展示去查看
- // 未过期: xxx人参与· 剩xx天xx时xx分。button展示去投票
- string label = 4;
- // 剩余时间
- int64 deadline = 5;
- // 生效文案
- string open_text = 6;
- // 过期文案
- string close_text = 7;
- // 已投票
- string voted_text = 8;
- // 投票状态
- AdditionVoteState state = 9;
- // 投票信息
- oneof item {
- //
- AdditionVoteWord addition_vote_word = 10;
- //
- AdditionVotePic addition_vote_pic = 11;
- //
- AdditionVoteDefaule addition_vote_defaule = 12;
- }
- // 业务类型
- // 0:动态投票 1:话题h5组件
- int32 biz_type = 13;
- // 投票总人数
- int64 total = 14;
- // 附加卡类型
- string card_type = 15;
- // 异常提示
- string tips = 16;
- // 跳转地址
- string uri = 17;
- // 是否投票
- bool is_voted = 18;
- // 投票最多多选个数,单选为1
- int32 choice_cnt = 19;
- // 是否默认选中分享到动态
- bool defaule_select_share = 20;
-}
-
-// 外露投票
-message AdditionVoteDefaule {
- // 图片 多张
- repeated string cover = 1;
-}
-
-// 外露图片类型
-message AdditionVotePic {
- // 图片投票详情
- repeated AdditionVotePicItem item = 1;
-}
-
-// 图片投票详情
-message AdditionVotePicItem {
- // 选项索引,从1开始
- int32 opt_idx = 1;
- // 图片
- string cover = 2;
- // 选中状态
- bool is_vote = 3;
- // 人数
- int32 total = 4;
- // 占比
- double persent = 5;
- // 标题文案
- string title = 6;
- // 是否投票人数最多的选项
- bool is_max_option = 7;
-}
-
-// 投票状态
-enum AdditionVoteState {
- addition_vote_state_none = 0; //
- addition_vote_state_open = 1; //
- addition_vote_state_close = 2; //
-}
-
-// 投票类型
-enum AdditionVoteType {
- addition_vote_type_none = 0; //
- addition_vote_type_word = 1; //
- addition_vote_type_pic = 2; //
- addition_vote_type_default = 3; //
-}
-
-// 外露文字类型
-message AdditionVoteWord {
- // 外露文字投票详情
- repeated AdditionVoteWordItem item = 1;
-}
-
-// 外露文字投票详情
-message AdditionVoteWordItem {
- // 选项索引,从1开始
- int32 opt_idx = 1;
- // 文案
- string title = 2;
- // 选中状态
- bool is_vote = 3;
- // 人数
- int32 total = 4;
- // 占比
- double persent = 5;
- // 是否投票人数最多的选项
- bool is_max_option = 6;
-}
-
-// 活动皮肤
-message AdditionalActSkin {
- // 动画SVGA资源
- string svga = 1;
- // 动画SVGA最后一帧图片资源
- string last_image = 2;
- // 动画播放次数
- int64 play_times = 3;
-}
-
-// 动态-附加卡-按钮
-message AdditionalButton {
- // 按钮类型
- AddButtonType type = 1;
- // jump-跳转样式
- AdditionalButtonStyle jump_style = 2;
- // jump-跳转链接
- string jump_url = 3;
- // button-未点样式
- AdditionalButtonStyle uncheck = 4;
- // button-已点样式
- AdditionalButtonStyle check = 5;
- // button-当前状态
- AdditionalButtonStatus status = 6;
- // 按钮点击样式
- AdditionalButtonClickType click_type = 7;
-}
-
-// 附加卡按钮点击类型
-enum AdditionalButtonClickType {
- click_none = 0; // 通用按钮
- click_up = 1; // 预约卡按钮
-}
-
-message AdditionalButtonInteractive {
- // 是否弹窗
- string popups = 1;
- // 弹窗确认文案
- string confirm = 2;
- // 弹窗取消文案
- string cancel = 3;
- //
- string desc = 4;
-}
-
-//
-enum AdditionalButtonStatus {
- none = 0; //
- uncheck = 1; //
- check = 2; //
-}
-
-// 动态-附加卡-按钮样式
-message AdditionalButtonStyle {
- // icon
- string icon = 1;
- // 文案
- string text = 2;
- // 按钮点击交互
- AdditionalButtonInteractive interactive = 3;
- // 当前按钮填充样式
- AddButtonBgStyle bg_style = 4;
- // toast文案, 当disable=1时有效
- string toast = 5;
- // 当前按钮样式,
- // 0:高亮 1:置灰(按钮不可点击)
- DisableState disable = 6;
-}
-
-// 动态-附加卡-番剧卡
-message AdditionalPGC {
- // 头部说明文案
- string head_text = 1;
- // 标题
- string title = 2;
- // 展示图
- string image_url = 3;
- // 描述文字1
- string desc_text_1 = 4;
- // 描述文字2
- string desc_text_2 = 5;
- // 点击跳转链接
- string url = 6;
- // 按钮
- AdditionalButton button = 7;
- // 头部icon
- string head_icon = 8;
- // style
- ImageStyle style = 9;
- // 动态本身的类型 type
- string type = 10;
-}
-
-// 枚举-动态附加卡
-enum AdditionalType {
- additional_none = 0; // 占位
- additional_type_pgc = 1; // 附加卡-追番
- additional_type_goods = 2; // 附加卡-商品
- additional_type_vote = 3; // 附加卡投票
- additional_type_common = 4; // 附加通用卡
- additional_type_esport = 5; // 附加电竞卡
- additional_type_up_rcmd = 6; // 附加UP主推荐卡
- additional_type_ugc = 7; // 附加卡-ugc
- additional_type_up_reservation = 8; // UP主预约卡
-}
-
-// 动态卡片列表
-message CardVideoDynList {
- // 动态列表
- repeated DynamicItem list = 1;
- // 更新的动态数
- int64 update_num = 2;
- // 历史偏移
- string history_offset = 3;
- // 更新基础信息
- string update_baseline = 4;
- // 是否还有更多数据
- bool has_more = 5;
-}
-
-// 视频页-我的追番
-message CardVideoFollowList {
- // 查看全部(跳转链接)
- string view_all_link = 1;
- // 追番列表
- repeated FollowListItem list = 2;
-}
-
-// 视频页-最近访问
-message CardVideoUpList {
- // 标题展示文案
- string title = 1;
- // up主列表
- repeated UpListItem list = 2;
- // 服务端生成的透传上报字段
- string footprint = 3;
- // 直播数
- int32 show_live_num = 4;
- // 跳转label
- UpListMoreLabel more_label = 5;
- // 标题开关(综合页)
- int32 title_switch = 6;
- // 是否展示右上角查看更多label
- bool show_more_label = 7;
- // 是否在快速消费页查看更多按钮
- bool show_in_personal = 8;
- // 是否展示右侧查看更多按钮
- bool show_more_button = 9;
-}
-
-// 评论外露展示项
-message CmtShowItem {
- // 用户mid
- int64 uid = 1;
- // 用户昵称
- string uname = 2;
- // 点击跳转链接
- string uri = 3;
- // 评论内容
- string comment = 4;
-}
-
-// 装扮卡片-粉丝勋章信息
-message DecoCardFan {
- // 是否是粉丝
- int32 is_fan = 1;
- // 数量
- int32 number = 2;
- // 数量 str
- string number_str = 3;
- // 颜色
- string color = 4;
-}
-
-// 装扮卡片
-message DecorateCard {
- // 装扮卡片id
- int64 id = 1;
- // 装扮卡片链接
- string card_url = 2;
- // 装扮卡片点击跳转链接
- string jump_url = 3;
- // 粉丝样式
- DecoCardFan fan = 4;
-}
-
-// 文本类型
-enum DescType {
- desc_type_none = 0; // 占位
- desc_type_text = 1; // 文本
- desc_type_aite = 2; // @
- desc_type_lottery = 3; // 抽奖
- desc_type_vote = 4; // 投票
- desc_type_topic = 5; // 话题
- desc_type_goods = 6; // 商品
- desc_type_bv = 7; // bv
- desc_type_av = 8; // av
- desc_type_emoji = 9; // 表情
- desc_type_user = 10; // 外露用户
- desc_type_cv = 11; // 专栏
- desc_type_vc = 12; // 小视频
- desc_type_web = 13; // 网址
- desc_type_taobao = 14; // 淘宝
- desc_type_mail = 15; // 邮箱
- desc_type_ogv_season = 16; // 番剧season
- desc_type_ogv_ep = 17; // 番剧ep
-}
-
-// 文本描述
-message Description {
- // 文本内容
- string text = 1;
- // 文本类型
- DescType type = 2;
- // 点击跳转链接
- string uri = 3;
- // emoji类型
- EmojiType emoji_type = 4;
- // 商品类型
- string goods_type = 5;
- // 前置Icon
- string icon_url = 6;
- // icon_name
- string icon_name = 7;
- // 资源ID
- string rid = 8;
- // 商品卡特殊字段
- ModuleDescGoods goods = 9;
- // 文本原始文案
- string orig_text = 10;
-}
-
-// 尺寸信息
-message Dimension {
- //
- int64 height = 1;
- //
- int64 width = 2;
- //
- int64 rotate = 3;
-}
-
-//
-enum DisableState {
- highlight = 0; // 高亮
- gary = 1; // 置灰(按钮不可点击)
-}
-
-// 动态通用附加卡-follow/取消follow-响应
-message DynAdditionCommonFollowReply {
- //
- AdditionalButtonStatus status = 1;
-}
-
-// 动态通用附加卡-follow/取消follow-请求
-message DynAdditionCommonFollowReq {
- //
- AdditionalButtonStatus status = 1;
- //
- string dyn_id = 2;
- //
- string card_type = 3;
-}
-
-// 最近访问-个人feed流列表-返回
-message DynAllPersonalReply {
- // 动态列表
- repeated DynamicItem list = 1;
- // 偏移量
- string offset = 2;
- // 是否还有更多数据
- bool has_more = 3;
- // 已读进度
- string read_offset = 4;
- // 关注状态
- Relation relation = 5;
-}
-
-// 最近访问-个人feed流列表-请求
-message DynAllPersonalReq {
- // 被访问者的 UID
- int64 host_uid = 1;
- // 偏移量 第一页可传空
- string offset = 2;
- // 标明下拉几次
- int32 page = 3;
- // 是否是预加载 默认是1;客户端预加载。1:是预加载,不更新已读进度,不会影响小红点;0:非预加载,更新已读进度
- int32 is_preload = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 6;
- // 服务端生成的透传上报字段
- string footprint = 7;
- // 来源
- string from = 8;
- // 秒开用
- PlayerArgs player_args = 9;
-}
-
-// 动态综合页-响应
-message DynAllReply {
- // 卡片列表
- DynamicList dynamic_list = 1;
- // 顶部up list
- CardVideoUpList up_list = 2;
- // 话题广场
- TopicList topic_list = 3;
- // 无关注推荐
- Unfollow unfollow = 4;
-}
-
-// 动态综合页-请求
-message DynAllReq {
- // 透传 update_baseline
- string update_baseline = 1;
- // 透传 history_offset
- string offset = 2;
- // 向下翻页数
- int32 page = 3;
- // 刷新方式 1向上刷新 2向下翻页
- Refresh refresh_type = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 综合页当前更新的最大值
- string assist_baseline = 6;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 7;
- // 推荐up主入参(new的时候传)
- RcmdUPsParam rcmd_ups_param = 8;
- // 广告参数
- AdParam ad_param = 9;
- // 是否冷启
- int32 cold_start = 10;
- // 来源
- string from = 11;
- // 秒开参数
- PlayerArgs player_args = 12;
-}
-
-// 最近访问-标记已读-请求
-message DynAllUpdOffsetReq {
- // 被访问者的UID
- int64 host_uid = 1;
- // 用户已读进度
- string read_offset = 2;
- // 服务端生成的透传上报字段
- string footprint = 3;
-}
-
-// 动态详情页-响应
-message DynDetailReply {
- // 动态详情
- DynamicItem item = 1;
-}
-
-// 批量动态id获取动态详情-请求
-message DynDetailsReq {
- // 动态id
- string dynamic_ids = 1;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 2;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 3;
- // 秒开参数
- PlayerArgs player_args = 4;
-}
-
-// 动态小卡类型
-enum DynExtendType {
- dyn_ext_type_none = 0; // 占位
- dyn_ext_type_topic = 1; // 话题小卡
- dyn_ext_type_lbs = 2; // lbs小卡
- dyn_ext_type_hot = 3; // 热门小卡
- dyn_ext_type_game = 4; // 游戏小卡
- dyn_ext_type_common = 5; // 通用小卡
- dyn_ext_type_biliCut = 6; // 必剪小卡
- dyn_ext_type_ogv = 7; // ogv小卡
- dyn_ext_type_auto_ogv = 8; // 自动附加ogv小卡
-}
-
-// 动态发布生成临时卡-响应
-message DynFakeCardReply {
- // 动态卡片
- DynamicItem item = 1;
-}
-
-// 动态发布生成临时卡-请求
-message DynFakeCardReq {
- //卡片内容json string
- string content = 1;
-}
-
-// 查看更多-列表-响应
-message DynMixUpListViewMoreReply {
- //
- repeated MixUpListItem items = 1;
- //
- string search_default_text = 2;
- // 排序类型列表
- repeated SortType sort_types = 3;
- // 是否展示更多的排序策略
- bool show_more_sort_types = 4;
- // 默认排序策略
- int32 default_sort_type = 5;
-}
-
-// 查看更多-请求
-message DynMixUpListViewMoreReq {
- // 排序策略
- // 1:推荐排序 2:最常访问 3:最近关注,其他值为默认排序
- int32 sort_type = 1;
-}
-
-// 动态模块类型
-enum DynModuleType {
- module_none = 0; // 占位
- module_author = 1; // 发布人模块
- module_dispute = 2; // 争议小黄条
- module_desc = 3; // 描述文案
- module_dynamic = 4; // 动态卡片
- module_forward = 5; // 转发模块
- module_likeUser = 6; // 点赞用户(废弃)
- module_extend = 7; // 小卡模块
- module_additional = 8; // 附加卡
- module_stat = 9; // 计数信息
- module_fold = 10; // 折叠
- module_comment = 11; // 评论外露(废弃)
- module_interaction = 12; // 外露交互模块(点赞、评论)
- module_author_forward = 13; // 转发卡的发布人模块
- module_ad = 14; // 广告卡模块
- module_banner = 15; // 通栏模块
- module_item_null = 16; // 获取物料失败模块
- module_share_info = 17; // 分享组件
- module_recommend = 18; // 相关推荐模块
- module_stat_forward = 19; // 转发卡计数信息
- module_top = 20; // 顶部模块
- module_bottom = 21; // 底部模块
-}
-
-// 关注推荐up主换一换-响应
-message DynRcmdUpExchangeReply {
- // 无关注推荐
- Unfollow unfollow = 1;
-}
-
-// 关注推荐up主换一换-请求
-message DynRcmdUpExchangeReq {
- // 登录用户id
- int64 uid = 1;
- // 上一次不感兴趣的ts,单位:秒;该字段透传给搜索
- int64 dislikeTs = 2;
- // 需要与服务端确认或参照客户端现有参数
- string from = 3;
-}
-
-// 动态点赞-请求
-message DynThumbReq {
- // 用户uid
- int64 uid = 1;
- // 动态id
- string dyn_id = 2;
- // 动态类型(透传extend中的dyn_type)
- int64 dyn_type = 3;
- // 业务方资源id
- string rid = 4;
- // 点赞类型
- ThumbType type = 5;
-}
-
-//
-enum DynUriType {
- dyn_uri_type_none = 0; //
- dyn_uri_type_direct = 1; // 直接跳转对应uri
- dyn_uri_type_suffix = 2; // 作为后缀拼接
-}
-
-// 最近访问-个人feed流列表-响应
-message DynVideoPersonalReply {
- // 动态列表
- repeated DynamicItem list = 1;
- // 偏移量
- string offset = 2;
- // 是否还有更多数据
- bool has_more = 3;
- // 已读进度
- string read_offset = 4;
- // 关注状态
- Relation relation = 5;
-}
-
-// 最近访问-个人feed流列表-请求
-message DynVideoPersonalReq {
- // 被访问者的 UID
- int64 host_uid = 1;
- // 偏移量 第一页可传空
- string offset = 2;
- // 标明下拉几次
- int32 page = 3;
- // 是否是预加载
- int32 is_preload = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 6;
- // 服务端生成的透传上报字段
- string footprint = 7;
- // 来源
- string from = 8;
- // 秒开参数
- PlayerArgs player_args = 9;
-}
-
-// 动态视频页-响应
-message DynVideoReply {
- // 卡片列表
- CardVideoDynList dynamic_list = 1;
- // 动态卡片
- CardVideoUpList video_up_list = 2;
- // 视频页-我的追番
- CardVideoFollowList video_follow_list = 3;
-}
-
-// 动态视频页-请求
-message DynVideoReq {
- // 透传 update_baseline
- string update_baseline = 1;
- // 透传 history_offset
- string offset = 2;
- // 向下翻页数
- int32 page = 3;
- // 刷新方式
- // 1:向上刷新 2:向下翻页
- Refresh refresh_type = 4;
- // 秒开参数 新版本废弃,统一使用player_args
- PlayurlParam playurl_param = 5;
- // 综合页当前更新的最大值
- string assist_baseline = 6;
- // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
- int32 local_time = 7;
- // 来源
- string from = 8;
- // 秒开参数
- PlayerArgs player_args = 9;
-}
-
-// 最近访问-标记已读-请求
-message DynVideoUpdOffsetReq {
- // 被访问者的UID
- int64 host_uid = 1;
- // 用户已读进度
- string read_offset = 2;
- // 服务端生成的透传上报字段
- string footprint = 3;
-}
-
-// 投票操作-响应
-message DynVoteReply {
- // 投票详情
- AdditionVote2 item = 1;
- // 投票操作返回状态
- string toast = 2;
-}
-
-// 投票操作-请求
-message DynVoteReq {
- // 投票ID
- int64 vote_id = 1;
- // 选项索引数组
- repeated int64 votes = 2;
- // 状态
- VoteStatus status = 3;
- // 动态ID
- string dynamic_id = 4;
- // 是否分享
- bool share = 5;
-}
-
-// 动态卡片
-message DynamicItem {
- // 动态卡片类型
- DynamicType card_type = 1;
- // 转发类型下,源卡片类型
- DynamicType item_type = 2;
- // 模块内容
- repeated Module modules = 3;
- // 操作相关字段
- Extend extend = 4;
- // 该卡片下面是否含有折叠卡
- int32 has_fold = 5;
-}
-
-//动态卡片列表
-message DynamicList {
- // 动态列表
- repeated DynamicItem list = 1;
- // 更新的动态数
- int64 update_num = 2;
- // 历史偏移
- string history_offset = 3;
- // 更新基础信息
- string update_baseline = 4;
- // 是否还有更多数据
- bool has_more = 5;
-}
-
-// 枚举-动态类型
-enum DynamicType {
- dyn_none = 0; // 占位
- forward = 1; // 转发
- av = 2; // 稿件: ugc、小视频、短视频、UGC转PGC
- pgc = 3; // pgc:番剧、PGC番剧、PGC电影、PGC电视剧、PGC国创、PGC纪录片
- courses = 4; // 付费更新批次
- fold = 5; // 折叠
- word = 6; // 纯文字
- draw = 7; // 图文
- article = 8; // 专栏 原仅phone端
- music = 9; // 音频 原仅phone端
- common_square = 10; // 通用卡 方形
- common_vertical = 11; // 通用卡 竖形
- live = 12; // 直播卡 只有转发态
- medialist = 13; // 播单 原仅phone端 只有转发态
- courses_season = 14; // 付费更新批次 只有转发态
- ad = 15; // 广告卡
- applet = 16; // 小程序卡
- subscription = 17; // 订阅卡
- live_rcmd = 18; // 直播推荐卡
- banner = 19; // 通栏
- ugc_season = 20; // 合集卡
- subscription_new = 21; // 新订阅卡
-}
-
-// 表情包类型
-enum EmojiType {
- emoji_none = 0; // 占位
- emoji_old = 1; // emoji旧类型
- emoji_new = 2; // emoji新类型
- vip = 3; // 大会员表情
-}
-
-// 附加大卡-电竞卡样式
-enum EspaceStyle {
- moba = 0; // moba类
-}
-
-// 动态-拓展小卡模块-通用小卡
-message ExtInfoCommon {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // poiType
- int32 poi_type = 4;
- // 类型
- DynExtendType type = 5;
- // 客户端埋点用
- string sub_module = 6;
- // 行动点文案
- string action_text = 7;
- // 行动点链接
- string action_url = 8;
- // 资源rid
- int64 rid = 9;
- // 轻浏览是否展示
- bool is_show_light = 10;
-}
-
-// 动态-拓展小卡模块-游戏小卡
-message ExtInfoGame {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 动态-拓展小卡模块-热门小卡
-message ExtInfoHot {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 动态-拓展小卡模块-lbs小卡
-message ExtInfoLBS {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // poiType
- int32 poi_type = 4;
-}
-
-// 动态-拓展小卡模块-ogv小卡
-message ExtInfoOGV {
- // ogv小卡
- repeated InfoOGV info_ogv = 1;
-}
-
-// 动态-拓展小卡模块-话题小卡
-message ExtInfoTopic {
- // 标题-话题名
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
-}
-
-// 扩展字段,用于动态部分操作使用
-message Extend {
- // 动态id
- string dyn_id_str = 1;
- // 业务方id
- string business_id = 2;
- // 源动态id
- string orig_dyn_id_str = 3;
- // 转发卡:用户名
- string orig_name = 4;
- // 转发卡:图片url
- string orig_img_url = 5;
- // 转发卡:文字内容
- repeated Description orig_desc = 6;
- // 填充文字内容
- repeated Description desc = 7;
- // 被转发的源动态类型
- DynamicType orig_dyn_type = 8;
- // 分享到站外展示类型
- string share_type = 9;
- // 分享的场景
- string share_scene = 10;
- // 是否快速转发
- bool is_fast_share = 11;
- // r_type 分享和转发
- int32 r_type = 12;
- // 数据源的动态类型
- int64 dyn_type = 13;
- // 用户id
- int64 uid = 14;
- // 卡片跳转
- string card_url = 15;
- // 透传字段
- google.protobuf.Any source_content = 16;
- // 转发卡:用户头像
- string orig_face = 17;
- // 评论跳转
- ExtendReply reply = 18;
-}
-
-// 评论扩展
-message ExtendReply {
- // 基础跳转地址
- string uri = 1;
- // 参数部分
- repeated ExtendReplyParam params = 2;
-}
-
-// 评论扩展参数部分
-message ExtendReplyParam {
- // 参数名
- string key = 1;
- // 参数值
- string value = 2;
-}
-
-// 折叠类型
-enum FoldType {
- FoldTypeZore = 0; // 占位
- FoldTypePublish = 1; // 用户发布折叠
- FoldTypeFrequent = 2; // 转发超频折叠
- FoldTypeUnite = 3; // 联合投稿折叠
- FoldTypeLimit = 4; // 动态受限折叠
-}
-
-// 视频页-我的追番-番剧信息
-message FollowListItem {
- // season_id
- int64 season_id = 1;
- // 标题
- string title = 2;
- // 封面图
- string cover = 3;
- // 跳转链接
- string url = 4;
- // new_ep
- NewEP new_ep = 5;
- // 子标题
- string sub_title = 6;
- // 卡片位次
- int64 pos = 7;
-}
-
-//
-enum FollowType {
- ft_not_follow = 0; //
- ft_follow = 1; //
-}
-
-// 动态-附加卡-商品卡-商品
-message GoodsItem {
- // 图片
- string cover = 1;
- // schemaPackageName(Android用)
- string schema_package_name = 2;
- // 商品类型
- // 1:淘宝 2:会员购
- int32 source_type = 3;
- // 跳转链接
- string jump_url = 4;
- // 跳转文案
- string jump_desc = 5;
- // 标题
- string title = 6;
- // 摘要
- string brief = 7;
- // 价格
- string price = 8;
- // item_id
- int64 item_id = 9;
- // schema_url
- string schema_url = 10;
- // open_white_list
- repeated string open_white_list = 11;
- // use_web_v2
- bool user_web_v2 = 12;
- // ad mark
- string ad_mark = 13;
-}
-
-// 高亮文本
-message HighlightText {
- // 展示文本
- string text = 1;
- // 高亮类型
- HighlightTextStyle text_style = 2;
-}
-
-// 文本高亮枚举
-enum HighlightTextStyle {
- style_none = 0; // 默认
- style_highlight = 1; // 高亮
-}
-
-// 枚举-附加卡样式
-enum ImageStyle {
- add_style_vertical = 0; //
- add_style_square = 1; //
-}
-
-// 动态-拓展小卡模块-ogv小卡-(one of 片单、榜单、分区)
-message InfoOGV {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 小图标
- string icon = 3;
- // 客户端埋点用
- string sub_module = 4;
-}
-
-// 外露交互模块
-message InteractionItem {
- // 外露模块类型
- LocalIconType icon_type = 1;
- // 外露模块文案
- repeated Description desc = 2;
- // 外露模块uri相关 根据type不同用法不同
- string uri = 3;
- // 动态id
- string dynamic_id = 4;
- // 评论mid
- int64 comment_mid = 6;
-}
-
-// 点赞动画
-message LikeAnimation {
- // 开始动画
- string begin = 1;
- // 过程动画
- string proc = 2;
- // 结束动画
- string end = 3;
- // id
- int64 like_icon_id = 4;
-}
-
-// 点赞拓展信息
-message LikeInfo {
- // 点赞动画
- LikeAnimation animation = 1;
- // 是否点赞
- bool is_like = 2;
-}
-
-// 点赞用户
-message LikeUser {
- // 用户mid
- int64 uid = 1;
- // 用户昵称
- string uname = 2;
- // 点击跳转链接
- string uri = 3;
-}
-
-// 直播信息
-message LiveInfo {
- // 是否在直播
- // 0:未直播 1:正在直播 (废弃)
- int32 is_living = 1;
- // 跳转链接
- string uri = 2;
- // 直播状态
- LiveState live_state = 3;
-}
-
-// 直播状态
-enum LiveState {
- live_none = 0; // 未直播
- live_live = 1; // 直播中
- live_rotation = 2; // 轮播中
-}
-
-// 外露模块类型
-enum LocalIconType {
- local_icon_comment = 0; //
- local_icon_like = 1; //
-}
-
-// 动态-附加卡-电竞卡-战队
-message MatchTeam {
- // 战队ID
- int64 id = 1;
- // 战队名
- string name = 2;
- // 战队图标
- string cover = 3;
- // 日间色值
- string color = 4;
- // 夜间色值
- string night_color = 5;
-}
-
-// 动态列表渲染部分-详情模块-小程序/小游戏
-message MdlDynApplet {
- // 小程序id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 主标题
- string title = 4;
- // 副标题
- string sub_title = 5;
- // 封面图
- string cover = 6;
- // 小程序icon
- string icon = 7;
- // 小程序标题
- string label = 8;
- // 按钮文案
- string button_title = 9;
-}
-
-// 动态-详情模块-稿件
-message MdlDynArchive {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // avid
- int64 avid = 7;
- // cid
- int64 cid = 8;
- // 视频源类型
- MediaType media_type = 9;
- // 尺寸信息
- Dimension dimension = 10;
- // 角标,多个角标之前有间距
- repeated VideoBadge badge = 11;
- // 是否能够自动播放
- bool can_play= 12;
- // stype
- VideoType stype = 13;
- // 是否PGC
- bool isPGC = 14;
- // inline播放地址
- string inlineURL = 15;
- // PGC的epid
- int64 EpisodeId = 16;
- // 子类型
- int32 SubType = 17;
- // PGC的ssid
- int64 PgcSeasonId = 18;
- // 播放按钮
- string play_icon = 19;
- // 时长
- int64 duration = 20;
- // 跳转地址
- string jump_url = 21;
- // 番剧是否为预览视频
- bool is_preview = 22;
- // 新角标,多个角标之前没有间距
- repeated VideoBadge badge_category = 23;
- // 当前是否是pgc正片
- bool is_feature = 24;
- // 是否是预约召回
- ReserveType reserve_type = 25;
- // bvid
- string bvid = 26;
- // 播放数
- int32 view = 27;
-}
-
-// 动态列表渲染部分-详情模块-专栏模块
-message MdlDynArticle {
- // 专栏id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 标题
- string title = 3;
- // 文案部分
- string desc = 4;
- // 配图
- repeated string covers = 5;
- // 阅读量标签
- string label = 6;
- // 模板类型
- int32 templateID = 7;
-}
-
-// 动态列表渲染部分-详情模块-通用
-message MdlDynCommon {
- // 物料id
- int64 oid = 1;
- // 跳转地址
- string uri = 2;
- // 标题
- string title = 3;
- // 描述 漫画卡标题下第一行
- string desc = 4;
- // 封面
- string cover = 5;
- // 标签1 漫画卡标题下第二行
- string label = 6;
- // 所属业务类型
- int32 bizType = 7;
- // 镜像数据ID
- int64 sketchID = 8;
- // 卡片样式
- MdlDynCommonType style = 9;
- // 角标
- repeated VideoBadge badge = 10;
-}
-
-//
-enum MdlDynCommonType {
- mdl_dyn_common_none = 0; //
- mdl_dyn_common_square = 1; //
- mdl_dyn_common_vertica = 2; //
-}
-
-// 动态-详情模块-付费课程批次
-message MdlDynCourBatch {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 跳转地址
- string uri = 3;
- // 展示项 1(本集标题)
- string text_1 = 4;
- // 展示项 2(更新了多少个视频)
- string text_2 = 5;
- // 角标
- VideoBadge badge = 6;
- // 播放按钮
- string play_icon = 7;
-}
-
-// 动态-详情模块-付费课程系列
-message MdlDynCourSeason {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 跳转地址
- string uri = 3;
- // 展示项 1(更新信息)
- string text_1 = 4;
- // 描述信息
- string desc = 5;
- // 角标
- VideoBadge badge = 6;
- // 播放按钮
- string play_icon = 7;
-}
-
-// 动态列表渲染部分-详情模块-图文模块
-message MdlDynDraw {
- // 图片
- repeated MdlDynDrawItem items = 1;
- // 跳转地址
- string uri = 2;
- // 图文ID
- int64 id = 3;
-}
-
-// 动态列表渲染部分-详情模块-图文
-message MdlDynDrawItem {
- // 图片链接
- string src = 1;
- // 图片宽度
- int64 width = 2;
- // 图片高度
- int64 height = 3;
- // 图片大小
- float size = 4;
- // 图片标签
- repeated MdlDynDrawTag tags = 5;
-}
-
-// 动态列表渲染部分-详情模块-图文-标签
-message MdlDynDrawTag {
- // 标签类型
- MdlDynDrawTagType type = 1;
- // 标签详情
- MdlDynDrawTagItem item = 2;
-}
-
-// 动态列表部分-详情模块-图文-标签详情
-message MdlDynDrawTagItem {
- // 跳转链接
- string url = 1;
- // 标签内容
- string text = 2;
- // 坐标-x
- int64 x = 3;
- // 坐标-y
- int64 y = 4;
- // 方向
- int32 orientation = 5;
- // 来源
- // 0:未知 1:淘宝 2:自营
- int32 source = 6;
- // 商品id
- int64 item_id = 7;
- // 用户mid
- int64 mid = 8;
- // 话题id
- int64 tid = 9;
- // lbs信息
- string poi = 10;
- // 商品标签链接
- string schema_url = 11;
-}
-
-// 图文标签类型
-enum MdlDynDrawTagType {
- mdl_draw_tag_none = 0; // 占位
- mdl_draw_tag_common = 1; // 普通标签
- mdl_draw_tag_goods = 2; // 商品标签
- mdl_draw_tag_user = 3; // 用户昵称
- mdl_draw_tag_topic = 4; // 话题名称
- mdl_draw_tag_lbs = 5; // lbs标签
-}
-
-// 动态列表渲染部分-详情模块-转发模块
-message MdlDynForward {
- // 动态转发核心模块 套娃
- DynamicItem item = 1;
- // 透传类型
- // 0:分享 1:转发
- int32 rtype = 2;
-}
-
-// 动态列表渲染部分-详情模块-直播
-message MdlDynLive {
- // 房间号
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 直播间标题
- string title = 3;
- // 直播间封面
- string cover = 4;
- // 标题1 例: 陪伴学习
- string cover_label = 5;
- // 标题2 例: 54.6万人气
- string cover_label2 = 6;
- // 直播状态
- LiveState live_state = 7;
- // 直播角标
- VideoBadge badge = 8;
- // 是否是预约召回
- ReserveType reserve_type = 9;
-}
-
-// 动态列表渲染部分-详情模块-直播推荐
-message MdlDynLiveRcmd {
- // 直播数据
- string content = 1;
- // 是否是预约召回
- ReserveType reserve_type = 2;
-}
-
-// 动态列表渲染部分-详情模块-播单
-message MdlDynMedialist {
- // 播单id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // 主标题
- string title = 3;
- // 副标题
- string sub_title = 4;
- // 封面图
- string cover = 5;
- // 封面类型
- int32 cover_type = 6;
- // 角标
- VideoBadge badge = 7;
-}
-
-// 动态列表渲染部分-详情模块-音频模块
-message MdlDynMusic {
- // 音频id
- int64 id = 1;
- // 跳转地址
- string uri = 2;
- // upId
- int64 up_id = 3;
- // 歌名
- string title = 4;
- // 专辑封面
- string cover = 5;
- // 展示项1
- string label1 = 6;
- // upper
- string upper = 7;
-}
-
-// 动态-详情模块-pgc
-message MdlDynPGC {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // cid
- int64 cid = 7;
- // season_id
- int64 season_id = 8;
- // epid
- int64 epid = 9;
- // aid
- int64 aid = 10;
- // 视频源类型
- MediaType media_type = 11;
- // 番剧类型
- VideoSubType sub_type = 12;
- // 番剧是否为预览视频
- bool is_preview = 13;
- // 尺寸信息
- Dimension dimension = 14;
- // 角标,多个角标之前有间距
- repeated VideoBadge badge = 15;
- // 是否能够自动播放
- bool can_play= 16;
- // season
- PGCSeason season = 17;
- // 播放按钮
- string play_icon = 18;
- // 时长
- int64 duration = 19;
- // 跳转地址
- string jump_url = 20;
- // 新角标,多个角标之前没有间距
- repeated VideoBadge badge_category = 21;
- // 当前是否是pgc正片
- bool is_feature = 22;
-}
-
-// 动态列表渲染部分-详情模块-订阅卡
-message MdlDynSubscription {
- // 卡片物料id
- int64 id = 1;
- // 广告创意id
- int64 ad_id = 2;
- // 跳转地址
- string uri = 3;
- // 标题
- string title = 4;
- // 封面图
- string cover = 5;
- // 广告标题
- string ad_title = 6;
- // 角标
- VideoBadge badge = 7;
- // 小提示
- string tips = 8;
-}
-
-// 动态新附加卡
-message MdlDynSubscriptionNew {
- //样式类型
- MdlDynSubscriptionNewStyle style = 1;
- // 新订阅卡数据
- oneof item {
- //
- MdlDynSubscription dyn_subscription = 2;
- // 直播推荐
- MdlDynLiveRcmd dyn_live_rcmd = 3;
- }
-}
-
-//
-enum MdlDynSubscriptionNewStyle {
- mdl_dyn_subscription_new_style_nont = 0; // 占位
- mdl_dyn_subscription_new_style_live = 1; // 直播
- mdl_dyn_subscription_new_style_draw = 2; // 图文
-}
-
-// 动态列表渲染部分-UGC合集
-message MdlDynUGCSeason {
- // 标题
- string title = 1;
- // 封面图
- string cover = 2;
- // 秒开地址
- string uri = 3;
- // 视频封面展示项 1
- string cover_left_text_1 = 4;
- // 视频封面展示项 2
- string cover_left_text_2 = 5;
- // 封面视频展示项 3
- string cover_left_text_3 = 6;
- // 卡片物料id
- int64 id = 7;
- // inline播放地址
- string inlineURL = 8;
- // 是否能够自动播放
- bool can_play= 9;
- // 播放按钮
- string play_icon = 10;
- // avid
- int64 avid = 11;
- // cid
- int64 cid = 12;
- // 尺寸信息
- Dimension dimension = 13;
- // 时长
- int64 duration = 14;
- // 跳转地址
- string jump_url = 15;
-}
-
-// 播放器类型
-enum MediaType {
- MediaTypeNone = 0; // 本地
- MediaTypeUGC = 1; // UGC
- MediaTypePGC = 2; // PGC
- MediaTypeLive = 3; // 直播
- MediaTypeVCS = 4; // 小视频
-}
-
-// 查看更多-列表单条数据
-message MixUpListItem {
- // 用户mid
- int64 uid = 1;
- // 特别关注
- // 0:否 1:是
- int32 special_attention = 2;
- // 小红点状态
- // 0:没有 1:有
- int32 reddot_state = 3;
- // 直播信息
- MixUpListLiveItem live_info = 4;
- // 昵称
- string name = 5;
- // 头像
- string face = 6;
- // 认证信息
- OfficialVerify official = 7;
- // 大会员信息
- VipInfo vip = 8;
- // 关注状态
- Relation relation = 9;
-}
-
-message MixUpListLiveItem {
- // 直播状态
- // 0:未直播 1:直播中
- bool status = 1;
- // 房间号
- int64 room_id = 2;
- // 跳转地址
- string uri = 3;
-}
-
-// 动态模块
-message Module {
- // 类型
- DynModuleType module_type = 1;
- oneof module_item {
- // 用户模块 1
- ModuleAuthor module_author = 2;
- // 争议黄条模块 2
- ModuleDispute module_dispute = 3;
- // 动态正文模块 3
- ModuleDesc module_desc = 4;
- // 动态卡模块 4
- ModuleDynamic module_dynamic = 5;
- // 点赞外露(废弃)
- ModuleLikeUser module_likeUser = 6;
- // 小卡模块 6
- ModuleExtend module_extend = 7;
- // 大卡模块 5
- ModuleAdditional module_additional = 8;
- // 计数模块 8
- ModuleStat module_stat = 9;
- // 折叠模块 9
- ModuleFold module_fold = 10;
- // 评论外露(废弃)
- ModuleComment module_comment = 11;
- // 外露交互模块(点赞、评论) 7
- ModuleInteraction module_interaction = 12;
- // 转发卡-原卡用户模块
- ModuleAuthorForward module_author_forward = 13;
- // 广告卡
- ModuleAd module_ad = 14;
- // 通栏
- ModuleBanner module_banner = 15;
- // 获取物料失败
- ModuleItemNull module_item_null = 16;
- // 分享组件
- ModuleShareInfo module_share_info = 17;
- // 相关推荐模块
- ModuleRecommend module_recommend = 18;
- // 顶部模块
- ModuleTop module_top = 19;
- // 底部模块
- ModuleButtom module_buttom = 20;
- // 转发卡计数模块
- ModuleStat module_stat_forward = 21;
- }
-}
-
-// 动态列表-用户模块-广告卡
-message ModuleAd {
- // 广告透传信息
- google.protobuf.Any source_content = 1;
- // 用户模块
- ModuleAuthor module_author = 2;
-}
-
-// 动态-附加卡模块
-message ModuleAdditional {
- // 类型
- AdditionalType type = 1;
- oneof item {
- // 废弃
- AdditionalPGC pgc = 2;
- //
- AdditionGoods goods = 3;
- // 废弃
- AdditionVote vote = 4;
- //
- AdditionCommon common = 5;
- //
- AdditionEsport esport = 6;
- // 投票
- AdditionVote2 vote2 = 8;
- //
- AdditionUgc ugc = 9;
- // up主预约发布卡
- AdditionUP up = 10;
- }
- // 附加卡物料ID
- int64 rid = 7;
-}
-
-// 动态-发布人模块
-message ModuleAuthor {
- // 用户mid
- int64 mid = 1;
- // 时间标签
- string ptime_label_text = 2;
- // 用户详情
- UserInfo author = 3;
- // 装扮卡片
- DecorateCard decorate_card = 4;
- // 点击跳转链接
- string uri = 5;
- // 右侧操作区域 - 三点样式
- repeated ThreePointItem tp_list = 6;
- // 右侧操作区域样式枚举
- ModuleAuthorBadgeType badge_type = 7;
- // 右侧操作区域 - 按钮样式
- ModuleAuthorBadgeButton badge_button = 8;
- // 是否关注
- // 1:关注 0:不关注 默认0,注:点赞列表使用,其他场景不使用该字段
- int32 attend = 9;
- // 关注状态
- Relation relation = 10;
- // 右侧操作区域 - 提权样式
- Weight weight = 11;
-}
-
-// 动态列表渲染部分-用户模块-按钮
-message ModuleAuthorBadgeButton {
- // 图标
- string icon = 1;
- // 文案
- string title = 2;
- // 状态
- int32 state = 3;
- // 物料ID
- int64 id = 4;
-}
-
-// 右侧操作区域样式枚举
-enum ModuleAuthorBadgeType {
- module_author_badge_type_none = 0; // 占位
- module_author_badge_type_threePoint = 1; // 三点
- module_author_badge_type_button = 2; // 按钮类型
- module_author_badge_type_weight = 3; // 提权
-}
-
-// 动态列表-用户模块-转发模板
-message ModuleAuthorForward {
- // 展示标题
- repeated ModuleAuthorForwardTitle title = 1;
- // 源卡片跳转链接
- string url = 2;
- // 用户uid
- int64 uid = 3;
- // 时间标签
- string ptime_label_text = 4;
- // 是否展示关注
- bool show_follow = 5;
- // 源up主头像
- string face_url = 6;
- // 双向关系
- Relation relation = 7;
- // 右侧操作区域 - 三点样式
- repeated ThreePointItem tp_list = 8;
-}
-
-// 动态列表-用户模块-转发模板-title部分
-message ModuleAuthorForwardTitle {
- // 文案
- string text = 1;
- // 跳转链接
- string url = 2;
-}
-
-// 动态列表-通栏
-message ModuleBanner {
- // 模块标题
- string title = 1;
- // 卡片类型
- ModuleBannerType type = 2;
- // 卡片
- oneof item{
- ModuleBannerUser user = 3;
- }
- // 不感兴趣文案
- string dislike_text = 4;
- // 不感兴趣图标
- string dislike_icon = 5;
-}
-
-// 动态列表-通栏类型
-enum ModuleBannerType {
- module_banner_type_none = 0; //
- module_banner_type_user = 1; //
-}
-
-// 动态通栏-用户
-message ModuleBannerUser {
- // 卡片列表
- repeated ModuleBannerUserItem list = 1;
-}
-
-// 动态通栏-推荐用户卡
-message ModuleBannerUserItem {
- // up主头像
- string face = 1;
- // up主昵称
- string name = 2;
- // up主uid
- int64 uid = 3;
- // 直播状态
- LiveState live_state = 4;
- // 认证信息
- OfficialVerify official = 5;
- // 大会员信息
- VipInfo vip = 6;
- // 标签信息
- string label = 7;
- // 按钮
- AdditionalButton button = 8;
- // 跳转地址
- string uri = 9;
-}
-
-// 底部模块
-message ModuleButtom {
- // 计数模块
- ModuleStat module_stat = 1;
-}
-
-// 评论外露模块
-message ModuleComment {
- // 评论外露展示项
- repeated CmtShowItem cmtShowItem = 1;
-}
-
-// 动态-描述文字模块
-message ModuleDesc {
- // 描述信息(已按高亮拆分)
- repeated Description desc = 1;
- // 点击跳转链接
- string jump_uri = 2;
- // 文本原本
- string text = 3;
-}
-
-// 正文商品卡参数
-message ModuleDescGoods {
- // 商品类型
- // 1:淘宝 2:会员购
- int32 source_type = 1;
- // 跳转链接
- string jump_url = 2;
- // schema_url
- string schema_url = 3;
- // item_id
- int64 item_id = 4;
- // open_white_list
- repeated string open_white_list = 5;
- // use_web_v2
- bool user_web_v2 = 6;
- // ad mark
- string ad_mark = 7;
- // schemaPackageName(Android用)
- string schema_package_name = 8;
-}
-
-// 动态-争议小黄条模块
-message ModuleDispute {
- // 标题
- string title = 1;
- // 描述内容
- string desc = 2;
- // 跳转链接
- string uri = 3;
-}
-
-// 动态-详情模块
-message ModuleDynamic {
- // 类型
- ModuleDynamicType type = 1;
- oneof module_item {
- //稿件
- MdlDynArchive dyn_archive = 2;
- //pgc
- MdlDynPGC dyn_pgc = 3;
- //付费课程-系列
- MdlDynCourSeason dyn_cour_season = 4;
- //付费课程-批次
- MdlDynCourBatch dyn_cour_batch = 5;
- //转发卡
- MdlDynForward dyn_forward = 6;
- //图文
- MdlDynDraw dyn_draw = 7;
- //专栏
- MdlDynArticle dyn_article = 8;
- //音频
- MdlDynMusic dyn_music = 9;
- //通用卡方
- MdlDynCommon dyn_common = 10;
- //直播卡
- MdlDynLive dyn_common_live = 11;
- //播单
- MdlDynMedialist dyn_medialist = 12;
- //小程序卡
- MdlDynApplet dyn_applet = 13;
- //订阅卡
- MdlDynSubscription dyn_subscription = 14;
- //直播推荐卡
- MdlDynLiveRcmd dyn_live_rcmd = 15;
- //UGC合集
- MdlDynUGCSeason dyn_ugc_season = 16;
- //订阅卡
- MdlDynSubscriptionNew dyn_subscription_new = 17;
- }
-}
-
-// 动态详情模块类型
-enum ModuleDynamicType {
- mdl_dyn_archive = 0; // 稿件
- mdl_dyn_pgc = 1; // pgc
- mdl_dyn_cour_season = 2; // 付费课程-系列
- mdl_dyn_cour_batch = 3; // 付费课程-批次
- mdl_dyn_forward = 4; // 转发卡
- mdl_dyn_draw = 5; // 图文
- mdl_dyn_article = 6; // 专栏
- mdl_dyn_music = 7; // 音频
- mdl_dyn_common = 8; // 通用卡方
- mdl_dyn_live = 9; // 直播卡
- mdl_dyn_medialist = 10; // 播单
- mdl_dyn_applet = 11; // 小程序卡
- mdl_dyn_subscription = 12; // 订阅卡
- mdl_dyn_live_rcmd = 13; // 直播推荐卡
- mdl_dyn_ugc_season = 14; // UGC合集
- mdl_dyn_subscription_new = 15; // 订阅卡
-}
-
-// 动态-小卡模块
-message ModuleExtend {
- // 详情
- repeated ModuleExtendItem extend = 1;
- // 模块整体跳转uri
- string uri = 2; // 废弃
-}
-
-// 动态-拓展小卡模块
-message ModuleExtendItem {
- // 类型
- DynExtendType type = 1;
- // 卡片详情
- oneof extend {
- // 废弃
- ExtInfoTopic ext_info_topic = 2;
- // 废弃
- ExtInfoLBS ext_info_lbs = 3;
- // 废弃
- ExtInfoHot ext_info_hot = 4;
- // 废弃
- ExtInfoGame ext_info_game = 5;
- //
- ExtInfoCommon ext_info_common = 6;
- //
- ExtInfoOGV ext_info_ogv = 7;
- }
-}
-
-// 动态-折叠模块
-message ModuleFold {
- // 折叠分类
- FoldType fold_type = 1;
- // 折叠文案
- string text = 2;
- // 被折叠的动态
- string fold_ids = 3;
- // 被折叠的用户信息
- repeated UserInfo fold_users = 4;
-}
-
-// 外露交互模块
-message ModuleInteraction {
- // 外露交互模块
- repeated InteractionItem interaction_item = 1;
-}
-
-// 获取物料失败模块
-message ModuleItemNull {
- // 图标
- string icon = 1;
- // 文案
- string text = 2;
-}
-
-// 动态-点赞用户模块
-message ModuleLikeUser {
- // 点赞用户
- repeated LikeUser like_users = 1;
- // 文案
- string display_text = 2;
-}
-
-// 相关推荐模块
-message ModuleRecommend {
- // 模块标题
- string module_title = 1;
- // 图片
- string image = 2;
- // 标签
- string tag = 3;
- // 标题
- string title = 4;
- // 跳转链接
- string jump_url = 5;
- // 序列化的广告信息
- repeated google.protobuf.Any ad = 6;
-}
-
-// 分享模块
-message ModuleShareInfo {
- // 展示标题
- string title = 1;
- // 分享组件列表
- repeated ShareChannel share_channels = 2;
- // share_origin
- string share_origin = 3;
- // 业务id
- string oid = 4;
- // sid
- string sid = 5;
-}
-
-// 动态-计数模块
-message ModuleStat {
- // 转发数
- int64 repost = 1;
- // 点赞数
- int64 like = 2;
- // 评论数
- int64 reply = 3;
- // 点赞拓展信息
- LikeInfo like_info = 4;
- // 禁评
- bool no_comment = 5;
- // 禁转
- bool no_forward = 6;
- // 点击评论跳转链接
- string reply_url = 7;
- // 禁评文案
- string no_comment_text = 8;
- // 禁转文案
- string no_forward_text = 9;
-}
-
-// 顶部模块
-message ModuleTop {
- // 三点模块
- repeated ThreePointItem tp_list = 1;
-}
-
-// 认证名牌
-message Nameplate {
- // nid
- int64 nid = 1;
- // 名称
- string name = 2;
- // 图片地址
- string image = 3;
- // 小图地址
- string image_small = 4;
- // 等级
- string level = 5;
- // 获取条件
- string condition = 6;
-}
-
-// 最新ep
-message NewEP {
- // 最新话epid
- int32 id = 1;
- // 更新至XX话
- string index_show = 2;
- // 更新剧集的封面
- string cover = 3;
-}
-
-// 空响应
-message NoReply {
-
-}
-
-// 空请求
-message NoReq {
-
-}
-
-// 认证信息
-message OfficialVerify {
- // 127:未认证 0:个人 1:机构
- int32 type = 1;
- // 认证描述
- string desc = 2;
- // 是否关注
- int32 is_atten = 3;
-}
-
-// PGC单季信息
-message PGCSeason {
- // 是否完结
- int32 is_finish = 1;
- // 标题
- string title = 2;
- // 类型
- int32 type = 3;
-}
-
-//
-message PlayerArgs {
- //
- int64 qn = 1;
- //
- int64 fnver = 2;
- //
- int64 fnval = 3;
- //
- int64 force_host = 4;
-}
-
-// 秒开通用参数
-message PlayurlParam {
- // 清晰度
- int32 qn = 1;
- // 流版本
- int32 fnver = 2;
- // 流类型
- int32 fnval = 3;
- // 是否强制使用域名
- int32 force_host = 4;
- // 是否4k
- int32 fourk = 5;
-}
-
-// 推荐up主入参
-message RcmdUPsParam {
- int64 dislike_ts = 1;
-}
-
-// 刷新方式
-enum Refresh {
- refresh_new = 0; // 刷新列表
- refresh_history = 1; // 请求历史
-}
-
-// 关注关系
-message Relation {
- // 关注状态
- RelationStatus status = 1;
- // 关注
- int32 is_follow = 2;
- // 被关注
- int32 is_followed = 3;
- // 文案
- string title = 4;
-}
-
-// 关注关系 枚举
-enum RelationStatus {
- // 1-未关注 2-关注 3-被关注 4-互相关注 5-特别关注
- relation_status_none = 0;
- relation_status_nofollow = 1;
- relation_status_follow = 2;
- relation_status_followed = 3;
- relation_status_mutual_concern = 4;
- relation_status_special = 5;
-}
-
-//
-enum ReserveType {
- reserve_none = 0; // 占位
- reserve_recall = 1; // 预约召回
-}
-
-// 分享渠道组件
-message ShareChannel {
- // 分享名称
- string name = 1;
- // 分享按钮图片
- string image = 2;
- // 分享渠道
- string channel = 3;
-}
-
-// 排序类型
-message SortType {
- // 排序策略
- // 1:推荐排序 2:最常访问 3:最近关注
- int32 sort_type = 1;
- // 排序策略名称
- string sort_type_name = 2;
-}
-
-// 三点-关注
-message ThreePointAttention {
- // attention icon
- string attention_icon = 1;
- // 关注时显示的文案
- string attention_text = 2;
- // not attention icon
- string not_attention_icon = 3;
- // 未关注时显示的文案
- string not_attention_text = 4;
- // 当前关注状态
- ThreePointAttentionStatus status = 5;
-}
-
-// 枚举-三点关注状态
-enum ThreePointAttentionStatus {
- tp_not_attention = 0; //
- tp_attention = 1; //
-}
-
-// 三点-自动播放 旧版不维护
-message ThreePointAutoPlay {
- // open icon
- string open_icon = 1;
- // 开启时显示文案
- string open_text = 2;
- // close icon
- string close_icon = 3;
- // 关闭时显示文案
- string close_text = 4;
- // 开启时显示文案v2
- string open_text_v2 = 5;
- // 关闭时显示文案v2
- string close_text_v2 = 6;
- // 仅wifi/免流 icon
- string only_icon = 7;
- // 仅wifi/免流 文案
- string only_text = 8;
- // open icon v2
- string open_icon_v2 = 9;
- // close icon v2
- string close_icon_v2 = 10;
-}
-
-// 三点-默认结构(使用此背景、举报、删除)
-message ThreePointDefault {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
- // 跳转链接
- string uri = 3;
- // id
- string id = 4;
-}
-
-// 三点-不感兴趣
-message ThreePointDislike {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
-}
-
-// 三点-收藏
-message ThreePointFavorite {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
- // 物料ID
- int64 id = 3;
- // 是否订阅
- bool is_favourite = 4;
- // 取消收藏图标
- string cancel_icon = 5;
- // 取消收藏文案
- string cancel_title = 6;
-}
-
-// 三点Item
-message ThreePointItem {
- //类型
- ThreePointType type = 1;
- oneof item {
- // 默认结构
- ThreePointDefault default = 2;
- // 自动播放
- ThreePointAutoPlay auto_player = 3;
- // 分享
- ThreePointShare share = 4;
- // 关注
- ThreePointAttention attention = 5;
- // 稍后在看
- ThreePointWait wait = 6;
- // 不感兴趣
- ThreePointDislike dislike = 7;
- // 收藏
- ThreePointFavorite favorite = 8;
- }
-}
-
-// 三点-分享
-message ThreePointShare {
- // icon
- string icon = 1;
- // 标题
- string title = 2;
- // 分享渠道
- repeated ThreePointShareChannel channel = 3;
- // 分享渠道名
- string channel_name = 4;
-}
-
-// 三点-分享渠道
-message ThreePointShareChannel {
- // icon
- string icon = 1;
- // 名称
- string title = 2;
-}
-
-// 三点类型
-enum ThreePointType {
- tp_none = 0; // 占位
- background = 1; // 使用此背景
- auto_play = 2; // 自动播放
- share = 3; // 分享
- wait = 4; // 稍后再播
- attention = 5; // 关注
- report = 6; // 举报
- delete = 7; // 删除
- dislike = 8; // 不感兴趣
- favorite = 9; // 收藏
-}
-
-// 三点-稍后在看
-message ThreePointWait {
- // addition icon
- string addition_icon = 1;
- // 已添加时的文案
- string addition_text = 2;
- // no addition icon
- string no_addition_icon = 3;
- // 未添加时的文案
- string no_addition_text = 4;
- // avid
- int64 id = 5;
-}
-
-//
-enum ThumbType {
- cancel = 0; //
- thumb = 1; //
-}
-
-// 话题广场操作按钮
-message TopicButton {
- // 按钮图标
- string icon = 1;
- // 按钮文案
- string title = 2;
- // 跳转
- string jump_uri = 3;
-}
-
-// 综合页-话题广场
-message TopicList {
- // 模块标题
- string title = 1;
- // 话题列表
- repeated TopicListItem topic_list_item = 2;
- // 发起活动
- TopicButton act_button = 3;
- // 查看更多
- TopicButton more_button = 4;
-}
-
-// 综合页-话题广场-话题
-message TopicListItem {
- // 前置图标
- string icon = 1;
- // 前置图标文案
- string icon_title = 2;
- // 话题id
- int64 topic_id = 3;
- // 话题名
- string topic_name = 4;
- // 跳转链接
- string url = 5;
- // 卡片位次
- int64 pos = 6;
-}
-
-// 综合页-无关注列表
-message Unfollow {
- // 标题展示文案
- string title = 1;
- // 无关注列表
- repeated UnfollowUserItem list = 2;
- // trackID
- string TrackId = 3;
-}
-
-// 综合页-无关注列表
-message UnfollowUserItem {
- // 是否有更新
- bool has_update = 1;
- // up主头像
- string face = 2;
- // up主昵称
- string name = 3;
- // up主uid
- int64 uid = 4;
- // 排序字段 从1开始
- int32 pos = 5;
- // 直播状态
- LiveState live_state = 6;
- // 认证信息
- OfficialVerify official = 7;
- // 大会员信息
- VipInfo vip = 8;
- // up介绍
- string sign = 9;
- // 标签信息
- string label = 10;
- // 按钮
- AdditionalButton button = 11;
-}
-
-// 动态顶部up列表-up主信息
-message UpListItem {
- // 是否有更新
- bool has_update = 1;
- // up主头像
- string face = 2;
- // up主昵称
- string name = 3;
- // up主uid
- int64 uid = 4;
- // 排序字段 从1开始
- int64 pos = 5;
- // 用户类型
- UserItemType user_item_type = 6;
- // 直播头像样式-日
- UserItemStyle display_style_day = 7;
- // 直播头像样式-夜
- UserItemStyle display_style_night = 8;
- // 直播埋点
- int64 style_id = 9;
- // 直播状态
- LiveState live_state = 10;
- // 分割线
- bool separator = 11;
- // 跳转
- string uri = 12;
- // UP主预约上报使用
- bool is_recall = 13;
-}
-
-// 最常访问-查看更多
-message UpListMoreLabel {
- // 文案
- string title = 1;
- // 跳转地址
- string uri = 2;
-}
-
-// 用户信息
-message UserInfo {
- // 用户mid
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- // 用户头像
- string face = 3;
- // 认证信息
- OfficialVerify official = 4;
- // 大会员信息
- VipInfo vip = 5;
- // 直播信息
- LiveInfo live = 6;
- // 空间页跳转链接
- string uri = 7;
- // 挂件信息
- UserPendant pendant = 8;
- // 认证名牌
- Nameplate nameplate = 9;
-}
-
-// 直播头像样式
-message UserItemStyle {
- //
- string rect_text = 1;
- //
- string rect_text_color = 2;
- //
- string rect_icon = 3;
- //
- string rect_bg_color = 4;
- //
- string outer_animation = 5;
-}
-
-// 用户类型
-enum UserItemType {
- user_item_type_none = 0; //
- user_item_type_live = 1; //
- user_item_type_live_custom = 2; //
- user_item_type_normal = 3; //
- user_item_type_extend = 4; //
-}
-
-// 头像挂件信息
-message UserPendant {
- // pid
- int64 pid = 1;
- // 名称
- string name = 2;
- // 图片链接
- string image = 3;
- // 有效期
- int64 expire = 4;
-}
-
-// 角标信息
-message VideoBadge {
- // 文案
- string text = 1;
- // 文案颜色-日间
- string text_color = 2;
- // 文案颜色-夜间
- string text_color_night = 3;
- // 背景颜色-日间
- string bg_color = 4;
- // 背景颜色-夜间
- string bg_color_night = 5;
- // 边框颜色-日间
- string border_color = 6;
- // 边框颜色-夜间
- string border_color_night = 7;
- // 样式
- int32 bg_style = 8;
- // 背景透明度-日间
- int32 bg_alpha = 9;
- // 背景透明度-夜间
- int32 bg_alpha_night = 10;
-}
-
-// 番剧类型
-enum VideoSubType {
- VideoSubTypeNone = 0; // 没有子类型
- VideoSubTypeBangumi = 1; // 番剧
- VideoSubTypeMovie = 2; // 电影
- VideoSubTypeDocumentary = 3; // 纪录片
- VideoSubTypeDomestic = 4; // 国创
- VideoSubTypeTeleplay = 5; // 电视剧
-}
-
-// 视频类型
-enum VideoType {
- video_type_general = 0; //普通视频
- video_type_dynamic = 1; //动态视频
- video_type_playback = 2; //直播回放视频
-}
-
-// 大会员信息
-message VipInfo {
- // 大会员类型
- int32 Type = 1;
- // 大会员状态
- int32 status = 2;
- // 到期时间
- int64 due_date = 3;
- // 标签
- VipLabel label = 4;
- // 主题
- int32 theme_type = 5;
- // 大会员角标
- // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
- int32 avatar_subscript = 6;
- // 昵称色值,可能为空,色值示例:#FFFB9E60
- string nickname_color = 7;
-}
-
-// 大会员标签
-message VipLabel {
- // 图片地址
- string path = 1;
- // 文本值
- string text = 2;
- // 对应颜色类型
- string label_theme = 3;
-}
-
-// 状态
-enum VoteStatus {
- normal = 0; // 正常
- anonymous = 1; // 匿名
-}
-
-// 提权样式
-message Weight {
- // 提权展示标题
- string title = 1;
- // 下拉框内容
- repeated WeightItem items = 2;
- // icon
- string icon = 3;
-}
-
-// 热门默认跳转按钮
-message WeightButton {
- string jump_url = 1;
- // 展示文案
- string title = 2;
-}
-
-// 提权不感兴趣
-message WeightDislike {
- // 负反馈业务类型 作为客户端调用负反馈接口的参数
- string feed_back_type = 1;
- // 展示文案
- string title = 2;
-}
-
-// 提权样式
-message WeightItem {
- // 类型
- WeightType type = 1;
- oneof item {
- // 热门默认跳转按钮
- WeightButton button = 2;
- // 提权不感兴趣
- WeightDislike dislike = 3;
- }
-}
-
-// 枚举-提权类型
-enum WeightType {
- weight_none = 0; // 默认 占位
- weight_dislike = 1; // 不感兴趣
- weight_jump = 2; // 跳链
-}
diff --git a/bili-api-grpc/proto/bilibili/dynamic/interfaces/feed/v1/api.proto b/bili-api-grpc/proto/bilibili/dynamic/interfaces/feed/v1/api.proto
deleted file mode 100644
index e39c761b0..000000000
--- a/bili-api-grpc/proto/bilibili/dynamic/interfaces/feed/v1/api.proto
+++ /dev/null
@@ -1,237 +0,0 @@
-syntax = "proto3";
-
-package bilibili.main.dynamic.feed.v1;
-
-option java_multiple_files = true;
-option java_package = "bilibili.main.dynamic.feed.v1";
-
-import "bilibili/dynamic/common/dynamic.proto";
-
-//
-service Feed {
- // 发布页预校验
- rpc CreateInitCheck(CreateInitCheckReq) returns (bilibili.dynamic.CreateCheckResp);
- //
- rpc SubmitCheck(SubmitCheckReq) returns (SubmitCheckRsp);
- // 创建动态
- rpc CreateDyn(CreateDynReq) returns (bilibili.dynamic.CreateResp);
- // 根据name取uid
- rpc GetUidByName(bilibili.dynamic.GetUidByNameReq) returns (bilibili.dynamic.GetUidByNameRsp);
- // at用户推荐列表
- rpc AtList(bilibili.dynamic.AtListReq) returns (bilibili.dynamic.AtListRsp);
- // at用户搜索列表
- rpc AtSearch(bilibili.dynamic.AtSearchReq) returns (bilibili.dynamic.AtListRsp);
- //
- rpc ReserveButtonClick(ReserveButtonClickReq) returns (ReserveButtonClickResp);
- //
- rpc CreatePlusButtonClick(CreatePlusButtonClickReq) returns (CreatePlusButtonClickRsp);
- //
- rpc HotSearch(HotSearchReq) returns (HotSearchRsp);
- //
- rpc Suggest(SuggestReq) returns (SuggestRsp);
- //
- rpc DynamicButtonClick(DynamicButtonClickReq) returns (DynamicButtonClickRsp);
- //
- rpc CreatePermissionButtonClick(CreatePermissionButtonClickReq) returns (CreatePermissionButtonClickRsp);
- //
- rpc CreatePageInfos(CreatePageInfosReq) returns (CreatePageInfosRsp);
-}
-
-// 创建动态-请求
-message CreateDynReq {
- // 用户创建接口meta信息
- bilibili.dynamic.UserCreateMeta meta = 1;
- // 发布的内容
- bilibili.dynamic.CreateContent content = 2;
- // 发布类型
- bilibili.dynamic.CreateScene scene = 3;
- // 图片内容
- repeated bilibili.dynamic.CreatePic pics = 4;
- // 转发源
- bilibili.dynamic.DynIdentity repost_src = 5;
- // 动态视频
- bilibili.dynamic.CreateDynVideo video = 6;
- // 通用模板类型:2048方图 2049竖图 其他值无效
- int64 sketch_type = 7;
- // 通用模板的元内容(网页内容)
- bilibili.dynamic.Sketch sketch = 8;
- // 小程序的内容
- bilibili.dynamic.Program program = 9;
- // 动态附加小卡
- bilibili.dynamic.CreateTag dyn_tag = 10;
- // 动态附加大卡
- bilibili.dynamic.CreateAttachCard attach_card = 11;
- // 特殊的创建选项
- bilibili.dynamic.CreateOption option = 12;
- //
- bilibili.dynamic.CreateTopic topic = 13;
- //
- string upload_id = 14;
-}
-
-//
-message CreateInitCheckReq {
- //
- int32 scene = 1;
- //
- bilibili.dynamic.MetaDataCtrl meta = 2;
- //
- bilibili.dynamic.RepostInitCheck repost = 3;
-}
-
-//
-message CreatePageInfosReq {
- //
- int64 topic_id = 1;
-}
-
-//
-message CreatePageInfosRsp {
- //
- CreatePageTopicInfo topic = 1;
-}
-
-//
-message CreatePageTopicInfo {
- //
- int64 topic_id = 1;
- //
- string topic_name = 2;
-}
-
-//
-message CreatePermissionButtonClickReq {
- //
- DynamicButtonClickBizType type = 1;
-}
-
-//
-message CreatePermissionButtonClickRsp {
-
-}
-
-//
-message CreatePlusButtonClickReq {
-
-}
-
-//
-message CreatePlusButtonClickRsp {
-
-}
-
-//
-enum DynamicButtonClickBizType {
- DYNAMIC_BUTTON_CLICK_BIZ_TYPE_NONE = 0; //
- DYNAMIC_BUTTON_CLICK_BIZ_TYPE_LIVE = 1; //
- DYNAMIC_BUTTON_CLICK_BIZ_TYPE_DYN_UP = 2; //
-}
-
-//
-message DynamicButtonClickReq {
-
-}
-
-//
-message DynamicButtonClickRsp {
-
-}
-
-//
-message HotSearchReq {
-
-}
-
-//
-message HotSearchRsp {
- //
- message Item {
- //
- string words = 1;
- }
- //
- repeated Item items = 1;
- //
- string version = 2;
-}
-
-//
-message ReserveButtonClickReq {
- //
- int64 uid = 1;
- //
- int64 reserve_id = 2;
- //
- int64 reserve_total = 3;
- //
- int32 cur_btn_status = 4;
- //
- string spmid = 5;
- //
- int64 dyn_id = 6;
- //
- int64 dyn_type = 7;
-}
-
-//
-message ReserveButtonClickResp {
- //
- ReserveButtonStatus final_btn_status = 1;
- //
- ReserveButtonMode btn_mode = 2;
- //
- int64 reserve_update = 3;
- //
- string desc_update = 4;
- //
- bool has_activity = 5;
- //
- string activity_url = 6;
- //
- string toast = 7;
-}
-
-//
-enum ReserveButtonMode {
- RESERVE_BUTTON_MODE_NONE = 0; //
- RESERVE_BUTTON_MODE_RESERVE = 1; //
- RESERVE_BUTTON_MODE_UP_CANCEL = 2; //
-}
-
-//
-enum ReserveButtonStatus {
- RESERVE_BUTTON_STATUS_NONE = 0; //
- RESERVE_BUTTON_STATUS_UNCHECK = 1; //
- RESERVE_BUTTON_STATUS_CHECK = 2; //
-}
-
-//
-message SubmitCheckReq {
- //
- bilibili.dynamic.CreateContent content = 1;
- //
- repeated bilibili.dynamic.CreatePic pics = 2;
-}
-
-//
-message SubmitCheckRsp {
-
-}
-
-//
-message SuggestReq {
- //
- string s = 1;
- //
- int32 type = 2;
-}
-
-//
-message SuggestRsp {
- //
- repeated string list = 1;
- //
- string track_id = 2;
- //
- string version = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/gaia/gw/gw_api.proto b/bili-api-grpc/proto/bilibili/gaia/gw/gw_api.proto
deleted file mode 100644
index 9d79e6461..000000000
--- a/bili-api-grpc/proto/bilibili/gaia/gw/gw_api.proto
+++ /dev/null
@@ -1,114 +0,0 @@
-syntax = "proto3";
-
-package bilibili.gaia.gw;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-// 应用列表上报
-service Gaia {
- // 应用列表上报
- rpc ExUploadAppList(GaiaEncryptMsgReq) returns (UploadAppListReply);
- // 拉取rsa公钥
- rpc ExFetchPublicKey(google.protobuf.Empty) returns (FetchPublicKeyReply);
-}
-
-// 待加密的pb对象
-message DeviceAppList {
- // 上报类型
- // first_installation:首次安装上报 first_open:每日启动上报
- string source = 1;
- // 安装的系统程序列表
- repeated string system_app_list = 2;
- //安装的用户程序列表
- repeated string user_app_list = 3;
-}
-
-// 加密方式
-enum EncryptType {
- INVALID_ENCRYPT_TYPE = 0; // 非法值
- CLIENT_AES = 1; // 同客户端人工约定AES加密私钥,存储在客户端
- SERVER_RSA_AES = 2; // 客户端随机生成一个用于AES加密的私钥,并用服务端下发的RSA公钥来加密
-}
-
-//
-message FetchPublicKeyReply {
- // 版本号
- string version = 1;
- // RSA公钥
- string public_key = 2;
- // 公钥过期时间
- int64 deadline = 3;
-}
-
-//
-message GaiaDeviceBasicInfo {
- //平台&应用信息
- string platform = 1; //android/ios/web/h5;
- string device = 2; //运行设备, 用于区分不同的app, 见客户端传入的对应参数。对于苹果系统,device有效值为phone, pad;安卓无法区分phone和pad,留空即可。
- string mobi_app = 3; //包类型,用于区分不同的app, 见客户端传入的对应参数(mobi_app );对于web端请求,请传空
- string origin =4; //客户端appkey, 用以区分不同的客户端,对应客户端请求参数中的appkey,如果无法获取可传空“”
- string app_id = 5; //app产品编号 //产品编号,由数据平台分配,粉=1,白=2,蓝=3,直播姬=4,HD=5,海外=6,OTT=7,漫画=8,TV野版=9,小视频=10,网易漫画=11,网易漫画lite=12,网易漫画HD=13,国际版=14
-
- //应用的版本信息
- string sdkver = 6; // SDK版本号 "sdkver": "2.6.6"
- string app_version = 7; // app版本 "app_version":"5.36.0"
- string app_version_code = 8; // app版本号 "app_version_code":"5360000"
- string build = 9; // app版本号,见客户端传入的对应参数;对于web端请求,请传空
-
- //渠道信息
- string channel = 10; //渠道标识,见客户端传入的对应参数;对于web端请求,请传空;对应chid
-
- //机器硬件信息
- string brand =11; //手机品牌,见客户端传入的对应参数;
- string model=12; //手机型号,见客户端传入的对应参数
- string osver =13; //系统版本,见客户端传入的对应参数
- string user_agent=14;
-
- //设备标识信息
- string buvid_local = 15; //本地设备唯一标识
- string buvid = 16; //设备唯一标识
-
- //登陆用户信息
- string mid = 17; //最后一次登陆用户的mid,如果无登陆信息,传0即可
-
- //本次启动信息
- int64 fts = 18; // app首次启动时间 "fts":1530447775661
- int32 first = 19; // 是否首次启动 是:0 否:1
-
- //网络相关的信息
- string network = 20; // 网络连接方式, WIFI/CELLULAR/OFFLINE/OTHERNET/ETHERNET "network":"WIFI", ESS_NETWORK_STATE、ACCESS_WIFI_STATE
-}
-
-// 应用列表上报-请求
-message GaiaEncryptMsgReq {
- // 上报头部
- GaiaMsgHeader header = 1;
- // 加密数据
- bytes encrypt_payload = 2;
-}
-
-// 风控通用消息头
-message GaiaMsgHeader {
- //加密类型
- EncryptType encode_type = 1;
- //类型
- PayloadType payload_type = 2;
- //RAS加密后的aes_key
- bytes encoded_aes_key = 3;
- //当前时间戳(ms)
- int64 ts = 4;
-}
-
-// 负载类型
-enum PayloadType {
- INVALID_PAYLOAD = 0; //非法值
- DEVICE_APP_LIST = 1; //设备app列表,对应DeviceAppList
-}
-
-// 应用列表上报-响应
-message UploadAppListReply {
- // 上报响应id
- string trace_id = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/im/interfaces/inner-interface/v1/api.proto b/bili-api-grpc/proto/bilibili/im/interfaces/inner-interface/v1/api.proto
deleted file mode 100644
index bae02e87f..000000000
--- a/bili-api-grpc/proto/bilibili/im/interfaces/inner-interface/v1/api.proto
+++ /dev/null
@@ -1,37 +0,0 @@
-syntax = "proto3";
-
-package bilibili.im.interface.inner.interface.v1;
-
-option java_multiple_files = true;
-option java_package = "bilibili.im.interfaces.inner.interface1.v1";
-
-//
-service InnerInterface {
- //
- rpc UpdateListInn(ReqOpBlacklist) returns(RspOpBlacklist);
-}
-
-//
-message BanUser {
- // 用户mid
- uint64 uid = 1;
- // 封禁业务
- int32 limit = 2;
- // 封禁时间
- int32 time = 3;
- // 模式
- // 1:add 2:remove
- int32 mode = 4;
-}
-
-//
-message ReqOpBlacklist {
- // 需要封禁/解封的用户信息
- repeated BanUser ban_users = 1;
-}
-
-//
-message RspOpBlacklist {
- //
- repeated uint64 failed_users = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/im/interfaces/v1/im.proto b/bili-api-grpc/proto/bilibili/im/interfaces/v1/im.proto
deleted file mode 100644
index 805df0ee0..000000000
--- a/bili-api-grpc/proto/bilibili/im/interfaces/v1/im.proto
+++ /dev/null
@@ -1,573 +0,0 @@
-syntax = "proto3";
-
-package bilibili.im.interface.v1;
-
-option java_multiple_files = true;
-option java_package = "bilibili.im.interface1.v1";
-
-import "bilibili/im/type/im.proto";
-
-// 私信
-service ImInterface {
- // 发送消息
- rpc SendMsg (ReqSendMsg) returns (RspSendMsg);
- // 同步关系
- rpc SyncRelation (ReqRelationSync) returns (RspRelationSync);
- // 确认同步进度
- rpc SyncAck (ReqSyncAck) returns (RspSyncAck);
- // 同步版本拉取消息
- rpc SyncFetchSessionMsgs (ReqSessionMsg) returns (RspSessionMsg);
- // 拉取会话记录列表
- rpc GetSessions (ReqGetSessions) returns (RspSessions);
- // 拉取新消息
- rpc NewSessions (ReqNewSessions) returns (RspSessions);
- // 拉取已读消息
- rpc AckSessions (ReqAckSessions) returns (RspSessions);
- // 更新已读进度
- rpc UpdateAck (ReqUpdateAck) returns (DummyRsp);
- // 置顶聊天
- rpc SetTop (ReqSetTop) returns (DummyRsp);
- // 删除会话记录
- rpc RemoveSession (ReqRemoveSession) returns (DummyRsp);
- // 未读私信数
- rpc SingleUnread (ReqSingleUnread) returns (RspSingleUnread);
- // 我创建的应援团未读数
- rpc MyGroupUnread (DummyReq) returns (RspMyGroupUnread);
- // 未关注的人批量设置为已读
- rpc UpdateUnflwRead (DummyReq) returns (DummyRsp);
- // 应援团消息助手
- rpc GroupAssisMsg (ReqGroupAssisMsg) returns (RspSessionMsg);
- // 更新应援团小助手消息已拉取进度
- rpc AckAssisMsg (ReqAckAssisMsg) returns (DummyRsp);
- // 拉取会话详情
- rpc SessionDetail (ReqSessionDetail) returns (bilibili.im.type.SessionInfo);
- // 批量拉取会话详情
- rpc BatchSessDetail (ReqSessionDetails) returns (RspSessionDetails);
- // 批量删除会话
- rpc BatchRmSessions (ReqBatRmSess) returns (DummyRsp);
- // 拉取最近私信分享列表
- rpc ShareList (ReqShareList) returns (RspShareList);
- //
- rpc SpecificSingleUnread (ReqSpecificSingleUnread) returns (RspSpecificSingleUnread);
- //
- rpc GetSpecificSessions (ReqGetSpecificSessions) returns (RspSessions);
- //
- rpc GetLiveInfo(ReqLiveInfo) returns (RspLiveInfo);
- //
- rpc GetTotalUnread(ReqTotalUnread) returns (RspTotalUnread);
- //
- rpc ShowClearUnreadUI(ReqShowClearUnreadUI) returns (RspShowClearUnreadUI);
- //
- rpc CloseClearUnreadUI(ReqCloseClearUnreadUI) returns (RspCloseClearUnreadUI);
- //
- rpc UpdateTotalUnread(ReqUpdateTotalUnread) returns (RspUpdateTotalUnread);
-}
-
-// 空请求
-message DummyReq {
- //
- uint32 idl = 1;
-}
-
-// 空响应
-message DummyRsp {
- reserved 1;
-}
-
-// 表情资源信息
-message EmotionInfo {
- // 表情
- string text = 1;
- // 表情url
- string url = 2;
- // 表情大小
- // 0:未知 1:min 2:max
- int32 size = 3;
- // gif url
- string gif_url = 4;
-}
-
-//
-enum ENUM_FOLD {
- FOLD_NO = 0; //
- FOLD_YES = 1; //
- FOLD_UNKNOWN = 2; //
-}
-
-//
-enum ENUM_UNREAD_TYPE{
- UNREAD_TYPE_ALL = 0; //
- UNREAD_TYPE_FOLLOW = 1; //
- UNREAD_TYPE_UNFOLLOW = 2; //
- UNREAD_TYPE_DUSTBIN = 3; //
-}
-
-//
-message MsgDetail {
- //
- int64 msg_key = 1;
- //
- int64 seqno = 2;
-}
-
-//
-message MsgFeedUnreadRsp {
- //
- map unread = 1;
-}
-
-// 更新应援团小助手消息已拉取进度-请求
-message ReqAckAssisMsg {
- //
- uint64 ack_seqno = 1;
-}
-
-// 拉取已读消息-请求
-message ReqAckSessions {
- //
- uint64 begin_ts = 1;
- //
- uint32 end_ts = 2;
- //
- uint32 size = 3;
-}
-
-// 批量删除会话-请求
-message ReqBatRmSess {
-
-}
-
-//
-message ReqCloseClearUnreadUI {
-
-}
-
-//
-message ReqGetMsg {
- //
- int64 talker_id = 1;
- //
- int32 session_type = 2;
- //
- repeated MsgDetail msg_detail = 3;
-}
-
-// 拉取会话记录列表-请求
-message ReqGetSessions {
- //
- uint64 begin_ts = 1;
- //
- uint64 end_ts = 2;
- //
- uint32 size = 3;
- //
- uint32 session_type = 4;
- //
- uint32 unfollow_fold = 5;
- //
- uint32 group_fold = 6;
- //
- uint32 sort_rule = 7;
- // 青少年模式
- uint32 teenager_mode = 8;
- // 课堂模式
- uint32 lessons_mode = 9;
-}
-
-// -请求
-message ReqGetSpecificSessions {
- // 具体会话详情
- repeated SimpleSession talker_sessions = 1;
-}
-
-// 应援团消息助手-请求
-message ReqGroupAssisMsg {
- //
- uint64 client_seqno = 1;
- //
- uint32 size = 2;
-}
-
-//
-message ReqLiveInfo {
- //
- int64 uid = 1;
- //
- int64 talker_id = 2;
-}
-
-// 拉取新消息-请求
-message ReqNewSessions {
- //
- uint64 begin_ts = 1;
- //
- uint32 size = 2;
- //
- uint32 teenager_mode = 3;
- // 课堂模式
- uint32 lessons_mode = 4;
-}
-
-// 同步关系-请求
-message ReqRelationSync {
- // 客户端当前seqno
- uint64 client_relation_oplog_seqno = 1;
-}
-
-// 删除会话记录-请求
-message ReqRemoveSession {
- //
- uint64 talker_id = 1;
- //
- uint32 session_type = 2;
-}
-
-// 发送消息-请求
-message ReqSendMsg {
- // 消息内容
- bilibili.im.type.Msg msg = 1;
- //
- string cookie = 2;
- //
- string cookie2 = 3;
- //
- int32 error_code = 4;
- //
- string dev_id = 5;
-}
-
-// 拉取会话详情-请求
-message ReqSessionDetail {
- //
- uint64 talker_id = 1;
- //
- uint32 session_type = 2;
- //
- uint64 uid = 3;
-}
-
-// 批量拉取会话详情-请求
-message ReqSessionDetails {
- // 会话详情请求列表
- repeated ReqSessionDetail sess_ids = 1;
-}
-
-// 同步版本拉取消息-请求
-message ReqSessionMsg {
- //
- uint64 talker_id = 1;
- //
- int32 session_type = 2;
- //
- uint64 end_seqno = 3;
- //
- uint64 begin_seqno = 4;
- //
- int32 size = 5;
- //
- int32 order = 6;
- //
- string dev_id = 7;
-}
-
-// 置顶聊天-请求
-message ReqSetTop {
- //
- uint64 talker_id = 1;
- //
- uint32 session_type = 2;
- //
- // 0:置顶 1:取消置顶
- uint32 op_type = 3;
-}
-
-// 拉取最近私信分享列表-请求
-message ReqShareList {
- // 分页大小 最大20
- int32 size = 1;
-}
-
-//
-message ReqShowClearUnreadUI {
- //
- int32 unread_type = 1;
- //
- int32 show_unfollow_list = 2;
- //
- int32 show_dustbin = 4;
-}
-
-// 未读私信数-请求
-message ReqSingleUnread {
- //
- int32 unread_type = 1;
- //
- int32 show_unfollow_list = 2;
- //
- int64 uid = 3;
- //
- int32 show_dustbin = 4;
-}
-
-// -请求
-message ReqSpecificSingleUnread {
- // 具体会话详情
- repeated SimpleSession talker_sessions = 1;
-}
-
-// 确认同步进度-请求
-message ReqSyncAck {
- //
- uint64 client_seqno = 1;
-}
-
-//
-message ReqTotalUnread {
- //
- int32 unread_type = 1;
- //
- int32 show_unfollow_list = 2;
- //
- int64 uid = 3;
- //
- int32 show_dustbin = 4;
- //
- int32 singleunread_on = 5;
- //
- int32 msgfeed_on = 6;
- //
- int32 sysup_on = 7;
-}
-
-// 更新已读进度-请求
-message ReqUpdateAck {
- // 聊天对象uid,可以为用户id或者为群id
- uint64 talker_id = 1;
- // 会话类型
- uint32 session_type = 2;
- // 已读的最大seqno
- uint64 ack_seqno = 3;
-}
-
-//
-message ReqUpdateIntercept {
- //
- int64 uid = 1;
- //
- int64 talker_id = 2;
- //
- int32 status = 3;
-}
-
-//
-message ReqUpdateTotalUnread {
-
-}
-
-//
-message RspCloseClearUnreadUI {
-
-}
-
-//
-message RspGetMsg {
- //
- repeated bilibili.im.type.Msg msg = 1;
-}
-
-//
-message RspLiveInfo {
- //
- int64 live_status = 1;
- //
- string jump_url = 2;
-}
-
-// 我创建的应援团未读数-响应
-message RspMyGroupUnread {
- // 未读消息数
- uint32 unread_count = 1;
-}
-
-// 同步关系-响应
-message RspRelationSync {
- //
- int32 full = 1;
- // 增量日志
- repeated bilibili.im.type.RelationLog relation_logs = 2;
- // 全量列表
- repeated bilibili.im.type.FriendRelation friend_list = 3;
- // 服务器端最大的relation seqno
- uint64 server_relation_oplog_seqno = 4;
- // 全量列表
- repeated bilibili.im.type.GroupRelation group_list = 5;
-}
-
-// 发送消息-响应
-message RspSendMsg {
- //
- uint64 msg_key = 1;
- // 表情资源信息
- repeated EmotionInfo e_infos = 2;
- //
- string msg_content = 3;
- //
- bilibili.im.type.KeyHitInfos key_hit_infos = 4;
-}
-
-// 批量拉取会话详情-响应
-message RspSessionDetails {
- // 会话详情列表
- repeated bilibili.im.type.SessionInfo sess_infos = 1;
-}
-
-// 同步版本拉取消息-响应
-message RspSessionMsg {
- //
- repeated bilibili.im.type.Msg messages = 1;
- //
- int32 has_more = 2;
- //
- uint64 min_seqno = 3;
- //
- uint64 max_seqno = 4;
- // 表情资源信息
- repeated EmotionInfo e_infos = 5;
-}
-
-// 拉取消息-响应
-message RspSessions {
- //
- repeated bilibili.im.type.SessionInfo session_list = 1;
- //
- uint32 has_more = 2;
- // 标记反垃圾会话是否在清理中
- bool anti_disturb_cleaning = 3;
- // 当session_list为空时,会返回该字段用于判断通讯录是否为空,1表示空,0表示非空
- int32 is_address_list_empty = 4;
- //
- map system_msg = 5;
- //
- bool show_level = 6;
-}
-
-// 拉取最近私信分享列表-响应
-message RspShareList {
- // 最近会话列表
- repeated ShareSessionInfo session_list = 1;
- //
- int32 IsAddressListEmpty = 2;
-}
-
-//
-message RspShowClearUnreadUI {
- //
- bool display = 1;
- //
- string text = 2;
-}
-
-// 未读私信数-响应
-message RspSingleUnread {
- // 未关注用户私信数
- uint64 unfollow_unread = 1;
- // 已关注用户私信数
- uint64 follow_unread = 2;
- // 未关注人列表是否有新业务通知
- uint32 unfollow_push_msg = 3;
- //
- int32 dustbin_push_msg = 4;
- //
- int64 dustbin_unread = 5;
- //
- int64 biz_msg_unfollow_unread = 6;
- //
- int64 biz_msg_follow_unread = 7;
-}
-
-// -响应
-message RspSpecificSingleUnread {
- // key -> 用户uid, value ->未读数
- map talkerUnreadCnt = 1;
- // 总未读数
- uint64 allUnreadCnt = 2;
-}
-
-// 确认同步进度-响应
-message RspSyncAck {
-
-}
-
-//
-message RspTotalUnread {
- //
- SessionSingleUnreadRsp session_single_unread = 1;
- //
- MsgFeedUnreadRsp msg_feed_unread = 2;
- //
- SysMsgInterfaceLastMsgRsp sys_msg_interface_last_msg = 3;
- //
- int32 total_unread = 4;
-}
-
-//
-message RspUpdateTotalUnread {
-
-}
-
-//
-enum SESSION_TYPE {
- UNKNOWN = 0; //
- UN_FOLD_SESSION = 1; //
- UN_FOLLOW_SINGLE_SESSION = 2; //
- MY_GROUP_SESSION = 3; //
- ALL_SESSION = 4; //
- DUSTBIN_SESSION = 5; //
-}
-
-//
-message SessionSingleUnreadRsp {
- //
- int64 unfollow_unread = 1;
- //
- int64 follow_unread = 2;
- //
- int32 unfollow_push_msg = 3;
- //
- int32 dustbin_push_msg = 4;
- //
- int64 dustbin_unread = 5;
-}
-
-// 会话信息,用于私信分享
-message ShareSessionInfo {
- //
- uint64 talker_id = 1;
- //
- string talker_uname = 2;
- //
- string talker_icon = 3;
- // 认证信息
- // -1: 无认证 0:个人认证 1:机构认证
- int32 official_type = 4;
-}
-
-//
-message SimpleSession {
- // 聊天对象uid,可以为用户id或者为群id
- uint64 talker_id = 1;
- // 会话类型
- uint32 session_type = 2;
-}
-
-//
-message SysMsgInterfaceLastMsgRsp {
- //
- int32 unread = 1;
- //
- string title = 2;
- //
- string time = 3;
- //
- int64 id = 4;
-}
diff --git a/bili-api-grpc/proto/bilibili/im/type/im.proto b/bili-api-grpc/proto/bilibili/im/type/im.proto
deleted file mode 100644
index 2c0f04820..000000000
--- a/bili-api-grpc/proto/bilibili/im/type/im.proto
+++ /dev/null
@@ -1,380 +0,0 @@
-syntax = "proto3";
-
-package bilibili.im.type;
-
-option java_multiple_files = true;
-
-//
-message AccountInfo {
- //
- string name = 1;
- //
- string pic_url = 2;
-}
-
-//
-enum CmdId {
- EN_CMD_ID_INVALID = 0; //非法cmd
-
- // msg_svr
- EN_CMD_ID_SEND_MSG = 200001; // 发消息
-
- // sync_msg_svr
- EN_CMD_ID_SYNC_MSG = 500001; // 同步消息
- EN_CMD_ID_SYNC_RELATION = 500002; // 同步相关链
- EN_CMD_ID_SYNC_ACK = 500003; // 客户端同步消息完成后,向服务器确认同步进度
- EN_CMD_ID_SYNC_FETCH_SESSION_MSGS = 500006; // 多端同步版本拉取消息
-
- // session_svr
- EN_CMD_ID_SESSION_SVR_GET_SESSIONS = 1000001; // 拉会话列表
- EN_CMD_ID_SESSION_SVR_NEW_SESSIONS = 1000002; // 新消息到达时获取会话列表
- EN_CMD_ID_SESSION_SVR_ACK_SESSIONS = 1000003; // 获取已读位置有更新的会话列表
- EN_CMD_ID_SESSION_SVR_UPDATE_ACK = 1000004; // 更新已读进度
- EN_CMD_ID_SESSION_SVR_SET_TOP = 1000005; // 置顶/取消置顶
- EN_CMD_ID_SESSION_SVR_REMOVE_SESSION = 1000007; // 删除会话
- EN_CMD_ID_SESSION_SVR_SINGLE_UNREAD = 1000008; // 单聊未读信息数
- EN_CMD_ID_SESSION_SVR_MY_GROUP_UNREAD = 1000009; // 我创建的应援团未读数
- EN_CMD_ID_SESSION_SVR_UPDATE_UNFLW_READ = 1000010; // 未关注的人批量设置为已读
- EN_CMD_ID_SESSION_SVR_GROUP_ASSIS_MSG = 1000011; // 应援团消息助手
- EN_CMD_ID_SESSION_SVR_ACK_ASSIS_MSG = 1000012; // 更新应援团小助手消息已拉取进度
- EN_CMD_ID_SESSION_SVR_SESSION_DETAIL = 1000015; // 拉会话详情
- EN_CMD_ID_SESSION_SVR_BATCH_SESS_DETAIL = 1000016; // 批量拉会话详情
- EN_CMD_ID_SESSION_SVR_BATCH_RM_SESSIONS = 1000017; // 批量删除会话
-}
-
-//
-enum ENUM_BIZ_MSG_TYPE {
- BIZ_MSG_TYPE_NORMAL = 0; //
- BIZ_MSG_TYPE_CARD_VIDEO = 1; //
-}
-
-//
-message FriendRelation {
- // 用户mid
- uint64 uid = 1;
- // 用户昵称
- string user_name = 2;
- // 头像url
- string face = 3;
- // vip类型
- // 0:无 1:月度大会员 2:年度大会员
- uint32 vip_level = 4;
-}
-
-//
-message GroupRelation {
- //
- uint64 group_id = 1;
- //
- uint64 owner_uid = 2;
- //
- uint32 group_type = 3;
- //
- uint32 group_level = 4;
- //
- string group_cover = 5;
- //
- string group_name = 6;
- //
- string group_notice = 7;
- //
- int32 status = 8;
- //
- int32 member_role = 9;
- //
- string fans_medal_name = 10;
- //
- uint64 room_id = 11;
-}
-
-// 关键词高亮文本
-message HighText {
- //
- string title = 1;
- //
- string url = 2;
- // 表示高亮文本应该高亮第几个匹配的文本,ps:比如,“有疑问请联系客服,联系客服时,请说明具体的情况”,一共有2个匹配的文本,要高亮第一个匹配的,则index=1
- uint32 index = 3;
-}
-
-//
-message ImgInfo {
- //
- string url = 1;
- //
- int32 width = 2;
- //
- int32 height = 3;
- //
- string imageType = 4;
-}
-
-// 关键词命中信息
-message KeyHitInfos {
- //
- string toast = 1;
- //
- uint32 rule_id = 2;
- //
- repeated HighText high_text = 3;
- //
-}
-
-//
-message Medal {
- //
- int64 uid = 1;
- //
- int32 medal_id = 2;
- //
- int32 level = 3;
- //
- string medal_name = 4;
- //
- int32 score = 5;
- //
- int32 intimacy = 6;
- //
- int32 master_status = 7;
- //
- int32 is_receive = 8;
- //
- int64 medal_color_start = 9;
- //
- int64 medal_color_end = 10;
- //
- int64 medal_color_border = 11;
- //
- int64 medal_color_name = 12;
- //
- int64 medal_color_level = 13;
- //
- int64 guard_level = 14;
-}
-
-//
-message Msg {
- // 发送方mid
- uint64 sender_uid = 1;
- // 接收方类型
- RecverType receiver_type = 2;
- // 接收方mid
- uint64 receiver_id = 3;
- // 客户端的序列id,用于服务端去重
- uint64 cli_msg_id = 4;
- // 消息类型
- MsgType msg_type = 5;
- // 消息内容
- string content = 6;
- // 服务端的序列号x
- uint64 msg_seqno = 7;
- // 消息发送时间(服务端时间)
- uint64 timestamp = 8;
- // @用户列表
- repeated uint64 at_uids = 9;
- // 多人消息
- repeated uint64 recver_ids = 10;
- // 消息唯一标示
- uint64 msg_key = 11;
- // 消息状态
- uint32 msg_status = 12;
- // 是否为系统撤销
- bool sys_cancel = 13;
- // 通知码
- string notify_code = 14;
- // 消息来源
- MsgSource msg_source = 15;
- // 如果msg.content有表情字符,则该参数需要置为1
- int32 new_face_version = 16;
- // 命中关键词信息
- KeyHitInfos key_hit_infos = 17;
-}
-
-// 消息来源
-enum MsgSource {
- EN_MSG_SOURCE_UNKONW = 0; //
- EN_MSG_SOURCE_IOS = 1; //
- EN_MSG_SOURCE_ANDRIOD = 2; //
- EN_MSG_SOURCE_H5 = 3; //
- EN_MSG_SOURCE_PC = 4; //
- EN_MSG_SOURCE_BACKSTAGE = 5; //
- EN_MSG_SOURCE_BIZ = 6; //
- EN_MSG_SOURCE_WEB = 7; //
- EN_MSG_SOURCE_AUTOREPLY_BY_FOLLOWED = 8; //
- EN_MSG_SOURCE_AUTOREPLY_BY_RECEIVE_MSG = 9; //
- EN_MSG_SOURCE_AUTOREPLY_BY_KEYWORDS = 10; //
- EN_MSG_SOURCE_AUTOREPLY_BY_VOYAGE = 11; //
- EN_MSG_SOURCE_VC_ATTACH_MSG = 12; //
-};
-
-// 消息类型
-enum MsgType {
- // 基础消息类型
- EN_INVALID_MSG_TYPE = 0; // 空空的~
- EN_MSG_TYPE_TEXT = 1; // 文本消息
- EN_MSG_TYPE_PIC = 2; // 图片消息
- EN_MSG_TYPE_AUDIO = 3; // 语音消息
- EN_MSG_TYPE_SHARE = 4; // 分享消息
- EN_MSG_TYPE_DRAW_BACK = 5; // 撤回消息
- EN_MSG_TYPE_CUSTOM_FACE = 6; // 自定义表情
- EN_MSG_TYPE_SHARE_V2 = 7; // 分享v2消息
- EN_MSG_TYPE_SYS_CANCEL = 8; // 系统撤销
- EN_MSG_TYPE_MINI_PROGRAM = 9; // 小程序
-
- // 扩展消息类型
- EN_MSG_TYPE_NOTIFY_MSG = 10; // 业务通知
- EN_MSG_TYPE_VIDEO_CARD = 11; // 视频卡片
- EN_MSG_TYPE_ARTICLE_CARD = 12; // 专栏卡片
- EN_MSG_TYPE_PICTURE_CARD = 13; // 图片卡
- EN_MSG_TYPE_COMMON_SHARE_CARD = 14; // 异形卡
- EN_MSG_TYPE_BIZ_MSG_TYPE = 50; //
- EN_MSG_TYPE_MODIFY_MSG_TYPE = 51; //
-
- // 功能类系统消息类型
- EN_MSG_TYPE_GROUP_MEMBER_CHANGED = 101; // 群成员变更
- EN_MSG_TYPE_GROUP_STATUS_CHANGED = 102; // 群状态变更
- EN_MSG_TYPE_GROUP_DYNAMIC_CHANGED = 103; // 群动态变更
- EN_MSG_TYPE_GROUP_LIST_CHANGED = 104; // 群列表变更
- EM_MSG_TYPE_FRIEND_LIST_CHANGED = 105; // 好友列表变更
- EN_MSG_TYPE_GROUP_DETAIL_CHANGED = 106; // 群详情发生变化
- EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED = 107; // 群成员角色发生变化
- EN_MSG_TYPE_NOTICE_WATCH_LIST = 108; //
- EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED = 109; // 消息系统,收到新的reply
- EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED = 110; //
- EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED = 111; //
- EN_MSG_TYPE_NOTIFY_NEW_UP_RECIEVED = 112; //
- EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED_V2 = 113; //
- EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED_V2 = 114; //
- EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED_V2 = 115; //
- EN_MSG_TYPE_GROUP_DETAIL_CHANGED_MULTI = 116; // 群详情发生变化,多端同步版本需要即时消息,无需落地
- EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED_MULTI = 117; // 群成员角色发生变化,多端同步版本需要即时消息,无需落地
- EN_MSG_TYPE_NOTIFY_ANTI_DISTURB = 118; //
-
- // 系统通知栏消息类型
- EN_MSG_TYPE_SYS_GROUP_DISSOLVED = 201; // 群解散
- EN_MSG_TYPE_SYS_GROUP_JOINED = 202; // 入群
- EN_MSG_TYPE_SYS_GROUP_MEMBER_EXITED = 203; // 成员主动退群
- EN_MSG_TYPE_SYS_GROUP_ADMIN_FIRED = 204; // 房管被撤
- EN_MSG_TYPE_SYS_GROUP_MEMBER_KICKED = 205; // 成员被T
- EN_MSG_TYPE_SYS_GROUP_ADMIN_KICK_OFF = 206; // 管理T人
- EN_MSG_TYPE_SYS_GROUP_ADMIN_DUTY = 207; // 管理上任
- EN_MSG_TYPE_SYS_GROUP_AUTO_CREATED = 208; // 自动创建
- EN_MSG_TYPE_SYS_FRIEND_APPLY = 210; // 好友申请
- EN_MSG_TYPE_SYS_FRIEND_APPLY_ACK = 211; // 好友申请通过
- EN_MSG_TYPE_SYS_GROUP_APPLY_FOR_JOINING = 212; // 用户加群申请
- EN_MSG_TYPE_SYS_GROUP_ADMIN_ACCEPTED_USER_APPLY = 213; // 通知管理员,有其他管理员已经同意用户加群
-
- // 聊天窗口通知消息类型
- EN_MSG_TYPE_CHAT_MEMBER_JOINED = 301; // 入群
- EN_MSG_TYPE_CHAT_MEMBER_EXITED = 302; // 退群
- EN_MSG_TYPE_CHAT_GROUP_FREEZED = 303; // 冻结
- EN_MSG_TYPE_CHAT_GROUP_DISSOLVED = 304; // 解散
- EN_MSG_TYPE_CHAT_GROUP_CREATED = 305; // 开通应援团
- EN_MSG_TYPE_CHAT_POPUP_SESSION = 306; // 弹出会话
-}
-
-// 接收方类型
-enum RecverType {
- EN_NO_MEANING = 0; //
- EN_RECVER_TYPE_PEER = 1; // 单人
- EN_RECVER_TYPE_GROUP = 2; // 群
- EN_RECVER_TYPE_PEERS = 3; // 多人
-}
-
-//
-message RelationLog {
- // 操作类型
- RelationLogType log_type = 1;
- // 操作seqno
- uint64 oplog_seqno = 2;
- // 好友信息
- FriendRelation friend_relation = 3;
- // 群信息
- GroupRelation group_relation = 4;
-}
-
-//
-enum RelationLogType {
- EN_INVALID_LOG_TYPE = 0; //
- EN_ADD_FRIEND = 1; // 添加好友
- EN_REMOVE_FRIEND = 2; // 删除好友
- EN_JOIN_GROUP = 3; // 加入群
- EN_EXIT_GROUP = 4; // 退出群
-}
-
-//
-enum SESSION_TYPE {
- INVALID_SESSION_TYPE = 0; //
- UN_FOLD_SESSION = 1; //
- UN_FOLLOW_SINGLE_SESSION = 2; //
- MY_GROUP_SESSION = 3; //
- ALL_SESSION = 4; //
-}
-
-// 会话详情
-message SessionInfo {
- //
- uint64 talker_id = 1;
- //
- uint32 session_type = 2;
- //
- uint64 at_seqno = 3;
- //
- uint64 top_ts = 4;
- //
- string group_name = 5;
- //
- string group_cover = 6;
- //
- uint32 is_follow = 7;
- //
- uint32 is_dnd = 8;
- //
- uint64 ack_seqno = 9;
- //
- uint64 ack_ts = 10;
- //
- uint64 session_ts = 11;
- //
- uint32 unread_count = 12;
- //
- Msg last_msg = 13;
- //
- uint32 group_type = 14;
- //
- uint32 can_fold = 15;
- //
- uint32 status = 16;
- //
- uint64 max_seqno = 17;
- // 会话是否有业务通知
- uint32 new_push_msg = 18;
- // 接收方是否设置接受推送
- uint32 setting = 19;
- //
- uint32 is_guardian = 20;
- //
- int32 is_intercept = 21;
- //
- int32 is_trust = 22;
- //
- int32 system_msg_type = 23;
- //
- AccountInfo account_info = 24;
- //
- int32 live_status = 25;
- //
- int32 biz_msg_unread_count = 26;
- //
- UserLabel user_label = 27;
-}
-
-//
-message UserLabel {
- //
- int32 label_type = 1;
- //
- Medal medal = 2;
- //
- int32 guardian_relation = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/live/app/room/v1/room.proto b/bili-api-grpc/proto/bilibili/live/app/room/v1/room.proto
deleted file mode 100644
index f30ae5cd4..000000000
--- a/bili-api-grpc/proto/bilibili/live/app/room/v1/room.proto
+++ /dev/null
@@ -1,54 +0,0 @@
-syntax = "proto3";
-
-package bilibili.live.app.room.v1;
-
-option java_multiple_files = true;
-
-//
-message GetStudioListReq {
- //
- int64 room_id = 1;
-}
-
-//
-message GetStudioListResp {
- //
- message Pendants {
- //
- Pendant frame = 1;
- //
- Pendant badge = 2;
- }
- //
- message Pendant {
- //
- string name = 1;
- //
- int64 position = 2;
- //
- string value = 3;
- //
- string desc = 4;
- }
- //
- message StudioMaster {
- //
- int64 uid = 1;
- //
- int64 room_id = 2;
- //
- string uname = 3;
- //
- string face = 4;
- //
- Pendants pendants = 5;
- //
- string tag = 6;
- //
- int64 tag_type = 7;
- }
- //
- int64 status = 1;
- //
- repeated StudioMaster master_list = 2;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/live/general/interfaces/v1/interfaces.proto b/bili-api-grpc/proto/bilibili/live/general/interfaces/v1/interfaces.proto
deleted file mode 100644
index 395d45b75..000000000
--- a/bili-api-grpc/proto/bilibili/live/general/interfaces/v1/interfaces.proto
+++ /dev/null
@@ -1,63 +0,0 @@
-syntax = "proto3";
-
-package bilibili.live.general.interfaces.v1;
-
-option java_multiple_files = true;
-option java_package = "bilibili.live.general.interfaces.v1";
-
-//
-message GetOnlineRankReq {
- //
- int64 ruid = 1;
- //
- int64 room_id = 2;
- //
- int64 page = 3;
- //
- int64 page_size = 4;
- //
- string platform = 5;
-}
-
-//
-message GetOnlineRankResp {
- //
- message OnlineRankItem {
- //
- int64 uid = 1;
- //
- string uname = 2;
- //
- string face = 3;
- //
- int64 continue_watch = 4;
- //
- MedalInfo medal_info = 5;
- //
- int64 guard_level = 6;
- }
- //
- OnlineRankItem item = 1;
- //
- int64 online_num = 2;
-}
-
-//
-message MedalInfo {
- //
- int64 guard_level = 1;
- //
- int64 medal_color_start = 2;
- //
- int64 medal_color_end = 3;
- //
- int64 medal_color_border = 4;
- //
- string medal_name = 5;
- //
- int64 level = 6;
- //
- int64 target_id = 7;
- //
- int64 is_light = 8;
-}
diff --git a/bili-api-grpc/proto/bilibili/main/community/reply/v1/reply.proto b/bili-api-grpc/proto/bilibili/main/community/reply/v1/reply.proto
deleted file mode 100644
index 1b99fa220..000000000
--- a/bili-api-grpc/proto/bilibili/main/community/reply/v1/reply.proto
+++ /dev/null
@@ -1,1322 +0,0 @@
-syntax = "proto3";
-
-package bilibili.main.community.reply.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/pagination/pagination.proto";
-import "google/protobuf/any.proto";
-
-// 评论区
-service Reply {
- // 主评论列表接口
- rpc MainList(MainListReq) returns (MainListReply);
- // 二级评论明细接口
- rpc DetailList(DetailListReq) returns (DetailListReply);
- // 对话评论树接口
- rpc DialogList(DialogListReq) returns (DialogListReply);
- // 评论预览接口
- rpc PreviewList(PreviewListReq) returns (PreviewListReply);
- // 评论搜索item前置发布接口
- rpc SearchItemPreHook(SearchItemPreHookReq) returns (SearchItemPreHookReply);
- // 评论搜索插入项目接口
- rpc SearchItem(SearchItemReq) returns (SearchItemReply);
- // 评论at用户搜索接口
- rpc AtSearch(AtSearchReq) returns (AtSearchReply);
- // 查询单条评论接口
- rpc ReplyInfo(ReplyInfoReq) returns (ReplyInfoReply);
- // 用户回调上报接口
- rpc UserCallback(UserCallbackReq) returns (UserCallbackReply);
- // 评论分享材料接口
- rpc ShareRepliesInfo(ShareRepliesInfoReq) returns (ShareRepliesInfoResp);
- // 评论表情推荐列表接口
- rpc SuggestEmotes(SuggestEmotesReq) returns (SuggestEmotesResp);
-}
-
-// 活动
-message Activity {
- // 活动id
- int64 activity_id = 1;
- // 活动状态
- // -1:待审 1:上线
- int64 activity_state = 2;
- // 参与活动的输入框文案
- string activity_placeholder = 3;
-}
-
-// 文章项目
-message ArticleSearchItem {
- // 标题
- string title = 1;
- // UP主昵称
- string up_nickname = 2;
- // 封面
- repeated string covers = 3;
-}
-
-// 评论at用户搜索组
-message AtGroup {
- // 组类型
- int32 group_type = 1;
- // 组标题
- string group_name = 2;
- // 评论at用户搜索列表
- repeated AtItem items = 3;
-}
-
-// 评论at用户搜索条目
-message AtItem {
- // 用户mid
- int64 mid = 1;
- // 用户名
- string name = 2;
- // 用户头像url
- string face = 3;
- // 用户是否关注
- int32 fans = 4;
- // 用户认证类型
- int32 official_verify_type = 5;
-}
-
-// 评论at用户搜索-响应
-message AtSearchReply {
- // 评论at用户搜索组
- repeated AtGroup groups = 1;
-}
-
-// 评论at用户搜索-请求
-message AtSearchReq {
- //
- int64 mid = 1;
- // 关键字
- string keyword = 2;
-}
-
-// 广告
-message CM {
- // 广告数据(需要解包)
- google.protobuf.Any source_content = 1;
-}
-
-// 评论主体信息
-message Content {
- // 评论文本
- string message = 1;
- // 需要渲染的用户转义
- map menber = 2;
- // 需要渲染的表情转义
- map emote = 3;
- // 需要高亮的话题转义
- map topic = 4;
- // 需要高亮的超链转义
- map url = 5;
- // 投票信息
- Vote vote = 6;
- // at到的用户mid列表
- map at_name_to_mid = 7;
- // 富文本
- RichText rich_text = 8;
- // 评论图片
- repeated Picture pictures = 9;
-}
-
-// 图片信息
-message Picture {
- // 图片URL
- string img_src = 1;
- // 图片宽度
- double img_width = 2;
- // 图片高度
- double img_height = 3;
- // 图片大小,单位KB
- double img_size = 4;
-}
-
-// 页面游标回复
-message CursorReply {
- // 下页数据
- int64 next = 1;
- // 上页数据
- int64 prev = 2;
- // 是否到顶
- bool isBegin = 3;
- // 是否到底
- bool isEnd = 4;
- // 排序方式
- // 2:时间 3:热度
- Mode mode = 5;
- // 当前排序mode在切换按钮上的展示文案
- string mode_text = 6;
-}
-
-// 页面游标请求
-message CursorReq {
- // 下页数据
- int64 next = 1;
- // 上页数据
- int64 prev = 2;
- // 排序方式
- Mode mode = 4;
-}
-
-// 二级评论明细-响应
-message DetailListReply {
- // 页面游标
- CursorReply cursor = 1;
- // 评论区显示控制字段
- SubjectControl subject_control = 2;
- // 根评论信息(带二级评论)
- ReplyInfo root = 3;
- // 评论区的活动
- Activity activity = 4;
- //
- LikeInfo likes = 5;
- // 排序方式
- Mode mode = 6;
- // 当前排序mode在切换按钮上的展示文案
- string mode_text = 7;
- // 分页
- bilibili.pagination.FeedPaginationReply pagination_reply = 8;
- //
- string session_id = 9;
-}
-
-// 二级评论明细-请求
-message DetailListReq {
- // 目标评论区id
- int64 oid = 1;
- // 目标评论区业务type
- int64 type = 2;
- // 根评论rpid
- int64 root = 3;
- // 目标评论rpid
- int64 rpid = 4;
- // 页面游标
- CursorReq cursor = 5;
- // 来源标识
- DetailListScene scene = 6;
- // 排序方式
- Mode mode = 7;
- // 分页
- bilibili.pagination.FeedPagination pagination = 8;
-}
-
-// 来源标识
-enum DetailListScene {
- REPLY = 0; // 评论区展开
- MSG_FEED = 1; // 回复消息推送
- NOTIFY = 2; //
-}
-
-// 对话评论树-响应
-message DialogListReply {
- // 页面游标
- CursorReply cursor = 1;
- // 评论区显示控制字段
- SubjectControl subject_control = 2;
- // 子评论列表
- repeated ReplyInfo replies = 3;
- // 评论区的活动
- Activity activity = 4;
-}
-
-// 对话评论树-请求
-message DialogListReq {
- // 目标评论区id
- int64 oid = 1;
- // 目标评论区业务type
- int64 type = 2;
- // 根评论rpid
- int64 root = 3;
- // 对话评论rpid
- int64 rpid = 4;
- // 页面游标
- CursorReq cursor = 5;
-}
-
-// 特效
-message Effects {
- //
- string preloading = 1;
-}
-
-// 表情项
-message Emote {
- // 表情大小
- // 1:小 2:大
- int64 size = 1;
- // 表情url
- string url = 2;
- //
- string jump_url = 3;
- //
- string jump_title = 4;
- //
- int64 id = 5;
- //
- int64 package_id = 6;
- //
- string gif_url = 7;
- //
- string text = 8;
-}
-
-// 商品项目
-message GoodsSearchItem {
- // 商品id
- int64 id = 1;
- // 商品名
- string name = 2;
- // 价钱
- string price = 3;
- // 收入
- string income = 4;
- // 图片
- string img = 5;
- // 标签
- string label = 6;
-}
-
-//
-message LikeInfo {
- //
- message Item {
- //
- Member member = 1;
- }
- //
- repeated Item items = 1;
- //
- string title = 2;
-}
-
-// 抽奖
-message Lottery {
- // 抽奖id
- int64 lottery_id = 1;
- // 抽奖状态
- // 0:未开奖 1:开奖中 2:已开奖
- int64 lottery_status = 2;
- // 抽奖人mid
- int64 lottery_mid = 3;
- // 开奖时间
- int64 lottery_time = 4;
- //
- int64 oid = 5;
- //
- int64 type = 6;
- // 发送时间
- int64 ctime = 7;
- // 抽奖评论正文
- Content content = 8;
- // 用户信息
- Member member = 9;
- // 评论条目控制字段
- ReplyControl reply_control = 10;
-}
-
-// 主评论列表-响应
-message MainListReply {
- // 页面游标
- CursorReply cursor = 1;
- // 评论列表
- repeated ReplyInfo replies = 2;
- // 评论区显示控制字段
- SubjectControl subject_control = 3;
- // UP置顶评论
- ReplyInfo up_top = 4;
- // 管理员置顶评论
- ReplyInfo admin_top = 5;
- // 投票置顶评论
- ReplyInfo vote_top = 6;
- // 评论区提示
- Notice notice = 7;
- // 抽奖评论
- Lottery lottery = 8;
- // 活动
- Activity activity = 9;
- // 精选评论区筛选后台信息
- UpSelection up_selection = 10;
- // 广告
- CM cm = 11;
- // 特效
- Effects effects = 12;
- //
- Operation operation = 13;
- //
- repeated ReplyInfo top_replies = 14;
- //
- QoeInfo qoe = 15;
- //
- map callbacks = 16;
- //
- OperationV2 operation_v2 = 17;
- // 排序方式
- Mode mode = 18;
- // 当前排序mode在切换按钮上的展示文案
- string mode_text = 19;
- // 分页
- bilibili.pagination.FeedPaginationReply pagination_reply = 20;
- //
- string session_id = 21;
- //
- string report_params = 22;
- //
- VoteCard vote_card = 23;
-}
-
-// 主评论列表-请求
-message MainListReq {
- // 目标评论区id
- int64 oid = 1;
- // 目标评论区业务type
- int64 type = 2;
- // 页面游标
- CursorReq cursor = 3;
- // 扩展数据json
- string extra = 4;
- // 广告扩展
- string ad_extra = 5;
- // 目标评论rpid
- int64 rpid = 6;
- //
- int64 seek_rpid = 7;
- // 评论区筛选类型 取值可为: ["全部" "粉丝评论" "笔记长评"]
- string filter_tag_name = 8;
- // 排序方式
- Mode mode = 9;
- // 分页
- bilibili.pagination.FeedPagination pagination = 10;
-}
-
-// 用户信息
-message Member {
- // 地区类型
- enum RegionType {
- DEFAULT = 0; // 默认
- MAINLAND = 1; // 大陆地区
- GAT = 2; //
- }
- //
- enum ShowStatus {
- SHOWDEFAULT = 0; // 默认
- ZOOMINMAINLAND = 1; //
- RAW = 2; //
- }
- // NFT地区
- message Region {
- // 地区类型
- RegionType type = 1;
- // 角标url
- string icon = 2;
- //
- ShowStatus show_status = 3;
- }
- // NFT信息
- message NftInteraction {
- //
- string itype = 1;
- //
- string metadata_url = 2;
- //
- string nft_id = 3;
- // NFT地区
- Region region = 4;
- }
- /**********基础信息**********/
- // 用户mid
- int64 mid = 1;
- // 昵称
- string name = 2;
- // 性别
- string sex = 3;
- // 头像url
- string face = 4;
- // 等级
- int64 level = 5;
- // 认证类型
- int64 official_verify_type = 6;
- /**********VIP相关**********/
- // 会员类型
- // 0:不是大会员 1:月度会员 2:年度大会员
- int64 vip_type = 7;
- // 会员状态
- int64 vip_status = 8;
- // 会员样式
- int64 vip_theme_type = 9;
- // 会员铭牌样式url
- string vip_label_path = 10;
- /**********装扮相关**********/
- // 头像框url
- string garb_pendant_image = 11;
- // 装扮卡url
- string garb_card_image = 12;
- // 有关注按钮时的装扮卡url
- string garb_card_image_with_focus = 13;
- // 专属装扮页面url
- string garb_card_jump_url = 14;
- // 专属装扮id
- string garb_card_number = 15;
- // 专属装扮id显示颜色
- string garb_card_fan_color = 16;
- // 是否为专属装扮卡
- bool garb_card_is_fan = 17;
- /**********粉丝勋章相关**********/
- // 粉丝勋章名
- string fans_medal_name = 18;
- // 粉丝勋章等级
- int64 fans_medal_level = 19;
- // 粉丝勋章显示颜色
- int64 fans_medal_color = 20;
- // 会员昵称颜色
- string vip_nickname_color = 21;
- // 会员角标
- // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
- int32 vip_avatar_subscript = 22;
- // 会员标签文
- string vip_label_text = 23;
- // 会员标颜色
- string vip_label_theme = 24;
- // 粉丝勋章底色
- int64 fans_medal_color_end = 25;
- // 粉丝勋章边框颜色
- int64 fans_medal_color_border = 26;
- // 粉丝勋章名颜色
- int64 fans_medal_color_name = 27;
- // 粉丝勋章等级颜色
- int64 fans_medal_color_level = 28;
- //
- int64 fans_guard_level = 29;
- //
- int32 face_nft = 30;
- // 是否NFT头像
- int32 face_nft_new = 31;
- // 是否为硬核会员
- int32 is_senior_member = 32;
- // NFT信息
- NftInteraction nft_interaction = 33;
- //
- string fans_guard_icon = 34;
- //
- string fans_honor_icon = 35;
-}
-
-// 用户信息V2
-message MemberV2 {
- // 基本信息
- message Basic {
- // 用户mid
- int64 mid = 1;
- // 昵称
- string name = 2;
- // 性别
- string sex = 3;
- // 头像url
- string face = 4;
- // 等级
- int64 level = 5;
- }
- // 认证
- message Official {
- // 认证类型
- int64 verify_type = 1;
- }
- // 大会员
- message Vip {
- // 会员类型
- // 0:不是大会员 1:月度会员 2:年度大会员
- int64 type = 1;
- // 会员状态
- int64 status = 2;
- // 会员样式
- int64 theme_type = 3;
- // 会员铭牌样式url
- string label_path = 4;
- //
- string nickname_color = 5;
- //
- int32 avatar_subscript = 6;
- //
- string label_text = 7;
- //
- string vip_label_theme = 8;
- }
- // 装扮
- message Garb {
- // 头像框url
- string pendant_image = 1;
- // 装扮卡url
- string card_image = 2;
- // 有关注按钮时的装扮卡url
- string card_image_with_focus = 3;
- // 专属装扮页面url
- string card_jump_url = 4;
- // 专属装扮id
- string card_number = 5;
- // 专属装扮id显示颜色
- string card_fan_color = 6;
- // 是否为专属装扮卡
- bool card_is_fan = 7;
- }
- // 粉丝勋章
- message Medal {
- // 粉丝勋章名
- string name = 1;
- // 粉丝勋章等级
- int64 level = 2;
- // 粉丝勋章显示颜色
- int64 color_start = 3;
- // 粉丝勋章底色
- int64 color_end = 4;
- // 粉丝勋章边框颜色
- int64 color_border = 5;
- // 粉丝勋章名颜色
- int64 color_name = 6;
- // 粉丝勋章等级颜色
- int64 color_level = 7;
- //
- int64 guard_level = 8;
- //
- string first_icon = 9;
- //
- int64 level_bg_color = 11;
- }
- // 地区类型
- enum RegionType {
- DEFAULT = 0; // 默认
- MAINLAND = 1; // 大陆地区
- GAT = 2; //
- }
- //
- enum ShowStatus {
- SHOWDEFAULT = 0; //
- ZOOMINMAINLAND = 1; //
- RAW = 2; //
- }
- // NFT地区
- message Region {
- // 地区类型
- RegionType type = 1;
- // 角标url
- string icon = 2;
- //
- ShowStatus show_status = 3;
- }
- // NFT信息
- message Interaction {
- //
- string itype = 1;
- //
- string metadata_url = 2;
- //
- string nft_id = 3;
- // NFT地区
- Region region = 4;
-
- }
- // NFT
- message Nft {
- //
- int32 face = 1;
- //
- Interaction interaction = 2;
- }
- // 硬核会员
- message Senior {
- // 是否为硬核会员
- int32 is_senior_member = 1;
- }
- // 契约
- message Contractor {
- // 是否和up签订契约
- bool is_contractor = 1;
- // 契约显示文案
- string contract_desc = 2;
- }
- // 基本信息
- Basic basic = 1;
- // 认证信息
- Official official = 2;
- // 大会员信息
- Vip vip = 3;
- // 装扮信息
- Garb garb = 4;
- // 粉丝勋章信息
- Medal medal = 5;
- // NFT信息
- Nft nft = 6;
- // 硬核会员信息
- Senior senior = 7;
- // 契约信息
- Contractor contractor = 8;
-}
-
-// 排序方式
-enum Mode {
- DEFAULT = 0; //
- UNSPECIFIED = 1; // 默认排序
- MAIN_LIST_TIME = 2; // 按时间
- MAIN_LIST_HOT = 3; // 按热度
-}
-
-//
-message Notice {
- //
- int64 id = 1;
- //
- string content = 2;
- //
- string link = 3;
-}
-
-//
-message Operation {
- //
- int32 type = 1;
- //
- int64 id = 2;
- //
- OperationTitle title = 3;
- //
- OperationTitle subtitle = 4;
- //
- string link = 5;
- //
- string report_extra = 6;
- //
- string icon = 7;
-}
-
-//
-message OperationV2 {
- //
- int32 type = 1;
- //
- string prefix_text = 2;
- //
- OperationIcon icon = 3;
- //
- string title = 4;
- //
- string link = 5;
- //
- string report_extra = 6;
-}
-
-//
-message OperationIcon {
- //
- int32 position = 1;
- //
- string url = 2;
-}
-
-//
-message OperationTitle {
- //
- string content = 1;
- //
- bool is_highlight = 2;
-}
-
-// PGC视频项目
-message PGCVideoSearchItem {
- // 标题
- string title = 1;
- // 类别
- string category = 2;
- // 封面
- string cover = 3;
-}
-
-// 评论区预览-回复
-message PreviewListReply {
- // 页面游标
- CursorReply cursor = 1;
- // 评论列表
- repeated ReplyInfo replies = 2;
- // 评论区显示控制字段
- SubjectControl subject_control = 3;
- // UP置顶评论
- ReplyInfo upTop = 4;
- // 管理员置顶评论
- ReplyInfo admin_top = 5;
- // 投票置顶评论
- ReplyInfo vote_top = 6;
-}
-
-// 评论区预览-请求
-message PreviewListReq {
- // 目标评论区id
- int64 oid = 1;
- // 目标评论区业务type
- int64 type = 2;
- // 页面游标
- CursorReq cursor = 3;
-}
-
-//
-message QoeInfo {
- //
- int64 id = 1;
- //
- int32 type = 2;
- //
- int32 style = 3;
- //
- string title = 4;
- //
- string feedback_title = 5;
- //
- repeated QoeScoreItem score_items = 6;
- //
- int64 display_rank = 7;
-}
-
-//
-message QoeScoreItem {
- //
- string title = 1;
- //
- string url = 2;
- //
- float score = 3;
-}
-
-// 评论条目标签信息
-message ReplyCardLabel {
- // 标签文本
- string text_content = 1;
- // 文本颜色
- string text_color_day = 2;
- // 文本颜色夜间
- string text_color_night = 3;
- // 标签颜色
- string label_color_day = 4;
- // 标签颜色夜间
- string label_color_night = 5;
- //
- string image = 6;
- // 标签类型 0:UP主觉得很赞 1:妙评
- int32 type = 7;
- // 背景url
- string background = 8;
- // 背景宽
- double background_width = 9;
- // 背景高
- double background_height = 10;
- // 点击跳转url
- string jump_url = 11;
- //
- int64 effect = 12;
- //
- int64 effect_start_time = 13;
-}
-
-// 评论条目控制字段
-message ReplyControl {
- // 操作行为标志
- // 0:无 1:已点赞 2:已点踩
- int64 action = 1;
- // 是否UP觉得很赞
- bool up_like = 2;
- // 是否存在UP回复
- bool up_reply = 3;
- // 是否显示关注按钮
- bool show_follow_btn = 4;
- // 是否协管
- bool is_assist = 5;
- // 是否展示标签
- string label_text = 6;
- // 是否关注
- bool following = 7;
- // 是否粉丝
- bool followed = 8;
- // 是否被自己拉黑
- bool blocked = 9;
- // 是否存在折叠的二级评论
- bool has_folded_reply = 10;
- // 是否折叠
- bool is_folded_reply = 11;
- // 是否UP置顶
- bool is_up_top = 12;
- // 是否管理置顶
- bool is_admin_top = 13;
- // 是否置顶投票评论
- bool is_vote_top = 14;
- // 最大收起显示行数
- int64 max_line = 15;
- // 该条评论可不可见
- bool invisible = 16;
- // 是否和up签订契约
- bool is_contractor = 17;
- // 是否是笔记评论
- bool is_note = 18;
- // 评论条目标签列表
- repeated ReplyCardLabel card_labels = 19;
- // 子评论数文案 "共x条回复"
- string sub_reply_entry_text = 20;
- // 子评论数文案 "相关回复共x条"
- string sub_reply_title_text = 21;
- // 契约显示文案
- string contract_desc = 22;
- // 发布时间文案 "x天前发布"
- string time_desc = 23;
- //
- string biz_scene = 24;
- // IP属地信息 "IP属地:xxx"
- string location = 25;
-}
-
-//
-message ReplyExtra {
- //
- int64 season_id = 1;
- //
- int64 season_type = 2;
- //
- int64 ep_id = 3;
- //
- bool is_story = 4;
-}
-
-// 评论条目信息
-message ReplyInfo {
- // 二级评论列表
- repeated ReplyInfo replies = 1;
- // 评论rpid
- int64 id = 2;
- // 评论区对象id
- int64 oid = 3;
- // 评论区类型
- int64 type = 4;
- // 发布者UID
- int64 mid = 5;
- // 根评论rpid
- int64 root = 6;
- // 父评论rpid
- int64 parent = 7;
- // 对话评论rpid
- int64 dialog = 8;
- // 点赞数
- int64 like = 9;
- // 发布时间
- int64 ctime = 10;
- // 回复数
- int64 count = 11;
- // 评论主体信息
- Content content = 12;
- // 发布者信息
- Member member = 13;
- // 评论控制字段
- ReplyControl reply_control = 14;
- // 发布者信息V2
- MemberV2 member_v2 = 15;
-}
-
-// 查询单条评论-响应
-message ReplyInfoReply {
- // 评论条目信息
- ReplyInfo reply = 1;
-}
-
-// 查询单条评论-请求
-message ReplyInfoReq {
- // 评论rpid
- int64 rpid = 1;
- //
- int32 scene = 2;
-}
-
-// 富文本
-message RichText {
- // 富文本类型
- oneof item {
- // 笔记
- RichTextNote note = 1;
- }
-}
-
-// 笔记
-message RichTextNote {
- // 预览文本
- string summary = 1;
- // 笔记预览图片url列表
- repeated string images = 2;
- // 笔记页面url
- string click_url = 3;
- // 发布日期 YYYY-mm-dd
- string last_mtime_text = 4;
-}
-
-// 评论搜索插入项目
-message SearchItem {
- //
- string url = 1;
- // 项目
- oneof item {
- // 商品
- GoodsSearchItem goods = 2;
- // 视频
- VideoSearchItem video = 3;
- // 专栏
- ArticleSearchItem article = 4;
- }
-}
-
-// 评论搜索插入项目响应游标
-message SearchItemCursorReply {
- // 是否有下一页
- bool has_next = 1;
- // 下页
- int64 next = 2;
-}
-
-// 评论搜索插入项目请求游标
-message SearchItemCursorReq {
- // 下一页
- int64 next = 1;
- // tab类型
- SearchItemType item_type = 2;
-}
-
-// 评论搜索item前置发布-响应
-message SearchItemPreHookReply {
- // 输入框的文案
- string placeholder_text = 1;
- // 背景空白的时候的文案
- string background_text = 2;
- // 有权限的tab栏的顺序
- repeated SearchItemType ordered_type = 3;
-}
-
-// 评论搜索item前置发布-请求
-message SearchItemPreHookReq {
- // 目标评论区id
- int64 oid = 1;
- // 目标评论区业务type
- int64 type = 2;
-}
-
-// 评论搜索插入项目-回复
-message SearchItemReply {
- //
- SearchItemCursorReply cursor = 1;
- // 搜索的结果
- repeated SearchItem items = 2;
- // 附加信息
- SearchItemReplyExtraInfo extra = 3;
-}
-
-//
-message SearchItemReplyExtraInfo {
- //
- string event_id = 1;
-}
-
-// 评论搜索插入项目-请求
-message SearchItemReq {
- // 页面游标
- SearchItemCursorReq cursor = 1;
- // 目标评论区id
- int64 oid = 2;
- // 目标评论区业务type
- int64 type = 3;
- // 搜索关键词
- string keyword = 4;
-}
-
-//
-enum SearchItemType {
- DEFAULT_ITEM_TYPE = 0; //
- GOODS = 1; //
- VIDEO = 2; //
- ARTICLE = 3; //
-}
-
-//
-enum SearchItemVideoSubType {
- UGC = 0; //
- PGC = 1; //
-}
-
-// 评论分享材料-请求
-message ShareRepliesInfoReq {
- // 评论rpid列表
- repeated int64 rpids = 1;
- // 目标评论区id
- int64 oid = 2;
- // 目标评论区业务type
- int64 type = 3;
-}
-
-// 评论分享材料-响应
-message ShareRepliesInfoResp {
- //
- message ShareExtra {
- //
- bool is_pgc = 1;
- }
- // 评论分享条目列表
- repeated ShareReplyInfo infos = 1;
- // 源内容标题
- string from_title = 2;
- // 源内容UP主
- string from_up = 3;
- // 源内容封面url
- string from_pic = 4;
- // 源内容页面url
- string url = 5;
- // logo url
- string slogan_pic = 6;
- // 标语
- string slogan_text = 7;
- //
- ShareReplyTopic topic = 8;
- //
- ShareExtra extra = 9;
-}
-
-// 评论分享条目信息
-message ShareReplyInfo {
- // 用户信息
- Member member = 1;
- // 评论主体信息
- Content content = 2;
- // 分享标题(评论发布者昵称)
- string title = 3;
- // 分享副标题 "发表了评论"
- string sub_title = 4;
- // 荣誉信息文案 "获得了up主点赞"
- string achievement_text = 5;
- //
- string label_url = 6;
-}
-
-//
-message ShareReplyTopic {
- //
- Topic topic = 1;
- //
- string origin_text = 2;
-}
-
-// 评论区控制字段
-message SubjectControl {
- // 评论区筛选类型
- message FilterTag {
- // 类型名
- string name = 1;
- //
- string event_id = 2;
- }
- // UP主mid
- int64 up_mid = 1;
- // 自己是否为协管
- bool is_assist = 2;
- // 是否只读
- bool read_only = 3;
- // 是否有发起投票权限
- bool has_vote_access = 4;
- // 是否有发起抽奖权限
- bool has_lottery_access = 5;
- // 是否有被折叠评论
- bool has_folded_reply = 6;
- // 空评论区背景文案
- string bg_text = 7;
- // 是否被UP拉黑
- bool up_blocked = 8;
- // 是否有发起活动权限
- bool has_activity_access = 9;
- // 标题展示控制
- bool show_title = 10;
- // 是否显示UP主操作标志
- bool show_up_action = 11;
- // 是否显示评论区排序切换按钮
- int64 switcher_type = 12;
- // 是否禁止输入框
- bool input_disable = 13;
- // 根评论输入框背景文案
- string root_text = 14;
- // 子评论输入框背景文案
- string child_text = 15;
- // 评论总数
- int64 count = 16;
- // 评论区标题
- string title = 17;
- // 离开态输入框的文案
- string giveup_text = 18;
- // 是否允许笔记
- bool has_note_access = 19;
- //
- bool disable_jump_emote = 20;
- //
- string empty_background_text_plain = 21;
- //
- string empty_background_text_highlight = 22;
- //
- string empty_background_uri = 23;
- // 评论区筛选类型列表
- repeated FilterTag support_filter_tags = 24;
-}
-
-// 评论表情推荐列表-请求
-message SuggestEmotesReq {
- // 目标评论区id
- int64 oid = 1;
- // 目标评论区业务type
- int64 type = 2;
-}
-
-// 评论表情推荐列表-响应
-message SuggestEmotesResp {
- // 表情推荐列表
- repeated Emote emotes = 1;
-}
-
-// 话题项
-message Topic {
- // 跳转url
- string link = 1;
- // 话题id
- int64 id = 2;
-}
-
-// UGC视频项目
-message UGCVideoSearchItem {
- // 标题
- string title = 1;
- // UP主昵称
- string up_nickname = 2;
- // 时长(单位为秒)
- int64 duration = 3;
- // 封面
- string cover = 4;
-}
-
-// 精选评论
-message UpSelection {
- // 待审评论数
- int64 pending_count = 1;
- // 忽略评论数
- int64 ignore_count = 2;
-}
-
-// 超链项
-message Url {
- // 扩展字段
- message Extra {
- //
- int64 goods_item_id = 1;
- //
- string goods_prefetched_cache = 2;
- //
- int32 goods_show_type = 3;
- // 热词搜索
- bool is_word_search = 4;
- //
- int64 goods_cm_control = 5;
- }
- // 标题
- string title = 1;
- //
- int64 state = 2;
- // 图标url
- string prefix_icon = 3;
- // 客户端内跳转uri
- string app_url_schema = 4;
- //
- string app_name = 5;
- //
- string app_package_name = 6;
- // 点击上报数据
- string click_report = 7;
- // 是否半屏打开
- bool is_half_screen = 8;
- // 展现上报数据
- string exposure_report = 9;
- // 扩展字段
- Extra extra = 10;
- // 是否下划线
- bool underline = 11;
- //
- bool match_once = 12;
- // 网页url
- string pc_url = 13;
- //
- int32 icon_position = 14;
-}
-
-//
-enum UserCallbackAction {
- Dismiss = 0; //
-}
-
-// 用户回调上报-响应
-message UserCallbackReply {}
-
-// 用户回调上报-请求
-message UserCallbackReq {
- // 用户mid
- int64 mid = 1;
- //
- UserCallbackScene scene = 2;
- //
- UserCallbackAction action = 3;
- // 目标评论区id
- int64 oid = 4;
- // 目标评论区业务type
- int64 type = 5;
-}
-
-//
-enum UserCallbackScene {
- Insert = 0; //
-}
-
-// 视频项目
-message VideoSearchItem {
- //
- SearchItemVideoSubType type = 1;
- //
- oneof video_item {
- // UGC视频
- UGCVideoSearchItem ugc = 2;
- // PGC视频
- PGCVideoSearchItem pgc = 3;
- }
-}
-
-// 投票信息
-message Vote {
- // 投票id
- int64 id = 1;
- // 投票标题
- string title = 2;
- // 参与人数
- int64 count = 3;
-}
-
-//
-message VoteCard{
- // 投票id
- int64 vote_id = 1;
- // 投票标题
- string title = 2;
- //
- int64 count = 3;
- //
- repeated VoteCardOption options = 4;
- //
- int64 my_vote_option = 5;
-}
-
-//
-message VoteCardOption{
- //
- int64 idx = 1;
- //
- string desc = 2;
- //
- int64 count = 3;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/metadata/device/device.proto b/bili-api-grpc/proto/bilibili/metadata/device/device.proto
deleted file mode 100644
index 6c566c64f..000000000
--- a/bili-api-grpc/proto/bilibili/metadata/device/device.proto
+++ /dev/null
@@ -1,43 +0,0 @@
-syntax = "proto3";
-
-package bilibili.metadata.device;
-
-option java_multiple_files = true;
-
-// 设备信息
-// gRPC头部:x-bili-device-bin
-message Device {
- // 产品id
- // 粉 白 蓝 直播姬 HD 海外 OTT 漫画 TV野版 小视频 网易漫画 网易漫画 网易漫画HD 国际版 东南亚版
- // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 30
- int32 app_id = 1;
- // 构建id
- int32 build = 2;
- // 设备buvid
- string buvid = 3;
- // 包类型
- string mobi_app = 4;
- // 平台类型
- // ios android
- string platform = 5;
- // 设备类型
- string device = 6;
- // 渠道
- string channel = 7;
- // 手机品牌
- string brand = 8;
- // 手机型号
- string model = 9;
- // 系统版本
- string osver = 10;
- // 本地设备指纹
- string fp_local = 11;
- // 远程设备指纹
- string fp_remote = 12;
- // APP版本号
- string version_name = 13;
- // 设备指纹, 不区分本地或远程设备指纹,作为推送目标的索引
- string fp = 14;
- // 首次启动时的毫秒时间戳
- int64 fts = 15;
-}
diff --git a/bili-api-grpc/proto/bilibili/metadata/metadata.proto b/bili-api-grpc/proto/bilibili/metadata/metadata.proto
deleted file mode 100644
index 9d324cb3f..000000000
--- a/bili-api-grpc/proto/bilibili/metadata/metadata.proto
+++ /dev/null
@@ -1,24 +0,0 @@
-syntax = "proto3";
-
-package bilibili.metadata;
-
-option java_multiple_files = true;
-
-// 请求元数据
-// gRPC头部:x-bili-metadata-bin
-message Metadata {
- // 登录 access_key
- string access_key = 1;
- // 包类型, 如 `android`
- string mobi_app = 2;
- // 运行设备, 留空即可
- string device = 3;
- // 构建id, 如 `7380300`
- int32 build = 4;
- // APP分发渠道, 如 `master`
- string channel = 5;
- // 设备唯一标识
- string buvid = 6;
- // 平台类型, 如 `android`
- string platform = 7;
-}
diff --git a/bili-api-grpc/proto/bilibili/metadata/network/network.proto b/bili-api-grpc/proto/bilibili/metadata/network/network.proto
deleted file mode 100644
index 3d846d030..000000000
--- a/bili-api-grpc/proto/bilibili/metadata/network/network.proto
+++ /dev/null
@@ -1,37 +0,0 @@
-syntax = "proto3";
-
-package bilibili.metadata.network;
-
-option java_multiple_files = true;
-
-// 网络类型标识
-// gRPC头部:x-bili-network-bin
-message Network {
- // 网络类型
- NetworkType type = 1;
- // 免流类型
- TFType tf = 2;
- // 运营商
- string oid = 3;
-}
-
-// 网络类型
-enum NetworkType {
- NT_UNKNOWN = 0; // 未知
- WIFI = 1; // WIFI
- CELLULAR = 2; // 蜂窝网络
- OFFLINE = 3; // 未连接
- OTHERNET = 4; // 其他网络
- ETHERNET = 5; // 以太网
-}
-
-// 免流类型
-enum TFType {
- TF_UNKNOWN = 0; // 正常计费
- U_CARD = 1; // 联通卡
- U_PKG = 2; // 联通包
- C_CARD = 3; // 移动卡
- C_PKG = 4; // 移动包
- T_CARD = 5; // 电信卡
- T_PKG = 6; // 电信包
-}
diff --git a/bili-api-grpc/proto/bilibili/metadata/restriction/restriction.proto b/bili-api-grpc/proto/bilibili/metadata/restriction/restriction.proto
deleted file mode 100644
index 9f9c77517..000000000
--- a/bili-api-grpc/proto/bilibili/metadata/restriction/restriction.proto
+++ /dev/null
@@ -1,26 +0,0 @@
-syntax = "proto3";
-
-package bilibili.metadata.restriction;
-
-option java_multiple_files = true;
-
-// 模式类型
-enum ModeType {
- NORMAL = 0; // 正常模式
- TEENAGERS = 1; // 青少年模式
- LESSONS = 2; // 课堂模式
-}
-
-// 限制条件
-message Restriction {
- // 青少年模式开关状态
- bool teenagers_mode = 1;
- // 课堂模式开关状态
- bool lessons_mode = 2;
- // 模式类型(旧版)
- ModeType mode = 3;
- // app 审核review状态
- bool review = 4;
- // 客户端是否选择关闭个性化推荐
- bool disable_rcmd = 5;
-}
diff --git a/bili-api-grpc/proto/bilibili/pangu/gallery/v1/gallery.proto b/bili-api-grpc/proto/bilibili/pangu/gallery/v1/gallery.proto
deleted file mode 100644
index 1ba8b873b..000000000
--- a/bili-api-grpc/proto/bilibili/pangu/gallery/v1/gallery.proto
+++ /dev/null
@@ -1,252 +0,0 @@
-syntax = "proto3";
-
-package bilibili.pangu.gallery.v1;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-//
-service GalleryInterface {
- //
- rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty);
- //
- rpc UserInfo (GetUserInfoReq) returns (GetUserInfoReply);
- //
- rpc ListNFTByMid (ListNFTByMidReq) returns (ListNFTByMidReply);
- //
- rpc ListOrderByMid (ListOrderByMidReq) returns (ListOrderByMidReply);
- //
- rpc BasicInfo (BasicInfoReq) returns (BasicInfoReply);
- //
- rpc UserCheck (UserCheckReq) returns (UserCheckReply);
- //
- rpc AgreePolicy (AgreePolicyReq) returns (AgreePolicyReply);
- //
- rpc GetLastPolicy (GetLastPolicyReq) returns (GetLastPolicyReply);
-}
-
-//
-message AgreePolicyReply {
-
-}
-
-//
-message AgreePolicyReq {
- //
- PolicyType policy_type = 1;
- //
- string version = 2;
-}
-
-//
-message BasicInfoReply {
- //
- string customer_service_url = 1;
- //
- string agreement_url = 2;
- //
- string privacy_url = 3;
- //
- repeated Link links = 4;
-}
-
-//
-message BasicInfoReq {
- //
- int64 mid = 1;
-}
-
-//
-message Display {
- //
- string bg_theme_light = 1;
- //
- string bg_theme_night = 2;
- //
- string nft_poster = 3;
- //
- string nft_raw = 4;
-}
-
-//
-enum GT14Status {
- LT14 = 0; //
- GE14 = 1; //
- UNKNOWN_GT14 = 2; //
-}
-
-//
-message GetLastPolicyReply {
- //
- string short_desc = 1;
- //
- string detail_jump = 2;
- //
- string version = 3;
-}
-
-//
-message GetLastPolicyReq {
- //
- PolicyType policy_type = 1;
-}
-
-//
-message GetUserInfoReply {
- //
- int64 mid = 1;
- //
- string name = 2;
- //
- string address = 3;
- //
- string avatar_url = 4;
- //
- string help_url = 5;
-}
-
-//
-message GetUserInfoReq {
- //
- int64 mid = 1;
-}
-
-//
-message Link {
- //
- string name = 1;
- //
- string link_url = 2;
- //
- string track_event_id = 3;
-}
-
-//
-message ListNFTByMidReply {
- //
- repeated NFT nfts = 1;
- //
- int64 anchor_id = 2;
- //
- bool end = 3;
-}
-
-//
-message ListNFTByMidReq {
- //
- int64 mid = 1;
- //
- string category = 2;
- //
- string biz_type = 3;
- //
- int64 anchor_id = 4;
- //
- int64 page_size = 5;
-}
-
-//
-message ListOrderByMidReply {
- //
- repeated Order orders = 1;
- //
- int64 anchor_id = 2;
- //
- bool end = 3;
-}
-
-//
-message ListOrderByMidReq {
- //
- int64 mid = 1;
- //
- int64 anchor_id = 2;
- //
- int64 page_size = 3;
-}
-
-//
-message NFT {
- //
- string nft_id = 1;
- //
- string item_name = 2;
- //
- string serial_number = 3;
- //
- string issuer = 4;
- //
- Display display = 5;
- //
- string detail_url = 6;
- //
- NFTStatus nft_status = 7;
- //
- int64 item_id = 8;
-}
-
-//
-enum NFTStatus {
- UNDEFINED = 0; //
- NORMAL = 1; //
- DOING = 2; //
-}
-
-//
-message Order {
- //
- string item_name = 1;
- //
- string serial_number = 2;
- //
- string tx_hash = 3;
- //
- string tx_time = 4;
- //
- string issuer = 5;
- //
- string issue_time = 6;
- //
- string token_id = 7;
- //
- Display display = 8;
- //
- string contract_address = 9;
- //
- string hash_jump = 10;
- //
- string contract_jump = 11;
- //
- bool disable_browser_jump = 12;
-}
-
-//
-enum PolicyAgreeStatus {
- UNSIGNED = 0; //
- ACCEPTED = 1; //
- EXPIRED = 2; //
-}
-
-//
-enum PolicyType {
- UNKNOWN_POLICY = 0; //
- WALLET = 1; //
- SALE = 2; //
-}
-
-//
-message UserCheckReply {
- //
- int32 policy_status = 1;
- //
- int32 gt14 = 2;
-}
-
-//
-message UserCheckReq {
- //
- int64 mid = 1;
- //
- int32 policy_type = 2;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/pgc/gateway/player/v1/playurl.proto b/bili-api-grpc/proto/bilibili/pgc/gateway/player/v1/playurl.proto
deleted file mode 100644
index 73b9f1381..000000000
--- a/bili-api-grpc/proto/bilibili/pgc/gateway/player/v1/playurl.proto
+++ /dev/null
@@ -1,267 +0,0 @@
-syntax = "proto3";
-
-package bilibili.pgc.gateway.player.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/playurl/v1/playurl.proto";
-
-// 播放地址
-service PlayURL {
- // 播放页信息
- rpc PlayView (PlayViewReq) returns (PlayViewReply);
- // 获取投屏地址
- rpc Project (ProjectReq) returns (ProjectReply);
- // 直播播放页信息
- rpc LivePlayView (LivePlayViewReq) returns (LivePlayViewReply);
-}
-
-// 其他业务信息
-message BusinessInfo {
- // 当前视频是否是预览
- bool is_preview = 1;
- // 用户是否承包过
- bool bp = 2;
- // drm使用
- string marlin_token = 3;
-}
-
-// 事件
-message Event {
- // 震动
- Shake shake = 1;
-}
-
-// 播放信息
-message LivePlayInfo {
- //
- int32 current_qn = 1;
- //
- repeated QualityDescription quality_description = 2;
- //
- repeated ResponseDataUrl durl = 3;
-}
-
-// 直播播放页信息-响应
-message LivePlayViewReply {
- // 房间信息
- RoomInfo room_info = 1;
- // 播放信息
- LivePlayInfo play_info = 2;
-}
-
-// 直播播放页信息-请求
-message LivePlayViewReq {
- // 剧集epid
- int64 ep_id = 1;
- // 清晰度
- // 0,10000:原画 400:蓝光 250:超清 150:高清 80:流畅
- uint32 quality = 2;
- // 类型
- // 0:音频 2:hevc 4:dash 8:p2p, 16:蒙版
- uint32 ptype = 3;
- // 是否请求https
- bool https = 4;
- // 0:默认直播间播放 1:投屏播放
- uint32 play_type = 5;
- // 投屏设备
- // 0:默认其他 1:OTT设备
- int32 device_type = 6;
-}
-
-// 禁用功能配置
-message PlayAbilityConf {
- bool background_play_disable = 1; // 后台播放
- bool flip_disable = 2; // 镜像反转
- bool cast_disable = 3; // 投屏
- bool feedback_disable = 4; // 反馈
- bool subtitle_disable = 5; // 字幕
- bool playback_rate_disable = 6; // 播放速度
- bool time_up_disable = 7; // 定时停止
- bool playback_mode_disable = 8; // 播放方式
- bool scale_mode_disable = 9; // 画面尺寸
- bool like_disable = 10; // 赞
- bool dislike_disable = 11; // 踩
- bool coin_disable = 12; // 投币
- bool elec_disable = 13; // 充电
- bool share_disable = 14; // 分享
- bool screen_shot_disable = 15; // 截图
- bool lock_screen_disable = 16; // 锁定
- bool recommend_disable = 17; // 相关推荐
- bool playback_speed_disable = 18; // 播放速度
- bool definition_disable = 19; // 清晰度
- bool selections_disable = 20; // 选集
- bool next_disable = 21; // 下一集
- bool edit_dm_disable = 22; // 编辑弹幕
- bool small_window_disable = 23; // 小窗
- bool shake_disable = 24; // 震动
- bool outer_dm_disable = 25; // 外层面板弹幕设置
- bool inner_dm_disable = 26; // 三点内弹幕设置
- bool freya_enter_disable = 27; // 一起看入口
- bool dolby_disable = 28; // 杜比音效
- bool freya_full_disable = 29; // 全屏一起看入口
- bool skip_oped_switch_disable = 30; //
-}
-
-// 播放页信息-响应
-message PlayViewReply {
- // 视频流信息
- bilibili.app.playurl.v1.VideoInfo video_info = 1;
- // 播放控件用户自定义配置
- PlayAbilityConf play_conf = 2;
- // 业务需要的其他信息
- BusinessInfo business = 3;
- // 事件
- Event event = 4;
-}
-
-// 播放页信息-请求
-message PlayViewReq {
- // 剧集epid
- int64 epid = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string from_spmid = 10;
- // 青少年模式
- int32 teenagers_mode = 11;
- // 视频编码
- bilibili.app.playurl.v1.CodeType prefer_codec_type = 12;
- // 是否强制请求预览视频
- bool is_preview = 13;
- // 一起看房间id
- int64 room_id = 14;
-}
-
-// 投屏地址-响应
-message ProjectReply {
- bilibili.app.playurl.v1.PlayURLReply project = 1;
-}
-
-// 投屏地址-请求
-message ProjectReq {
- // 剧集epid
- int64 ep_id = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 forceHost = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string fromSpmid = 10;
- // 使用协议
- // 0:默认乐播 1:自建协议 2:云投屏 3:airplay
- int32 protocol = 11;
- // 投屏设备
- // 0:默认其他 1:OTT设备
- int32 device_type = 12;
- //
- bool use_new_project_code = 13;
-}
-
-//
-message QualityDescription {
- //
- int32 qn = 1;
- //
- string desc = 2;
-}
-
-//
-message ResponseDataUrl {
- string url = 1;
- // 表示stream类型,按位表示
- // Value| 1 | 1 | 1 | 1 | 1
- // --------------------------------------------
- // desc | mask | p2p | dash | hevc | only-audio
- uint32 stream_type = 2;
- // 表示支持p2p的cdn厂商,按位表示
- // 值 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
- // -----------------------------------------------
- // CDN | hw | bdy | bsy | ws | txy | qn | js | bvc
- uint32 ptag = 3;
-}
-
-// 房间信息
-message RoomInfo {
- // 房间长号
- int64 room_id = 1;
- // 主播mid
- int64 uid = 2;
- // 状态相关
- RoomStatusInfo status = 3;
- // 展示相关
- RoomShowInfo show = 4;
-}
-
-// 房间信息-展示相关
-message RoomShowInfo {
- // 短号
- int64 short_id = 1;
- // 人气值
- int64 popularity_count = 8;
- // 最近一次开播时间戳
- int64 live_start_time = 10;
-}
-
-// 房间信息-状态相关
-message RoomStatusInfo {
- // 直播间状态
- // 0:未开播 1:直播中 2:轮播中
- int64 live_status = 1;
- // 横竖屏方向
- // 0:横屏 1:竖屏
- int64 live_screen_type = 2;
- // 是否开播过标识
- int64 live_mark = 3;
- // 封禁状态
- // 0:未封禁 1:审核封禁 2:全网封禁
- int64 lock_status = 4;
- // 封禁时间戳
- int64 lock_time = 5;
- // 隐藏状态
- // 0:不隐藏 1:隐藏
- int64 hidden_status = 6;
- // 隐藏时间戳
- int64 hidden_time = 7;
- // 直播类型
- // 0:默认 1:摄像头直播 2;录屏直播 3:语音直播
- int64 live_type = 8;
- //
- int64 room_shield = 9;
-}
-
-// 震动
-message Shake {
- // 文件地址
- string file = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/pgc/gateway/player/v2/playurl.proto b/bili-api-grpc/proto/bilibili/pgc/gateway/player/v2/playurl.proto
deleted file mode 100644
index 9024fbbfd..000000000
--- a/bili-api-grpc/proto/bilibili/pgc/gateway/player/v2/playurl.proto
+++ /dev/null
@@ -1,1129 +0,0 @@
-syntax = "proto3";
-
-package bilibili.pgc.gateway.player.v2;
-
-option java_multiple_files = true;
-
-import "google/protobuf/timestamp.proto";
-
-// 视频url
-service PlayURL {
- // 播放页信息
- rpc PlayView (PlayViewReq) returns (PlayViewReply);
- //
- rpc PlayViewComic(PlayViewReq) returns (PlayViewReply);
-}
-
-//
-message Animation {
- //
- map qn_svga_animation_map = 1;
-}
-
-//
-message AudioMaterialProto {
- //
- string audio_id = 1;
- //
- string title = 2;
- //
- string edition = 3;
- //
- uint64 person_id = 4;
- //
- string person_name = 5;
- //
- string person_avatar = 6;
- //
- repeated DashItem audio = 7;
-}
-
-// 角标信息
-message BadgeInfo {
- // 角标文案
- string text = 1;
- // 角标色值
- string bg_color = 2;
- // 角标色值-夜间模式
- string bg_color_night = 3;
- // 文案色值
- string text_color = 4;
- // ? 新版本客户端已弃用此项
- GradientColor bg_gradient_color = 5;
- //
- string img = 6;
-}
-
-// Dialog组件: 底部显示
-message BottomDisplay {
- // 文案
- TextInfo title = 1;
- // 图标
- string icon = 2;
-}
-
-// 按钮信息
-message ButtonInfo {
- // 按钮文案
- string text = 1;
- // 按钮字体色值
- string text_color = 2;
- // 按钮字体色值-夜间模式
- string text_color_night = 3;
- // 按钮背景色
- string bg_color = 4;
- // 按钮背景色-夜间模式
- string bg_color_night = 5;
- // 按钮链接
- string link = 6;
- // 按钮动作类型
- string action_type = 7;
- // 角标信息
- BadgeInfo badge_info = 8;
- // 埋点上报信息
- Report report = 9;
- // 左侧删除线样式文案
- string left_strikethrough_text = 10;
- // 缩略按钮文案信息
- TextInfo simple_text_info = 11;
- // 缩略按钮背景色值
- string simple_bg_color = 12;
- // 缩略按钮字体色值-夜间模式
- string simple_bg_color_night = 13;
- //
- GradientColor bg_gradient_color = 14;
- //
- map order_report_params = 15;
- //
- TaskParam task_param = 16;
- //
- string pc_link = 17;
-}
-
-// 投屏限制. code = 0 时为无限制, 否则表示不不允许投屏并提示message
-message CastTips {
- //
- int32 code = 1;
- //
- string message = 2;
-}
-
-// 跳过片头/片尾配置
-message ClipInfo {
- //
- int64 material_no = 1;
- // DASH分段始
- int32 start = 2;
- // DASH分段终
- int32 end = 3;
- // Clip类型
- ClipType clip_type = 4;
- // 跳过片头/片尾时的提示语
- string toast_text = 5;
- //
- MultiView multi_view = 6;
-}
-
-// 跳过片头/片尾配置: Clip类型
-enum ClipType {
- NT_UNKNOWN = 0; //
- CLIP_TYPE_OP = 1; // 跳过OP
- CLIP_TYPE_ED = 2; // 跳过ED
- CLIP_TYPE_HE = 3; //
- CLIP_TYPE_MULTI_VIEW = 4; //
- CLIP_TYPE_AD = 5; //
-}
-
-// 编码类型
-enum CodeType {
- NOCODE = 0; // 默认
- CODE264 = 1; // H.264
- CODE265 = 2; // H.265
-}
-
-//
-message ContinuePlayInfo {
- //
- int64 continue_play_ep_id = 1;
-}
-
-// 优惠券
-message Coupon {
- // 优惠券token
- string coupon_token = 1;
- // 优惠券类型
- // 1:折扣券 2:满减券 3:兑换券
- int64 type = 2;
- // 优惠券面值
- string value = 3;
- // 优惠券使用描述
- string use_desc = 4;
- // 优惠券标题
- string title = 5;
- // 优惠券描述
- string desc = 6;
- // 优惠券支付按钮文案
- string pay_button_text = 7;
- // 优惠券支付按钮删除线文案
- string pay_button_text_line_through = 8;
- // 实付金额
- string real_amount = 9;
- // 使用过期时间
- google.protobuf.Timestamp expire_time = 10;
- //
- int64 otype = 11;
- //
- string amount = 12;
-}
-
-// 优惠券信息
-message CouponInfo {
- // 提示框信息
- CouponToast toast = 1;
- // 弹窗信息
- PopWin pop_win = 2;
-}
-
-// 优惠券提示框文案信息
-message CouponTextInfo {
- // 提示框文案-播正片6分钟预览
- string positive_preview = 1;
- // 提示框文案-播非正片分节ep
- string section = 2;
-}
-
-// 优惠券提示框信息
-message CouponToast {
- // 提示框文案信息
- CouponTextInfo text_info = 1;
- // 提示框按钮
- ButtonInfo button = 2;
-}
-
-// dash条目
-message DashItem {
- // 清晰度
- uint32 id = 1;
- // 主线流
- string base_url = 2;
- // 备用流
- repeated string backup_url = 3;
- // 带宽
- uint32 bandwidth = 4;
- // 编码id
- uint32 codecid = 5;
- // md5
- string md5 = 6;
- // 视频大小
- uint64 size = 7;
- // 帧率
- string frame_rate = 8;
- // DRM widevine 密钥
- string widevine_pssh = 9;
-}
-
-// dash视频流
-message DashVideo {
- // 主线流
- string base_url = 1;
- // 备用流
- repeated string backup_url = 2;
- // 带宽
- uint32 bandwidth = 3;
- // 编码id
- uint32 codecid = 4;
- // md5
- string md5 = 5;
- // 大小
- uint64 size = 6;
- // 伴音质量id
- uint32 audio_id = 7;
- // 是否非全二压
- bool no_rexcode = 8;
- // 帧率
- string frame_rate = 9;
- // 宽
- int32 width = 10;
- // 高
- int32 height = 11;
- // DRM 密钥
- string widevine_pssh = 12;
-}
-
-//
-message DataControl {
- //
- bool need_watch_progress = 1;
-}
-
-// 鉴权浮层
-message Dialog {
- // 鉴权限制码
- int64 code = 1;
- // 鉴权限制信息
- string msg = 2;
- // 浮层类型
- string type = 3;
- // 浮层样式类型
- string style_type = 4;
- // 浮层配置
- DialogConfig config = 5;
- // 标题
- TextInfo title = 6;
- // 副标题
- TextInfo subtitle = 7;
- // 图片信息
- ImageInfo image = 8;
- // 按钮列表
- repeated ButtonInfo button = 9;
- // 底部描述
- ButtonInfo bottom_desc = 10;
- // 埋点上报信息
- Report report = 11;
- // 倒计时 秒
- int32 count_down_sec = 12;
- // 右下描述
- TextInfo right_bottom_desc = 13;
- //
- repeated BottomDisplay bottom_display = 14;
- //
- repeated PlayList play_list = 15;
-}
-
-// 鉴权浮层配置
-message DialogConfig {
- // 是否显示高斯模糊背景图
- bool is_show_cover = 1;
- // 是否响应转屏
- bool is_orientation_enable = 2;
- // 是否响应上滑吸顶
- bool is_nested_scroll_enable = 3;
- // 是否强制竖屏
- bool is_force_halfscreen_enable = 4;
- // 是否启用背景半透明
- bool is_background_translucent_enable = 5;
-}
-
-// 当前分辨率信息
-message Dimension {
- // 宽
- int32 width = 1;
- // 长
- int32 height = 2;
- // 旋转角度
- int32 rotate = 3;
-}
-
-// 杜比音频信息
-message DolbyItem {
- // 杜比类型
- enum Type {
- NONE = 0; // NONE
- COMMON = 1; // 普通杜比音效
- ATMOS = 2; // 全景杜比音效
- }
- // 杜比类型
- Type type = 1;
- // 音频流
- DashItem audio = 2;
-}
-
-// DRM技术类型
-enum DrmTechType {
- NON = 0; //
- FAIR_PLAY = 1; //
- WIDE_VINE = 2; //
- BILI_DRM = 3; //
-}
-
-// 播放结束后的尾页Dialog
-message EndPage {
- //
- Dialog dialog = 1;
- //
- bool hide = 2;
-}
-
-//
-message EpInlineVideo {
- //
- int64 material_no = 1;
- //
- int64 aid = 2;
- //
- int64 cid = 3;
-}
-
-// 剧集广告信息
-message EpisodeAdvertisementInfo {
- //
- int64 aid = 1;
- //
- string title = 2;
- //
- string link = 3;
- //
- int32 follow_video_bnt_flag = 4;
- //
- string next_video_title = 5;
- //
- string next_video_link = 6;
- //
- int64 cid = 7;
- //
- int32 season_id = 8;
- //
- int32 follow = 9;
-}
-
-// EP信息
-message EpisodeInfo {
- //
- int32 ep_id = 1;
- //
- int64 cid = 2;
- //
- int64 aid = 3;
- //
- int64 ep_status = 4;
- //
- SeasonInfo season_info = 5;
- //
- string cover = 6;
- //
- string title = 7;
- //
- Interaction interaction = 8;
- //
- string long_title = 9;
-}
-
-//
-message EpPreVideo {
- //
- int64 aid = 1;
- //
- int64 cid = 2;
-}
-
-//
-message EpPublicityVideo {
- //
- enum Type {
- DATA_NOT_SET = 0;
- EP_PRE_VIDEO = 2;
- EP_INLINE = 3;
- }
- //
- Type type = 1;
- //
- oneof data {
- //
- EpPreVideo ep_pre_video = 2;
- //
- EpInlineVideo ep_inline_video = 3;
- }
-}
-
-//
-enum EpPublicityVideoType {
- //
- PRE = 0;
- //
- INLINE = 1;
-}
-
-// 事件
-message Event {
- // 震动
- Shake shake = 1;
-}
-
-// 放映室提示语
-message FreyaConfig {
- //
- string desc = 1;
- //
- int32 type = 2;
- //
- int32 issued_cnt = 3;
- //
- bool is_always_show = 4;
- //
- int32 screen_number = 5;
- //
- int32 full_screen_number = 6;
-}
-
-// 渐变色信息
-message GradientColor {
- //
- string start_color = 1;
- //
- string end_color = 2;
-}
-
-// 高画质试看信息
-message HighDefinitionTrialInfo {
- //
- bool trial_able = 1;
- //
- int32 remaining_times = 2;
- //
- int32 start = 3;
- //
- int32 time_length = 4;
- //
- Toast start_toast = 5;
- //
- Toast end_toast = 6;
- //
- Report report = 7;
- //
- ButtonInfo quality_open_tip_btn = 8;
- //
- ButtonInfo no_longer_trial_btn = 9;
-}
-
-// 历史记录节点
-message HistoryNode {
- // 节点ID
- int64 node_id = 1;
- // 节点标题
- string title = 2;
- // 对应CID
- int64 cid = 3;
-}
-
-// 图片信息
-message ImageInfo {
- // 图片链接
- string url = 1;
-}
-
-//
-enum InlineScene {
- UNKNOWN = 0; //
- RELATED_EP = 1; //
- HE = 2; //
- SKIP = 3; //
-}
-
-//
-enum InlineType {
- TYPE_UNKNOWN = 0; //
- TYPE_WHOLE = 1; //
- TYPE_HE_CLIP = 2; //
- TYPE_PREVIEW = 3; //
-}
-
-// 交互信息
-message Interaction {
- // 历史节点
- HistoryNode history_node = 1;
- // 版本
- int64 graph_version = 2;
- // 交互消息
- string msg = 3;
- // 是否为交互
- bool is_interaction = 4;
-}
-
-// 限制操作类型
-enum LimitActionType {
- //
- LAT_UNKNOWN = 0;
- //
- SHOW_LIMIT_DIALOG = 1;
- //
- SKIP_CURRENT_EP = 2;
-}
-
-//
-message MultiView {
- //
- string button_material = 1;
- //
- int64 ep_id = 2;
- //
- int64 cid = 3;
- //
- int64 avid = 4;
-}
-
-// 大会员广告: 支付提示信息
-message PayTip {
- // 标题
- string title = 1;
- // 跳转链接
- string url = 2;
- // 图标
- string icon = 3;
- // 浮层类型
- int32 type = 4;
- // 显示类型
- int32 show_type = 5;
- // 图片信息
- string img = 6;
- // 白天背景颜色
- string bg_day_color = 7;
- // 夜间背景颜色
- string bg_night_color = 8;
- // 白天线条颜色
- string bg_line_color = 9;
- // 夜间线条颜色
- string bg_night_line_color = 10;
- // 文字颜色
- string text_color = 11;
- // 夜间文字颜色
- string text_night_color = 12;
- // 视图展示起始时间
- int64 view_start_time = 13;
- // 按钮列表
- repeated ButtonInfo button = 14;
- // 跳转链接打开方式
- int32 url_open_type = 15;
- // 埋点上报信息
- Report report = 16;
- // 角度样式
- int32 angle_style = 17;
- // 埋点上报类型
- int32 report_type = 18;
- // 订单埋点上报参数
- map order_report_params = 19;
- // 巨屏图片信息
- string giant_screen_img = 20;
-}
-
-// 禁用功能配置
-message PlayAbilityConf {
- bool background_play_disable = 1; // 后台播放
- bool flip_disable = 2; // 镜像反转
- bool cast_disable = 3; // 投屏
- bool feedback_disable = 4; // 反馈
- bool subtitle_disable = 5; // 字幕
- bool playback_rate_disable = 6; // 播放速度
- bool time_up_disable = 7; // 定时停止
- bool playback_mode_disable = 8; // 播放方式
- bool scale_mode_disable = 9; // 画面尺寸
- bool like_disable = 10; // 赞
- bool dislike_disable = 11; // 踩
- bool coin_disable = 12; // 投币
- bool elec_disable = 13; // 充电
- bool share_disable = 14; // 分享
- bool screen_shot_disable = 15; // 截图
- bool lock_screen_disable = 16; // 锁定
- bool recommend_disable = 17; // 相关推荐
- bool playback_speed_disable = 18; // 播放速度
- bool definition_disable = 19; // 清晰度
- bool selections_disable = 20; // 选集
- bool next_disable = 21; // 下一集
- bool edit_dm_disable = 22; // 编辑弹幕
- bool small_window_disable = 23; // 小窗
- bool shake_disable = 24; // 震动
- bool outer_dm_disable = 25; // 外层面板弹幕设置
- bool inner_dm_disable = 26; // 三点内弹幕设置
- bool freya_enter_disable = 27; // 一起看入口
- bool dolby_disable = 28; // 杜比音效
- bool freya_full_disable = 29; // 全屏一起看入口
- bool skip_oped_switch_disable = 30; // 跳过片头片尾
- bool record_screen_disable = 31; // 录屏
- bool color_optimize_disable = 32; // 色觉优化
- bool dubbing_disable = 33; // 配音
-}
-
-// 云控扩展配置信息
-message PlayAbilityExtConf {
- //
- bool allow_close_subtitle = 1;
- //
- FreyaConfig freya_config = 2;
- //
- CastTips cast_tips = 3;
-}
-
-// 播放配音信息
-message PlayDubbingInfo {
- // 背景音频
- AudioMaterialProto background_audio = 1;
- // 角色音频列表
- repeated RoleAudioProto role_audio_list = 2;
- // 引导文本
- string guide_text = 3;
-}
-
-// 错误码
-enum PlayErr {
- NoErr = 0; //
- WithMultiDeviceLoginErr = 1; // 管控类型的错误码
-}
-
-
-// 播放扩展信息
-message PlayExtInfo {
- // 播放配音信息
- PlayDubbingInfo play_dubbing_info = 1;
-}
-
-//
-message PlayList {
- //
- int32 season_id = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- string link = 4;
- //
- BadgeInfo badge_info = 5;
-}
-
-// 其他业务信息
-message PlayViewBusinessInfo {
- // 当前视频是否是预览
- bool is_preview = 1;
- // 用户是否承包过
- bool bp = 2;
- // drm使用
- string marlin_token = 3;
- // 倍速动效色值
- string playback_speed_color = 4;
- //
- ContinuePlayInfo continue_play_info = 5;
- // 跳过片头/片尾配置
- repeated ClipInfo clip_info = 6;
- //
- InlineType inline_type = 7;
- //
- int32 ep_whole_duration = 8;
- // 当前分辨率信息
- Dimension dimension = 9;
- //
- map quality_ext_map = 10;
- //
- map exp_map = 11;
- // DRM技术类型
- DrmTechType drm_tech_type = 12;
- //
- int32 limit_action_type = 13;
- //
- bool is_drm = 14;
- //
- RecordInfo record_info = 15;
- //
- int32 vip_status = 16;
- //
- bool is_live_pre = 17;
- //
- EpisodeInfo episode_info = 18;
- //
- EpisodeAdvertisementInfo episode_advertisement_info = 19;
- //
- UserStatus user_status = 20;
-}
-
-// 播放页信息-响应
-message PlayViewReply {
- // 视频流信息
- VideoInfo video_info = 1;
- // 播放控件用户自定义配置
- PlayAbilityConf play_conf = 2;
- // 业务需要的其他信息
- PlayViewBusinessInfo business = 3;
- // 事件
- Event event = 4;
- // 展示信息
- ViewInfo view_info = 5;
- // 自定义配置扩展信息
- PlayAbilityExtConf play_ext_conf = 6;
- // 播放扩展信息
- PlayExtInfo play_ext_info = 7;
-}
-
-// 播放页信息-请求
-message PlayViewReq {
- // 剧集epid
- int64 epid = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- int64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 当前页spm
- string spmid = 9;
- // 上一页spm
- string from_spmid = 10;
- // 青少年模式
- int32 teenagers_mode = 11;
- // 视频编码
- CodeType prefer_codec_type = 12;
- // 是否强制请求预览视频
- bool is_preview = 13;
- // 一起看房间id
- int64 room_id = 14;
- // 是否需要展示信息
- bool is_need_view_info = 15;
- // 场景控制
- SceneControl scene_control = 16;
- //
- InlineScene inline_scene = 17;
- //
- int64 material_no = 18;
- // DRM 安全等级
- int32 security_level = 19;
- //
- int64 season_id = 20;
- //
- DataControl data_control = 21;
-}
-
-// 弹窗信息
-message PopWin {
- // 弹窗标题 老字段
- string title = 1;
- // 优惠券列表
- repeated Coupon coupon = 2;
- // 弹窗按钮列表
- repeated ButtonInfo button = 3;
- // 底部文案 老字段
- string bottom_text = 4;
- // 弹窗标题 新字段
- TextInfo pop_title = 5;
- // 弹窗副标题
- TextInfo subtitle = 6;
- // 底部描述 新字段
- ButtonInfo bottom_desc = 7;
- // 弹窗小图
- string cover = 8;
- // 弹窗类型
- string pop_type = 9;
-}
-
-// 广告组件: 竖屏时视频下部提示栏
-message PromptBar {
- // 主标题, 如: "本片含大会员专享内容"
- TextInfo title = 1;
- // 副标题, 如: "成为大会员可免费看全部剧集"
- TextInfo sub_title = 2;
- // 副标题前面的icon
- string sub_title_icon = 3;
- // 背景图
- string bg_image = 4;
- // 背景渐变色
- GradientColor bg_gradient_color = 5;
- // 按钮
- repeated ButtonInfo button = 6;
- // 埋点上报信息
- Report report = 7;
- //
- string full_screen_ip_icon = 8;
- //
- GradientColor full_screen_bg_gradient_color = 9;
-}
-
-// 云控拓展视频画质信息
-message QualityExtInfo {
- // 是否支持试看
- bool trial_support = 1;
-}
-
-// 备案信息
-message RecordInfo {
- // 记录
- string record = 1;
- // 记录图标
- string record_icon = 2;
-}
-
-// 埋点上报信息
-message Report {
- // 曝光事件
- string show_event_id = 1;
- // 点击事件
- string click_event_id = 2;
- // 埋点透传参数
- string extends = 3;
-}
-
-// 分段流条目
-message ResponseUrl {
- // 分段序号
- uint32 order = 1;
- // 分段时长
- uint64 length = 2;
- // 分段大小
- uint64 size = 3;
- // 主线流
- string url = 4;
- // 备用流
- repeated string backup_url = 5;
- // md5
- string md5 = 6;
-}
-
-// 权限信息
-message Rights {
- // 是否可以观看
- int32 can_watch = 1;
-}
-
-// 角色配音信息
-message RoleAudioProto {
- // 角色ID
- int64 role_id = 1;
- // 角色名称
- string role_name = 2;
- // 角色头像
- string role_avatar = 3;
- // 音频素材列表
- repeated AudioMaterialProto audio_material_list = 4;
-}
-
-// 场景控制
-message SceneControl {
- // 是否收藏播单
- bool fav_playlist = 1;
- // 是否小窗
- bool small_window = 2;
- // 是否画中画
- bool pip = 3;
- //
- bool was_he_inline = 4;
- //
- bool is_need_trial = 5;
-}
-
-// 方案
-message Scheme {
- enum ActionType {
- UNKNOWN = 0;
- SHOW_TOAST = 1;
- }
- //
- ActionType action_type = 1;
- //
- string toast = 2;
-}
-
-// PGC SEASON 信息
-message SeasonInfo {
- // PGC SEASON ID
- int32 season_id = 1;
- // PGC SEASON 类型
- int32 season_type = 2;
- // PGC SEASON 状态
- int32 season_status = 3;
- // 封面
- string cover = 4;
- // 标题
- string title = 5;
- // 权限信息
- Rights rights = 6;
- // 模式
- int32 mode = 7;
-}
-
-// DRM 安全等级
-enum SecurityLevel {
- LEVEL_UNKNOWN = 0; //
- LEVEL_L1 = 1; //
- LEVEL_L2 = 2; //
- LEVEL_L3 = 3; //
-}
-
-// 分段视频流
-message SegmentVideo {
- //分段视频流列表
- repeated ResponseUrl segment = 1;
-}
-
-// 震动
-message Shake {
- // 文件地址
- string file = 1;
-}
-
-// 视频流信息
-message Stream {
- // 元数据
- StreamInfo info = 1;
- // 流数据
- oneof content {
- // dash流
- DashVideo dash_video = 2;
- // 分段流
- SegmentVideo segment_video = 3;
- }
-}
-
-// 流媒体元数据
-message StreamInfo {
- // 视频质量
- int32 quality = 1;
- // 视频格式
- string format = 2;
- // 描述信息
- string description = 3;
- // 错误码
- int32 err_code = 4;
- // 流限制信息
- StreamLimit limit = 5;
- // 是否需要VIP
- bool need_vip = 6;
- // 是否需要登录
- bool need_login = 7;
- // 是否完整
- bool intact = 8;
- // 权限信息
- int64 attribute = 10;
- // 新版描述信息
- string new_description = 11;
- // 显示描述信息
- string display_desc = 12;
- // 上标
- string superscript = 13;
- // 方案信息
- Scheme scheme = 14;
- // 是否支持DRM
- bool support_drm = 15;
- // 字幕信息
- string subtitle = 16;
-}
-
-// 清晰度不满足条件信息
-message StreamLimit {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 提示信息
- string msg = 3;
-}
-
-// 任务参数信息
-message TaskParam {
- // 任务类型
- string task_type = 1;
- // 活动ID
- int64 activity_id = 2;
- // 提示ID
- int64 tips_id = 3;
-}
-
-// 文案信息
-message TextInfo {
- // 文案
- string text = 1;
- // 字体色值
- string text_color = 2;
- // 字体色值-夜间模式
- string text_color_night = 3;
-}
-
-// toast
-message Toast {
- // toast文案 老字段
- string text = 1;
- // toast按钮
- ButtonInfo button = 2;
- // 显示样式类型
- int32 show_style_type = 3;
- // 图标
- string icon = 4;
- // toast文案 新字段
- TextInfo toast_text = 5;
- // 埋点上报信息
- Report report = 6;
- //
- map order_report_params = 7;
-}
-
-// 用户状态信息
-message UserStatus {
- // 是否支付
- bool pay_check = 1;
- // 是否承包
- bool sponsor = 2;
- // 观看进度
- WatchProgress watch_progress = 3;
- // 系列观看进度
- WatchProgress aid_watch_progress = 4;
-}
-
-// 视频url信息
-message VideoInfo {
- // 视频清晰度
- uint32 quality = 1;
- // 视频格式
- string format = 2;
- // 视频时长
- uint64 timelength = 3;
- // 视频编码id
- uint32 video_codecid = 4;
- // 视频流
- repeated Stream stream_list = 5;
- // 伴音流
- repeated DashItem dash_audio = 6;
- // 杜比伴音流
- DolbyItem dolby = 7;
-}
-
-// 展示信息
-message ViewInfo {
- // 弹窗
- Dialog dialog = 1;
- // Toast
- Toast toast = 2;
- // 优惠券信息
- CouponInfo coupon_info = 3;
- // 未支付剧集ID列表
- repeated int64 demand_no_pay_epids = 4;
- // 结束页
- EndPage end_page = 5;
- // 扩展配置
- map exp_config = 6;
- // 弹窗
- PopWin pop_win = 7;
- // 试看提示栏
- PromptBar try_watch_prompt_bar = 8;
- // 支付提示信息
- PayTip pay_tip = 9;
- // 高清试看提示信息
- HighDefinitionTrialInfo high_definition_trial_info = 10;
- // 弹窗扩展
- map ext_dialog = 11;
- // 动画
- Animation animation = 12;
- // Toast扩展
- map ext_toast = 13;
-}
-
-// 观看进度信息
-message WatchProgress {
- // 上次观看的 EP ID
- int32 last_ep_id = 1;
- // 上次观看到的EP INDEX
- string last_ep_index = 2;
- // 上次观看的进度
- int64 progress = 3;
- // 上次观看的 CID
- int64 last_play_cid = 4;
- // 带时间的提示信息
- Toast toast = 5;
- // 不带时间的提示信息
- Toast toast_without_time = 6;
- // 上次观看的 AID
- int64 last_play_aid = 7;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/pgc/service/premiere/v1/premiere.proto b/bili-api-grpc/proto/bilibili/pgc/service/premiere/v1/premiere.proto
deleted file mode 100644
index f221b745f..000000000
--- a/bili-api-grpc/proto/bilibili/pgc/service/premiere/v1/premiere.proto
+++ /dev/null
@@ -1,35 +0,0 @@
-syntax = "proto3";
-
-package bilibili.pgc.service.premiere.v1;
-
-option java_multiple_files = true;
-
-// 首播服务
-service Premiere {
- // 获取首播状态
- rpc Status (PremiereStatusReq) returns (PremiereStatusReply);
-}
-
-// 获取首播状态-请求
-message PremiereStatusReq {
- // 剧集epid
- int64 ep_id = 1;
-}
-
-// 获取首播状态-响应
-message PremiereStatusReply {
- // 服务端播放进度 单位ms 用户实际播放进度:progress - delay_time
- int64 progress = 1;
- // 起播时间戳 单位ms
- int64 start_time = 2;
- // 延迟播放时长 单位ms
- int64 delay_time = 3;
- // 首播在线人数
- int64 online_count = 4;
- // 首播状态
- // 1:预热 2:首播中 3:紧急停播 4:已结束
- int32 status = 5;
- // 首播结束后跳转类型
- // 1:下架 2:转点播
- int32 after_premiere_type = 6;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/playershared/playershared.proto b/bili-api-grpc/proto/bilibili/playershared/playershared.proto
deleted file mode 100644
index d20c7e78c..000000000
--- a/bili-api-grpc/proto/bilibili/playershared/playershared.proto
+++ /dev/null
@@ -1,835 +0,0 @@
-syntax = "proto3";
-
-package bilibili.playershared;
-
-option java_multiple_files = true;
-
-// ArcConf消息
-message ArcConf {
- // 是否支持
- bool is_support = 1;
- // 是否禁用
- bool disabled = 2;
- // 额外内容
- ExtraContent extra_content = 3;
- // 不支持场景列表
- repeated int32 unsupport_scene = 4;
-}
-
-//
-enum ArcType {
- //
- ARC_TYPE_NORMAL = 0;
- //
- ARC_TYPE_INTERACT = 1;
-}
-
-//
-message BackgroundInfo {
- //
- string drawable_color = 1;
- //
- string drawable_bitmap_url = 2;
- //
- int32 effects = 3;
-}
-
-//
-message BadgeInfo {
- //
- string text = 1;
- //
- string bg_color = 2;
- //
- string bg_color_night = 3;
- //
- string text_color = 4;
- //
- GradientColor bg_gradient_color = 5;
- //
- string img = 6;
-}
-
-//
-enum BizType {
- //
- BIZ_TYPE_UNKNOWN = 0;
- //
- BIZ_TYPE_UGC = 1;
- //
- BIZ_TYPE_PGC = 2;
- //
- BIZ_TYPE_PUGV = 3;
-}
-
-//
-message BottomDisplay {
- //
- TextInfo title = 1;
- //
- string icon = 2;
-}
-
-// 按钮组件
-message Button {
- // 按钮文本
- string text = 1;
- // 按钮跳转链接
- string link = 2;
- // 埋点上报相关
- map report_params = 3;
-}
-
-enum ButtonAction {
- //
- BUTTON_UNKNOWN = 0;
- //
- PAY = 1;
- //
- VIP = 2;
- //
- PACK = 3;
- //
- LINK = 4;
- //
- COUPON = 5;
- //
- DEMAND = 6;
- //
- DEMAND_PACK = 7;
- //
- FOLLOW = 8;
- //
- APPOINTMENT = 9;
- //
- VIP_FREE = 10;
- //
- TASK = 11;
- //
- CHARGINGPLUS = 12;
- //
- BP = 13;
- //
- PRE_SELL = 14;
-}
-
-//
-message ButtonInfo {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
- //
- string link = 6;
- //
- ButtonAction action_type = 7;
- //
- BadgeInfo badge_info = 8;
- //
- Report report = 9;
- //
- string left_strikethrough_text = 10;
- //
- TextInfo simple_text_info = 11;
- //
- string simple_bg_color = 12;
- //
- string simple_bg_color_night = 13;
- //
- GradientColor bg_gradient_color = 14;
- //
- map order_report_params = 15;
- //
- TaskParam task_param = 16;
- //
- string frame_color = 17;
- //
- string icon = 18;
-}
-
-// 视频编码
-enum CodeType {
- NOCODE = 0; // 不指定
- CODE264 = 1; // H264
- CODE265 = 2; // H265
- CODEAV1 = 3; // AV1
-}
-
-//
-message ComprehensiveToast {
- //
- int32 type = 1;
- //
- ButtonInfo button = 2;
- //
- int32 show_style_type = 3;
- //
- string icon = 4;
- //
- TextInfo toast_text = 5;
- //
- Report report = 6;
- //
- map order_report_params = 7;
-}
-
-// 功能类型
-enum ConfType {
- NoType = 0;
- FLIPCONF = 1;
- CASTCONF = 2;
- FEEDBACK = 3;
- SUBTITLE = 4;
- PLAYBACKRATE = 5;
- TIMEUP = 6;
- PLAYBACKMODE = 7;
- SCALEMODE = 8;
- BACKGROUNDPLAY = 9;
- LIKE = 10;
- DISLIKE = 11;
- COIN = 12;
- ELEC = 13;
- SHARE = 14;
- SCREENSHOT = 15;
- LOCKSCREEN = 16;
- RECOMMEND = 17;
- PLAYBACKSPEED = 18;
- DEFINITION = 19;
- SELECTIONS = 20;
- NEXT = 21;
- EDITDM = 22;
- SMALLWINDOW = 23;
- SHAKE = 24;
- OUTERDM = 25;
- INNERDM = 26;
- PANORAMA = 27;
- DOLBY = 28;
- COLORFILTER = 29;
- LOSSLESS = 30;
- FREYAENTER = 31;
- FREYAFULLENTER = 32;
- SKIPOPED = 33;
- RECORDSCREEN = 34;
- DUBBING = 35;
- LISTEN = 36;
-}
-
-//
-message ConfValue {
- oneof value {
- //
- int32 switch_val = 1;
- //
- int32 selected_val = 2;
- }
-}
-
-// Dash条目
-message DashItem {
- // 清晰度
- uint32 id = 1;
- // 主线流
- string base_url = 2;
- // 备用流
- repeated string backup_url = 3;
- // 带宽
- uint32 bandwidth = 4;
- // 编码id
- uint32 codecid = 5;
- // md5
- string md5 = 6;
- // 大小
- uint64 size = 7;
- // 帧率
- string frame_rate = 8;
- // DRM密钥
- string widevine_pssh = 9;
-}
-
-// 视频流信息: dash流
-message DashVideo {
- // 主线流
- string base_url = 1;
- // 备用流
- repeated string backup_url = 2;
- // 带宽
- uint32 bandwidth = 3;
- // 编码id
- uint32 codecid = 4;
- // md5
- string md5 = 5;
- // 大小
- uint64 size = 6;
- // 伴音质量id
- uint32 audio_id = 7;
- // 是否非全二压
- bool no_rexcode = 8;
- // 帧率
- string frame_rate = 9;
- // 宽
- int32 width = 10;
- // 高
- int32 height = 11;
- // DRM密钥
- string widevine_pssh = 12;
-}
-
-//
-message DeviceConf {
- ConfValue conf_value = 1;
-}
-
-//
-message Dialog {
- //
- int32 style_type = 1;
- //
- BackgroundInfo background_info = 2;
- //
- TextInfo title = 3;
- //
- TextInfo subtitle = 4;
- //
- ImageInfo image = 5;
- //
- repeated ButtonInfo button = 6;
- //
- ButtonInfo bottom_desc = 7;
- //
- Report report = 8;
- //
- int32 count_down_sec = 9;
- //
- TextInfo right_bottom_desc = 10;
- //
- repeated BottomDisplay bottom_display = 11;
- //
- ExtData ext_data = 12;
- //
- int32 limit_action_type = 13;
-}
-
-// 当前分辨率信息
-message Dimension {
- // 宽
- int32 width = 1;
- // 长
- int32 height = 2;
- // 旋转角度
- int32 rotate = 3;
-}
-
-// 杜比伴音流信息
-message DolbyItem {
- // 杜比类型
- enum Type {
- NONE = 0; // NONE
- COMMON = 1; // 普通杜比音效
- ATMOS = 2; // 全景杜比音效
- }
- // 杜比类型
- Type type = 1;
- // 音频流
- repeated DashItem audio = 2;
-}
-
-// DRM类型
-enum DrmTechType {
- //
- UNKNOWN_DRM = 0;
- //
- FAIR_PLAY = 1;
- //
- WIDE_VINE = 2;
- // 哔哩哔哩自研DRM
- BILI_DRM = 3;
-}
-
-enum Effects {
- //
- EFFECTS_UNKNOWN = 0;
- //
- GAUSSIAN_BLUR = 1;
- //
- HALF_ALPHA = 2;
-}
-
-// 事件
-message Event {
- // 震动
- Shake shake = 1;
-}
-
-//
-message ExtData {
- //
- ExtDataType type = 1;
- //
- oneof data {
- PlayListInfo play_list_info = 2;
- }
-}
-
-enum ExtDataType {
- //
- EXT_DATA_TYPE_UNKNOWN = 0;
- //
- PLAY_LIST = 1;
-}
-
-// ? 错误码补充信息
-message ExtraContent {
- //
- string disable_reason = 1;
- //
- int64 disable_code = 2;
-}
-
-//
-message GradientColor {
- //
- string start_color = 1;
- //
- string end_color = 2;
-}
-
-//
-enum GuideStyle {
- //
- STYLE_UNKNOWN = 0;
- //
- HORIZONTAL_IMAGE = 1;
- //
- VERTICAL_TEXT = 2;
- //
- SIMPLE_TEXT = 3;
- //
- CHARGING_TEXT = 4;
-}
-
-// 播放历史
-message History {
- //
- HistoryInfo current_video = 1;
- //
- HistoryInfo related_video = 2;
-}
-
-//
-message HistoryInfo {
- //
- int64 progress = 1;
- //
- int64 last_play_cid = 2;
- //
- Toast toast = 3;
- //
- Toast toast_without_time = 4;
- //
- int64 last_play_aid = 5;
-}
-
-//
-message ImageInfo {
- //
- string url = 1;
-}
-
-//
-message Interaction {
- //
- Node history_node = 1;
- //
- int64 graph_version = 2;
- //
- string msg = 3;
- //
- int64 mark = 4;
-}
-
-enum LimitActionType {
- //
- LAT_UNKNOWN = 0;
- //
- SHOW_LIMIT_DIALOG = 1;
- //
- SKIP_CURRENT_EP = 2;
-}
-
-// HIRES伴音流信息
-message LossLessItem {
- // 是否为hires
- bool is_lossless_audio = 1;
- // 音频流信息
- DashItem audio = 2;
- // 是否需要大会员
- bool need_vip = 3;
-}
-
-//
-message Node {
- //
- int64 node_id = 1;
- //
- string title = 2;
- //
- int64 cid = 3;
-}
-
-//
-message PlayArc {
- //
- BizType video_type = 1;
- //
- uint64 aid = 2;
- //
- uint64 cid = 3;
- //
- DrmTechType drm_tech_type = 4;
- //
- ArcType arc_type = 5;
- //
- Interaction interaction = 6;
- //
- Dimension dimension = 7;
- //
- int64 duration = 8;
- //
- bool is_preview = 9;
-}
-
-// 播放页信息-响应: PlayArcConf
-message PlayArcConf {
- map arc_confs = 1;
-}
-
-//
-message PlayDeviceConf {
- //
- map device_confs = 1;
-}
-
-// 错误码
-enum PlayErr {
- NoErr = 0; //
- WithMultiDeviceLoginErr = 1; // 管控类型的错误码
-}
-
-//
-message PlayList {
- //
- int64 season_id = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- string link = 4;
- //
- BadgeInfo badge_info = 5;
-}
-
-//
-message PlayListInfo {
- //
- repeated PlayList play_list = 2;
-}
-
-// 视频下方广告 Banner
-message PromptBar {
- //
- TextInfo title = 1;
- //
- TextInfo subtitle = 2;
- //
- string sub_title_icon = 3;
- //
- string bg_image = 4;
- //
- GradientColor bg_gradient_color = 5;
- //
- repeated ButtonInfo button = 6;
- //
- Report report = 7;
- //
- string full_screen_ip_icon = 8;
- //
- GradientColor full_screen_bg_gradient_color = 9;
-}
-
-// 播放页信息-响应: 高画质试看信息
-message QnTrialInfo {
- // 能否试看高画质
- bool trial_able = 1;
- //
- int32 remaining_times = 2;
- //
- int32 start = 3;
- //
- int32 time_length = 4;
- //
- Toast start_toast = 5;
- //
- Toast end_toast = 6;
- //
- Button quality_open_tip_btn = 8;
-}
-
-//
-message Report {
- //
- string show_event_id = 1;
- //
- string click_event_id = 2;
- //
- string extends = 3;
-}
-
-// Dash Response, 未使用
-message ResponseDash {
- repeated DashItem video = 1;
- repeated DashItem audio = 2;
-}
-
-// 分段流条目
-message ResponseUrl {
- // 分段序号
- uint32 order = 1;
- // 分段时长
- uint64 length = 2;
- // 分段大小
- uint64 size = 3;
- // 主线流
- string url = 4;
- // 备用流
- repeated string backup_url = 5;
- // md5
- string md5 = 6;
-}
-
-// 方案
-message Scheme {
- enum ActionType {
- UNKNOWN = 0;
- SHOW_TOAST = 1;
- }
- //
- ActionType action_type = 1;
- //
- string toast = 2;
-}
-
-// 视频流信息: 分段流
-message SegmentVideo {
- repeated ResponseUrl segment = 1;
-}
-
-// 震动
-message Shake {
- //
- string file = 1;
-}
-
-enum ShowStyleType {
- //
- SHOW_STYLE_TYPE_UNKNOWN = 0;
- //
- SHOW_STYLE_TYPE_ORDINARY = 1;
- //
- SHOW_STYLE_TYPE_RESIDENT = 2;
-}
-
-// 视频流信息
-message Stream {
- // 元数据
- StreamInfo stream_info = 1;
- // 流数据
- oneof content {
- // dash流
- DashVideo dash_video = 2;
- // 分段流
- SegmentVideo segment_video = 3;
- }
-}
-
-// 视频流信息: 元数据
-message StreamInfo {
- // 清晰度
- uint32 quality = 1;
- // 格式
- string format = 2;
- // 格式描述
- string description = 3;
- // 错误码
- uint32 err_code = 4;
- // 不满足条件信息
- StreamLimit limit = 5;
- // 是否需要vip
- bool need_vip = 6;
- // 是否需要登录
- bool need_login = 7;
- // 是否完整
- bool intact = 8;
- // 是否非全二压
- bool no_rexcode = 9;
- // 清晰度属性位
- int64 attribute = 10;
- // 新版格式描述
- string new_description = 11;
- // 格式文字
- string display_desc = 12;
- // 新版格式描述备注
- string superscript = 13;
- //
- bool vip_free = 14;
- //
- string subtitle = 15;
- // 方案
- Scheme scheme = 16;
- // 支持drm
- bool support_drm = 17;
-}
-
-// 视频流信息: 流媒体元数据: 清晰度不满足条件信息
-message StreamLimit {
- // 标题
- string title = 1;
- // 跳转地址
- string uri = 2;
- // 提示信息
- string msg = 3;
-}
-
-//
-message TaskParam {
- //
- string task_type = 1;
- //
- int64 activity_id = 2;
- //
- int64 tips_id = 3;
-}
-
-//
-message TextInfo {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
-}
-
-// Toast信息
-message Toast {
- // toast文案
- string text = 1;
- // toast按钮
- Button button = 2;
-}
-
-enum ToastType {
- //
- TOAST_TYPE_UNKNOWN = 0;
- //
- VIP_CONTENT_REMIND = 1;
- //
- VIP_DEFINITION_REMIND = 2;
- //
- VIP_DEFINITION_GUIDE = 3;
- //
- OGV_VIDEO_START_TOAST = 4;
- //
- CHARGING_TOAST = 5;
-}
-
-//
-enum UnsupportScene {
- //
- UNKNOWN_SCENE = 0;
- //
- PREMIERE = 1;
-}
-
-// 播放页信息-请求: 音视频VOD
-message VideoVod {
- // 视频aid
- int64 aid = 1;
- // 视频cid
- int64 cid = 2;
- // 清晰度
- uint64 qn = 3;
- // 视频流版本
- int32 fnver = 4;
- // 视频流格式
- int32 fnval = 5;
- // 下载模式
- // 0:播放 1:flv下载 2:dash下载
- uint32 download = 6;
- // 流url强制是用域名
- // 0:允许使用ip 1:使用http 2:使用https
- int32 force_host = 7;
- // 是否4K
- bool fourk = 8;
- // 视频编码
- CodeType prefer_codec_type = 9;
- // 响度均衡
- uint64 voice_balance = 10;
-}
-
-message ViewInfo {
- //
- map dialog_map = 1;
- //
- PromptBar prompt_bar = 2;
- //
- repeated ComprehensiveToast toasts = 3;
-}
-
-// 播放页信息-响应: VOD音视频信息
-message VodInfo {
- // 视频清晰度
- uint32 quality = 1;
- // 视频格式
- string format = 2;
- // 视频时长
- uint64 timelength = 3;
- // 视频编码id
- uint32 video_codecid = 4;
- // 视频流
- repeated Stream stream_list = 5;
- // 伴音流
- repeated DashItem dash_audio = 6;
- // 杜比伴音流
- DolbyItem dolby = 7;
- // 响度均衡操作信息
- VolumeInfo volume = 8;
- // HIRES伴音流信息
- LossLessItem loss_less_item = 9;
- // 是否支持投屏
- bool support_project = 10;
-}
-
-// 响度均衡操作信息
-message VolumeInfo {
- // Measured integrated loudness 实际综合响度
- double measured_i = 1;
- // Measured loudness range 实际响度范围
- double measured_lra = 2;
- // Measured true peak 实际响度真峰值
- double measured_tp = 3;
- // Measured threshold 实际响度阈值
- double measured_threshold = 4;
- // Target offset gain(Gain is applied before the true-peak limiter) 目标增益Offset(增益在真实峰值限制器之前应用)
- double target_offset = 5;
- // Target integrated loudness 目标综合响度
- double target_i = 6;
- // Target true peak 目标响度真峰值
- double target_tp = 7;
-}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/polymer/app/search/v1/search.proto b/bili-api-grpc/proto/bilibili/polymer/app/search/v1/search.proto
deleted file mode 100644
index ea8350641..000000000
--- a/bili-api-grpc/proto/bilibili/polymer/app/search/v1/search.proto
+++ /dev/null
@@ -1,2332 +0,0 @@
-syntax = "proto3";
-
-package bilibili.polymer.app.search.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/app/archive/middleware/v1/preload.proto";
-import "bilibili/pagination/pagination.proto";
-
-//
-service Search {
- // 搜索所有类型结果
- rpc SearchAll(SearchAllRequest) returns (SearchAllResponse);
- // 搜索指定类型结果
- rpc SearchByType(SearchByTypeRequest) returns (SearchByTypeResponse);
- //
- rpc SearchComic(SearchComicRequest) returns (SearchComicResponse);
-}
-
-//
-message Args {
- //
- int32 online = 1;
- //
- string rname = 2;
- //
- int64 room_id = 3;
- //
- string tname = 4;
- //
- int64 up_id = 5;
- //
- string up_name = 6;
- //
- int64 rid = 7;
- //
- int64 tid = 8;
- //
- int64 aid = 9;
-}
-
-//
-message Avatar {
- //
- string cover = 1;
- //
- string event = 2;
- //
- string event_v2 = 3;
- //
- string text = 4;
- //
- int64 up_id = 5;
- //
- string uri = 6;
- //
- int32 face_nft_new = 7;
- //
- NftFaceIcon nft_face_icon = 8;
-}
-
-//
-message AvItem {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string uri = 3;
- //
- string ctime_label = 4;
- //
- string duration = 5;
- //
- int32 play = 6;
- //
- int64 danmaku = 7;
- //
- int32 ctime = 8;
- //
- string goto = 9;
- //
- string param = 10;
- //
- int32 position = 11;
- //
- string ctime_label_v2 = 12;
-}
-
-//
-message Background {
- //
- int32 show = 1;
- //
- string bg_pic_url = 2;
- //
- string fg_pic_url = 3;
-}
-
-//
-message Badge {
- //
- string text = 1;
- //
- string bg_cover = 2;
-}
-
-//
-message Badge2 {
- //
- string bg_cover = 1;
- //
- string text = 2;
-}
-
-//
-message BottomButton {
- //
- string desc = 1;
- //
- string link = 2;
-}
-
-//
-message BrandADAccount {
- //
- string param = 1;
- //
- string goto = 2;
- //
- int64 mid = 3;
- //
- string name = 4;
- //
- string face = 5;
- //
- string sign = 6;
- //
- Relation relation = 7;
- //
- int64 roomid = 8;
- //
- int64 live_status = 9;
- //
- string live_link = 10;
- //
- OfficialVerify official_verify = 11;
- //
- VipInfo vip = 12;
- //
- string uri = 13;
- //
- int32 face_nft_new = 14;
-}
-
-//
-message BrandADArc {
- //
- string param = 1;
- //
- string goto = 2;
- //
- int64 aid = 3;
- //
- int64 play = 4;
- //
- int64 reply = 5;
- //
- string duration = 6;
- //
- string author = 7;
- //
- string title = 8;
- //
- string uri = 9;
- //
- string cover = 10;
-}
-
-//
-message Button {
- //
- string text = 1;
- //
- string param = 2;
- //
- string uri = 3;
- //
- string event = 4;
- //
- int32 selected = 5;
- //
- int32 type = 6;
- //
- string event_v2 = 7;
- //
- Relation relation = 8;
-}
-
-//
-message ButtonMeta {
- //
- string icon = 1;
- //
- string text = 2;
- //
- string button_status = 3;
- //
- string toast = 4;
-}
-
-//
-message CardBusinessBadge {
- //
- GotoIcon goto_icon = 1;
- //
- ReasonStyle badge_style = 2;
-}
-
-//
-enum CategorySort {
- CATEGORY_SORT_DEFAULT = 0; //
- CATEGORY_SORT_PUBLISH_TIME = 1; //
- CATEGORY_SORT_CLICK_COUNT = 2; //
- CATEGORY_SORT_COMMENT_COUNT = 3; //
- CATEGORY_SORT_LIKE_COUNT = 4; //
-}
-
-//
-message ChannelLabel {
- //
- string text = 1;
- //
- string uri = 2;
-}
-
-//
-message ChannelMixedItem {
- //
- int64 id = 1;
- //
- int32 cover_left_icon1 = 2;
- //
- string cover_left_text1 = 3;
- //
- string cover = 4;
- //
- string goto = 5;
- //
- string param = 6;
- //
- string uri = 7;
- //
- string title = 8;
- //
- Badge2 badge = 9;
-}
-
-//
-message CheckMore {
- //
- string content = 1;
- //
- string uri = 2;
-}
-
-//
-message CloudGameParams {
- //
- int64 source_from = 1;
- //
- string scene = 2;
-}
-
-//
-message DetailsRelationItem {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string cover_left_text = 3;
- //
- ReasonStyle cover_badge_style = 4;
- //
- string module_pos = 5;
- //
- string goto = 6;
- //
- string param = 7;
- //
- string uri = 8;
- //
- int32 position = 9;
- //
- string cover_left_text_v2 = 10;
- //
- ReasonStyle cover_badge_style_v2 = 11;
-}
-
-//
-message DislikeReason {
- //
- int32 id = 1;
- //
- string name = 2;
-}
-
-//
-message DisplayOption {
- //
- int32 video_title_row = 1;
- //
- int32 search_page_visual_opti = 2;
-}
-
-//
-message DyTopic {
- //
- string title = 1;
- //
- string uri = 2;
-}
-
-//
-message EasterEgg {
- //
- int32 id = 1;
- //
- int32 show_count = 2;
- //
- int32 type = 3;
- //
- string url = 4;
- //
- int32 close_count = 5;
- //
- int32 mask_transparency = 6;
- //
- string mask_color = 7;
- //
- int32 pic_type = 8;
- //
- int32 show_time = 9;
- //
- string source_url = 10;
- //
- string source_md5 = 11;
- //
- int32 source_size = 12;
-}
-
-//
-message Episode {
- //
- string uri = 1;
- //
- string param = 2;
- //
- string index = 3;
- //
- repeated ReasonStyle badges = 4;
- //
- int32 position = 5;
-}
-
-//
-message EpisodeNew {
- //
- string title = 1;
- //
- string uri = 2;
- //
- string param = 3;
- //
- int32 is_new = 4;
- //
- repeated ReasonStyle badges = 5;
- //
- int32 type = 6;
- //
- int32 position = 7;
- //
- string cover = 8;
- //
- string label = 9;
-}
-
-//
-message ExtraLink {
- //
- string text = 1;
- //
- string uri = 2;
-}
-
-//
-message FollowButton {
- //
- string icon = 1;
- //
- map texts = 2;
- //
- string status_report = 3;
-}
-
-//
-message FullTextResult {
- //
- int32 type = 1;
- //
- string show_text = 2;
- //
- int64 jump_start_progress = 3;
- //
- string jump_uri = 4;
-}
-
-//
-message GotoIcon {
- //
- string icon_url = 1;
- //
- string icon_night_url = 2;
- //
- int32 icon_width = 3;
- //
- int32 icon_height = 4;
-}
-
-//
-message InlineProgressBar {
- //
- string icon_drag = 1;
- //
- string icon_drag_hash = 2;
- //
- string icon_stop = 3;
- //
- string icon_stop_hash = 4;
-}
-
-//
-message InlineThreePointPanel {
- //
- int32 panel_type = 1;
- //
- string share_id = 2;
- //
- string share_origin = 3;
- //
- repeated ShareButtonItem functional_buttons = 4;
-}
-
-message Item {
- //
- string uri = 1;
- //
- string param = 2;
- //
- string goto = 3;
- //
- string linktype = 4;
- //
- int32 position = 5;
- //
- string trackid = 6;
- //
- oneof card_item {
- //
- SearchSpecialCard special = 7;
- //
- SearchArticleCard article = 8;
- //
- SearchBannerCard banner = 9;
- //
- SearchLiveCard live = 10;
- //
- SearchGameCard game = 11;
- //
- SearchPurchaseCard purchase = 12;
- //
- SearchRecommendWordCard recommend_word = 13;
- //
- SearchDynamicCard dynamic = 14;
- //
- SearchNoResultSuggestWordCard suggest_keyword = 15;
- //
- SearchSpecialGuideCard special_guide = 16;
- //
- SearchComicCard comic = 17;
- //
- SearchNewChannelCard channel_new = 18;
- //
- SearchOgvCard ogv_card = 19;
- //
- SearchOgvRelationCard bangumi_relates = 20;
- //
- SearchOgvRecommendCard find_more = 21;
- //
- SearchSportCard esport = 22;
- //
- SearchAuthorNewCard author_new = 23;
- //
- SearchTipsCard tips = 24;
- //
- SearchAdCard cm = 25;
- //
- SearchPediaCard pedia_card = 26;
- //
- SearchUgcInlineCard ugc_inline = 27;
- //
- SearchLiveInlineCard live_inline = 28;
- //
- SearchTopGameCard top_game = 29;
- //
- SearchOlympicGameCard sports = 30;
- //
- SearchOlympicWikiCard pedia_card_inline = 31;
- //
- SearchRecommendTipCard recommend_tips = 32;
- //
- SearchCollectionCard collection_card = 33;
- //
- SearchOgvChannelCard ogv_channel = 34;
- //
- SearchOgvInlineCard ogv_inline = 35;
- //
- SearchUpperCard author = 36;
- //
- SearchVideoCard av = 37;
- //
- SearchBangumiCard bangumi = 38;
- //
- SearchSportInlineCard esports_inline = 39;
- }
-}
-
-//
-message LikeResource {
- //
- string url = 1;
- //
- string content_hash = 2;
-}
-
-//
-message LiveBadgeResource {
- //
- string text = 1;
- //
- string animation_url = 2;
- //
- string animation_url_hash = 3;
- //
- string background_color_light = 4;
- //
- string background_color_night = 5;
- //
- int64 alpha_light = 6;
- //
- int64 alpha_night = 7;
- //
- string font_color = 8;
-}
-
-//
-message Mask {
- //
- Avatar avatar = 1;
- //
- Button button = 2;
-}
-
-//
-message MatchInfoObj {
- //
- int64 id = 1;
- //
- int32 status = 2;
- //
- string match_stage = 3;
- //
- MatchTeam team1 = 4;
- //
- MatchTeam team2 = 5;
- //
- MatchItem match_label = 6;
- //
- MatchItem match_time = 7;
- //
- MatchItem match_button = 8;
-}
-
-//
-message MatchItem {
- //
- int32 state = 1;
- //
- string text = 2;
- //
- string text_color = 3;
- //
- string text_color_night = 4;
- //
- string uri = 5;
- //
- string live_link = 6;
- //
- Texts texts = 7;
-}
-
-//
-message MatchTeam {
- //
- int64 id = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- int32 score = 4;
-}
-
-//
-message Nav {
- //
- string name = 1;
- //
- int32 total = 2;
- //
- int32 pages = 3;
- //
- int32 type = 4;
-}
-
-//
-message Navigation {
- //
- int64 id = 1;
- //
- repeated Navigation children = 2;
- //
- repeated Navigation inline_children = 3;
- //
- string title = 4;
- //
- string uri = 5;
- //
- NavigationButton button = 6;
-}
-
-//
-message NavigationButton {
- //
- int64 type = 1;
- //
- string text = 2;
- //
- string uri = 3;
-}
-
-//
-message NftFaceIcon {
- //
- int32 region_type = 1;
- //
- string icon = 2;
- //
- int32 show_status = 3;
-}
-
-//
-message Notice {
- //
- int64 mid = 1;
- //
- int64 notice_id = 2;
- //
- string content = 3;
- //
- string url = 4;
- //
- int64 notice_type = 5;
- //
- string icon = 6;
- //
- string icon_night = 7;
- //
- string text_color = 8;
- //
- string text_color_night = 9;
- //
- string bg_color = 10;
- //
- string bg_color_night = 11;
-}
-
-//
-message OfficialVerify {
- //
- int32 type = 1;
- //
- string desc = 2;
-}
-
-//
-message OgvCardUI {
- //
- string background_image = 1;
- //
- string gaussian_blur_value = 2;
- //
- string module_color = 3;
-}
-
-//
-message OgvClipInfo {
- //
- int64 play_start_time = 1;
- //
- int64 play_end_time = 2;
-}
-
-//
-message OgvRecommendWord {
- //
- string title = 1;
- //
- string goto = 2;
- //
- string param = 3;
- //
- string uri = 4;
-}
-
-//
-message PediaCover {
- //
- int64 cover_type = 1;
- //
- string cover_sun_url = 2;
- //
- string cover_night_url = 3;
- //
- int32 cover_width = 4;
- //
- int32 cover_height = 5;
-}
-
-//
-message PlayerArgs {
- //
- int32 is_live = 1;
- //
- int64 aid = 2;
- //
- int64 cid = 3;
- //
- int32 sub_type = 4;
- //
- int64 room_id = 5;
- //
- int64 ep_id = 7;
- //
- int32 is_preview = 8;
- //
- string type = 9;
- //
- int32 duration = 10;
- //
- int64 season_id = 11;
- //
- int32 report_required_play_duration = 12;
- //
- int32 report_required_time = 13;
- //
- int32 manual_play = 14;
- //
- bool hide_play_button = 15;
- //
- int32 content_mode = 16;
- //
- int32 report_history = 17;
-}
-
-//
-message PlayerWidget {
- //
- string title = 1;
- //
- string desc = 2;
-}
-
-//
-message RankInfo {
- //
- string search_night_icon_url = 1;
- //
- string search_day_icon_url = 2;
- //
- string search_bkg_night_color = 3;
- //
- string search_bkg_day_color = 4;
- //
- string search_font_night_color = 5;
- //
- string search_font_day_color = 6;
- //
- string rank_content = 7;
- //
- string rank_link = 8;
-}
-
-//
-message RcmdReason {
- //
- string content = 1;
-}
-
-//
-message ReasonStyle {
- //
- string text = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string bg_color = 4;
- //
- string bg_color_night = 5;
- //
- string border_color = 6;
- //
- string border_color_night = 7;
- //
- int32 bg_style = 8;
-}
-
-//
-message RecommendWord {
- //
- string param = 1;
- //
- string type = 2;
- //
- string title = 3;
- //
- string from_source = 4;
-}
-
-//
-message Relation {
- //
- int32 status = 1;
-}
-
-//
-message RightTopLiveBadge {
- //
- int32 live_status = 1;
- //
- LiveBadgeResource in_live = 2;
- //
- string live_stats_desc = 3;
-}
-
-//
-message SearchAdCard {
- //
- string json_str = 1;
-}
-
-//
-message SearchAllRequest {
- //
- string keyword = 1;
- //
- int32 order = 2;
- //
- string tid_list = 3;
- //
- string duration_list = 4;
- //
- string extra_word = 5;
- //
- string from_source = 6;
- //
- int32 is_org_query = 7;
- //
- int32 local_time = 8;
- //
- string ad_extra = 9;
- //
- bilibili.pagination.Pagination pagination = 10;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 11;
-}
-
-//
-message SearchAllResponse {
- //
- string keyword = 1;
- //
- string trackid = 2;
- //
- repeated Nav nav = 3;
- //
- repeated Item item = 4;
- //
- EasterEgg easter_egg = 5;
- //
- string exp_str = 6;
- //
- repeated string extra_word_list = 7;
- //
- string org_extra_word = 8;
- //
- int64 select_bar_type = 9;
- //
- int64 new_search_exp_num = 10;
- //
- bilibili.pagination.PaginationReply pagination = 11;
- //
- DisplayOption app_display_option = 12;
- //
- map annotation = 13;
-}
-
-//
-message SearchArticleCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int32 play = 3;
- //
- int32 like = 4;
- //
- int32 reply = 5;
- //
- repeated string image_urls = 6;
- //
- string author = 7;
- //
- int32 template_id = 8;
- //
- int64 id = 9;
- //
- int64 mid = 10;
- //
- string name = 11;
- //
- string desc = 12;
- //
- int32 view = 13;
-}
-
-//
-message SearchAuthorNewCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int32 live_face = 3;
- //
- string live_uri = 4;
- //
- string live_link = 5;
- //
- int32 fans = 6;
- //
- int32 level = 7;
- //
- string sign = 8;
- //
- bool is_up = 9;
- //
- int32 archives = 10;
- //
- int64 mid = 11;
- //
- int64 roomid = 12;
- //
- Relation relation = 13;
- //
- OfficialVerify official_verify = 14;
- //
- int32 face_nft_new = 15;
- //
- NftFaceIcon nft_face_icon = 16;
- //
- int32 is_senior_member = 17;
- //
- Background background = 18;
- //
- int32 av_style = 19;
- //
- Space space = 20;
- //
- repeated AvItem av_items = 21;
- //
- Notice notice = 22;
- //
- SharePlane share_plane = 23;
- //
- string inline_type = 24;
- //
- SearchInlineData inline_live = 25;
- //
- int32 is_inline_live = 26;
- //
- repeated ThreePoint three_point = 27;
- //
- int32 live_status = 28;
- //
- VipInfo vip = 29;
-}
-
-//
-message SearchBangumiCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int32 media_type = 3;
- //
- int32 play_state = 4;
- //
- string area = 5;
- //
- string style = 6;
- //
- string styles = 7;
- //
- string cv = 8;
- //
- double rating = 9;
- //
- int32 vote = 10;
- //
- string target = 11;
- //
- string staff = 12;
- //
- string prompt = 13;
- //
- int64 ptime = 14;
- //
- string season_type_name = 15;
- //
- repeated Episode episodes = 16;
- //
- int32 is_selection = 17;
- //
- int32 is_atten = 18;
- //
- string label = 19;
- //
- int64 season_id = 20;
- //
- string out_name = 21;
- //
- string out_icon = 22;
- //
- string out_url = 23;
- //
- repeated ReasonStyle badges = 24;
- //
- int32 is_out = 25;
- //
- repeated EpisodeNew episodes_new = 26;
- //
- WatchButton watch_button = 27;
- //
- string selection_style = 28;
- //
- CheckMore check_more = 29;
- //
- FollowButton follow_button = 30;
- //
- ReasonStyle style_label = 31;
- //
- repeated ReasonStyle badges_v2 = 32;
- //
- string styles_v2 = 33;
-}
-
-//
-message SearchBannerCard {
- //
- string title = 1;
- //
- string cover = 2;
-}
-
-//
-message SearchByTypeRequest {
- enum CategorySort {
- CATEGORY_SORT_DEFAULT = 0;
- CATEGORY_SORT_PUBLISH_TIME = 1;
- CATEGORY_SORT_CLICK_COUNT = 2;
- CATEGORY_SORT_COMMENT_COUNT = 3;
- CATEGORY_SORT_LIKE_COUNT = 4;
- }
- enum UserType {
- ALL = 0;
- UP = 1;
- NORMAL_USER = 2;
- AUTHENTICATED_USER = 3;
- }
- enum UserSort {
- USER_SORT_DEFAULT = 0;
- USER_SORT_FANS_DESCEND = 1;
- USER_SORT_FANS_ASCEND = 2;
- USER_SORT_LEVEL_DESCEND = 3;
- USER_SORT_LEVEL_ASCEND = 4;
- }
- // 搜索目标类型, 番剧为7
- int32 type = 1;
- // 关键词
- string keyword = 2;
- //
- CategorySort category_sort = 3;
- //
- int64 category_id = 4;
- //
- UserType user_type = 5;
- //
- UserSort user_sort = 6;
- //
- bilibili.pagination.Pagination pagination = 7;
- //
- bilibili.app.archive.middleware.v1.PlayerArgs player_args = 8;
-}
-
-//
-message SearchByTypeResponse {
- // 追踪id
- string trackid = 1;
- // 当前页码
- int32 pages = 2;
- //
- string exp_str = 3;
- // 搜索关键词
- string keyword = 4;
- // 是否为推荐结果
- int32 result_is_recommend = 5;
- // 搜索结果条目
- repeated Item items = 6;
- // 分页信息
- bilibili.pagination.PaginationReply pagination = 7;
- //
- map annotation = 8;
-}
-
-//
-message SearchCollectionCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string author = 3;
- //
- repeated AvItem av_items = 4;
- //
- BottomButton bottom_button = 5;
- //
- string collection_icon = 6;
- //
- string show_card_desc1 = 7;
- //
- string show_card_desc2 = 8;
-}
-
-//
-message SearchComicCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string name = 3;
- //
- string style = 4;
- //
- string comic_url = 5;
- //
- string badge = 6;
-}
-
-//
-message SearchComicInfo {
- //
- string uri = 1;
- //
- string param = 2;
- //
- SearchComicCard comic = 3;
-}
-
-//
-message SearchComicRequest {
- //
- string id_list = 1;
-}
-
-//
-message SearchComicResponse {
- //
- repeated SearchComicInfo items = 1;
-}
-
-//
-message SearchDynamicCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int32 cover_count = 3;
- //
- repeated string covers = 4;
- //
- Upper upper = 5;
- //
- Stat stat = 6;
- //
- repeated DyTopic dy_topic = 7;
-}
-
-//
-message SearchGameCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string reserve = 3;
- //
- float rating = 4;
- //
- string tags = 5;
- //
- string notice_name = 6;
- //
- string notice_content = 7;
- //
- string gift_content = 8;
- //
- string gift_url = 9;
- //
- int32 reserve_status = 10;
- //
- RankInfo rank_info = 11;
- //
- string special_bg_color = 12;
- //
- CloudGameParams cloud_game_params = 13;
- //
- bool show_cloud_game_entry = 14;
-}
-
-//
-message SearchInlineData {
- //
- string uri = 1;
- //
- string title = 2;
- //
- PlayerArgs player_args = 3;
- //
- int32 can_play = 4;
- //
- Args args = 5;
- //
- string card_goto = 6;
- //
- string card_type = 7;
- //
- string cover = 8;
- //
- int32 cover_left_icon1 = 9;
- //
- int32 cover_left_icon2 = 10;
- //
- string cover_left_text1 = 11;
- //
- string cover_left_text2 = 12;
- //
- UpArgs up_args = 13;
- //
- string extra_uri = 14;
- //
- bool is_fav = 15;
- //
- bool is_coin = 16;
- //
- string goto = 17;
- //
- Share share = 18;
- //
- ThreePoint2 three_point = 19;
- //
- repeated ThreePointV2 three_point_v2 = 20;
- //
- SharePlane share_plane = 21;
- //
- InlineThreePointPanel three_point_meta = 22;
- //
- Avatar avatar = 23;
- //
- string cover_right_text = 24;
- //
- string desc = 25;
- //
- InlineProgressBar inline_progress_bar = 26;
- //
- SearchLikeButtonItem like_button = 27;
- //
- int32 official_icon = 28;
- //
- int32 official_icon_v2 = 29;
- //
- string param = 30;
- //
- TrafficConfig traffic_config = 31;
- //
- bool is_atten = 32;
- //
- GotoIcon goto_icon = 33;
- //
- bool disable_danmaku = 34;
- //
- bool hide_danmaku_switch = 35;
- //
- ReasonStyle badge_style = 36;
- //
- PlayerWidget player_widget = 37;
- //
- ReasonStyle cover_badge_style = 38;
- //
- RightTopLiveBadge right_top_live_badge = 39;
-}
-
-//
-message SearchLikeButtonItem {
- //
- int64 aid = 1;
- //
- int64 count = 2;
- //
- int32 selected = 3;
- //
- bool show_count = 4;
- //
- LikeResource like_resource = 5;
- //
- LikeResource like_night_resource = 6;
- //
- LikeResource dislike_resource = 7;
- //
- LikeResource dislike_night_resource = 8;
-}
-
-//
-message SearchLiveCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- RcmdReason rcmd_reason = 3;
- //
- string name = 4;
- //
- int32 online = 5;
- //
- string badge = 6;
- //
- string live_link = 7;
- //
- string card_left_text = 8;
- //
- int32 card_left_icon = 9;
- //
- string show_card_desc2 = 10;
- //
- RightTopLiveBadge right_top_live_badge = 11;
-}
-
-//
-message SearchLiveInlineCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int64 mid = 3;
- //
- ReasonStyle rcmd_reason_style = 4;
- //
- int64 roomid = 5;
- //
- string live_link = 6;
- //
- SearchInlineData live_room_inline = 7;
- //
- string inline_type = 8;
-}
-
-//
-message SearchNewChannelCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int64 id = 3;
- //
- string type_icon = 4;
- //
- ChannelLabel channel_label1 = 5;
- //
- ChannelLabel channel_label2 = 6;
- //
- ChannelLabel channel_button = 7;
- //
- string design_type = 8;
- //
- repeated ChannelMixedItem items = 9;
-}
-
-//
-message SearchNoResultSuggestWordCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int32 sug_key_word_type = 3;
-}
-
-//
-message SearchOgvCard {
- //
- string title = 1;
- //
- string sub_title1 = 2;
- //
- string sub_title2 = 3;
- //
- string cover = 4;
- //
- string bg_cover = 5;
- //
- string special_bg_color = 6;
- //
- string cover_uri = 7;
-}
-
-//
-message SearchOgvChannelCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int64 media_id = 3;
- //
- string styles = 4;
- //
- string area = 5;
- //
- string staff = 6;
- //
- string badge = 7;
- //
- WatchButton watch_button = 8;
- //
- double rating = 9;
- //
- string desc = 10;
- //
- repeated ReasonStyle badges_v2 = 11;
- //
- string styles_v2 = 12;
-}
-
-//
-message SearchOgvInlineCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string author = 3;
- //
- int32 danmaku = 4;
- //
- string desc = 5;
- //
- string face = 6;
- //
- string inline_type = 7;
- //
- int64 mid = 8;
- //
- int64 play = 9;
- //
- SearchInlineData ogv_inline = 10;
- //
- OgvClipInfo ogv_clip_info = 11;
- //
- WatchButton watch_button = 12;
- //
- string score = 13;
- //
- int32 ogv_inline_exp = 14;
- //
- repeated ReasonStyle badges_v2 = 15;
-}
-
-//
-message SearchOgvRecommendCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- repeated OgvRecommendWord items = 3;
- //
- string special_bg_color = 4;
-}
-
-//
-message SearchOgvRelationCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string special_bg_color = 3;
- //
- string more_text = 4;
- //
- string more_url = 5;
- //
- repeated DetailsRelationItem items = 6;
- //
- int32 is_new_style = 7;
- //
- OgvCardUI ogv_card_ui = 8;
-}
-
-//
-message SearchOlympicGameCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- SportsMatchItem sports_match_item = 3;
- //
- MatchItem match_top = 4;
- //
- string bg_cover = 5;
- //
- repeated ExtraLink extra_link = 6;
- //
- string inline_type = 7;
- //
- SearchInlineData ugc_inline = 8;
- //
- SearchInlineData live_room_inline = 9;
- //
- MatchItem match_bottom = 10;
-}
-
-//
-message SearchOlympicWikiCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- CardBusinessBadge card_business_badge = 3;
- //
- NavigationButton read_more = 4;
- //
- string inline_type = 5;
- //
- SearchInlineData ugc_inline = 6;
- //
- SearchInlineData live_room_inline = 7;
- //
- PediaCover pedia_cover = 8;
- //
- repeated Navigation navigation = 9;
-}
-
-//
-message SearchPediaCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- repeated Navigation navigation = 3;
- //
- NavigationButton read_more = 4;
- //
- int32 navigation_module_count = 5;
- //
- PediaCover pedia_cover = 6;
- //
- CardBusinessBadge card_business_badge = 7;
-}
-
-//
-message SearchPurchaseCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string badge = 3;
- //
- string venue = 4;
- //
- int32 price = 5;
- //
- string price_complete = 6;
- //
- int32 price_type = 7;
- //
- int32 required_number = 8;
- //
- string city = 9;
- //
- string show_time = 10;
- //
- int64 id = 11;
- //
- string shop_name = 12;
-}
-
-//
-message SearchRecommendTipCard {
- //
- string title = 1;
- //
- string cover = 2;
-}
-
-//
-message SearchRecommendWordCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- repeated RecommendWord list = 3;
-}
-
-//
-message SearchSpecialCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- repeated ReasonStyle new_rec_tags = 3;
- //
- CardBusinessBadge card_business_badge = 4;
- //
- string badge = 5;
- //
- string desc = 6;
- //
- repeated ReasonStyle new_rec_tags_v2 = 7;
-}
-
-//
-message SearchSpecialGuideCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string phone = 3;
- //
- string desc = 4;
-}
-
-//
-message SearchSportCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string bg_cover = 3;
- //
- MatchItem match_top = 4;
- //
- MatchItem match_bottom = 5;
- //
- repeated ExtraLink extra_link = 6;
- //
- repeated MatchInfoObj items = 7;
- //
- int64 id = 8;
-}
-
-//
-message SearchSportInlineCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string bg_cover = 3;
- //
- MatchItem match_top = 4;
- //
- MatchItem match_bottom = 5;
- //
- repeated ExtraLink extra_link = 6;
- //
- repeated MatchInfoObj items = 7;
- //
- int64 id = 8;
- //
- SearchInlineData esports_inline = 9;
- //
- string inline_type = 10;
-}
-
-//
-message SearchTipsCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string sub_title = 4;
- //
- string cover_night = 134;
-}
-
-//
-message SearchTopGameCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- int32 array = 3;
- //
- string background_image = 4;
- //
- int32 button_type = 5;
- //
- string game_icon = 6;
- //
- int64 game_base_id = 7;
- //
- int32 game_status = 8;
- //
- string inline_type = 9;
- //
- TopGameUI top_game_ui = 10;
- //
- string notice_content = 11;
- //
- string notice_name = 12;
- //
- float rating = 13;
- //
- string score = 14;
- //
- repeated TabInfo tab_info = 15;
- //
- string tags = 16;
- //
- SearchInlineData ugc_inline = 17;
- //
- string video_cover_image = 18;
- //
- SearchInlineData inline_live = 19;
-}
-
-//
-message SearchUgcInlineCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string author = 3;
- //
- int32 danmaku = 4;
- //
- string desc = 5;
- //
- string inline_type = 6;
- //
- int64 mid = 7;
- //
- int64 play = 8;
- //
- SearchInlineData ugc_inline = 9;
- //
- FullTextResult full_text = 10;
-}
-
-//
-message SearchUpperCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- string sign = 3;
- //
- int32 fans = 4;
- //
- int32 archives = 5;
- //
- int32 live_status = 6;
- //
- int32 roomid = 7;
- //
- OfficialVerify official_verify = 8;
- //
- int32 face_nft_new = 9;
- //
- NftFaceIcon nft_face_icon = 10;
- //
- repeated AvItem av_items = 11;
- //
- bool is_up = 12;
- //
- int32 attentions = 13;
- //
- int32 level = 14;
- //
- int32 is_senior_member = 15;
- //
- VipInfo vip = 16;
- //
- Relation relation = 17;
- //
- string live_link = 18;
- //
- Notice notice = 19;
-}
-
-//
-message SearchVideoCard {
- //
- string title = 1;
- //
- string cover = 2;
- //
- RcmdReason rcmd_reason = 3;
- //
- repeated ReasonStyle new_rec_tags = 4;
- //
- repeated ThreePoint three_point = 5;
- //
- Share share = 6;
- //
- CardBusinessBadge card_business_badge = 7;
- //
- int32 play = 8;
- //
- int32 danmaku = 9;
- //
- string author = 10;
- //
- string desc = 11;
- //
- string duration = 12;
- //
- repeated ReasonStyle badges = 13;
- //
- int64 mid = 14;
- //
- string show_card_desc1 = 15;
- //
- string show_card_desc2 = 16;
- //
- FullTextResult full_text = 17;
- //
- repeated ReasonStyle new_rec_tags_v2 = 18;
- //
- repeated ReasonStyle badges_v2 = 19;
-}
-
-//
-message Share {
- //
- string type = 1;
- //
- Video video = 2;
-}
-
-//
-message ShareButtonItem {
- //
- int32 type = 1;
- //
- repeated ButtonMeta button_metas = 2;
-}
-
-//
-message SharePlane {
- //
- string title = 1;
- //
- string share_subtitle = 2;
- //
- string desc = 3;
- //
- string cover = 4;
- //
- int64 aid = 5;
- //
- string bvid = 6;
- //
- ShareTo share_to = 7;
- //
- string author = 8;
- //
- int64 author_id = 9;
- //
- string short_link = 10;
- //
- string play_number = 11;
- //
- int64 room_id = 12;
- //
- int32 ep_id = 13;
- //
- string area_name = 14;
- //
- string author_face = 15;
- //
- int32 season_id = 16;
- //
- string share_from = 17;
- //
- string season_title = 18;
- //
- string from = 19;
-}
-
-//
-message ShareTo {
- //
- bool dynamic = 1;
- //
- bool im = 2;
- //
- bool copy = 3;
- //
- bool more = 4;
- //
- bool wechat = 5;
- //
- bool weibo = 6;
- //
- bool wechat_monment = 7;
- //
- bool qq = 8;
- //
- bool qzone = 9;
- //
- bool facebook = 10;
- //
- bool line = 11;
- //
- bool messenger = 12;
- //
- bool whats_app = 13;
- //
- bool twitter = 14;
-}
-
-//
-enum Sort {
- SORT_DEFAULT = 0; //
- SORT_VIEW_COUNT = 1; //
- SORT_PUBLISH_TIME = 2; //
- SORT_DANMAKU_COUNT = 3; //
-}
-
-//
-message Space {
- //
- int32 show = 1;
- //
- string text_color = 2;
- //
- string text_color_night = 3;
- //
- string text = 4;
- //
- string space_url = 5;
-}
-
-//
-message SportsMatchItem {
- //
- int64 match_id = 1;
- //
- int64 season_id = 2;
- //
- string match_name = 3;
- //
- string img = 4;
- //
- string begin_time_desc = 5;
- //
- string match_status_desc = 6;
- //
- string sub_content = 7;
- //
- string sub_extra_icon = 8;
-}
-
-//
-message Stat {
- //
- int32 play = 1;
- //
- int32 like = 2;
- //
- int32 reply = 3;
-}
-
-//
-message TabInfo {
- //
- string tab_name = 1;
- //
- string tab_url = 2;
- //
- int32 sort = 3;
-}
-
-//
-message TextButton {
- //
- string text = 1;
- //
- string uri = 2;
-}
-
-//
-message TextLabel {
- //
- string text = 1;
- //
- string uri = 2;
-}
-
-//
-message Texts {
- //
- string booking_text = 1;
- //
- string unbooking_text = 2;
-}
-
-//
-message ThreePoint {
- //
- string type = 1;
- //
- string icon = 2;
- //
- string title = 3;
-}
-
-//
-message ThreePoint2 {
- //
- repeated DislikeReason dislike_reasons = 1;
- //
- repeated DislikeReason feedbacks = 2;
- //
- int32 watch_later = 3;
-}
-
-//
-message ThreePointV2 {
- //
- string title = 1;
- //
- string subtitle = 2;
- //
- repeated DislikeReason reasons = 3;
- //
- string type = 4;
- //
- int64 id = 5;
-}
-
-//
-message ThreePointV3 {
- //
- string title = 1;
- //
- string selected_title = 2;
- //
- string subtitle = 3;
- //
- repeated DislikeReason reasons = 4;
- //
- string type = 5;
- //
- int64 id = 6;
- //
- int32 selected = 7;
- //
- string icon = 8;
- //
- string selected_icon = 9;
- //
- string url = 10;
- //
- int32 default_id = 11;
-}
-
-//
-message ThreePointV4 {
- //
- SharePlane share_plane = 1;
- //
- WatchLater watch_later = 2;
-}
-
-//
-message TopGameUI {
- //
- string background_image = 1;
- //
- string cover_default_color = 2;
- //
- string gaussian_blur_value = 3;
- //
- string mask_color_value = 4;
- //
- string mask_opacity = 5;
- //
- string module_color = 6;
-}
-
-//
-message TrafficConfig {
- //
- string title = 1;
- //
- repeated TrafficConfigOption options = 2;
- //
- int64 default_option_id = 3;
-}
-
-//
-message TrafficConfigOption {
- //
- int32 id = 1;
- //
- string text = 2;
-}
-
-//
-message UpArgs {
- //
- int64 up_id = 1;
- //
- string up_name = 2;
- //
- string up_face = 3;
- //
- int32 selected = 4;
-}
-
-//
-message Upper {
- //
- int64 mid = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- string ptime_text = 4;
-}
-
-//
-enum UserSort {
- USER_SORT_DEFAULT = 0; //
- USER_SORT_FANS_DESCEND = 1; //
- USER_SORT_FANS_ASCEND = 2; //
- USER_SORT_LEVEL_DESCEND = 3; //
- USER_SORT_LEVEL_ASCEND = 4; //
-}
-
-//
-enum UserType {
- ALL = 0; //
- UP = 1; //
- NORMAL_USER = 2; //
- AUTHENTICATED_USER = 3; //
-}
-
-//
-message Video {
- //
- string bvid = 1;
- //
- int64 cid = 2;
- //
- string share_subtitle = 3;
- //
- bool is_hot_label = 4;
- //
- int32 page = 5;
- //
- int32 page_count = 6;
- //
- string short_link = 7;
-}
-
-//
-message VipInfo {
- //
- int32 type = 1;
- //
- int32 status = 2;
- //
- int64 due_date = 3;
- //
- int32 vip_pay_type = 4;
- //
- int32 theme_type = 5;
- //
- VipLabel label = 6;
- //
- int32 avatar_subscript = 7;
- //
- string nickname_color = 8;
- //
- int64 role = 9;
- //
- string avatar_subscript_url = 10;
- //
- int32 tv_vip_status = 11;
- //
- int32 tv_vip_pay_type = 12;
-}
-
-//
-message VipLabel {
- //
- string path = 1;
- //
- string text = 2;
- //
- string label_theme = 3;
- //
- string text_color = 4;
- //
- int32 bg_style = 5;
- //
- string bg_color = 6;
- //
- string border_color = 7;
- //
- bool use_img_label = 8;
- //
- string img_label_uri_hans = 9;
- //
- string img_label_uri_hant = 10;
- //
- string img_label_uri_hans_static = 11;
- //
- string img_label_uri_hant_static = 12;
-}
-
-//
-message WatchButton {
- //
- string title = 1;
- //
- string link = 2;
-}
-
-//
-message WatchedShow {
- //
- bool switch = 1;
- //
- int64 num = 2;
- //
- string text_small = 3;
- //
- string text_large = 4;
- //
- string icon = 5;
- //
- string icon_location = 6;
- //
- string icon_web = 7;
-}
-
-//
-message WatchLater {
- //
- int64 aid = 1;
- //
- string bvid = 2;
-}
diff --git a/bili-api-grpc/proto/bilibili/polymer/community/govern/v1/govern.proto b/bili-api-grpc/proto/bilibili/polymer/community/govern/v1/govern.proto
deleted file mode 100644
index 25744bd8b..000000000
--- a/bili-api-grpc/proto/bilibili/polymer/community/govern/v1/govern.proto
+++ /dev/null
@@ -1,98 +0,0 @@
-syntax = "proto3";
-
-package bilibili.polymer.app.govern.v1;
-
-option java_multiple_files = true;
-
-// 反骚扰
-service AntiHarassmentService {
- //
- rpc StoreAntiHarassmentSettings(StoreAntiHarassmentSettingsReq) returns (StoreAntiHarassmentSettingsRsp);
- //
- rpc LoadAntiHarassmentSettings(LoadAntiHarassmentSettingsReq) returns (LoadAntiHarassmentSettingsRsp);
-}
-
-//
-message AntiHarassmentInfo {
- //
- int32 limit = 1;
- //
- int32 follow_time_limit_second = 2;
- //
- int64 expire_time = 3;
-}
-
-//
-enum AntiHarassmentLimit {
- DefaultLimit = 0; //
- FollowLimit = 1; //
- ReFollowLimit = 2; //
- TwoWayFollow = 3; //
- AllLimit = 4; //
-}
-
-//
-message AntiHarassmentSetting {
- //
- int64 mid = 1;
- //
- bool auto_limit = 2;
- //
- AntiHarassmentInfo im = 3;
- //
- AntiHarassmentInfo reply = 4;
- //
- AntiHarassmentInfo dm = 5;
- //
- AntiHarassmentInfo reply_me = 6;
- //
- AntiHarassmentInfo like_me = 7;
- //
- AntiHarassmentInfo at_me = 8;
- //
- int64 auto_limit_expire_time = 9;
-}
-
-//
-enum BizType {
- InvalidBizType = 0; //
- Im = 1; //
- Dm = 2; //
- Reply = 3; //
- ReplyMe = 4; //
- LikeMe = 5; //
- AtMe = 6; //
-}
-
-//
-message LoadAntiHarassmentSettingsReq {
- //
- int32 biz_type = 1;
- //
- int64 recv_mid = 2;
- //
- int64 send_mid = 3;
-}
-
-//
-message LoadAntiHarassmentSettingsRsp {
- //
- bool anti_harassment_ret = 1;
- //
- AntiHarassmentSetting anti_harassment_setting = 2;
- //
- int32 show_window = 3;
-}
-
-//
-message StoreAntiHarassmentSettingsReq {
- //
- int32 biz_type = 1;
- //
- int64 mid = 2;
- //
- AntiHarassmentSetting anti_harassment_setting = 3;
-}
-
-//
-message StoreAntiHarassmentSettingsRsp {}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/polymer/contract/v1/contract.proto b/bili-api-grpc/proto/bilibili/polymer/contract/v1/contract.proto
deleted file mode 100644
index 49bfa95a8..000000000
--- a/bili-api-grpc/proto/bilibili/polymer/contract/v1/contract.proto
+++ /dev/null
@@ -1,93 +0,0 @@
-syntax = "proto3";
-
-package bilibili.polymer.contract.v1;
-
-option java_multiple_files = true;
-
-import "google/protobuf/empty.proto";
-
-// 契约
-service Contract {
- //
- rpc AddContract(AddContractReq) returns (google.protobuf.Empty);
- //
- rpc AddContractV2(AddContractReq) returns (AddContractReply);
- //
- rpc ContractConfig(ContractConfigReq) returns (ContractConfigReply);
-}
-
-//
-message AddContractReply {
- //
- bool allow_message = 1;
- //
- bool allow_reply = 2;
- //
- string input_text = 3;
- //
- string input_title = 4;
-}
-
-//
-message AddContractReq {
- //
- CommonReq common = 1;
- //
- int64 mid = 2;
- //
- int64 up_mid = 3;
- //
- int64 aid = 4;
- //
- int32 source = 5;
-}
-
-//
-message CommonReq {
- //
- string platform = 1;
- //
- int32 build = 2;
- //
- string buvid = 3;
- //
- string mobi_app = 4;
- //
- string device = 5;
- //
- string ip = 6;
- //
- string spmid = 7;
-}
-
-//
-message ContractCard {
- //
- string title = 1;
- //
- string sub_title = 2;
-}
-
-//
-message ContractConfigReply {
- //
- int32 is_follow_display = 1;
- //
- int32 is_triple_display = 2;
- //
- ContractCard contract_card = 3;
-}
-
-//
-message ContractConfigReq {
- //
- CommonReq common = 1;
- //
- int64 mid = 2;
- //
- int64 up_mid = 3;
- //
- int64 aid = 4;
- //
- int32 source = 5;
-}
diff --git a/bili-api-grpc/proto/bilibili/relation/interfaces/api.proto b/bili-api-grpc/proto/bilibili/relation/interfaces/api.proto
deleted file mode 100644
index b0b467f88..000000000
--- a/bili-api-grpc/proto/bilibili/relation/interfaces/api.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-syntax = "proto3";
-
-package bilibili.relation.interface.v1;
-
-option java_multiple_files = true;
-option java_package = "bilibili.relation.interface1.v1";
-
-service RelationInterface {
- // 评论区 At 用户列表 (无需登录鉴权)
- rpc AtSearch (AtSearchReq) returns (AtSearchReply);
-}
-
-message AtSearchReq {
- // 可以为 1 , 但是不能为 0 或空 不知道有啥用
- int64 mid = 1;
- // 用户名搜索关键词
- string keyword = 2;
-}
-
-message AtSearchReply {
- // 搜索结果分组
- repeated AtGroup items = 1;
-}
-
-message AtGroup {
- // 分组类型 2: 我的关注 4:其他 ,其他自测
- int32 group_type = 1;
- // 分组名称
- string group_name = 2;
- // 用户列表
- repeated AtItem items = 3;
-}
-
-message AtItem {
- int64 mid = 1;
- string name = 2;
- string face = 3;
- int32 fans = 4;
- int32 official_verify_type = 5;
-}
diff --git a/bili-api-grpc/proto/bilibili/tv/interfaces/dm/v1/dm.proto b/bili-api-grpc/proto/bilibili/tv/interfaces/dm/v1/dm.proto
deleted file mode 100644
index 282ecc498..000000000
--- a/bili-api-grpc/proto/bilibili/tv/interfaces/dm/v1/dm.proto
+++ /dev/null
@@ -1,374 +0,0 @@
-syntax = "proto3";
-
-package bilibili.tv.interfaces.dm.v1;
-
-option java_multiple_files = true;
-option java_package = "bilibili.tv.interfaces.dm.v1";
-
-//
-message Chronos {
- //
- string md5 = 1;
- //
- string file = 2;
- //
- string sign = 3;
-}
-
-// 互动弹幕条目信息
-message CommandDm {
- // 弹幕id
- int64 id = 1;
- // 对象视频cid
- int64 oid = 2;
- // 发送者mid
- string mid = 3;
- // 互动弹幕指令
- string command = 4;
- // 互动弹幕正文
- string content = 5;
- // 出现时间
- int32 progress = 6;
- // 创建时间
- string ctime = 7;
- // 发布时间
- string mtime = 8;
- // 扩展json数据
- string extra = 9;
- // 弹幕id str类型
- string idStr = 10;
- //
- int64 display = 11;
-}
-
-// ott互动弹幕条目信息
-message CommandDmOtt {
- // 弹幕id
- int64 id = 1;
- // 对象视频cid
- int64 oid = 2;
- // 发送者mid
- int64 mid = 3;
- //
- int32 type = 4;
- // 互动弹幕指令
- string command = 5;
- // 互动弹幕正文
- string content = 6;
- //
- int32 state = 7;
- // 出现时间
- int32 progress = 8;
- // 创建时间
- string ctime = 9;
- // 发布时间
- string mtime = 10;
- // 扩展json数据
- string extra = 11;
- // 弹幕id str类型
- string id_str = 12;
-}
-
-//
-message CommandDmsOttReply {
- //
- repeated CommandDmOtt command_dms_ott = 1;
-}
-
-//
-message CommandDmsOttReq {
- //
- int64 aid = 1;
- //
- int64 cid = 2;
- //
- int64 mid = 3;
-}
-
-// 弹幕ai云屏蔽列表
-message DanmakuAIFlag {
- // 弹幕ai云屏蔽条目
- repeated DanmakuFlag dm_flags = 1;
-}
-
-// 弹幕条目
-message DanmakuElem {
- // 弹幕dmid
- int64 id = 1;
- // 弹幕出现位置(单位ms)
- int32 progress = 2;
- // 弹幕类型
- int32 mode = 3;
- // 弹幕字号
- int32 fontsize = 4;
- // 弹幕颜色
- uint32 color = 5;
- // 发送着mid hash
- string midHash = 6;
- // 弹幕正文
- string content = 7;
- // 发送时间
- int64 ctime = 8;
- // 权重 区间:[1,10]
- int32 weight = 9;
- // 动作
- string action = 10;
- // 弹幕池
- int32 pool = 11;
- // 弹幕dmid str
- string idStr = 12;
- // 弹幕属性位(bin求AND)
- // bit0:保护 bit1:直播 bit2:高赞
- int32 attr = 13;
-}
-
-// 弹幕ai云屏蔽条目
-message DanmakuFlag {
- // 弹幕dmid
- int64 dmid = 1;
- // 评分
- uint32 flag = 2;
-}
-
-// 云屏蔽配置信息
-message DanmakuFlagConfig {
- // 云屏蔽等级
- int32 rec_flag = 1;
- // 云屏蔽文案
- string rec_text = 2;
- // 云屏蔽开关
- int32 rec_switch = 3;
-}
-
-// 弹幕默认配置
-message DanmuDefaultPlayerConfig {
- bool player_danmaku_use_default_config = 1; // 是否使用推荐弹幕设置
- bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
- int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
- bool player_danmaku_blocktop = 6; // 是否屏蔽顶端弹幕
- bool player_danmaku_blockscroll = 7; // 是否屏蔽滚动弹幕
- bool player_danmaku_blockbottom = 8; // 是否屏蔽底端弹幕
- bool player_danmaku_blockcolorful = 9; // 是否屏蔽彩色弹幕
- bool player_danmaku_blockrepeat = 10; // 是否屏蔽重复弹幕
- bool player_danmaku_blockspecial = 11; // 是否屏蔽高级弹幕
- float player_danmaku_opacity = 12; // 弹幕不透明度
- float player_danmaku_scalingfactor = 13; // 弹幕缩放比例
- float player_danmaku_domain = 14; // 弹幕显示区域
- int32 player_danmaku_speed = 15; // 弹幕速度
- bool inline_player_danmaku_switch = 16; // 是否开启弹幕
- int32 player_danmaku_senior_mode_switch = 17; //
-}
-
-// 弹幕配置
-message DanmuPlayerConfig {
- bool player_danmaku_switch = 1; // 是否开启弹幕
- bool player_danmaku_switch_save = 2; // 是否记录弹幕开关设置
- bool player_danmaku_use_default_config = 3; // 是否使用推荐弹幕设置
- bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
- int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
- bool player_danmaku_blocktop = 6; // 是否屏蔽顶端弹幕
- bool player_danmaku_blockscroll = 7; // 是否屏蔽滚动弹幕
- bool player_danmaku_blockbottom = 8; // 是否屏蔽底端弹幕
- bool player_danmaku_blockcolorful = 9; // 是否屏蔽彩色弹幕
- bool player_danmaku_blockrepeat = 10; // 是否屏蔽重复弹幕
- bool player_danmaku_blockspecial = 11; // 是否屏蔽高级弹幕
- float player_danmaku_opacity = 12; // 弹幕不透明度
- float player_danmaku_scalingfactor = 13; // 弹幕缩放比例
- float player_danmaku_domain = 14; // 弹幕显示区域
- int32 player_danmaku_speed = 15; // 弹幕速度
- bool player_danmaku_enableblocklist = 16; // 是否开启屏蔽列表
- bool inline_player_danmaku_switch = 17; // 是否开启弹幕
- int32 inline_player_danmaku_config = 18; //
- int32 player_danmaku_ios_switch_save = 19; //
-}
-
-// 弹幕显示区域自动配置
-message DanmuPlayerDynamicConfig {
- // 时间
- int32 progress = 1;
- // 弹幕显示区域
- float player_danmaku_domain = 14;
-}
-
-// 弹幕配置信息
-message DanmuPlayerViewConfig {
- // 弹幕默认配置
- DanmuDefaultPlayerConfig danmuku_default_player_config = 1;
- // 弹幕用户配置
- DanmuPlayerConfig danmuku_player_config = 2;
- // 弹幕显示区域自动配置列表
- repeated DanmuPlayerDynamicConfig danmuku_player_dynamic_config = 3;
-}
-
-// 获取弹幕-响应
-message DmSegMobileReply {
- // 弹幕列表
- repeated DanmakuElem elems = 1;
- // 是否已关闭弹幕
- // 0:未关闭 1:已关闭
- int32 state = 2;
- // 弹幕云屏蔽ai评分值
- DanmakuAIFlag ai_flag = 3;
-}
-
-// 获取弹幕-请求
-message DmSegMobileReq {
- // 稿件avid/漫画epid
- int64 pid = 1;
- // 视频cid/漫画cid
- int64 oid = 2;
- // 弹幕类型
- // 1:视频 2:漫画
- int32 type = 3;
- // 分段(6min)
- int64 segment_index = 4;
- // 是否青少年模式
- int32 teenagers_mode = 5;
- //
- int64 from = 6;
-}
-
-// 客户端弹幕元数据-响应
-message DmViewReply {
- // 是否已关闭弹幕
- // 0:未关闭 1:已关闭
- bool closed = 1;
- // 智能防挡弹幕蒙版信息
- VideoMask mask = 2;
- // 视频字幕
- VideoSubtitle subtitle = 3;
- // 高级弹幕专包url(bfs)
- repeated string special_dms = 4;
- // 云屏蔽配置信息
- DanmakuFlagConfig ai_flag = 5;
- // 弹幕配置信息
- DanmuPlayerViewConfig player_config = 6;
- // 弹幕发送框样式
- int32 send_box_style = 7;
- // 是否允许
- bool allow = 8;
- // check box 是否展示
- string check_box = 9;
- // check box 展示文本
- string check_box_show_msg = 10;
- // 展示文案
- string text_placeholder = 11;
- // 弹幕输入框文案
- string input_placeholder = 12;
- //
- bool command_close = 13;
-}
-
-// 客户端弹幕元数据-请求
-message DmViewReq {
- // 稿件avid/漫画epid
- int64 pid = 1;
- // 视频cid/漫画cid
- int64 oid = 2;
- // 弹幕类型
- // 1:视频 2:漫画
- int32 type = 3;
- // 页面spm
- string spmid = 4;
- // 是否冷启
- int32 is_hard_boot = 5;
- //
- int64 from = 6;
-}
-
-// 单个字幕信息
-message SubtitleItem {
- // 字幕id
- int64 id = 1;
- // 字幕id str
- string id_str = 2;
- // 字幕语言代码
- string lan = 3;
- // 字幕语言
- string lan_doc = 4;
- // 字幕文件url
- string subtitle_url = 5;
- // 字幕作者信息
- UserInfo author = 6;
-}
-
-//
-message TvViewProgressReply {
- //
- VideoGuide video_guide = 1;
- //
- Chronos chronos = 2;
-}
-
-//
-message TvViewProgressReq {
- //
- int64 aid = 1;
- //
- int64 cid = 2;
- //
- int64 up_mid = 3;
- //
- string engine_version = 4;
- //
- string message_protocol = 5;
- //
- string service_key = 6;
- //
- int64 sid = 7;
- //
- int64 pid = 8;
- //
- int64 from = 9;
- //
- string guest_access_key = 10;
- //
- int64 epid = 11;
-}
-
-// 字幕作者信息
-message UserInfo {
- // 用户mid
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- // 用户性别
- string sex = 3;
- // 用户头像url
- string face = 4;
- // 用户签名
- string sign = 5;
- // 用户等级
- int32 rank = 6;
-}
-
-//
-message VideoGuide {
- //
- repeated CommandDm command_dms = 2;
-}
-
-// 智能防挡弹幕蒙版信息
-message VideoMask {
- // 视频cid
- int64 cid = 1;
- // 平台
- // 0:web端 1:客户端
- int32 plat = 2;
- // 帧率
- int32 fps = 3;
- // 间隔时间
- int64 time = 4;
- // 蒙版url
- string mask_url = 5;
-}
-
-// 视频字幕信息
-message VideoSubtitle {
- // 视频原语言代码
- string lan = 1;
- // 视频原语言
- string lanDoc = 2;
- // 视频字幕列表
- repeated SubtitleItem subtitles = 3;
-}
diff --git a/bili-api-grpc/proto/bilibili/web/interfaces/v1/interfaces.proto b/bili-api-grpc/proto/bilibili/web/interfaces/v1/interfaces.proto
deleted file mode 100644
index 57b4fdeb2..000000000
--- a/bili-api-grpc/proto/bilibili/web/interfaces/v1/interfaces.proto
+++ /dev/null
@@ -1,1278 +0,0 @@
-syntax = "proto3";
-
-package bilibili.web.interfaces.v1;
-
-option java_multiple_files = true;
-option java_package = "bilibili.web.interfaces.v1";
-
-// 用户信息
-message AccInfo {
- // 用户UID
- int64 mid = 1;
- // 用户昵称
- string name = 2;
- //
- string sex = 3;
- //
- string face = 4;
- //
- string sign = 5;
-}
-
-//
-message AccountCard {
- //
- string mid = 1;
- //
- string name = 2;
- //
- string sex = 3;
- //
- string rank = 4;
- //
- string face = 5;
- //
- int32 spacesta = 6;
- //
- string sign = 7;
- //
- CardLevelInfo level_info = 8;
- //
- PendantInfo pendant = 9;
- //
- NameplateInfo nameplate = 10;
- //
- OfficialInfo official = 11;
- //
- OfficialVerify official_verify = 12;
- //
- CardVip vip = 13;
- //
- int64 fans = 14;
- //
- int64 friend = 15;
- //
- int64 attention = 16;
-}
-
-//
-message ActivityArchiveReply {
- //
- Arc arc = 1;
- //
- string bvid = 2;
- //
- repeated Page pages = 3;
- //
- ReqUser req_user = 4;
- //
- repeated Staff staff = 5;
- //
- OperationRelate right_relate = 6;
- //
- OperationRelate bottom_relate = 7;
-}
-
-//
-message ActivityArchiveReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- string activity_key = 3;
-}
-
-//
-message ActivityEpisode {
- //
- int64 id = 1;
- //
- int64 aid = 2;
- //
- string bvid = 3;
- //
- int64 cid = 4;
- //
- string title = 5;
- //
- string cover = 6;
- //
- Author author = 7;
- //
- Rights rights = 8;
-}
-
-//
-message ActivityGame {
- //
- repeated ActivityGameIframe iframes = 1;
- //
- string disclaimer = 2;
- //
- string disclaimer_url = 3;
-}
-
-//
-message ActivityGameIframe {
- //
- string url = 1;
- //
- int64 height = 2;
-}
-
-//
-message ActivityLive {
- //
- int64 room_id = 1;
- //
- int64 now_time = 2;
- //
- int64 start_time = 3;
- //
- int64 end_time = 4;
- //
- string hover_pic = 5;
- //
- string hover_jump_url = 6;
- //
- int64 break_cycle = 7;
- //
- repeated LiveTimeline timeline = 8;
- //
- OperationRelate operation_relate = 9;
- //
- int64 reply_type = 10;
- //
- int64 reply_id = 11;
- //
- string hover_pic_close = 12;
- //
- string gift_disclaimer = 13;
-}
-
-//
-message ActivityLiveTimeInfoReply {
- //
- int64 now_time = 1;
- //
- int64 start_time = 2;
- //
- int64 end_time = 3;
- //
- repeated LiveTimeline timeline = 4;
-}
-
-//
-message ActivityLiveTimeInfoReq {
- //
- string activity_key = 1;
-}
-
-//
-message ActivitySeasonReply {
- //
- ActivitySeasonStatus status = 1;
- //
- string title = 2;
- //
- ActivityLive live = 3;
- //
- ActivitySubscribe subscribe = 4;
- //
- ActivityGame game = 5;
- //
- ActivityView view = 6;
- //
- ActivityTheme theme = 7;
-}
-
-//
-message ActivitySeasonReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
- //
- string activity_key = 3;
-}
-
-//
-message ActivitySeasonSection {
- //
- int64 id = 1;
- //
- string title = 2;
- //
- int64 type = 3;
- //
- repeated ActivityEpisode episodes = 4;
-}
-
-//
-enum ActivitySeasonStatus {
- StatusNone = 0; //
- StatusLive = 1; //
- StatusView = 2; //
-}
-
-//
-message ActivitySubscribe {
- //
- bool status = 1;
- //
- string title = 2;
- //
- string button_title = 3;
- //
- string button_selected_title = 4;
- //
- int64 season_stat_view = 5;
- //
- int64 season_stat_danmaku = 6;
- //
- OrderType order_type = 7;
- oneof param {
- //
- ReserveActivityParam reserve_activity_param = 8;
- //
- FavSeasonParam fav_season_param = 9;
- //
- JumpURLParam jump_URL_param = 10;
- }
-}
-
-//
-message ActivityTheme {
- //
- string base_color = 1;
- //
- string loading_bg_color = 2;
- //
- string operated_bg_color = 3;
- //
- string default_element_color = 4;
- //
- string hover_element_color = 5;
- //
- string selected_element_color = 6;
- //
- string base_font_color = 7;
- //
- string info_font_color = 8;
- //
- string mask_bg_color = 9;
- //
- string page_bg_color = 10;
- //
- string center_logo_img = 11;
- //
- string page_bg_img = 12;
- //
- string decorations2233_img = 13;
- //
- string main_banner_bg_img = 14;
- //
- string main_banner_title_img = 15;
- //
- string like_animation_img = 16;
- //
- string combo_like_img = 17;
- //
- string combo_coin_img = 18;
- //
- string combo_fav_img = 19;
- //
- string arrow_btn_img = 20;
- //
- string share_icon_bg_img = 21;
- //
- string live_list_location_img = 22;
- //
- string live_list_location_img_active = 23;
- //
- string player_loading_img = 24;
- //
- string share_img = 25;
- //
- map kv_color = 26;
-}
-
-//
-message ActivityView {
- //
- Arc arc = 1;
- //
- string bvid = 2;
- //
- repeated Page pages = 3;
- //
- repeated Staff staff = 4;
- //
- ReqUser req_user = 5;
- //
- OperationRelate right_relate = 6;
- //
- OperationRelate bottom_relate = 7;
- //
- repeated ActivitySeasonSection sections = 8;
-}
-
-//
-message Arc {
- //
- int64 aid = 1;
- //
- int64 videos = 2;
- //
- int32 type_id = 3;
- //
- string type_name = 4;
- //
- int32 copyright = 5;
- //
- string pic = 6;
- //
- string title = 7;
- //
- int64 pubdate = 8;
- //
- int64 ctime = 9;
- //
- string desc = 10;
- //
- int32 state = 11;
- //
- int32 access = 12;
- //
- int32 attribute = 13;
- //
- string tag = 14;
- //
- repeated string tags = 15;
- //
- int64 duration = 16;
- //
- int64 mission_id = 17;
- //
- int64 order_id = 18;
- //
- string redirect_url = 19;
- //
- int64 forward = 20;
- //
- Rights rights = 21;
- //
- Author author = 22;
- //
- Stat stat = 23;
- //
- string report_result = 24;
- //
- string dynamic = 25;
- //
- int64 first_cid = 26;
- //
- Dimension dimension = 27;
- //
- repeated StaffInfo staff_info = 28;
- //
- int64 season_id = 29;
- //
- repeated DescV2 desc_v2 = 30;
- //
- bool is_chargeable_season = 31;
- //
- bool is_blooper = 32;
-}
-
-//
-message Author {
- //
- int64 mid = 1;
- //
- string name = 2;
- //
- string face = 3;
-}
-
-//
-message Card {
- //
- AccountCard card = 1;
- //
- Space space = 2;
- //
- bool following = 3;
- //
- int64 archive_count = 4;
- //
- int32 article_count = 5;
- //
- int64 follower = 6;
-}
-
-//
-message CardLevelInfo {
- //
- int32 cur = 1;
- //
- int32 min = 2;
- //
- int32 now_exp = 3;
- //
- int32 next_exp = 4;
-}
-
-//
-message CardVip {
- //
- int32 type = 1;
- //
- string due_remark = 2;
- //
- int32 access_status = 3;
- //
- int32 vip_status = 4;
- //
- string vip_status_warn = 5;
- //
- int32 theme_type = 6;
-}
-
-message ClickActivitySeasonReq {
- //
- OrderType order_type = 1;
- oneof param {
- //
- ReserveActivityParam reserve_activity_param = 2;
- //
- FavSeasonParam fav_season_param = 3;
- //
- JumpURLParam jump_URL_param = 4;
- }
- //
- string spmid = 5;
- //
- int64 action = 6;
-}
-
-//
-message DescV2 {
- //
- string raw_text = 1;
- //
- int64 type = 2;
- //
- int64 biz_id = 3;
-}
-
-//
-message Dimension {
- //
- int64 width = 1;
- //
- int64 height = 2;
- //
- int64 rotate = 3;
-}
-
-//
-message FavSeasonParam {
- //
- int64 season_id = 1;
-}
-
-//
-message HotReply {
- //
- ReplyPage page = 1;
- //
- repeated Reply replies = 2;
-}
-
-//
-message JumpURLParam {
- //
- string jump_url = 1;
-}
-
-//
-message LiveTimeline {
- //
- string name = 1;
- //
- int64 start_time = 2;
- //
- int64 end_time = 3;
- //
- string cover = 4;
- //
- string subtitle = 5;
- //
- string h5_cover = 6;
-}
-
-//
-message NameplateInfo {
- //
- int32 nid = 1;
- //
- string name = 2;
- //
- string image = 3;
- //
- string image_small = 4;
- //
- string level = 5;
- //
- string condition = 6;
-}
-
-//
-message NoReply {}
-
-//
-message OfficialInfo {
- //
- int32 role = 1;
- //
- string title = 2;
- //
- string desc = 3;
-}
-
-//
-message OfficialVerify {
- //
- int32 type = 1;
- //
- string desc = 2;
-}
-
-//
-message OperationRelate {
- //
- string title = 1;
- //
- repeated RelateItem relate_item = 2;
- //
- repeated Relate ai_relate_item = 3;
-}
-
-//
-enum OrderType {
- TypeNone = 0; //
- TypeOrderActivity = 1; //
- TypeFavSeason = 2; //
- TypeClick = 3; //
-}
-
-//
-message Page {
- //
- int64 cid = 1;
- //
- int32 page = 2;
- //
- string from = 3;
- //
- string part = 4;
- //
- int64 duration = 5;
- //
- string vid = 6;
- //
- string desc = 7;
- //
- string weblink = 8;
- //
- Dimension dimension = 9;
-}
-
-//
-message PendantInfo {
- //
- int32 pid = 1;
- //
- string name = 2;
- //
- string image = 3;
- //
- int64 expire = 4;
-}
-
-//
-message ReasonStyle {
- //
- string text = 1;
-}
-
-//
-message Relate {
- //
- Arc arc = 1;
- //
- string bvid = 2;
- //
- int64 season_type = 3;
-}
-
-//
-message RelateItem {
- //
- string url = 1;
- //
- string cover = 2;
-}
-
-//
-message Relation {
- //
- int64 attribute = 1;
- //
- int64 special = 3;
-}
-
-//
-message Reply {
- //
- int64 rpid = 1;
- //
- int64 oid = 2;
- //
- int32 type = 3;
- //
- int64 mid = 4;
- //
- int64 root = 5;
- //
- int64 parent = 6;
- //
- int64 dialog = 7;
- //
- int32 count = 8;
- //
- int32 rcount = 9;
- //
- int32 floor = 10;
- //
- int32 state = 11;
- //
- int32 fans_grade = 12;
- //
- int32 attr = 13;
- //
- int64 ctime = 14;
- //
- string rpid_str = 15;
- //
- string root_str = 16;
- //
- string parent_str = 17;
- //
- string dialog_str = 18;
- //
- int32 like = 19;
- //
- int32 hate = 20;
- //
- int32 action = 21;
- //
- ReplyMember member = 22;
- //
- ReplyContent content = 23;
- //
- repeated Reply replies = 24;
- //
- int32 assist = 25;
- //
- ReplyFolder folder = 26;
- //
- ReplyUpAction up_action = 27;
- //
- ReplyLabel label = 28;
- //
- string raw_input = 29;
- //
- bool show_follow = 30;
-}
-
-//
-message ReplyContent {
- //
- int64 rp_id = 1;
- //
- string message = 2;
- //
- ReplyVote vote = 3;
- //
- repeated string topics = 5;
- //
- int32 ip = 6;
- //
- int32 plat = 7;
- //
- string device = 8;
- //
- string version = 9;
- //
- repeated ReplyMemberInfo members = 10;
- //
- map emote = 11;
-}
-
-//
-message ReplyEmote {
- //
- int64 id = 1;
- //
- int64 package_id = 2;
- //
- int64 state = 3;
- //
- int64 type = 4;
- //
- int64 attr = 5;
- //
- string text = 6;
- //
- string url = 7;
- //
- ReplyEmoteMeta meta = 8;
- //
- int64 ctime = 9;
- //
- int64 mtime = 10;
-}
-
-//
-message ReplyEmoteMeta {
- //
- ReplyEmoteMetaSize size = 1;
-}
-
-//
-enum ReplyEmoteMetaSize {
- EMOTE_META_SIZE_UNSPECIFIED = 0; //
- EMOTE_META_SIZE_SMALL = 1; //
- EMOTE_META_SIZE_BIG = 2; //
-}
-
-//
-message ReplyFansDetail {
- //
- int64 uid = 1;
- //
- int32 medal_id = 2;
- //
- string medal_name = 3;
- //
- int32 score = 4;
- //
- int32 level = 5;
- //
- int32 intimacy = 6;
- //
- int32 status = 7;
- //
- int32 received = 8;
-}
-
-//
-message ReplyFolder {
- //
- bool has_folded = 1;
- //
- bool is_folded = 2;
- //
- string rule = 3;
-}
-
-//
-message ReplyLabel {
- //
- int64 rpid = 1;
- //
- string content = 2;
- //
- string text_color = 3;
- //
- string text_color_night_mode = 4;
- //
- string bg_color = 5;
- //
- string bg_color_night_mode = 6;
- //
- string link = 7;
- //
- string position = 8;
-}
-
-//
-message ReplyLevelInfo {
- //
- int32 cur = 1;
- //
- int32 min = 2;
- //
- int32 now_exp = 3;
- //
- int32 next_exp = 4;
-}
-
-//
-message ReplyMember {
- //
- ReplyMemberInfo info = 1;
- //
- ReplyFansDetail fans_detail = 2;
- //
- int32 following = 3;
-}
-
-//
-message ReplyMemberInfo {
- //
- int32 role = 1;
- //
- string mid = 2;
- //
- string name = 3;
- //
- string sex = 4;
- //
- string sign = 5;
- //
- string avatar = 6;
- //
- string rank = 7;
- //
- string display_rank = 8;
- //
- ReplyLevelInfo level_info = 9;
- //
- PendantInfo pendant = 10;
- //
- NameplateInfo nameplate = 11;
- //
- OfficialVerify official_verify = 12;
- //
- ReplyVip vip = 13;
-}
-
-//
-message ReplyPage {
- //
- int64 acount = 1;
- //
- int64 count = 2;
- //
- int64 num = 3;
- //
- int64 size = 4;
-}
-
-//
-message ReplyUpAction {
- //
- bool like = 1;
- //
- bool reply = 2;
-}
-
-//
-message ReplyVip {
- //
- int32 type = 1;
- //
- int64 due_date = 2;
- //
- string due_remark = 3;
- //
- int32 access_status = 4;
- //
- int32 vip_status = 5;
- //
- string vip_status_warn = 6;
- //
- int32 theme_type = 7;
- //
- VipLabel label = 8;
-}
-
-//
-message ReplyVote {
- //
- int64 id = 1;
- //
- string title = 2;
- //
- int32 cnt = 3;
- //
- string desc = 4;
- //
- bool deleted = 5;
-}
-
-//
-message ReqUser {
- //
- bool favorite = 1;
- //
- bool like = 2;
- //
- bool dislike = 3;
- //
- int64 multiply = 4;
-}
-
-//
-message ReserveActivityParam {
- //
- int64 reserve_id = 1;
- //
- string from = 2;
- //
- string type = 3;
- //
- int64 oid = 4;
-}
-
-//
-message Rights {
- //
- int32 bp = 1;
- //
- int32 elec = 2;
- //
- int32 download = 3;
- //
- int32 movie = 4;
- //
- int32 pay = 5;
- //
- int32 hd5 = 6;
- //
- int32 no_reprint = 7;
- //
- int32 autoplay = 8;
- //
- int32 ugc_pay = 9;
- //
- int32 is_cooperation = 10;
- //
- int32 ugc_pay_preview = 11;
- //
- int32 arc_pay = 12;
- //
- int32 free_watch = 13;
-}
-
-//
-message SeasonEpisode {
- //
- int64 season_id = 1;
- //
- int64 section_id = 2;
- //
- int64 id = 3;
- //
- int64 aid = 4;
- //
- int64 cid = 5;
- //
- string title = 6;
- //
- int64 attribute = 7;
- //
- Arc arc = 8;
- //
- Page page = 9;
- //
- string bvid = 10;
- //
- ReasonStyle badge_style = 11;
-}
-
-//
-message SeasonSection {
- //
- int64 season_id = 1;
- //
- int64 id = 2;
- //
- string title = 3;
- //
- int64 type = 4;
- //
- repeated SeasonEpisode episodes = 5;
-}
-
-//
-message SeasonStat {
- //
- int64 season_id = 1;
- //
- int32 view = 2;
- //
- int32 danmaku = 3;
- //
- int32 reply = 4;
- //
- int32 fav = 5;
- //
- int32 coin = 6;
- //
- int32 share = 7;
- //
- int32 now_rank = 8;
- //
- int32 his_rank = 9;
- //
- int32 like = 10;
-}
-
-//
-message Space {
- //
- string s_img = 1;
- //
- string l_img = 2;
-}
-
-//
-message Staff {
- //
- int64 mid = 1;
- //
- string title = 2;
- //
- string name = 3;
- //
- string face = 4;
- //
- VipInfo vip = 5;
- //
- OfficialInfo official = 6;
- //
- int64 follower = 7;
- //
- int32 label_style = 8;
- //
- Relation relation = 9;
-}
-
-//
-message StaffInfo {
- //
- int64 mid = 1;
- //
- string title = 2;
-}
-
-//
-message Stat {
- //
- int64 aid = 1;
- //
- int32 view = 2;
- //
- int32 danmaku = 3;
- //
- int32 reply = 4;
- //
- int32 fav = 5;
- //
- int32 coin = 6;
- //
- int32 share = 7;
- //
- int32 now_rank = 8;
- //
- int32 his_rank = 9;
- //
- int32 like = 10;
- //
- int32 dislike = 11;
- //
- string evaluation = 12;
- //
- string argue_msg = 13;
-}
-
-//
-message Subtitle {
- //
- bool allow_submit = 1;
- //
- repeated SubtitleItem list = 2;
-}
-
-//
-message SubtitleItem {
- //
- int64 id = 1;
- //
- string lan = 2;
- //
- string lan_doc = 3;
- //
- bool is_lock = 4;
- //
- int64 author_mid = 5;
- //
- string subtitle_url = 6;
- //
- AccInfo author = 7;
-}
-
-//
-message Tag {
- //
- int64 id = 1;
- //
- string name = 2;
- //
- string cover = 3;
- //
- string head_cover = 4;
- //
- string content = 5;
- //
- string short_content = 6;
- //
- int32 type = 7;
- //
- int32 state = 8;
- //
- int64 ctime = 9;
- //
- TagCount tag_count = 10;
- //
- int32 is_atten = 11;
- //
- int64 likes = 12;
- //
- int64 hates = 13;
- //
- int32 attribute = 14;
- //
- int32 liked = 15;
- //
- int32 hated = 16;
-}
-
-//
-message TagCount {
- //
- int64 view = 1;
- //
- int64 use = 2;
- //
- int64 atten = 3;
-}
-
-//
-message UGCPayAsset {
- //
- int64 price = 1;
- //
- map platform_price = 2;
-}
-
-//
-message UGCSeason {
- //
- int64 id = 1;
- //
- string title = 2;
- //
- string cover = 3;
- //
- int64 mid = 4;
- //
- string intro = 5;
- //
- int32 sign_state = 6;
- //
- int64 attribute = 7;
- //
- repeated SeasonSection sections = 8;
- //
- SeasonStat stat = 9;
- //
- int64 ep_count = 10;
- //
- int64 season_type = 11;
- //
- bool is_pay_season = 12;
-}
-
-//
-message View {
- //
- Arc arc = 1;
- //
- bool no_cache = 2;
- //
- repeated Page pages = 3;
- //
- Subtitle subtitle = 4;
- //
- UGCPayAsset asset = 5;
- //
- ViewLabel label = 6;
- //
- repeated Staff staff = 7;
- //
- UGCSeason ugc_season = 8;
- //
- int64 stein_guide_cid = 9;
-}
-
-//
-message ViewDetailReply {
- //
- View view = 1;
- //
- Card card = 2;
- //
- repeated Tag tags = 3;
- //
- HotReply reply = 4;
- //
- repeated Arc related = 5;
-}
-
-//
-message ViewDetailReq {
- //
- int64 aid = 1;
- //
- string bvid = 2;
-}
-
-//
-message ViewLabel {
- //
- int64 type = 1;
-}
-
-//
-message VipInfo {
- //
- int32 type = 1;
- //
- int32 status = 2;
- //
- int32 vip_pay_type = 3;
- //
- int32 theme_type = 4;
-}
-
-//
-message VipLabel {
- //
- string path = 1;
-}
diff --git a/bili-api-grpc/proto/bilibili/web/space/v1/space.proto b/bili-api-grpc/proto/bilibili/web/space/v1/space.proto
deleted file mode 100644
index ccec3dc24..000000000
--- a/bili-api-grpc/proto/bilibili/web/space/v1/space.proto
+++ /dev/null
@@ -1,284 +0,0 @@
-syntax = "proto3";
-
-package bilibili.web.space.v1;
-
-option java_multiple_files = true;
-
-//
-message NoReply {}
-
-//
-message OfficialReply {
- //
- int64 id = 1;
- //
- int64 uid = 2;
- //
- string name = 3;
- //
- string icon = 4;
- //
- string scheme = 5;
- //
- string rcmd = 6;
- //
- string ios_url = 7;
- //
- string android_url = 8;
- //
- string button = 9;
- //
- string deleted = 10;
- //
- int64 mtime = 11;
-}
-
-//
-message OfficialRequest {
- //
- int64 mid = 1;
-}
-
-//
-message PhotoMall {
- //
- int64 id = 1;
- //
- string name = 2;
- //
- string img = 3;
- //
- string night_img = 4;
- //
- int64 is_activated = 5;
-}
-
-//
-message PhotoMallListReply {
- //
- repeated PhotoMall list = 1;
-}
-
-//
-message PhotoMallListReq {
- //
- string mobiapp = 1;
- //
- int64 mid = 2;
- //
- string device = 3;
-}
-
-//
-message PrivacyReply {
- //
- map privacy = 1;
-}
-
-//
-message PrivacyRequest {
- //
- int64 mid = 1;
-}
-
-//
-message SetTopPhotoReq {
- //
- string mobiapp = 1;
- //
- int64 i_d = 2;
- //
- int64 mid = 3;
- //
- int32 type = 4;
-}
-
-//
-message SpaceSettingReply {
- //
- int64 channel = 1;
- //
- int64 fav_video = 2;
- //
- int64 coins_video = 3;
- //
- int64 likes_video = 4;
- //
- int64 bangumi = 5;
- //
- int64 played_game = 6;
- //
- int64 groups = 7;
- //
- int64 comic = 8;
- //
- int64 b_bq = 9;
- //
- int64 dress_up = 10;
- //
- int64 disable_following = 11;
- //
- int64 live_playback = 12;
- //
- int64 close_space_medal = 13;
- //
- int64 only_show_wearing = 14;
- //
- int64 disable_show_school = 15;
- //
- int64 disable_show_nft = 16;
-}
-
-//
-message SpaceSettingReq {
- //
- int64 mid = 1;
-}
-
-//
-message TopPhoto {
- //
- string img_url = 1;
- //
- string night_img_url = 2;
- //
- int64 sid = 3;
-}
-
-//
-message TopPhotoArc {
- //
- bool show = 1;
- //
- int64 aid = 2;
- //
- string pic = 3;
-}
-
-//
-message TopPhotoArcCancelReq {
- //
- int64 mid = 1;
-}
-
-//
-message TopPhotoReply {
- //
- TopPhoto top_photo = 1;
- //
- TopPhotoArc top_photo_arc = 2;
-}
-
-//
-message TopPhotoReq {
- //
- string mobiapp = 1;
- //
- int64 mid = 2;
- //
- int32 build = 3;
- //
- string device = 4;
- //
- int64 login_mid = 5;
-}
-
-//
-enum TopPhotoType {
- UNKNOWN = 0; //
- PIC = 1; //
- ARCHIVE = 2; //
-}
-
-//
-message UpActivityTabReq {
- //
- int64 mid = 1;
- //
- int32 state = 2;
- //
- int64 tab_cont = 3;
- //
- string tab_name = 4;
-}
-
-//
-message UpActivityTabResp {
- //
- bool success = 1;
-}
-
-//
-message UpRcmdBlackListReply {}
-
-//
-message UserTabReply {
- //
- int32 tab_type = 1;
- //
- int64 mid = 2;
- //
- string tab_name = 3;
- //
- int32 tab_order = 4;
- //
- int64 tab_cont = 5;
- //
- int32 is_default = 6;
- //
- string h5_link = 7;
-}
-
-//
-message UserTabReq {
- //
- int64 mid = 1;
- //
- int32 plat = 2;
- //
- int32 build = 3;
-}
-
-//
-message WhitelistAddReply {
- //
- bool add_ok = 1;
-}
-
-//
-message WhitelistAddReq {
- //
- int64 mid = 1;
- //
- int64 stime = 2;
- //
- int64 etime = 3;
-}
-
-//
-message WhitelistReply {
- //
- bool is_white = 1;
-}
-
-//
-message WhitelistReq {
- //
- int64 mid = 1;
-}
-
-//
-message WhitelistUpReply {
- //
- bool up_ok = 1;
-}
-
-//
-message WhitelistValidTimeReply {
- //
- bool is_white = 1;
- //
- int64 stime = 2;
- //
- int64 etime = 3;
-}
diff --git a/bili-api-grpc/proto/datacenter/hakase/protobuf/android_device_info.proto b/bili-api-grpc/proto/datacenter/hakase/protobuf/android_device_info.proto
deleted file mode 100644
index cd5ece07b..000000000
--- a/bili-api-grpc/proto/datacenter/hakase/protobuf/android_device_info.proto
+++ /dev/null
@@ -1,270 +0,0 @@
-syntax = "proto3";
-
-package datacenter.hakase.protobuf;
-
-option java_multiple_files = true;
-
-message AndroidDeviceInfo {
- // ?
- string sdkver = 1;
- // 产品id
- // 粉 白 蓝 直播姬 HD 海外 OTT 漫画 TV野版 小视频 网易漫画 网易漫画 网易漫画HD 国际版 东南亚版
- // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 30
- string app_id = 2;
- // 版本号, 如 "7.39.0"
- string app_version = 3;
- // 版本号, 如 "7390300"
- string app_version_code = 4;
- // 用户 mid
- string mid = 5;
- // 渠道号, 如 "master"
- string chid = 6;
- // APP 首次安装启动时间戳
- int64 fts = 7;
- // 此处实际为 fp, 但不知为何命名为 buvid_local
- string buvid_local = 8;
- // 留空为 0
- int32 first = 9;
- // 进程名, 如 "tv.danmaku.bili"
- string proc = 10;
- // 网络信息, 为一数组直接 toString() 的结果
- // 如 """["dummy0,fe80::18d8:6ff:fe46:c2ba%dummy0,", "wlan0,fe80::a0f4:6dff:fea8:2d37%wlan0,192.168.1.5,", "lo,::1,127.0.0.1,", "rmnet_ims00,fe80::5a02:3ff:fe04:512%rmnet_ims00,2409:815a:7c38:cee1:1773:d0b9:d163:b023,"]"""
- string net = 11;
- // 手机无线电固件版本号(`Build.getRadioVersion()`). 如 `21C20B686S000C000,21C20B686S000C000`.
- string band = 12;
- // OS 版本号, 如 "12"
- string osver = 13;
- // 当前毫秒时间戳
- int64 t = 14;
- // CPU 逻辑核心计数
- int32 cpu_count = 15;
- // 手机 Model, 如 "NOH-AN01"
- string model = 16;
- // 手机品牌, 如 "HUAWEI"
- string brand = 17;
- // 屏幕信息, 如 "1288,2646,560", 即 "{width},{height},{pixel}"
- string screen = 18;
- // CPU 型号, 留空或根据实际情况确定
- string cpu_model = 19;
- // 蓝牙 MAC, 留空或根据实际情况确定
- string btmac = 20;
- // Linux 内核 bootid
- int64 boot = 21;
- // 模拟器(?), 如 "000"
- string emu = 22;
- // 移动网络 MCC MNC, 如中国移动为 46007
- string oid = 23;
- // 当前网络类型, 如 "WIFI", 见 bilibili.metadata.network.NetworkType
- string network = 24;
- // 运行内存(Byte)
- int64 mem = 25;
- // 传感器信息, 为一数组直接 toString() 的结果
- // 如 """["accelerometer-icm20690,invensense", "akm-akm09918,akm", "orientation,huawei", "als-tcs3718,ams", "proximity-tcs3718,ams", "gyroscope-icm20690,invensense", "gravity,huawei", "linear Acceleration,huawei", "rotation Vector,huawei", "airpress-bmp280,bosch", "HALL sensor,huawei", "uncalibrated Magnetic Field,Asahi Kasei Microdevices", "game Rotation Vector,huawei", "uncalibrated Gyroscope,STMicroelectronics", "significant Motion,huawei", "step Detector,huawei", "step counter,huawei", "geomagnetic Rotation Vector,huawei", "phonecall sensor,huawei", "RPC sensor,huawei", "agt,huawei", "color sensor,huawei", "uncalibrated Accelerometer,huawei", "drop sensor,huawei"]"""
- string sensor = 26;
- // CPU 频率, 如 2045000
- int64 cpu_freq = 27;
- // CPU 架构, 如 "ARM"
- string cpu_vendor = 28;
- // ?
- string sim = 29;
- // 光照传感器数值
- int32 brightness = 30;
- // Android Build.prop 信息, key 包括 net.hostname, ro.boot.hardware, etc.
- // 具体 key-value 需要技术手段自行确定
- map props = 31;
- // 系统信息, key 包括 product, cpu_model_name, display, cpu_abi_list, etc.
- // 具体 key-value 需要技术手段自行确定
- map sys = 32;
- // Wifi MAC, 一般无法获取, 留空
- string wifimac = 33;
- // Android ID
- string adid = 34;
- // OS 名称, 如 "android"
- string os = 35;
- // IMEI, 一般无法获取, 留空
- string imei = 36;
- // ?, 留空
- string cell = 37;
- // IMSI, 一般无法获取, 留空
- string imsi = 38;
- // ICCID, 一般无法获取, 留空
- string iccid = 39;
- // 摄像头数量, 留空
- int32 camcnt = 40;
- // 摄像头像素, 留空
- string campx = 41;
- // 手机内置存储空间(Byte)
- int64 total_space = 42;
- // ?, 例如 "false"
- string axposed = 43;
- // ?, 留空
- string maps = 44;
- // 如: "/data/user/0/tv.danmaku.bili/files"
- string files = 45;
- // 是否为虚拟化(?), 如 "0"
- string virtual = 46;
- // 虚拟进程, 如 "[]"
- string virtualproc = 47;
- // ?, 留空
- string gadid = 48;
- // ?, 留空
- string glimit = 49;
- // 设备安装的 APP 列表, 如 "[]"
- string apps = 50;
- // 客户端 GUID
- string guid = 51;
- // ?, 区分于用户 UID
- string uid = 52;
- // ?, 留空
- int32 root = 53;
- // 摄像头放大倍数(?), 留空
- string camzoom = 54;
- // 摄像头闪光灯(?), 留空
- string camlight = 55;
- // OAID 匿名设备标识符, 参见 T/TAF 095-2021 安卓系统补充设备标识技术规范, 默认 "00000000-0000-0000-0000-000000000000"
- string oaid = 56;
- // UDID 设备唯一标识符, 参见 T/TAF 095-2021 安卓系统补充设备标识技术规范, 可留空
- string udid = 57;
- // VAID 开发者匿名设备标识符, 参见 T/TAF 095-2021 安卓系统补充设备标识技术规范, 可留空
- string vaid = 58;
- // AAID, 应用匿名设备标识符, 参见 T/TAF 095-2021 安卓系统补充设备标识技术规范, 可留空
- string aaid = 59;
- // ?, 设置为 "[]"
- string androidapp20 = 60;
- // ?, 留空
- int32 androidappcnt = 61;
- // ?, 设置为 "[]"
- string androidsysapp20 = 62;
- // 当前剩余电量, 如 100
- int32 battery = 63;
- // Android 监听电量状态, 如 "BATTERY_STATUS_DISCHARGING"
- string battery_state = 64;
- // Wifi BSSID, 一般无法获取, 留空
- string bssid = 65;
- // ?, 如 "NOH-AN01 4.0.0.102(DEVC00E100R7P5)"
- string build_id = 67;
- // ISO 国家代码, 如 "CN"
- string country_iso = 68;
- // 可用运行内存(Byte)
- int64 free_memory = 70;
- // 可用内置存储空间(Byte)
- string fstorage = 71;
- // Linux kernel version
- string kernel_version = 74;
- // 语言, 如 "zh"
- string languages = 75;
- // Wifi 网卡 MAC(?), 留空
- string mac = 76;
- // 当前连接 Wifi 的 SSID, 留空
- string ssid = 79;
- // ?, 留空
- int32 systemvolume = 80;
- // Wifi 网卡 MAC 列表(?), 留空
- string wifimaclist = 81;
- // 运行内存(Byte)
- int64 memory = 82;
- // 当前剩余电量, 如 "100"
- string str_battery = 83;
- // 设备是否 Root(?), 留空
- bool is_root = 84;
- // 光照传感器数值字符串
- string str_brightness = 85;
- // 产品id, 见 2
- string str_app_id = 86;
- // 当前 IP(?), 留空
- string ip = 87;
- // 留空即可
- string user_agent = 88;
- // ?, 如: "1.25"
- string light_intensity = 89;
- // 设备 xyz 方向角度
- repeated float device_angle = 90;
- // GPS 传感器数量(或者是否有 GPS 传感器?), 如 "1"
- int64 gps_sensor = 91;
- // 速度传感器数量(或者是否有速度传感器?), 如 "1"
- int64 speed_sensor = 92;
- // 线性加速度传感器数量(或者是否有线性加速度传感器?), 如 "1"
- int64 linear_speed_sensor = 93;
- // 陀螺仪传感器数量(或者是否有陀螺仪传感器?), 如 "1"
- int64 gyroscope_sensor = 94;
- // 生物识别传感器数量(或者是否有生物识别传感器?), 如 "1"
- int64 biometric = 95;
- // 生物识别传感器类型(?), 如 "touchid"
- repeated string biometrics = 96;
- // 上次 Crash Dump 时的毫秒时间戳
- int64 last_dump_ts = 97;
- // 留空即可
- string location = 98;
- // 留空即可
- string country = 99;
- // 留空即可
- string city = 100;
- // ?, 默认为 0
- int32 data_activity_state = 101;
- // ?, 默认为 0
- int32 data_connect_state = 102;
- // ?, 默认为 0
- int32 data_network_type = 103;
- // ?, 默认为 0
- int32 voice_network_type = 104;
- // ?, 默认为 0
- int32 voice_service_state = 105;
- // USB 是否连接, 启用为 "1", 否则为 "0"
- int32 usb_connected = 106;
- // ADB 是否启用, 启用为 "1", 否则为 "0"
- int32 adb_enabled = 107;
- // 系统 UI 软件版本(?), 如 "14.0.0"
- string ui_version = 108;
- // 辅助服务
- repeated string accessibility_service = 109;
- // 传感器信息(需要和前面的 sensor 对应)
- repeated SensorInfo sensors_info = 110;
- // DrmId
- string drmid = 111;
- // 是否存在电池
- bool battery_present = 112;
- // 电池技术, 如 "Li-poly"
- string battery_technology = 113;
- // 电池温度(m℃)
- int32 battery_temperature = 114;
- // 电池电压(mV)
- int32 battery_voltage = 115;
- // 电池是否被拔开(?), 可以为 0
- int32 battery_plugged = 116;
- // 电池健康, 如 2
- int32 battery_health = 117;
- // 留空即可
- repeated string cpu_abi_list = 118;
- // 留空即可
- string cpu_abi_libc = 119;
- // 留空即可
- string cpu_abi_libc64 = 120;
- // 留空即可
- string cpu_processor = 121;
- // 留空即可
- string cpu_model_name = 122;
- // 留空即可
- string cpu_hardware = 123;
- // 留空即可
- string cpu_features = 124;
-}
-
-// 传感器信息
-message SensorInfo {
- // 传感器名称, 如 "rotation Vector"
- string name = 1;
- // 制造商
- string vendor = 2;
- //
- int32 version = 3;
- //
- int32 type = 4;
- //
- float max_range = 5;
- //
- float resolution = 6;
- // 耗电量(mA)
- float power = 7;
- //
- int32 min_delay = 8;
-}
diff --git a/bili-api-grpc/proto/pgc/gateway/vega/v1/vega.proto b/bili-api-grpc/proto/pgc/gateway/vega/v1/vega.proto
deleted file mode 100644
index 611c89fa6..000000000
--- a/bili-api-grpc/proto/pgc/gateway/vega/v1/vega.proto
+++ /dev/null
@@ -1,95 +0,0 @@
-syntax = "proto3";
-
-package pgc.gateway.vega.v1;
-
-option java_multiple_files = true;
-
-import "bilibili/rpc/status.proto";
-import "google/protobuf/any.proto";
-import "google/protobuf/empty.proto";
-
-//
-service Vega {
- //
- rpc CreateTunnel (VegaFrame) returns (VegaFrame);
-}
-
-//
-service VegaFrameDoc {
- //
- rpc Auth (AuthReq) returns (AuthResp);
- //
- rpc Heartbeat (HeartbeatReq) returns (HeartbeatResp);
- //
- rpc MessageAck (MessageAckReq) returns (google.protobuf.Empty);
- //
- rpc Subscribe (SubscribeReq) returns (google.protobuf.Empty);
-}
-
-//
-message AuthReq {}
-
-//
-message AuthResp {}
-
-//
-message FrameOption {
- //
- int64 vega_id = 1;
- //
- string req_id = 2;
- //
- int64 sequence = 3;
- //
- bool is_ack = 4;
- //
- bilibili.rpc.Status status = 5;
- //
- string ack_origin = 6;
- //
- int64 mid = 7;
-}
-
-//
-message HeartbeatReq {}
-
-//
-message HeartbeatResp {}
-
-//
-message MessageAckReq {
- //
- string vega_id = 1;
- //
- string req_id = 2;
- //
- string origin = 3;
- //
- string target_path = 4;
-}
-
-//
-message SubscribeReq {
- //
- repeated TargetPath target_paths = 1;
-}
-
-//
-message TargetPath {
- //
- string key = 1;
- //
- google.protobuf.Any subs = 2;
-}
-
-//
-message VegaFrame {
- //
- FrameOption options = 1;
- //
- string route_path = 2;
- //
- google.protobuf.Any body = 3;
- //
- google.protobuf.Any sub_biz = 4;
-}
diff --git a/bili-api/build.gradle.kts b/bili-api/build.gradle.kts
index 0b2548b91..5b6af4fa0 100644
--- a/bili-api/build.gradle.kts
+++ b/bili-api/build.gradle.kts
@@ -8,7 +8,7 @@ group = "dev.aaa1115910"
dependencies {
ksp(libs.koin.ksp.compiler)
- implementation(project(":bili-api-grpc"))
+ implementation(project(":bili-api:grpc"))
implementation(libs.koin.core)
implementation(libs.koin.annotations)
implementation(libs.jsoup)
diff --git a/bili-api-grpc/.gitignore b/bili-api/grpc/.gitignore
similarity index 100%
rename from bili-api-grpc/.gitignore
rename to bili-api/grpc/.gitignore
diff --git a/bili-api-grpc/build.gradle.kts b/bili-api/grpc/build.gradle.kts
similarity index 100%
rename from bili-api-grpc/build.gradle.kts
rename to bili-api/grpc/build.gradle.kts
diff --git a/bili-api-grpc/proto/bilibili/account/fission/v1/fission.proto b/bili-api/grpc/proto/bilibili/account/fission/v1/fission.proto
similarity index 55%
rename from bili-api-grpc/proto/bilibili/account/fission/v1/fission.proto
rename to bili-api/grpc/proto/bilibili/account/fission/v1/fission.proto
index ecd972698..dbd475e8b 100644
--- a/bili-api-grpc/proto/bilibili/account/fission/v1/fission.proto
+++ b/bili-api/grpc/proto/bilibili/account/fission/v1/fission.proto
@@ -16,22 +16,22 @@ service Fission {
// 动画效果
message AnimateIcon {
- // icon文件
- string icon = 1;
- // 动效json文件
- string json = 2;
+ // icon文件
+ string icon = 1;
+ // 动效json文件
+ string json = 2;
}
// 活动入口-响应
message EntranceReply {
- // 展示图标
- string icon = 1;
- // 活动名称
- string name = 2;
- // 活动跳转链接
- string url = 3;
- // 动画效果
- AnimateIcon animate_icon = 4;
+ // 展示图标
+ string icon = 1;
+ // 活动名称
+ string name = 2;
+ // 活动跳转链接
+ string url = 3;
+ // 动画效果
+ AnimateIcon animate_icon = 4;
}
// 活动入口-请求
@@ -39,25 +39,25 @@ message EntranceReq {}
//
message PrivacyReply {
- //
- string message = 1;
+ //
+ string message = 1;
}
//
message PrivacyReq {
- //
- string activity_uid = 1;
+ //
+ string activity_uid = 1;
}
//首页弹窗-响应
message WindowReply {
- // 弹窗类型
- // 0:弹窗 1:普通页面
- int32 type = 1;
- // 跳转链接
- string url = 2;
- // 上报数据字段
- string report_data = 3;
+ // 弹窗类型
+ // 0:弹窗 1:普通页面
+ int32 type = 1;
+ // 跳转链接
+ string url = 2;
+ // 上报数据字段
+ string report_data = 3;
}
// 首页弹窗-请求
diff --git a/bili-api/grpc/proto/bilibili/ad/v1/ad.proto b/bili-api/grpc/proto/bilibili/ad/v1/ad.proto
new file mode 100644
index 000000000..fc1313e8c
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/ad/v1/ad.proto
@@ -0,0 +1,1013 @@
+syntax = "proto3";
+
+package bilibili.ad.v1;
+
+option java_multiple_files = true;
+
+import "google/protobuf/any.proto";
+import "google/protobuf/wrappers.proto";
+
+// 自动播放视频
+message AdAutoPlayVideoDto {
+ // avid
+ int64 avid = 1;
+ // cid
+ int64 cid = 2;
+ // 分P
+ int64 page = 3;
+ //
+ string from = 4;
+ // 是否自动播放
+ string url = 5;
+ // 是否自动播放
+ string cover = 6;
+ // 是否自动播放
+ bool auto_play = 7;
+ // 按钮是否动态变色
+ bool btn_dyc_color = 8;
+ // 按钮动态变色时间 ms
+ int32 btn_dyc_time = 9;
+ // 用于做联播是否是同一个视频的id
+ int64 biz_id = 10;
+ // 开始播放三方监控
+ repeated string process0_urls = 11;
+ // 播放3S三方监控
+ repeated string play_3s_urls = 12;
+ // 播放5S三方监控
+ repeated string play_5s_urls = 13;
+ // 横竖屏
+ int32 orientation = 14;
+}
+
+// 商业标信息
+message AdBusinessMarkDto {
+ // 商业标样式
+ // 0:不展示标 1:实心+文字 2:空心框+文字 3:纯文字标 4:纯图片标
+ int32 type = 1;
+ // 商业标文案
+ string text = 2;
+ // 商业标文案颜色,如#80FFFFFF RGBA
+ string text_color = 3;
+ // 夜间模式文字色
+ string text_color_night = 4;
+ // 背景色
+ string bg_color = 5;
+ // 夜间模式背景色
+ string bg_color_night = 6;
+ // 边框色
+ string border_color = 7;
+ // 夜间模式边框色
+ string border_color_night = 8;
+ // 图片商业标
+ string img_url = 9;
+ // 图片高度
+ int32 img_height = 10;
+ // 图片宽度
+ int32 img_width = 11;
+ //
+ string bg_border_color = 12;
+}
+
+// 按钮
+message AdButtonDto {
+ // 类型
+ // 1:落地页 2:应用唤起 3:应用下载
+ int32 type = 1;
+ // 按钮文案
+ string text = 2;
+ // 按钮跳转地址
+ string jump_url = 3;
+ // 跳转监测链接
+ string report_urls = 4;
+ // 唤起schema
+ string dlsuc_callup_url = 5;
+ // 游戏id
+ int32 game_id = 6;
+ // 游戏监控字段
+ string game_monitor_param = 7;
+ //
+ int32 game_channel_id = 8;
+ //
+ string game_channel_extra = 9;
+}
+
+// 卡片
+message AdCardDto {
+ // 卡片类型
+ int32 card_type = 1;
+ // 标题
+ string title = 2;
+ // 描述
+ string desc = 3;
+ // 额外描述
+ string extra_desc = 4;
+ // 长描述
+ string long_desc = 5;
+ // 短标题, 弹幕广告目录面板标题
+ string short_title = 6;
+ // 弹幕/浮层广告的弹幕标题
+ string danmu_title = 7;
+ // 弹幕/浮层广告的弹幕高度,整型,分母为100
+ int32 danmu_height = 8;
+ // 弹幕/浮层广告的弹幕宽度,整型,分母为100
+ int32 danmu_width = 9;
+ // 弹幕/浮层广告生存时间,单位为毫秒
+ int32 danmu_life = 10;
+ // 弹幕/浮层开始时间,单位为毫秒
+ int32 danmu_begin = 11;
+ // 背景色值(含透明度)如#80FFFFFF
+ string danmu_color = 12;
+ // 弹幕/浮层广告H5落地页
+ string danmu_h5url = 13;
+ // 弹幕/浮层 广告icon
+ string danmu_icon = 14;
+ // 折叠时间,永驻浮层折叠时间,单位为毫秒
+ int32 fold_time = 15;
+ // 广告标文案
+ string ad_tag = 16;
+ // cover数组
+ repeated AdCoverDto covers = 17;
+ // 卡片跳转链接
+ string jump_url = 18;
+ //
+ string imax_landing_page_json_string = 19;
+ // app唤起schema
+ string callup_url = 20;
+ // univeral link域名
+ string universal_app = 21;
+ // 原价, 单位为分
+ string ori_price = 22;
+ // 现价, 同上
+ int32 cur_price = 23;
+ // 券后/现价 价格描述
+ string price_desc = 24;
+ // 价格单位符号
+ string price_symbol = 25;
+ // 券后价格 "1000"
+ string goods_cur_price = 26;
+ // 原价 "¥1002"
+ string goods_ori_price = 27;
+ // 开放平台商品
+ AdGoodDto good = 28;
+ // 打分? 满分为100
+ int32 rank = 29;
+ // 热度
+ int32 hot_score = 30;
+ // 按钮
+ AdButtonDto button = 31;
+ // 广告主logo
+ string adver_logo = 32;
+ // 广告主name
+ string adver_name = 33;
+ // 广告主主页链接
+ string adver_page_url = 34;
+ // 视频弹幕,视频广告用
+ repeated string video_barrage = 35;
+ // 商业标信息
+ AdBusinessMarkDto ad_tag_style = 36;
+ // 自动播放视频
+ AdAutoPlayVideoDto video = 37;
+ // 反馈面板功能模块,屏蔽、投诉、广告介绍
+ AdFeedbackPanelDto feedback_panel = 38;
+ //
+ int64 adver_mid = 39;
+ //
+ int64 adver_account_id = 40;
+ //
+ string duration = 41;
+ //
+ repeated QualityInfo quality_infos = 42;
+ // 动态广告文本
+ string dynamic_text = 43;
+ // 广告主信息
+ AdverDto adver = 44;
+ // 评分
+ int32 grade_level = 45;
+ //
+ bool support_transition = 46;
+ //
+ string transition = 47;
+ //
+ int32 under_player_interaction_style = 48;
+ //
+ string imax_landing_page_v2 = 49;
+ //
+ SubCardModule subcard_module = 50;
+ //
+ int32 grade_denominator = 51;
+ //
+ int32 star_level = 52;
+ //
+ Bulletin bulletin = 53;
+ //
+ Gift gift = 54;
+ //
+ repeated string game_tags = 55;
+ //
+ int32 ori_mark_hidden = 56;
+ //
+ bool use_multi_cover = 57;
+ //
+ WxProgramInfo wx_program_info = 58;
+ //
+ AndroidGamePageRes android_game_page_res = 59;
+ //
+ NotClickableArea not_clickable_area = 60;
+ //
+ ForwardReply forward_reply = 61;
+}
+
+// 额外广告数据
+message AdContentExtraDto {
+ // 动态布局
+ string layout = 1;
+ // 展现监控url
+ repeated string show_urls = 2;
+ // 点击监控url
+ repeated string click_urls = 3;
+ // 弹幕创意列表展示第三方上报
+ repeated string danmu_list_show_urls = 4;
+ // 弹幕创意列表点击第三方上报
+ repeated string danmu_list_click_urls = 5;
+ // 弹幕详情页展示第三方上报
+ repeated string danmu_detail_show_urls = 6;
+ // 弹幕商品添加购物车第三方上报
+ repeated string danmu_trolley_add_urls = 7;
+ // useWebView默认false
+ bool use_ad_web_v2 = 8;
+ // app唤起白名单
+ repeated string open_whitelist = 9;
+ // app下载白名单
+ AppPackageDto download_whitelist = 10;
+ // 卡片相关信息
+ AdCardDto card = 11;
+ // 视频播放和弹幕播放上报控制时间 ms
+ int32 report_time = 12;
+ // 是否优先唤起app store
+ int32 appstore_priority = 13;
+ // 广告售卖类型
+ int32 sales_type = 14;
+ // 落地页是否预加载
+ int32 preload_landingpage = 15;
+ // 是否需要展示风险行业提示
+ bool special_industry = 16;
+ // 风险行业提示
+ string special_industry_tips = 17;
+ // 是否展示下载弹框
+ bool enable_download_dialog = 18;
+ // 是否允许分享
+ bool enable_share = 19;
+ // 个人空间广告入口类型
+ // 1:橱窗 2:商品店铺 3:小程序
+ int32 upzone_entrance_type = 20;
+ // 个人空间广告入口上报id,橱窗id(当前用Mid)、店铺id或者小程序id
+ int32 upzone_entrance_report_id = 21;
+ // 分享数据
+ AdShareInfoDto share_info = 22;
+ // topview图片链接,闪屏预下载用
+ string topview_pic_url = 23;
+ // topview视频链接,闪屏预下载用
+ string topview_video_url = 24;
+ // 点击区域
+ // 0:表示banner可点击 1:表示素材可点击
+ int32 click_area = 25;
+ // 店铺
+ int64 shop_id = 26;
+ // up主
+ int64 up_mid = 27;
+ // 回传id
+ string track_id = 28;
+ // 商店直投
+ int32 enable_store_direct_launch = 29;
+ // DPA2.0商品ID
+ int64 product_id = 30;
+ //
+ bool enable_double_jump = 31;
+ //
+ repeated string show1s_urls = 32;
+ //
+ string from_track_id = 33;
+ //
+ bool store_callup_card = 34;
+ //
+ int32 landingpage_download_style = 35;
+ //
+ int32 special_industry_style = 36;
+ //
+ bool enable_h5_alert = 37;
+ //
+ int32 macro_replace_priority = 38;
+ //
+ int32 feedback_panel_style = 39;
+ //
+ string appstore_url = 40;
+ //
+ int32 enable_h5_pre_load = 41;
+ //
+ string h5_pre_load_url = 42;
+ //
+ string cm_from_track_id = 43;
+}
+
+// 广告卡片封面数据
+message AdCoverDto {
+ // 图片链接
+ string url = 1;
+ // 动图循环次数
+ // 0:无限循环
+ int32 loop = 2;
+ // 图片点击跳转地址,截至目前为空
+ string jump_url = 3;
+ // 跳转监测链接, 数组,单个图片的监控,出区别于click_urls,应前端要求。(此字段截至目前为空,使用时需再次确认)
+ repeated string report_urls = 4;
+ // 图片高度
+ int32 image_height = 5;
+ // 图片宽度
+ int32 image_width = 6;
+}
+
+// 广告内容
+message AdDto {
+ // 广告创意ID
+ int64 creative_id = 1;
+ // 广告闭环上报回传数据
+ string ad_cb = 2;
+ // 额外广告数据
+ AdContentExtraDto extra = 3;
+ // 广告标记
+ int32 cm_mark = 4;
+ //
+ int64 top_view_id = 5;
+ //
+ int32 creative_type = 6;
+ //
+ int32 card_type = 7;
+ //
+ int32 creative_style = 8;
+ //
+ int32 is_ad = 9;
+ //
+ CreativeDto creative_content = 10;
+}
+
+// 反馈面板功能模块
+message AdFeedbackPanelDto {
+ // 面板类型,广告、推广
+ string panel_type_text = 1;
+ // 反馈面版信息
+ repeated AdFeedbackPanelModuleDto feedback_panel_detail = 2;
+ //
+ string toast = 3;
+ //
+ string open_rec_tips = 4;
+ //
+ string close_rec_tips = 5;
+}
+
+// 反馈面版信息
+message AdFeedbackPanelModuleDto {
+ // 模块id
+ int32 module_id = 1;
+ // icon url
+ string icon_url = 2;
+ // 跳转类型
+ // 1:气泡 2:H5
+ int32 jump_type = 3;
+ // 跳转地址
+ string jump_url = 4;
+ // 文案
+ string text = 5;
+ // 二级文案数组
+ repeated AdSecondFeedbackPanelDto secondary_panel = 6;
+ //
+ string sub_text = 7;
+}
+
+// 开放平台商品
+message AdGoodDto {
+ // 电商商品ID
+ int64 item_id = 1;
+ // 电商SKU ID
+ int64 sku_id = 2;
+ // 店铺ID
+ int64 shop_id = 3;
+ // SKU库存
+ int64 sku_num = 4;
+}
+
+// 有弹幕的ogv ep
+message AdOgvEpDto {
+ // 分集epid
+ int64 epid = 1;
+ // 是否显示 "荐"
+ bool has_recommend = 2;
+}
+
+// 广告控制
+message AdsControlDto {
+ // 视频是否有弹幕,如有,需请求弹幕广告
+ int32 has_danmu = 1;
+ // 有弹幕的分P视频的cid,已弃用
+ repeated int64 cids = 2;
+ // 有弹幕的ogv ep
+ repeated AdOgvEpDto eps = 3;
+}
+
+// 二级文案
+message AdSecondFeedbackPanelDto {
+ // 屏蔽理由id
+ int32 reason_id = 1;
+ // 理由文案
+ string text = 2;
+}
+
+// 分享
+message AdShareInfoDto {
+ // 分享标题
+ string title = 1;
+ // 分享副标题
+ string subtitle = 2;
+ // 分享图片url
+ string image_url = 3;
+}
+
+// 广告主信息
+message AdverDto {
+ //
+ int64 adver_id = 1;
+ //
+ string adver_logo = 2;
+ //
+ string adver_name = 3;
+ //
+ int32 adver_type = 4;
+ //
+ string adver_page_url = 5;
+ //
+ string adver_desc = 6;
+}
+
+//
+message AndroidGamePageRes {
+ //
+ Module1 module1 = 1;
+ //
+ Module3 module3 = 2;
+ //
+ Module4 module4 = 3;
+ //
+ Module5 module5 = 4;
+ //
+ Module6 module6 = 5;
+ //
+ Module7 module7 = 6;
+ //
+ Module8 module8 = 7;
+ //
+ Module9 module9 = 8;
+ //
+ Module10 module10 = 9;
+ //
+ Module11 module11 = 10;
+ //
+ Module12 module12 = 11;
+ //
+ Module13 module13 = 12;
+ //
+ repeated int32 module_seq = 13;
+ //
+ string background_color = 14;
+ //
+ Module14 module14 = 15;
+}
+
+//
+message AndroidTag {
+ //
+ string text = 1;
+ //
+ int32 type = 2;
+}
+
+// app下载白名单
+message AppPackageDto {
+ // 包大小(单位bytes)
+ int64 size = 1;
+ //
+ string display_name = 2;
+ //
+ string apk_name = 3;
+ // url
+ string url = 4;
+ // bili schema url
+ string bili_url = 5;
+ // 包md5
+ string md5 = 6;
+ // 包icon
+ string icon = 7;
+ // 开发者姓名
+ string dev_name = 8;
+ // 权限地址
+ string auth_url = 9;
+ // 权限名,逗号隔开
+ string auth_name = 10;
+ // 版本
+ string version = 11;
+ // 更新时间,yy-mm-hh格式
+ string update_time = 12;
+ // 隐私协议标题
+ string privacy_name = 13;
+ // 隐私协议url
+ string privacy_url = 14;
+}
+
+//
+message Bulletin {
+ //
+ string tag_text = 1;
+ //
+ string text = 2;
+}
+
+//
+message Comment {
+ //
+ int64 game_base_id = 1;
+ //
+ string user_name = 2;
+ //
+ string user_face = 3;
+ //
+ int32 user_level = 4;
+ //
+ string comment_no = 5;
+ //
+ int32 grade = 6;
+ //
+ string content = 7;
+ //
+ int32 up_count = 8;
+}
+
+//
+message CreativeDto {
+ //
+ string title = 1;
+ //
+ string description = 2;
+ //
+ string image_url = 3;
+ //
+ string image_md5 = 4;
+ //
+ string url = 5;
+ //
+ string click_url = 6;
+ //
+ string show_url = 7;
+ //
+ int64 video_id = 8;
+ //
+ string thumbnail_url = 9;
+ //
+ string thumbnail_url_md5 = 10;
+ //
+ string logo_url = 11;
+ //
+ string logo_md5 = 12;
+ //
+ string username = 13;
+}
+
+//
+message CustomPlayUrl {
+ //
+ int32 play_time = 1;
+ //
+ repeated string urls = 2;
+}
+
+//
+message ForwardReply {
+ //
+ int64 comment_id = 1;
+ //
+ string message = 2;
+ //
+ string highlight_text = 3;
+ //
+ string highlight_prefix_icon = 4;
+ //
+ string callup_url = 5;
+ //
+ string jump_url = 6;
+ //
+ int32 jump_type = 7;
+ //
+ string author_name = 8;
+ //
+ string author_icon = 9;
+}
+
+//
+message Gift {
+ //
+ string icon = 1;
+ //
+ string night_icon = 2;
+ //
+ string text = 3;
+ //
+ string url = 4;
+}
+
+//
+message IosGamePageRes {
+ //
+ string logo = 1;
+ //
+ string name = 2;
+ //
+ string sub_titile = 3;
+ //
+ repeated string image_url = 4;
+ //
+ string desc = 5;
+ //
+ AdButtonDto game_button = 6;
+ //
+ double grade = 7;
+ //
+ string rank_num = 8;
+ //
+ string rank_name = 9;
+}
+
+//
+message Module1 {
+ //
+ string game_name = 1;
+ //
+ string game_icon = 2;
+ //
+ string developer_input_name = 3;
+ //
+ repeated AndroidTag tag_list = 4;
+}
+
+//
+message Module3 {
+ //
+ bool display = 1;
+ //
+ repeated QualityParmas quality_params = 3;
+}
+
+//
+message Module4 {
+ //
+ bool display = 1;
+ //
+ int32 gift_num = 2;
+ //
+ string gift_name = 3;
+ //
+ int32 gift_icon_num = 4;
+ //
+ repeated string icon_urls = 5;
+}
+
+//
+message Module5 {
+ //
+ bool display = 1;
+ //
+ string game_summary = 2;
+}
+
+//
+message Module6 {
+ //
+ bool display = 1;
+ //
+ string game_desc = 2;
+}
+
+//
+message Module7 {
+ //
+ bool display = 1;
+ //
+ repeated ScreenShots screen_shots = 2;
+}
+
+//
+message Module8 {
+ //
+ bool display = 1;
+ //
+ repeated string tag_list = 2;
+}
+
+//
+message Module9 {
+ //
+ bool display = 1;
+ //
+ string dev_introduction = 2;
+}
+
+//
+message Module10 {
+ //
+ bool display = 1;
+ //
+ string latest_update = 2;
+}
+
+//
+message Module11 {
+ //
+ bool display = 1;
+ //
+ repeated int32 star_number_list = 2;
+ //
+ string comment_str = 3;
+ //
+ double grade = 4;
+}
+
+//
+message Module12 {
+ //
+ bool display = 1;
+ //
+ repeated Comment comment_list = 2;
+ //
+ string comment_num = 3;
+ //
+ bool show_all_comment = 4;
+}
+
+//
+message Module13 {
+ //
+ int64 pkg_size = 1;
+ //
+ string customer_service = 2;
+ //
+ string website = 3;
+ //
+ string authority = 4;
+ //
+ string privacy = 5;
+ //
+ string developer_name = 6;
+ //
+ string update_time = 7;
+ //
+ string game_version = 8;
+ //
+ string android_pkg_name = 9;
+}
+
+//
+message Module14 {
+ //
+ repeated Reward reward_list = 1;
+ //
+ bool display = 2;
+}
+
+//
+message NotClickableArea {
+ //
+ int32 x = 1;
+ //
+ int32 y = 2;
+ //
+ int32 z = 3;
+}
+
+//
+message QualityInfo {
+ //
+ string icon = 1;
+ //
+ string text = 2;
+ //
+ bool is_bg = 3;
+ //
+ string bg_color = 4;
+ //
+ string bg_color_night = 5;
+}
+
+//
+message QualityParmas {
+ //
+ string first_line = 1;
+ //
+ string second_line = 2;
+ //
+ double grade = 3;
+ //
+ string rank_icon = 4;
+ //
+ int32 quality_type = 5;
+}
+
+//
+message Reward {
+ //
+ int32 level = 1;
+ //
+ string title = 2;
+ //
+ string content = 3;
+ //
+ string pic = 4;
+ //
+ bool reach = 5;
+}
+
+//
+message ScreenShots {
+ //
+ string url = 1;
+ //
+ int32 height = 2;
+ //
+ int32 width = 3;
+ //
+ int32 seq = 4;
+}
+
+// 广告数据
+message SourceContentDto {
+ // 广告请求id
+ string request_id = 1;
+ // 广告资源位source ID
+ int32 source_id = 2;
+ // 广告资源位resource ID
+ int32 resource_id = 3;
+ // 广告位上报标记,对广告返回数据恒为true
+ bool is_ad_loc = 4;
+ // 与天马现有逻辑一致, 0有含义
+ // 0:内容 1:广告
+ google.protobuf.Int32Value server_type = 5;
+ // 客户端IP回传拼接
+ string client_ip = 6;
+ // 广告卡片位置在一刷中的位置, 天马用, 0有含义
+ google.protobuf.Int32Value card_index = 7;
+ // 广告资源位source 位次
+ int32 index = 8;
+ // 广告内容
+ AdDto ad_content = 9;
+}
+
+//
+message SubCardModule {
+ //
+ string subcard_type = 1;
+ //
+ string icon = 2;
+ //
+ string desc = 3;
+ //
+ string rank_stars = 4;
+ //
+ string amount_number = 5;
+ //
+ string avatar = 6;
+ //
+ string title = 7;
+ //
+ AdButtonDto button = 8;
+ //
+ repeated TagInfo tag_infos = 9;
+}
+
+//
+message Tab2ExtraDto {
+ //
+ string cover_url = 1;
+ //
+ string title = 2;
+ //
+ string desc = 3;
+ //
+ AdButtonDto button = 5;
+ //
+ int32 auto_animate_time_ms = 6;
+ //
+ bool enable_click = 7;
+ //
+ string panel_url = 8;
+ //
+ repeated AppPackageDto download_whitelist = 9;
+ //
+ repeated string open_whitelist = 10;
+ //
+ bool use_ad_web_v2 = 11;
+ //
+ bool enable_store_direct_launch = 12;
+ //
+ int32 sales_type = 13;
+ //
+ int32 landingpage_download_style = 15;
+ //
+ int32 appstore_priority = 16;
+ //
+ string appstore_url = 17;
+ //
+ int32 appstore_delay_time = 18;
+ //
+ int32 page_cover_type = 19;
+ //
+ int32 page_pull_type = 20;
+ //
+ AndroidGamePageRes android_game_page_res = 21;
+ //
+ IosGamePageRes ios_game_page_res = 22;
+ //
+ AdBusinessMarkDto ad_tag_style = 23;
+ //
+ AdFeedbackPanelDto feedback_panel = 24;
+ //
+ string ad_cb = 25;
+ //
+ int32 url_type = 26;
+}
+
+//
+message TabExtraDto {
+ //
+ string tab_url = 1;
+ //
+ int32 enable_store_direct_launch = 2;
+ //
+ int32 store_callup_card = 3;
+ //
+ int32 sales_type = 4;
+ //
+ repeated AppPackageDto download_whitelist = 5;
+ //
+ bool special_industry = 6;
+ //
+ string special_industry_tips = 7;
+ //
+ repeated string open_whitelist = 8;
+ //
+ int32 landingpage_download_style = 9;
+ //
+ int32 appstore_priority = 10;
+ //
+ bool use_ad_web_v2 = 11;
+ //
+ bool enable_download_dialog = 12;
+ //
+ string appstore_url = 13;
+ //
+ int32 appstore_delay_time = 14;
+}
+
+//
+message TabInfoDto {
+ //
+ string tab_name = 1;
+ //
+ google.protobuf.Any extra = 2;
+ //
+ int32 tab_version = 3;
+}
+
+//
+message TagInfo {
+ //
+ string text = 1;
+ //
+ string text_color = 2;
+ //
+ string text_color_night = 3;
+ //
+ string bg_color = 4;
+ //
+ string bg_color_night = 5;
+ //
+ string border_color = 6;
+ //
+ string border_color_night = 7;
+ //
+ string type = 8;
+}
+
+//
+message WxProgramInfo {
+ //
+ string org_id = 1;
+ //
+ string name = 2;
+ //
+ string path = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/api/player/v1/player.proto b/bili-api/grpc/proto/bilibili/api/player/v1/player.proto
new file mode 100644
index 000000000..1db45237e
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/api/player/v1/player.proto
@@ -0,0 +1,77 @@
+syntax = "proto3";
+
+package bilibili.api.player.v1;
+
+option java_multiple_files = true;
+
+// 心跳上报
+service Heartbeat {
+ // 客户端心跳上报
+ rpc Mobile(HeartbeatReq) returns (HeartbeatReply);
+}
+
+// 客户端心跳上报-响应
+message HeartbeatReply {
+ // 时间戳
+ int64 ts = 1;
+}
+
+// 客户端心跳上报-请求
+message HeartbeatReq {
+ //
+ int64 server_time = 1;
+ //
+ string session = 2;
+ // 用户 mid
+ int64 mid = 3;
+ // 稿件 avid
+ int64 aid = 4;
+ // 视频 cid
+ int64 cid = 5;
+ //
+ string sid = 6;
+ //
+ int64 epid = 7;
+ //
+ string type = 8;
+ //
+ int32 sub_type = 9;
+ //
+ int32 quality = 10;
+ //
+ int64 total_time = 11;
+ //
+ int64 paused_time = 12;
+ //
+ int64 played_time = 13;
+ //
+ int64 video_duration = 14;
+ //
+ string play_type = 15;
+ //
+ int32 network_type = 16;
+ //
+ int64 last_play_progress_time = 17;
+ //
+ int64 max_play_progress_time = 18;
+ //
+ int32 from = 19;
+ //
+ string from_spmid = 20;
+ //
+ string spmid = 21;
+ //
+ string epid_status = 22;
+ //
+ string play_status = 23;
+ //
+ string user_status = 24;
+ //
+ int64 actual_played_time = 25;
+ //
+ int32 auto_play = 26;
+ //
+ int64 list_play_time = 27;
+ //
+ int64 detail_play_time = 28;
+}
diff --git a/bili-api/grpc/proto/bilibili/api/probe/v1/probe.proto b/bili-api/grpc/proto/bilibili/api/probe/v1/probe.proto
new file mode 100644
index 000000000..3a83ae7df
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/api/probe/v1/probe.proto
@@ -0,0 +1,194 @@
+syntax = "proto3";
+
+package bilibili.api.probe.v1;
+
+option java_multiple_files = true;
+
+// 服务可用性探针
+service Probe {
+ //
+ rpc TestCode (CodeReq) returns (CodeReply);
+ //
+ rpc TestReq (ProbeReq) returns (ProbeReply);
+ //
+ rpc TestStream (ProbeStreamReq) returns (ProbeStreamReply);
+ //
+ rpc TestSub (ProbeSubReq) returns (ProbeSubReply);
+}
+
+// 服务可用性探针
+service ProbeService {
+ //
+ rpc Echo(SimpleMessage) returns (SimpleMessage);
+ //
+ rpc EchoBody(SimpleMessage) returns (SimpleMessage);
+ //
+ rpc EchoDelete(SimpleMessage) returns (SimpleMessage);
+ //
+ rpc EchoError(ErrorMessage) returns (ErrorMessage);
+ //
+ rpc EchoPatch(DynamicMessageUpdate) returns (DynamicMessageUpdate);
+}
+
+//
+enum Category {
+ CATEGORY_UNSPECIFIED = 0; //
+ CATEGORY_ONE = 1; //
+ CATEGORY_TWO = 2; //
+ CATEGORY_THREE = 3; //
+ CATEGORY_FOUR = 4; //
+}
+
+//
+message CodeReply {
+ //
+ string id = 1;
+ //
+ string id1 = 2;
+ //
+ int64 code = 3;
+ //
+ string message_s = 4;
+}
+
+//
+message CodeReq {
+ //
+ int64 code = 1;
+}
+
+//
+message CreateTopic {
+ //
+ int64 id = 1;
+}
+
+//
+message CreatTask {
+ //
+ string task = 1;
+}
+
+//
+message DynamicMessageUpdate {
+ //
+ SimpleMessage body = 1;
+}
+
+//
+message Embedded {
+ //
+ bool bool_val = 1;
+ //
+ int32 int32_val = 2;
+ //
+ int64 int64_val = 3;
+ //
+ float float_val = 4;
+ //
+ double double_val = 5;
+ //
+ string string_val = 6;
+ //
+ repeated bool repeated_bool_val = 7;
+ //
+ repeated int32 repeated_int32_val = 8;
+ //
+ repeated int64 repeated_int64_val = 9;
+ //
+ repeated float repeated_float_val = 10;
+ //
+ repeated double repeated_double_val = 11;
+ //
+ repeated string repeated_string_val = 12;
+ //
+ map map_string_val = 13;
+ //
+ map map_error_val = 14;
+}
+
+//
+message ErrorMessage {
+ //
+ int64 code = 1;
+ //
+ string reason = 2;
+ //
+ string message = 3;
+}
+
+// Deprecated
+enum ErrorReason {
+ PROBE_UNSPECIFIED = 0; //
+ PROBE_CATEGORY_NOTFOUND = 1; //
+}
+
+//
+message ProbeReply {
+ //
+ string content = 1;
+ //
+ int64 timestamp = 2;
+}
+
+//
+message ProbeReq {
+ //
+ int64 mid = 1;
+ //
+ string buvid = 2;
+}
+
+//
+message ProbeStreamReply {
+ //
+ int64 sequence = 1;
+ //
+ int64 timestamp = 2;
+ //
+ string content = 3;
+}
+
+//
+message ProbeStreamReq {
+ //
+ int64 mid = 1;
+ //
+ int64 sequence = 2;
+}
+
+//
+message ProbeSubReply {
+ //
+ int64 message_id = 1;
+}
+
+//
+message ProbeSubReq {
+ //
+ string buvid = 1;
+}
+
+//
+message SimpleMessage {
+ //
+ int32 id = 1;
+ //
+ int64 num = 2;
+ //
+ string lang = 3;
+ //
+ int32 cate = 4;
+ //
+ Embedded embedded = 5;
+}
+
+//
+message Task {
+ //
+ string name = 1;
+ //
+ string author = 2;
+ //
+ bool cache = 3;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/api/ticket/v1/ticket.proto b/bili-api/grpc/proto/bilibili/api/ticket/v1/ticket.proto
new file mode 100644
index 000000000..c53706a64
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/api/ticket/v1/ticket.proto
@@ -0,0 +1,41 @@
+syntax = "proto3";
+
+package bilibili.api.ticket.v1;
+
+option java_multiple_files = true;
+
+service Ticket {
+ // 获取鉴权用 Ticket
+ rpc GetTicket (GetTicketRequest) returns (GetTicketResponse);
+}
+
+//
+message GetTicketRequest {
+ // 包含:
+ // + x-fingerprint(包含手机各类信息, 使用 datacenter.hakase.protobuf.AndroidDeviceInfo 生成)
+ // + x-exbadbasket(?)
+ map context = 1;
+ // 暂时固定为 ec01
+ string key_id = 2;
+ //
+ bytes sign = 3;
+ // 暂时留空
+ string token = 4;
+}
+
+//
+message GetTicketResponse {
+ //
+ message Context {
+ //
+ string v_voucher = 1;
+ }
+ // x-bili-ticket
+ string ticket = 1;
+ // 有效期起
+ int64 created_at = 2;
+ // 有效期
+ int64 ttl = 3;
+ //
+ Context context = 4;
+}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/archive/middleware/v1/preload.proto b/bili-api/grpc/proto/bilibili/app/archive/middleware/v1/preload.proto
similarity index 68%
rename from bili-api-grpc/proto/bilibili/app/archive/middleware/v1/preload.proto
rename to bili-api/grpc/proto/bilibili/app/archive/middleware/v1/preload.proto
index 66d9d1637..d458fea3e 100644
--- a/bili-api-grpc/proto/bilibili/app/archive/middleware/v1/preload.proto
+++ b/bili-api/grpc/proto/bilibili/app/archive/middleware/v1/preload.proto
@@ -13,8 +13,8 @@ message PlayerArgs {
// 流类型
int64 fnval = 3;
// 返回url是否强制使用域名
- // 0:不强制使用域名 1:http域名 2:https域名
- int64 force_host = 4;
- // 音量均衡
- int64 voice_balance = 5;
+ // 0:不强制使用域名 1:http域名 2:https域名
+ int64 force_host = 4;
+ // 音量均衡
+ int64 voice_balance = 5;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/archive/v1/archive.proto b/bili-api/grpc/proto/bilibili/app/archive/v1/archive.proto
new file mode 100644
index 000000000..7ec53e7fb
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/archive/v1/archive.proto
@@ -0,0 +1,204 @@
+syntax = "proto3";
+
+package bilibili.app.archive.v1;
+
+option java_multiple_files = true;
+
+// 稿件基本信息
+message Arc {
+ // 稿件avid
+ int64 aid = 1;
+ // 稿件分P数
+ int64 videos = 2;
+ // 分区id
+ int32 type_id = 3;
+ // 二级分区名
+ string type_name = 4;
+ // 稿件类型
+ // 1:原创 2:转载
+ int32 copyright = 5;
+ // 稿件封面url
+ string pic = 6;
+ // 稿件标题
+ string title = 7;
+ // 稿件发布时间
+ int64 pubdate = 8;
+ // 用户投稿时间
+ int64 ctime = 9;
+ // 稿件简介
+ string desc = 10;
+ // 稿件状态
+ int32 state = 11;
+ // 访问属性
+ // 0:全部可见 10000:登录可见
+ int32 access = 12;
+ // 属性位配置(现在无了)
+ int32 attribute = 13;
+ // 空
+ string tag = 14;
+ // 空
+ repeated string tags = 15;
+ // 稿件总时长(单位为秒)
+ int64 duration = 16;
+ // 参与的活动id
+ int64 mission_id = 17;
+ // 绑定的商单id
+ int64 order_id = 18;
+ // PGC稿件强制重定向url(如番剧、影视)
+ string redirect_url = 19;
+ // 空
+ int64 forward = 20;
+ // 控制标志
+ Rights rights = 21;
+ // UP主信息
+ Author author = 22;
+ // 状态数
+ Stat stat = 23;
+ // 空
+ string report_result = 24;
+ // 投稿时发送的动态内容
+ string dynamic = 25;
+ // 稿件1P cid
+ int64 first_cid = 26;
+ // 稿件1P 分辨率
+ Dimension dimension = 27;
+ // 合作组成员列表
+ repeated StaffInfo staff_info = 28;
+ // UGC合集id
+ int64 season_id = 29;
+ // 新版属性位配置(也没用)
+ int64 attribute_v2 = 30;
+ //
+ SeasonTheme season_theme = 31;
+ //
+ string short_link_v2 = 40;
+ //
+ int32 up_from_v2 = 41;
+ //
+ string first_frame = 42;
+}
+
+// UP主信息
+message Author {
+ // UP主mid
+ int64 mid = 1;
+ // UP主昵称
+ string name = 2;
+ // UP主头像url
+ string face = 3;
+}
+
+// 分辨率
+message Dimension {
+ // 宽度
+ int64 width = 1;
+ // 高度
+ int64 height = 2;
+ // 方向
+ // 0:横屏 1:竖屏
+ int64 rotate = 3;
+}
+
+// 分P信息
+message Page {
+ // 视频cid
+ int64 cid = 1;
+ // 分P序号
+ int32 page = 2;
+ // 源类型
+ // vupload:B站 qq:腾讯 hunan:芒果
+ string from = 3;
+ // 分P标题
+ string part = 4;
+ // 分P时长(单位为秒)
+ int64 duration = 5;
+ // 外链vid
+ string vid = 6;
+ // 分P简介
+ string desc = 7;
+ // 外链url
+ string webLink = 8;
+ // 分P分辨率
+ Dimension dimension = 9;
+ //
+ string first_frame = 10;
+}
+
+// 稿件控制标志
+message Rights {
+ // 老版是否付费
+ int32 bp = 1;
+ // 允许充电
+ int32 elec = 2;
+ // 允许下载
+ int32 download = 3;
+ // 是否电影
+ int32 movie = 4;
+ // PGC稿件需要付费
+ int32 pay = 5;
+ // 是否高码率
+ int32 hd5 = 6;
+ // 是否显示“禁止转载”标志
+ int32 no_reprint = 7;
+ // 是否允许自动播放
+ int32 autoplay = 8;
+ // UGC稿件需要付费(旧版)
+ int32 ugc_pay = 9;
+ // 是否联合投稿
+ int32 is_cooperation = 10;
+ // 是否UGC付费预览
+ int32 ugc_pay_preview = 11;
+ // 是否禁止后台播放
+ int32 no_background = 12;
+ // UGC稿件需要付费
+ int32 arc_pay = 13;
+ // 是否已付费可自由观看
+ int32 pay_free_watch = 14;
+}
+
+//
+message SeasonTheme {
+ //
+ string bg_color = 1;
+ //
+ string selected_bg_color = 2;
+ //
+ string text_color = 3;
+}
+
+// 合作成员信息
+message StaffInfo {
+ // 成员mid
+ int64 mid = 1;
+ // 成员角色
+ string title = 2;
+ // 属性位
+ // 0:普通 1:赞助商金色标志
+ int64 attribute = 3;
+}
+
+// 状态数
+message Stat {
+ // 稿件avid
+ int64 aid = 1;
+ // 播放数(当屏蔽时为-1)
+ int32 view = 2;
+ // 弹幕数
+ int32 danmaku = 3;
+ // 评论数
+ int32 reply = 4;
+ // 收藏数
+ int32 fav = 5;
+ // 投币数
+ int32 coin = 6;
+ // 分享数
+ int32 share = 7;
+ // 当前排名
+ int32 now_rank = 8;
+ // 历史最高排名
+ int32 his_rank = 9;
+ // 点赞数
+ int32 like = 10;
+ // 点踩数(前端不可见故恒为0)
+ int32 dislike = 11;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/card/v1/ad.proto b/bili-api/grpc/proto/bilibili/app/card/v1/ad.proto
new file mode 100644
index 000000000..28cd958af
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/card/v1/ad.proto
@@ -0,0 +1,67 @@
+syntax = "proto3";
+
+package bilibili.app.card.v1;
+
+option java_multiple_files = true;
+
+//
+message AdInfo {
+ //
+ int64 creative_id = 1;
+ //
+ int32 creative_type = 2;
+ //
+ int32 card_type = 3;
+ //
+ CreativeContent creative_content = 4;
+ //
+ string ad_cb = 5;
+ //
+ int64 resource = 6;
+ //
+ int32 source = 7;
+ //
+ string request_id = 8;
+ //
+ bool is_ad = 9;
+ //
+ int64 cm_mark = 10;
+ //
+ int32 index = 11;
+ //
+ bool is_ad_loc = 12;
+ //
+ int32 card_index = 13;
+ //
+ string client_ip = 14;
+ //
+ bytes extra = 15;
+ //
+ int32 creative_style = 16;
+}
+
+//
+message CreativeContent {
+ //
+ string title = 1;
+ //
+ string description = 2;
+ //
+ int64 video_id = 3;
+ //
+ string username = 4;
+ //
+ string image_url = 5;
+ //
+ string image_md5 = 6;
+ //
+ string log_url = 7;
+ //
+ string log_md5 = 8;
+ //
+ string url = 9;
+ //
+ string click_url = 10;
+ //
+ string show_url = 11;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/card/v1/card.proto b/bili-api/grpc/proto/bilibili/app/card/v1/card.proto
new file mode 100644
index 000000000..76d5e5739
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/card/v1/card.proto
@@ -0,0 +1,35 @@
+syntax = "proto3";
+
+package bilibili.app.card.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/card/v1/single.proto";
+
+// 卡片信息
+message Card {
+ oneof item {
+ // 小封面条目
+ SmallCoverV5 small_cover_v5 = 1;
+ //
+ LargeCoverV1 large_cover_v1 = 2;
+ //
+ ThreeItemAllV2 three_item_all_v2 = 3;
+ //
+ ThreeItemV1 three_item_v1 = 4;
+ //
+ HotTopic hot_topic = 5;
+ //
+ DynamicHot three_item_h_v5 = 6;
+ //
+ MiddleCoverV3 middle_cover_v3 = 7;
+ //
+ LargeCoverV4 large_cover_v4 = 8;
+ // 热门列表顶部按钮
+ PopularTopEntrance popular_top_entrance = 9;
+ //
+ RcmdOneItem rcmd_one_item = 10;
+ //
+ SmallCoverV5Ad small_cover_v5_ad = 11;
+ }
+}
diff --git a/bili-api/grpc/proto/bilibili/app/card/v1/common.proto b/bili-api/grpc/proto/bilibili/app/card/v1/common.proto
new file mode 100644
index 000000000..d09c876c3
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/card/v1/common.proto
@@ -0,0 +1,342 @@
+syntax = "proto3";
+
+package bilibili.app.card.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/card/v1/ad.proto";
+
+//
+message Args {
+ //
+ int32 type = 1;
+ //
+ int64 up_id = 2;
+ //
+ string up_name = 3;
+ //
+ int32 rid = 4;
+ //
+ string rname = 5;
+ //
+ int64 tid = 6;
+ //
+ string tname = 7;
+ //
+ string track_id = 8;
+ //
+ string state = 9;
+ //
+ int32 converge_type = 10;
+ //
+ int64 aid = 11;
+}
+
+//
+message Avatar {
+ //
+ string cover = 1;
+ //
+ string text = 2;
+ //
+ string uri = 3;
+ //
+ int32 type = 4;
+ //
+ string event = 5;
+ //
+ string event_v2 = 6;
+ //
+ int32 defalut_cover = 7;
+}
+
+// 条目基本信息
+message Base {
+ // 卡片类型
+ string card_type = 1;
+ // 卡片跳转类型?
+ string card_goto = 2;
+ // 跳转类型
+ // av:视频稿件 mid:用户空间
+ string goto = 3;
+ // 目标参数
+ string param = 4;
+ // 封面url
+ string cover = 5;
+ // 标题
+ string title = 6;
+ // 跳转uri
+ string uri = 7;
+ //
+ ThreePoint three_point = 8;
+ //
+ Args args = 9;
+ //
+ PlayerArgs player_args = 10;
+ // 条目排位序号
+ int64 idx = 11;
+ //
+ AdInfo ad_info = 12;
+ //
+ Mask mask = 13;
+ //来源标识
+ // recommend:推荐 operation:管理?
+ string from_type = 14;
+ //
+ repeated ThreePointV2 three_point_v2 = 15;
+ //
+ repeated ThreePointV3 three_point_v3 = 16;
+ //
+ Button desc_button = 17;
+ // 三点v4
+ ThreePointV4 three_point_v4 = 18;
+ //
+ UpArgs up_args = 19;
+}
+
+// 按钮信息
+message Button {
+ // 文案
+ string text = 1;
+ // 参数
+ string param = 2;
+ //
+ string uri = 3;
+ // 事件
+ string event = 4;
+ //
+ int32 selected = 5;
+ // 类型
+ int32 type = 6;
+ // 事件v2
+ string event_v2 = 7;
+ // 关系信息
+ Relation relation = 8;
+}
+
+//
+message DislikeReason {
+ //
+ int64 id = 1;
+ //
+ string name = 2;
+}
+
+//
+message LikeButton {
+ //
+ int64 Aid = 1;
+ //
+ int32 count = 2;
+ //
+ bool show_count = 3;
+ //
+ string event = 4;
+ //
+ int32 selected = 5;
+ //
+ string event_v2 = 6;
+}
+
+//
+message Mask {
+ //
+ Avatar avatar = 1;
+ //
+ Button button = 2;
+}
+
+//
+message PlayerArgs {
+ //
+ int32 is_live = 1;
+ //
+ int64 aid = 2;
+ //
+ int64 cid = 3;
+ //
+ int32 sub_type = 4;
+ //
+ int64 room_id = 5;
+ //
+ int64 ep_id = 7;
+ //
+ int32 is_preview = 8;
+ //
+ string type = 9;
+ //
+ int64 duration = 10;
+ //
+ int64 season_id = 11;
+}
+
+// 标签框信息
+message ReasonStyle {
+ // 文案
+ string text = 1;
+ // 文字颜色
+ string text_color = 2;
+ // 背景色
+ string bg_color = 3;
+ // 边框色
+ string border_color = 4;
+ // 图标url
+ string icon_url = 5;
+ // 文字颜色-夜间
+ string text_color_night = 6;
+ // 背景色-夜间
+ string bg_color_night = 7;
+ // 边框色-夜间
+ string border_color_night = 8;
+ // 图标url-夜间
+ string icon_night_url = 9;
+ // 背景风格id
+ // 1:无背景 2:有背景
+ int32 bg_style = 10;
+ //
+ string uri = 11;
+ //
+ string icon_bg_url = 12;
+ //
+ string event = 13;
+ //
+ string event_v2 = 14;
+ //
+ int32 right_icon_type = 15;
+ //
+ string left_icon_type = 16;
+}
+
+// 关系信息
+message Relation {
+ // 关系状态
+ int32 status = 1;
+ // 是否关注
+ int32 is_follow = 2;
+ // 是否粉丝
+ int32 is_followed = 3;
+}
+
+// 分享面板信息
+message SharePlane {
+ // 标题
+ string title = 1;
+ // 副标贴文案
+ string share_subtitle = 2;
+ // 备注
+ string desc = 3;
+ // 封面url
+ string cover = 4;
+ // 稿件avid
+ int64 aid = 5;
+ // 稿件bvid
+ string bvid = 6;
+ // 允许分享方式
+ map share_to = 7;
+ // UP主昵称
+ string author = 8;
+ // UP主mid
+ int64 author_id = 9;
+ // 短连接
+ string short_link = 10;
+ // 播放次数文案
+ string play_number = 11;
+ //
+ int64 first_cid = 12;
+}
+
+//
+message ThreePoint {
+ //
+ repeated DislikeReason dislike_reasons = 1;
+ //
+ repeated DislikeReason feedbacks = 2;
+ //稍后再看
+ int32 watch_later = 3;
+}
+
+//
+message ThreePointV2 {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ repeated DislikeReason reasons = 3;
+ //
+ string type = 4;
+ //
+ int64 id = 5;
+}
+
+//
+message ThreePointV3 {
+ //
+ string title = 1;
+ //
+ string selected_title = 2;
+ //
+ string subtitle = 3;
+ //
+ repeated DislikeReason reasons = 4;
+ //
+ string type = 5;
+ //
+ int64 id = 6;
+ //
+ int32 selected = 7;
+ //
+ string icon = 8;
+ //
+ string selected_icon = 9;
+ //
+ string url = 10;
+ //
+ int32 default_id = 11;
+}
+
+// 三点v4
+message ThreePointV4 {
+ // 分享面板信息
+ SharePlane share_plane = 1;
+ // 稍后再看
+ WatchLater watch_later = 2;
+}
+
+//
+message Up {
+ //
+ int64 id = 1;
+ //
+ string name = 2;
+ //
+ string desc = 3;
+ //
+ Avatar avatar = 4;
+ //
+ int32 official_icon = 5;
+ //
+ Button desc_button = 6;
+ //
+ string cooperation = 7;
+}
+
+//
+message UpArgs {
+ //
+ int64 up_id = 1;
+ //
+ string up_name = 2;
+ //
+ string up_face = 3;
+ //
+ int64 selected = 4;
+}
+
+// 稍后再看信息
+message WatchLater {
+ // 稿件avid
+ int64 aid = 1;
+ // 稿件bvid
+ string bvid = 2;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/card/v1/double.proto b/bili-api/grpc/proto/bilibili/app/card/v1/double.proto
new file mode 100644
index 000000000..1bacfbdd6
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/card/v1/double.proto
@@ -0,0 +1,418 @@
+syntax = "proto3";
+
+package bilibili.app.card.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/card/v1/common.proto";
+
+//
+message DoubleCards {
+ oneof Card {
+ //
+ SmallCoverV2 small_cover_v2 = 1;
+ //
+ OnePicV2 one_pic_v2 = 2;
+ //
+ ThreePicV2 three_pic_v2 = 3;
+ }
+}
+
+//
+message SmallCoverV2 {
+ //
+ Base base = 1;
+ //
+ string cover_gif = 2;
+ //
+ int32 cover_blur = 3;
+ //
+ string cover_left_text_1 = 4;
+ //
+ int32 cover_left_icon_1 = 5;
+ //
+ string cover_left_text_2 = 6;
+ //
+ int32 cover_left_icon_2 = 7;
+ //
+ string cover_right_text = 8;
+ //
+ int32 cover_right_icon = 9;
+ //
+ string cover_right_background_color = 10;
+ //
+ string subtitle = 11;
+ //
+ string badge = 12;
+ //
+ string rcmd_reason = 13;
+ //
+ string desc = 14;
+ //
+ Avatar avatar = 15;
+ //
+ int32 official_icon = 16;
+ //
+ int32 can_play = 17;
+ //
+ ReasonStyle rcmd_reason_style = 18;
+ //
+ ReasonStyle rcmd_reason_style_v2 = 19;
+ //
+ LikeButton like_button = 20;
+}
+
+//
+message SmallCoverV3 {
+ //
+ Base base = 1;
+ //
+ Avatar avatar = 2;
+ //
+ string cover_left_text = 3;
+ //
+ Button cover_right_button = 4;
+ //
+ string rcmd_reason = 5;
+ //
+ string desc = 6;
+ //
+ int32 official_icon = 7;
+ //
+ int32 can_play = 8;
+ //
+ ReasonStyle rcmd_reason_style = 9;
+}
+
+//
+message MiddleCoverV2 {
+ //
+ Base base = 1;
+ //
+ int32 ratio = 2;
+ //
+ string desc = 3;
+ //
+ string badge = 4;
+}
+
+//
+message LargeCoverV2 {
+ //
+ Base base = 1;
+ //
+ Avatar avatar = 2;
+ //
+ string badge = 3;
+ //
+ Button cover_right_button = 4;
+ //
+ string cover_left_text_1 = 5;
+ //
+ int32 cover_left_icon_1 = 6;
+ //
+ string cover_left_text_2 = 7;
+ //
+ int32 cover_left_icon_2 = 8;
+ //
+ string rcmd_reason = 9;
+ //
+ int32 official_icon = 10;
+ //
+ int32 can_play = 11;
+ //
+ ReasonStyle rcmd_reason_style = 12;
+ //
+ int32 show_top = 13;
+ //
+ int32 show_bottom = 14;
+}
+
+//
+message ThreeItemV2 {
+ //
+ Base base = 1;
+ //
+ int32 title_icon = 2;
+ //
+ string more_uri = 3;
+ //
+ string more_text = 4;
+ //
+ repeated ThreeItemV2Item items = 5;
+}
+
+//
+message ThreeItemV2Item {
+ //
+ Base base = 1;
+ //
+ int32 cover_left_icon = 2;
+ //
+ string desc_text_1 = 3;
+ //
+ int32 desc_icon_1 = 4;
+ //
+ string desc_text_2 = 5;
+ //
+ int32 desc_icon_2 = 6;
+ //
+ string badge = 7;
+}
+
+//
+message SmallCoverV4 {
+ //
+ Base base = 1;
+ //
+ string cover_badge = 2;
+ //
+ string desc = 3;
+ //
+ string title_right_text = 4;
+ //
+ int32 title_right_pic = 5;
+}
+
+//
+message TwoItemV2 {
+ //
+ Base base = 1;
+ //
+ repeated TwoItemV2Item items = 2;
+}
+
+message TwoItemV2Item {
+ //
+ Base base = 1;
+ //
+ string badge = 2;
+ //
+ string cover_left_text_1 = 3;
+ //
+ int32 cover_left_icon_1 = 4;
+}
+
+//
+message MultiItem {
+ //
+ Base base = 1;
+ //
+ string more_uri = 2;
+ //
+ string more_text = 3;
+ //
+ repeated DoubleCards items = 4;
+}
+
+//
+message ThreePicV2 {
+ //
+ Base base = 1;
+ //
+ string left_cover = 2;
+ //
+ string right_cover_1 = 3;
+ //
+ string right_cover_2 = 4;
+ //
+ string cover_left_text_1 = 5;
+ //
+ int32 cover_left_icon_1 = 6;
+ //
+ string cover_left_text_2 = 7;
+ //
+ int32 cover_left_icon_2 = 8;
+ //
+ string cover_right_text = 9;
+ //
+ int32 cover_right_icon = 10;
+ //
+ string cover_right_background_color = 11;
+ //
+ string badge = 12;
+ //
+ string rcmd_reason = 13;
+ //
+ string desc = 14;
+ //
+ Avatar avatar = 15;
+ //
+ ReasonStyle rcmd_reason_style = 16;
+}
+
+//
+message OnePicV2 {
+ //
+ Base base = 1;
+ //
+ int32 cover_left_icon_1 = 2;
+ //
+ string cover_left_text_2 = 3;
+ //
+ string cover_right_text = 4;
+ //
+ int32 cover_right_icon = 5;
+ //
+ string cover_right_background_color = 6;
+ //
+ string badge = 7;
+ //
+ string rcmd_reason = 8;
+ //
+ Avatar avatar = 9;
+ //
+ ReasonStyle rcmd_reason_style = 10;
+}
+
+//
+message LargeCoverV3 {
+ //
+ Base base = 1;
+ //
+ string cover_gif = 2;
+ //
+ Avatar avatar = 3;
+ //
+ ReasonStyle top_rcmd_reason_style = 4;
+ //
+ ReasonStyle bottom_rcmd_reason_style = 5;
+ //
+ string cover_left_text_1 = 6;
+ //
+ int32 cover_left_icon_1 = 7;
+ //
+ string cover_left_text_2 = 8;
+ //
+ int32 cover_left_icon_2 = 9;
+ //
+ string cover_right_text = 10;
+ //
+ string desc = 11;
+ //
+ int32 official_icon = 12;
+}
+
+//
+message ThreePicV3 {
+ //
+ Base base = 1;
+ //
+ string left_cover = 2;
+ //
+ string right_cover_1 = 3;
+ //
+ string right_cover_2 = 4;
+ //
+ string cover_left_text_1 = 5;
+ //
+ int32 cover_left_icon_1 = 6;
+ //
+ string cover_left_text_2 = 7;
+ //
+ int32 cover_left_icon_2 = 8;
+ //
+ string cover_right_text = 9;
+ //
+ int32 cover_right_icon = 10;
+ //
+ string cover_right_background_color = 11;
+ //
+ string badge = 12;
+ //
+ ReasonStyle rcmd_reason_style = 13;
+}
+
+//
+message OnePicV3 {
+ //
+ Base base = 1;
+ //
+ string cover_left_text_1 = 2;
+ //
+ int32 cover_left_icon_1 = 3;
+ //
+ string cover_right_text = 4;
+ //
+ int32 cover_right_icon = 5;
+ //
+ string cover_right_background_color = 6;
+ //
+ string badge = 7;
+ //
+ ReasonStyle rcmd_reason_style = 8;
+}
+
+//
+message SmallCoverV7 {
+ //
+ Base base = 1;
+ //
+ string desc = 2;
+}
+
+//
+message SmallCoverV9 {
+ //
+ Base base = 1;
+ //
+ string cover_left_text_1 = 2;
+ //
+ int32 cover_left_icon_1 = 3;
+ //
+ string cover_left_text_2 = 4;
+ //
+ int32 cover_left_icon_2 = 5;
+ //
+ string cover_right_text = 6;
+ //
+ int32 cover_right_icon = 7;
+ //
+ int32 can_play = 8;
+ //
+ ReasonStyle rcmd_reason_style = 9;
+ //
+ Up up = 10;
+ //
+ ReasonStyle left_cover_badge_style = 11;
+ //
+ ReasonStyle left_bottom_rcmd_reason_style = 12;
+}
+
+//
+message SmallCoverConvergeV2 {
+ //
+ Base base = 1;
+ //
+ string cover_left_text_1 = 2;
+ //
+ int32 cover_left_icon_1 = 3;
+ //
+ string cover_left_text_2 = 4;
+ //
+ int32 cover_left_icon_2 = 5;
+ //
+ string cover_right_text = 6;
+ //
+ string cover_right_top_text = 7;
+ //
+ ReasonStyle rcmd_reason_style = 8;
+ //
+ ReasonStyle rcmd_reason_style_v2 = 9;
+}
+
+//
+message SmallChannelSpecial {
+ //
+ Base base = 1;
+ //
+ string bg_cover = 2;
+ //
+ string desc_1 = 3;
+ //
+ string desc_2 = 4;
+ //
+ string badge = 5;
+ //
+ ReasonStyle rcmd_reason_style_2 = 6;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/card/v1/single.proto b/bili-api/grpc/proto/bilibili/app/card/v1/single.proto
new file mode 100644
index 000000000..8f38fc7ef
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/card/v1/single.proto
@@ -0,0 +1,355 @@
+syntax = "proto3";
+
+package bilibili.app.card.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/card/v1/common.proto";
+
+//
+message SmallCoverV5 {
+ // 条目基本信息
+ Base base = 1;
+ //
+ string cover_gif = 2;
+ //
+ Up up = 3;
+ // 封面右下角标文案
+ string cover_right_text_1 = 4;
+ // 右侧文案1
+ string right_desc_1 = 5;
+ // 右侧文案2
+ string right_desc_2 = 6;
+ // 右侧推荐原因标签框
+ ReasonStyle rcmd_reason_style = 7;
+ //
+ HotwordEntrance hotword_entrance = 8;
+ // 直播小卡的角标
+ ReasonStyle corner_mark_style = 9;
+ // 右侧文案1图标id
+ int32 right_icon_1 = 10;
+ // 右侧文案2图标id
+ int32 right_icon_2 = 11;
+ // 左上角角标
+ ReasonStyle left_corner_mark_style = 12;
+ //
+ string cover_right_text_content_description = 13;
+ //
+ string right_desc1_content_description = 14;
+}
+
+//
+message SmallCoverV5Ad {
+ //
+ Base base = 1;
+ //
+ string cover_gif = 2;
+ //
+ Up up = 3;
+ //
+ string cover_right_text1 = 4;
+ //
+ string right_desc1 = 5;
+ //
+ string right_desc2 = 6;
+ //
+ ReasonStyle rcmd_reason_style = 7;
+ //
+ HotwordEntrance hotword_entrance = 8;
+ //
+ ReasonStyle corner_mark_style = 9;
+ //
+ int32 right_icon1 = 10;
+ //
+ int32 right_icon2 = 11;
+ //
+ ReasonStyle left_corner_mark_style = 12;
+ //
+ string cover_right_text_content_description = 13;
+ //
+ string right_desc1_content_description = 14;
+}
+
+//
+message HotwordEntrance {
+ //
+ int64 hotword_id = 1;
+ //
+ string hot_text = 2;
+ //
+ string h5_url = 3;
+ //
+ string icon = 4;
+}
+
+//
+message LargeCoverV1 {
+ // 条目基本信息
+ Base base = 1;
+ //
+ string cover_gif = 2;
+ //
+ Avatar avatar = 3;
+ //
+ string cover_left_text_1 = 4;
+ //
+ string cover_left_text_2 = 5;
+ //
+ string cover_left_text_3 = 6;
+ //
+ string cover_badge = 7;
+ //
+ string top_rcmd_reason = 8;
+ //
+ string bottom_rcmd_reason = 9;
+ //
+ string desc = 10;
+ //
+ int32 official_icon = 11;
+ //
+ int32 can_play = 12;
+ //
+ ReasonStyle top_rcmd_reason_style = 13;
+ //
+ ReasonStyle bottom_rcmd_reason_style = 14;
+ //
+ ReasonStyle rcmd_reason_style_v2 = 15;
+ //
+ ReasonStyle left_cover_badge_style = 16;
+ //
+ ReasonStyle right_cover_badge_style = 17;
+ //
+ string cover_badge_2 = 18;
+ //
+ LikeButton like_button = 19;
+ //
+ int32 title_single_line = 20;
+ //
+ string cover_right_text = 21;
+}
+
+//
+message ThreeItemAllV2 {
+ // 条目基本信息
+ Base base = 1;
+ //
+ ReasonStyle top_rcmd_reason_style = 2;
+ //
+ repeated TwoItemHV1Item item = 3;
+}
+
+//
+message TwoItemHV1Item {
+ //
+ string title = 1;
+ //
+ string cover = 2;
+ //
+ string uri = 3;
+ //
+ string param = 4;
+ //
+ Args args = 5;
+ //
+ string goto = 6;
+ //
+ string cover_left_text_1 = 7;
+ //
+ int32 cover_left_icon_1 = 8;
+ //
+ string cover_right_text = 9;
+}
+
+// 推荐
+message RcmdOneItem {
+ // 条目基本信息
+ Base base = 1;
+ // 标签框信息
+ ReasonStyle topRcmdReasonStyle = 2;
+ // 小封面推荐内容信息
+ SmallCoverRcmdItem item = 3;
+}
+
+// 小封面推荐内容信息
+message SmallCoverRcmdItem {
+ // 标题
+ string title = 1;
+ // 封面url
+ string cover = 2;
+ // 跳转uri
+ string uri = 3;
+ // 参数
+ string param = 4;
+ // 跳转类型
+ // av:视频稿件
+ string goto = 5;
+ // 封面右下角标文案
+ string coverRightText1 = 6;
+ // 右侧文案1
+ string rightDesc1 = 7;
+ // 右侧文案2
+ string rightDesc2 = 8;
+ //
+ string coverGif = 9;
+ // 右侧文案1图标id
+ int32 rightIcon1 = 10;
+ // 右侧文案2图标id
+ int32 rightIcon2 = 11;
+ //
+ string cover_right_text_content_description = 12;
+ //
+ string right_desc1_content_description = 13;
+}
+
+//
+message ThreeItemV1 {
+ // 条目基本信息
+ Base base = 1;
+ //
+ int32 titleIcon = 2;
+ //
+ string moreUri = 3;
+ //
+ string moreText = 4;
+ //
+ repeated ThreeItemV1Item items = 5;
+}
+
+//
+message ThreeItemV1Item {
+ // 条目基本信息
+ Base base = 1;
+ //
+ string coverLeftText = 2;
+ //
+ int32 coverLeftIcon = 3;
+ //
+ string desc1 = 4;
+ //
+ string desc2 = 5;
+ //
+ string badge = 6;
+}
+
+//
+message HotTopicItem {
+ //
+ string cover = 1;
+ //
+ string uri = 2;
+ //
+ string param = 3;
+ //
+ string name = 4;
+}
+
+//
+message HotTopic {
+ // 条目基本信息
+ Base base = 1;
+ //
+ string desc = 2;
+ //
+ repeated HotTopicItem items = 3;
+}
+
+//
+message DynamicHot {
+ // 条目基本信息
+ Base base = 1;
+ //
+ string top_left_title = 2;
+ //
+ string desc1 = 3;
+ //
+ string desc2 = 4;
+ //
+ string more_uri = 5;
+ //
+ string more_text = 6;
+ //
+ repeated string covers = 7;
+ //
+ string cover_right_text = 8;
+ //
+ ReasonStyle top_rcmd_reason_style = 9;
+}
+
+//
+message MiddleCoverV3 {
+ // 条目基本信息
+ Base base = 1;
+ //
+ string desc1 = 2;
+ //
+ string desc2 = 3;
+ //
+ ReasonStyle cover_badge_style = 4;
+}
+
+//
+message LargeCoverV4 {
+ // 条目基本信息
+ Base base = 1;
+ //
+ string cover_left_text_1 = 2;
+ //
+ string cover_left_text_2 = 3;
+ //
+ string cover_left_text_3 = 4;
+ //
+ string cover_badge = 5;
+ //
+ int32 can_play = 6;
+ //
+ Up up = 7;
+ //
+ string short_link = 8;
+ //
+ string share_subtitle = 9;
+ //
+ string play_number = 10;
+ //
+ string bvid = 11;
+ //
+ string sub_param = 12;
+}
+
+// 热门列表顶部按钮
+message PopularTopEntrance {
+ // 条目基本信息
+ Base base = 1;
+ // 按钮项
+ repeated EntranceItem items = 2;
+}
+
+// 热门列表按钮信息
+message EntranceItem {
+ // 跳转类型
+ string goto = 1;
+ // 图标url
+ string icon = 2;
+ // 标题
+ string title = 3;
+ // 入口模块id
+ string module_id = 4;
+ // 跳转uri
+ string uri = 5;
+ // 入口id
+ int64 entrance_id = 6;
+ // 气泡信息
+ Bubble bubble = 7;
+ // 入口类型
+ // 1:代表分品类热门
+ int32 entrance_type = 8;
+}
+
+// 气泡信息
+message Bubble {
+ // 文案
+ string bubble_content = 1;
+ // 版本
+ int32 version = 2;
+ // 起始时间
+ int64 stime = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/click/v1/heartbeat.proto b/bili-api/grpc/proto/bilibili/app/click/v1/heartbeat.proto
new file mode 100644
index 000000000..1bed37ac2
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/click/v1/heartbeat.proto
@@ -0,0 +1,123 @@
+syntax = "proto3";
+
+package bilibili.app.click.v1;
+
+option java_multiple_files = true;
+
+service Click {
+
+}
+
+// 账户信息
+message AccountInfo {
+ //
+ uint64 mid = 1;
+}
+
+//
+message AppInfo {
+ //
+ string top_page_class = 1;
+ // 客户端首次启动时的毫秒时间戳
+ int64 ftime = 2;
+ //
+ string did = 3;
+}
+
+// 心跳补充信息
+message Extra {
+ //
+ string session = 1;
+ //
+ string refer = 2;
+}
+
+message HeartBeatReply {}
+
+//
+message HeartBeatReq {
+ //
+ string session_v2 = 1;
+ //
+ Stage stage = 2;
+ // 流加载失败timeout
+ uint64 stream_timeout = 3;
+ //
+ uint64 batch_frequency = 4;
+ //
+ float frequency = 5;
+ //
+ VideoMeta video_meta = 6;
+ //
+ AppInfo app_info = 7;
+ //
+ AccountInfo account_info = 8;
+ //
+ PreProcessResult pre_process_result = 9;
+ //
+ repeated PlayerStatus player_status = 10;
+ //
+ VideoInfo video_info = 11;
+}
+
+//
+message PlayerStatus {
+ //
+ float playback_rate = 1;
+ //
+ uint64 progress = 2;
+ //
+ PlayState play_state = 3;
+ //
+ bool is_buffering = 4;
+}
+
+//
+enum PlayState {
+ //
+ STATE_UNKNOWN = 0;
+ //
+ PREPARING = 1;
+ //
+ PREPARED = 2;
+ //
+ PLAYING = 3;
+ //
+ PAUSED = 4;
+ //
+ STOPPED = 5;
+ //
+ FAILED = 6;
+}
+
+//
+message PreProcessResult {
+ //
+ int64 vt = 1;
+}
+
+//
+enum Stage {
+ //
+ STAGE_UNKNOWN = 0;
+ //
+ START = 1;
+ //
+ END = 2;
+ //
+ SAMPLE = 3;
+}
+
+//
+message VideoInfo {
+ //
+ uint64 cid_duration = 1;
+}
+
+//
+message VideoMeta {
+ //
+ uint64 aid = 1;
+ //
+ uint64 cid = 2;
+}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/download.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/download.proto
similarity index 100%
rename from bili-api-grpc/proto/bilibili/app/distribution/setting/download.proto
rename to bili-api/grpc/proto/bilibili/app/distribution/setting/download.proto
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/dynamic.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/dynamic.proto
similarity index 87%
rename from bili-api-grpc/proto/bilibili/app/distribution/setting/dynamic.proto
rename to bili-api/grpc/proto/bilibili/app/distribution/setting/dynamic.proto
index 041780816..e7fbb6a9c 100644
--- a/bili-api-grpc/proto/bilibili/app/distribution/setting/dynamic.proto
+++ b/bili-api/grpc/proto/bilibili/app/distribution/setting/dynamic.proto
@@ -14,6 +14,6 @@ message DynamicAutoPlay {
//
message DynamicDeviceConfig {
- //
- DynamicAutoPlay auto_play = 1;
+ //
+ DynamicAutoPlay auto_play = 1;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/distribution/setting/experimental.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/experimental.proto
new file mode 100644
index 000000000..d868a3ec1
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/distribution/setting/experimental.proto
@@ -0,0 +1,67 @@
+syntax = "proto3";
+
+package bilibili.app.distribution.setting.experimental;
+
+option java_multiple_files = true;
+
+import "bilibili/app/distribution/v1/distribution.proto";
+
+//
+message DynamicSelect {
+ //
+ bilibili.app.distribution.v1.BoolValue fold = 1;
+}
+
+//
+message Exp {
+ //
+ bilibili.app.distribution.v1.Int64Value id = 1;
+ //
+ bilibili.app.distribution.v1.Int32Value bucket = 2;
+}
+
+//
+message ExperimentalConfig {
+ //
+ bilibili.app.distribution.v1.StringValue flag = 1;
+ //
+ repeated Exp exps = 2;
+}
+
+//
+message MultipleTusConfig {
+ //
+ TopLeft top_left = 1;
+ //
+ DynamicSelect dynamic_select = 2;
+}
+
+// APP首页头像跳转信息
+message TopLeft {
+ //
+ bilibili.app.distribution.v1.StringValue url = 1;
+ //
+ bilibili.app.distribution.v1.StringValue story_foreground_image = 2;
+ //
+ bilibili.app.distribution.v1.StringValue story_background_image = 3;
+ //
+ bilibili.app.distribution.v1.StringValue listen_foreground_image = 4;
+ //
+ bilibili.app.distribution.v1.StringValue listen_background_image = 5;
+ //
+ bilibili.app.distribution.v1.StringValue ios_story_foreground_image = 6;
+ //
+ bilibili.app.distribution.v1.StringValue ios_story_background_image = 7;
+ //
+ bilibili.app.distribution.v1.StringValue ios_listen_foreground_image = 8;
+ //
+ bilibili.app.distribution.v1.StringValue ios_listen_background_image = 9;
+ //
+ bilibili.app.distribution.v1.StringValue goto = 10;
+ //
+ bilibili.app.distribution.v1.StringValue url_v2 = 11;
+ //
+ bilibili.app.distribution.v1.Int64Value goto_v2 = 12;
+ //
+ bilibili.app.distribution.v1.StringValue badge = 13;
+}
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/internaldevice.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/internaldevice.proto
similarity index 100%
rename from bili-api-grpc/proto/bilibili/app/distribution/setting/internaldevice.proto
rename to bili-api/grpc/proto/bilibili/app/distribution/setting/internaldevice.proto
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/night.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/night.proto
similarity index 100%
rename from bili-api-grpc/proto/bilibili/app/distribution/setting/night.proto
rename to bili-api/grpc/proto/bilibili/app/distribution/setting/night.proto
diff --git a/bili-api/grpc/proto/bilibili/app/distribution/setting/other.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/other.proto
new file mode 100644
index 000000000..73ae36033
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/distribution/setting/other.proto
@@ -0,0 +1,27 @@
+syntax = "proto3";
+
+package bilibili.app.distribution.setting.other;
+
+option java_multiple_files = true;
+
+import "bilibili/app/distribution/v1/distribution.proto";
+
+//
+message OtherSettingsConfig {
+ //
+ bilibili.app.distribution.v1.Int64Value watermark_type = 1;
+ //
+ bilibili.app.distribution.v1.Int64Value web_image_quality_type = 2;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_read_pasteboard = 3;
+ //
+ bilibili.app.distribution.v1.BoolValue paste_auto_jump = 4;
+ //
+ bilibili.app.distribution.v1.BoolValue mini_screen_play_when_back = 5;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_resume_playing = 6;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_wifi_auto_update = 7;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_guide_screenshot_share = 8;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/distribution/setting/pegasus.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/pegasus.proto
new file mode 100644
index 000000000..f31dcbca4
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/distribution/setting/pegasus.proto
@@ -0,0 +1,43 @@
+syntax = "proto3";
+
+package bilibili.app.distribution.setting.pegasus;
+
+option java_multiple_files = true;
+
+import "bilibili/app/distribution/v1/distribution.proto";
+
+//
+message FeedModeValue {
+ //
+ bilibili.app.distribution.v1.Int64Value value = 1;
+}
+
+//
+message PegasusAutoPlay {
+ //
+ bilibili.app.distribution.v1.Int64Value single = 1;
+ //
+ bilibili.app.distribution.v1.Int64Value double = 2;
+ //
+ bilibili.app.distribution.v1.BoolValue single_affected_by_server_side = 3;
+ //
+ bilibili.app.distribution.v1.BoolValue double_affected_by_server_side = 4;
+}
+
+//
+message PegasusColumnValue {
+ //
+ bilibili.app.distribution.v1.Int64Value value = 1;
+ //
+ bilibili.app.distribution.v1.BoolValue affected_by_server_side = 2;
+}
+
+//
+message PegasusDeviceConfig {
+ //
+ PegasusColumnValue column = 1;
+ //
+ FeedModeValue mode = 2;
+ //
+ PegasusAutoPlay auto_play = 3;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/distribution/setting/play.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/play.proto
new file mode 100644
index 000000000..ce0b26cfa
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/distribution/setting/play.proto
@@ -0,0 +1,60 @@
+syntax = "proto3";
+
+package bilibili.app.distribution.setting.play;
+
+option java_multiple_files = true;
+
+import "bilibili/app/distribution/v1/distribution.proto";
+
+// 云端保存的播放器配置
+message CloudPlayConfig {
+ // 启用杜比全景声
+ bilibili.app.distribution.v1.BoolValue enable_panorama = 1;
+ // 启用杜比音效
+ bilibili.app.distribution.v1.BoolValue enable_dolby = 2;
+ // 启用震动
+ bilibili.app.distribution.v1.BoolValue enable_shake = 3;
+ // 启用后台播放
+ bilibili.app.distribution.v1.BoolValue enable_background = 4;
+ // 启用HIRES
+ bilibili.app.distribution.v1.BoolValue enable_loss_less = 5;
+}
+
+// 播放器策略配置
+message PlayConfig {
+ //
+ bilibili.app.distribution.v1.BoolValue should_auto_play = 1;
+ //
+ bilibili.app.distribution.v1.BoolValue should_auto_fullscreen = 2;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_playurl_https = 3;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_danmaku_interaction = 4;
+ //
+ bilibili.app.distribution.v1.Int64Value small_screen_status = 5;
+ //
+ bilibili.app.distribution.v1.Int64Value player_codec_mode_key = 6;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_gravity_rotate_screen = 7;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_danmaku_monospaced = 8;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_edit_subtitle = 9;
+ //
+ bilibili.app.distribution.v1.BoolValue enable_subtitle = 10;
+ //
+ bilibili.app.distribution.v1.Int64Value color_filter = 11;
+ //
+ bilibili.app.distribution.v1.BoolValue should_auto_story = 12;
+ //
+ bilibili.app.distribution.v1.BoolValue landscape_auto_story = 13;
+ //
+ bilibili.app.distribution.v1.BoolValue volume_balance = 14;
+}
+
+// 灰度测试特殊功能?
+message SpecificPlayConfig {
+ //
+ bilibili.app.distribution.v1.BoolValue enable_segmented_section = 1;
+}
+
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/privacy.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/privacy.proto
similarity index 66%
rename from bili-api-grpc/proto/bilibili/app/distribution/setting/privacy.proto
rename to bili-api/grpc/proto/bilibili/app/distribution/setting/privacy.proto
index 6206e52aa..067284db5 100644
--- a/bili-api-grpc/proto/bilibili/app/distribution/setting/privacy.proto
+++ b/bili-api/grpc/proto/bilibili/app/distribution/setting/privacy.proto
@@ -14,9 +14,9 @@ message MidPrivacySettingsConfig {
//
message PrivacySettingsConfig {
- //
- bilibili.app.distribution.v1.BoolValue ad_recommand_store = 1;
- // 传感器权限
- bilibili.app.distribution.v1.BoolValue sensor_access = 2;
+ //
+ bilibili.app.distribution.v1.BoolValue ad_recommand_store = 1;
+ // 传感器权限
+ bilibili.app.distribution.v1.BoolValue sensor_access = 2;
}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/distribution/setting/search.proto b/bili-api/grpc/proto/bilibili/app/distribution/setting/search.proto
similarity index 89%
rename from bili-api-grpc/proto/bilibili/app/distribution/setting/search.proto
rename to bili-api/grpc/proto/bilibili/app/distribution/setting/search.proto
index 08149a22d..b288ceee9 100644
--- a/bili-api-grpc/proto/bilibili/app/distribution/setting/search.proto
+++ b/bili-api/grpc/proto/bilibili/app/distribution/setting/search.proto
@@ -16,6 +16,6 @@ message SearchAutoPlay {
//
message SearchDeviceConfig {
- //
- SearchAutoPlay auto_play = 1;
+ //
+ SearchAutoPlay auto_play = 1;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/distribution/v1/distribution.proto b/bili-api/grpc/proto/bilibili/app/distribution/v1/distribution.proto
new file mode 100644
index 000000000..df9a502df
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/distribution/v1/distribution.proto
@@ -0,0 +1,160 @@
+syntax = "proto3";
+
+import "google/protobuf/any.proto";
+
+package bilibili.app.distribution.v1;
+
+option java_multiple_files = true;
+
+// APP配置
+service Distribution {
+ // 获取云端储存的用户偏好
+ rpc GetUserPreference (GetUserPreferenceReq) returns (GetUserPreferenceReply);
+ // 设定用户偏好
+ rpc SetUserPreference (SetUserPreferenceReq) returns (SetUserPreferenceReply);
+ // 获取云控配置
+ rpc UserPreference (UserPreferenceReq) returns (UserPreferenceReply);
+}
+
+//
+message GetUserPreferenceReq {
+ //
+ repeated string type_url = 1;
+ //
+ map extra_context = 2;
+}
+
+//
+message GetUserPreferenceReply {
+ // 对应 GetUserPreferenceReq 的请求的类型
+ repeated google.protobuf.Any value = 1;
+}
+
+//
+message SetUserPreferenceReq {
+ //
+ repeated google.protobuf.Any preference = 1;
+ //
+ map extra_context = 2;
+}
+
+//
+message SetUserPreferenceReply {}
+
+//
+message UserPreferenceReq {}
+
+// 云控配置下发
+message UserPreferenceReply {
+ // 具体解码需要根据实际请求 type_url 来判断
+ repeated google.protobuf.Any preference = 1;
+}
+
+//
+message BoolValue {
+ //
+ bool value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ bool default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message BytesValue {
+ //
+ bytes value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ bytes default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message DoubleValue {
+ //
+ double value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ double default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message FloatValue {
+ //
+ float value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ float default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message Int32Value {
+ //
+ int32 value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ int32 default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message Int64Value {
+ //
+ int64 value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ int64 default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message StringValue {
+ //
+ string value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ string default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message UInt32Value {
+ //
+ uint32 value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ uint32 default_value = 3;
+ //
+ string exp = 4;
+}
+
+//
+message UInt64Value {
+ //
+ uint64 value = 1;
+ //
+ int64 last_modified = 2;
+ //
+ uint64 default_value = 3;
+ //
+ string exp = 4;
+}
+
diff --git a/bili-api/grpc/proto/bilibili/app/dynamic/common/dynamic.proto b/bili-api/grpc/proto/bilibili/app/dynamic/common/dynamic.proto
new file mode 100644
index 000000000..94edf9977
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/dynamic/common/dynamic.proto
@@ -0,0 +1,23 @@
+syntax = "proto3";
+
+package bilibili.app.dynamic.common;
+
+option java_multiple_files = true;
+
+//
+message ItemWHRatio {
+ //
+ int32 ratio = 1;
+ //
+ int32 width = 2;
+ //
+ int32 height = 3;
+}
+
+//
+enum WHRatio {
+ W_H_RATIO_1_1 = 0;
+ W_H_RATIO_16_9 = 1;
+ W_H_RATIO_3_4 = 2;
+ W_H_RATIO_CUSTOM = 3;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/dynamic/v1/dynamic.proto b/bili-api/grpc/proto/bilibili/app/dynamic/v1/dynamic.proto
new file mode 100644
index 000000000..2b3e0ebb5
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/dynamic/v1/dynamic.proto
@@ -0,0 +1,1391 @@
+syntax = "proto3";
+
+package bilibili.app.dynamic.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/archive/middleware/v1/preload.proto";
+
+// v1动态
+service Dynamic {
+ // 动态视频页
+ rpc DynVideo (DynVideoReq) returns (DynVideoReqReply);
+ // 批量动态id获取动态详情
+ rpc DynDetails (DynDetailsReq) returns (DynDetailsReply);
+ // 小视频连播页
+ rpc SVideo (SVideoReq) returns (SVideoReply);
+ // 动态tab页
+ rpc DynTab (DynTabReq) returns (DynTabReply);
+ // 同城接口开关
+ rpc DynOurCitySwitch (DynOurCitySwitchReq) returns (NoReply);
+ // 动态同城页
+ rpc DynOurCity(DynOurCityReq) returns (DynOurCityReply);
+ // 最近访问-个人视频feed流
+ rpc DynVideoPersonal(DynVideoPersonalReq) returns (DynVideoPersonalReply);
+ // 最近访问-标记已读
+ rpc DynUpdOffset(DynUpdOffsetReq) returns (NoReply);
+ // 动态红点接口
+ rpc DynRed(DynRedReq) returns(DynRedReply);
+ // 查看更多-列表
+ rpc DynMixUpListViewMore(NoReq) returns (DynMixUpListViewMoreReply);
+ // 查看更多-搜索
+ rpc DynMixUpListSearch(DynMixUpListSearchReq) returns (DynMixUpListSearchReply);
+ // 同城点击上报
+ rpc OurCityClickReport(OurCityClickReportReq) returns (OurCityClickReportReply);
+ // 位置定位
+ rpc GeoCoder(GeoCoderReq) returns (GeoCoderReply);
+}
+
+// 地址部件
+message AddressComponent {
+ // 国家
+ string nation = 1;
+ // 省
+ string province = 2;
+ // 市
+ string city = 3;
+ // 区,可能为空字串
+ string district = 4;
+ // 街道,可能为空字串
+ string street = 5;
+ // 门牌,可能为空字串
+ string street_number = 6;
+}
+
+// 行政区划信息
+message AdInfo {
+ // 国家代码(ISO3166标准3位数字码)
+ string nation_code = 1;
+ // 行政区划代码,规则详见:行政区划代码说明
+ string adcode = 2;
+ // 城市代码,由国家码+行政区划代码(提出城市级别)组合而来,总共为9位
+ string city_code = 3;
+ // 行政区划名称
+ string name = 4;
+ // 行政区划中心点坐标
+ Gps gps = 5;
+}
+
+//
+enum BgType {
+ bg_type_default = 0; //
+ bg_type_face = 1; //
+}
+
+// 付费课程批次卡
+message CardCurrBatch {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 跳转地址
+ string uri = 3;
+ // 展示项 1(本集标题)
+ string text_1 = 4;
+ // 展示项 2(更新了多少个视频)
+ string text_2 = 5;
+ // 角标
+ VideoBadge badge = 6;
+}
+
+// 付费课程系列卡
+message CardCurrSeason {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 跳转地址
+ string uri = 3;
+ // 展示项 1(更新信息)
+ string text_1 = 4;
+ // 描述信息
+ string desc = 5;
+ // 角标
+ VideoBadge badge = 6;
+}
+
+// PGC视频卡片数据
+message CardPGC {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // cid
+ int64 cid = 7;
+ // season_id
+ int64 season_id = 8;
+ // epid
+ int64 epid = 9;
+ // aid
+ int64 aid = 10;
+ // 视频源类型
+ MediaType media_type = 11;
+ // 番剧类型
+ VideoSubType sub_type = 12;
+ // 番剧是否为预览视频 0:否,1:是
+ int32 is_preview = 13;
+ // 尺寸信息
+ Dimension dimension = 14;
+ // 角标
+ repeated VideoBadge badge = 15;
+ // 是否能够自动播放
+ int32 can_play = 16;
+ // PGC单季信息
+ PGCSeason season = 17;
+}
+
+// UGC视频卡片数据
+message CardUGC {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // avid
+ int64 avid = 7;
+ // cid
+ int64 cid = 8;
+ // 视频源类型
+ MediaType media_type = 9;
+ // 尺寸信息
+ Dimension dimension = 10;
+ // 角标
+ repeated VideoBadge badge = 11;
+ // 是否能够自动播放
+ int32 can_play = 12;
+}
+
+//
+enum CornerType {
+ corner_type_none = 0; //
+ corner_type_text = 1; //
+ corner_type_animation = 2; //
+}
+
+// 粉丝样式
+message DecoCardFan {
+ // 是否是粉丝
+ int32 is_fan = 1;
+ // 数量
+ int32 number = 2;
+ // 颜色
+ string color = 3;
+}
+
+// 装扮卡片
+message DecorateCard {
+ // 装扮卡片id
+ int64 id = 1;
+ // 装扮卡片链接
+ string card_url = 2;
+ // 装扮卡片点击跳转链接
+ string jump_url = 3;
+ // 粉丝样式
+ DecoCardFan fan = 4;
+}
+
+// 文本描述
+message Description {
+ // 文本内容
+ string text = 1;
+ // 文本类型
+ string type = 2;
+ // 点击跳转链接
+ string uri = 3;
+ // emoji类型
+ string emoji_type = 4;
+ // 商品类型
+ string goods_type = 5;
+}
+
+// 尺寸信息
+message Dimension {
+ //
+ int64 height = 1;
+ //
+ int64 width = 2;
+ //
+ int64 rotate = 3;
+}
+
+// 动态卡片项
+message DynamicItem {
+ // 卡片类型
+ // forward:转发 av:稿件视频 fold:折叠 pgc:pgc内容 courses:付费视频 upList:最近访问列表 followList:我的追番列表
+ string card_type = 1;
+ // 转发类型下,items的类型
+ string item_type = 2;
+ // 模块内容
+ repeated Module modules = 3;
+ // 动态ID str
+ string dyn_id_str = 4;
+ // 转发动态ID str
+ string orig_dyn_id_str = 5;
+ // r_type
+ int32 r_type = 6;
+ // 该卡片下面是否含有折叠卡
+ int32 has_fold = 7;
+}
+
+// 批量动态id获取动态详情返回值
+message DynDetailsReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+}
+
+// 批量动态id获取动态详情请求参数
+message DynDetailsReq {
+ // 青少年模式
+ int32 teenagers_mode = 1;
+ // 动态id
+ string dynamic_ids = 2;
+ // 清晰度
+ int32 qn = 3;
+ // 流版本
+ int32 fnver = 4;
+ // 流功能
+ int32 fnval = 5;
+ // 是否强制使用域名
+ int32 force_host = 6;
+ // 是否4k
+ int32 fourk = 7;
+}
+
+// 查看更多-搜索-响应
+message DynMixUpListSearchReply {
+ //
+ repeated MixUpListItem items = 1;
+}
+
+// 查看更多-搜索-请求
+message DynMixUpListSearchReq {
+ //
+ string name = 1;
+}
+
+// 查看更多-列表-响应
+message DynMixUpListViewMoreReply {
+ // 关注up主列表信息
+ repeated MixUpListItem items = 1;
+ // 默认搜索文案
+ string search_default_text = 2;
+}
+
+// 动态同城物料
+message DynOurCityItem {
+ // 卡片类型
+ // av:稿件 draw:图文
+ string card_type = 1;
+ // 动态ID
+ int64 dyn_id = 2;
+ // 跳转地址
+ string uri = 3;
+ // 模块列表
+ repeated DynOurCityModule modules = 4;
+ // 资源ID
+ int64 rid = 5;
+ // 透传服务端魔镜参数
+ string debug_info = 6;
+}
+
+// 动态同城物料模块
+message DynOurCityModule {
+ // 类型
+ // cover:封面 desc:描述 author:发布人 extend:扩展部分
+ string module_type = 1;
+ //
+ oneof module_item {
+ // 封面
+ DynOurCityModuleCover module_cover = 2;
+ // 描述
+ DynOurCityModuleDesc module_desc = 3;
+ // 发布人
+ DynOurCityModuleAuthor module_author = 4;
+ // 扩展部分
+ DynOurCityModuleExtend module_extend = 5;
+ }
+}
+
+// 动态同城物料-发布人模块
+message DynOurCityModuleAuthor {
+ // 用户Mid
+ int64 mid = 1;
+ // 用户昵称
+ string name = 2;
+ // 用户头像
+ string face = 3;
+ // 跳转地址
+ string uri = 4;
+}
+
+// 动态同城物料-封面模块
+message DynOurCityModuleCover {
+ // 封面图 单图样式取第一个元素
+ repeated string covers = 1;
+ // 封面样式
+ // 1:横图 2:竖图 3:方图
+ int32 style = 2;
+ // 视频封面展示项图标 1
+ int32 cover_left_icon_1 = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项图标 2
+ int32 cover_left_icon_2 = 5;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 6;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 7;
+ // 角标
+ repeated VideoBadge badge = 8;
+}
+
+// 动态同城物料-描述模块
+message DynOurCityModuleDesc {
+ // 描述信息
+ string desc = 1;
+}
+
+// 动态同城物料-扩展部分模块
+message DynOurCityModuleExtend {
+ // 类型
+ string type = 1;
+ oneof extend {
+ // LBS模块
+ DynOurCityModuleExtendLBS extend_lbs = 2;
+ }
+}
+
+// 动态同城物料extent-LBS模块
+message DynOurCityModuleExtendLBS {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // poiType
+ int32 poi_type = 4;
+}
+
+// 动态同城-响应
+message DynOurCityReply {
+ // 翻页游标
+ string offset = 1;
+ // 是否还有更多数据
+ // 1:有
+ int32 has_more = 2;
+ // 样式类型
+ // 1:双列 2:瀑布流
+ int32 style = 3;
+ // 顶导信息
+ string top_label = 4;
+ // 列表详情
+ repeated DynOurCityItem list = 5;
+ // 顶导按钮信息
+ string top_button_label = 6;
+ // 城市ID
+ int32 city_id = 7;
+ // 城市名
+ string city_name = 8;
+}
+
+// 动态同城页-请求
+message DynOurCityReq {
+ // 城市ID
+ int64 city_id = 1;
+ // 纬度
+ double lat = 2;
+ // 经度
+ double lng = 3;
+ // 透传上一次接口请求返回的offset
+ string offset = 4;
+ // 每页元素个数
+ int32 page_size = 5;
+ // 青少年模式
+ // 1:开启青少年模式
+ int32 teenagers_mode = 6;
+ // 清晰度(旧版)
+ int32 qn = 7;
+ // 流版本(旧版)
+ int32 fnver = 8;
+ // 流类型(旧版)
+ int32 fnval = 9;
+ // 是否强制使用域名(旧版)
+ int32 force_host = 10;
+ // 是否4k(旧版)
+ int32 fourk = 11;
+ // 是否开启lbs
+ // 0:关闭 1:开启
+ int32 lbs_state = 12;
+ // 是否刷新城市
+ uint32 refresh_city = 13;
+ // 魔镜设置
+ ExpConf exp_conf = 14;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 15;
+ // 城市码
+ int64 city_code = 16;
+ // 构建时间
+ int64 build_time = 17;
+}
+
+// 动态同城开关-请求
+message DynOurCitySwitchReq {
+ // 开关参数
+ // 0:关闭 1:开启
+ int32 switch = 1;
+}
+
+// 红点接口物料
+message DynRedItem {
+ // 数字红点有效 更新数
+ uint64 count = 1;
+}
+
+// 红点接口-响应
+message DynRedReply {
+ // 类型
+ // count:数字红点 point:普通红点 no_point:没有红点
+ string red_type = 1;
+ // 红点具体信息
+ DynRedItem dyn_red_item = 2;
+ // 默认tab 值对应tab接口下发的anchor
+ string default_tab = 3;
+ //
+ DynRedStyle red_style = 4;
+}
+
+// 动态红点接口-请求
+message DynRedReq {
+ // 动态红点接口各tab offset信息
+ repeated TabOffset tab_offset = 1;
+}
+
+//
+message DynRedStyle {
+ //
+ int32 bg_type = 1;
+ //
+ int32 corner_type = 2;
+ //
+ int32 display_time = 3;
+ //
+ string corner_mark = 4;
+ //
+ DynRedStyleUp up = 5;
+ //
+ int32 type = 6;
+}
+
+//
+message DynRedStyleUp {
+ //
+ int64 uid = 1;
+ //
+ string face = 2;
+}
+
+// 动态tab详情
+message DynTab {
+ // tab标题 优先展示用,未开启状态第一次请求返回同城,后续请求返回对应城市名
+ string title = 1;
+ // 跳转链接
+ string uri = 2;
+ // 气泡内容
+ string bubble = 3;
+ // 是否推红点
+ int32 red_point = 4;
+ // 城市ID
+ int64 city_id = 5;
+ // 是否弹窗
+ int32 is_popup = 6;
+ // 弹窗内容
+ Popup popup = 7;
+ // 是否默认tab
+ bool defaultTab = 8;
+ // 副标题 对应城市名
+ string sub_title = 9;
+ // 锚点字段
+ string anchor = 10;
+ // 内测文案
+ string internal_test = 11;
+}
+
+// 动态tab页-响应
+message DynTabReply {
+ // 动态tab详情列表
+ repeated DynTab dyn_tab = 1;
+}
+
+// 动态tab页-请求
+message DynTabReq {
+ // 青少年模式
+ // 1:开启青少年模式
+ int32 teenagers_mode = 1;
+}
+
+// 最近访问-标记已读-请求
+message DynUpdOffsetReq {
+ // 被访问者的UID
+ int64 host_uid = 1;
+ // 用户已读进度
+ string read_offset = 2;
+}
+
+// 最近访问-个人feed流列表-响应
+message DynVideoPersonalReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 偏移量
+ string offset = 2;
+ // 是否还有更多数据
+ int32 has_more = 3;
+ // 已读进度
+ string read_offset = 4;
+}
+
+// 最近访问-个人feed流列表-请求
+message DynVideoPersonalReq {
+ // 青少年模式
+ // 1:开启青少年模式
+ int32 teenagers_mode = 1;
+ // 被访问者的mid
+ int64 host_uid = 2;
+ // 偏移量 第一页可传空
+ string offset = 3;
+ // 标明下拉几次
+ int32 page = 4;
+ // 是否是预加载
+ int32 is_preload = 5;
+ // 清晰度
+ int32 qn = 6;
+ // 流版本
+ int32 fnver = 7;
+ // 流类型
+ int32 fnval = 8;
+ // 是否强制使用域名
+ int32 force_host = 9;
+ // 是否4k
+ int32 fourk = 10;
+}
+
+// 动态视频页-请求
+message DynVideoReq {
+ // 青少年模式
+ int32 teenagers_mode = 1;
+ // 透传 update_baseline
+ string update_baseline = 2;
+ // 透传 history_offset
+ string offset = 3;
+ // 向下翻页数
+ int32 page = 4;
+ // 刷新方式
+ // 1:向上刷新 2:向下翻页
+ int32 refresh_type = 5;
+ // 清晰度
+ int32 qn = 6;
+ // 流版本
+ int32 fnver = 7;
+ // 流类型
+ int32 fnval = 8;
+ // 是否强制使用域名
+ int32 force_host = 9;
+ // 是否4K
+ int32 fourk = 10;
+}
+
+// 动态视频页-响应
+message DynVideoReqReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 更新的动态数
+ int32 update_num = 2;
+ // 历史偏移
+ string history_offset = 3;
+ // 更新基础信息
+ string update_baseline = 4;
+ // 是否还有更多数据
+ int32 has_more = 5;
+}
+
+// 魔镜实验配置项
+message Exp {
+ // 实验名
+ string exp_name = 1;
+ // 实验组
+ string exp_group = 2;
+}
+
+// 魔镜设置
+message ExpConf {
+ // 是否是魔镜请求
+ int32 exp_enable = 1;
+ // 实验配置
+ repeated Exp exps = 2;
+}
+
+// 拓展
+message Extend {
+ // 类型
+ // topic:话题小卡 lbs:lbs hot:热门视频 game:游戏
+ string type = 1;
+ // 卡片详情
+ oneof extend {
+ // 话题小卡
+ ExtInfoTopic ext_info_topic = 2;
+ // lbs
+ ExtInfoLBS ext_info_lbs = 3;
+ // 热门视频
+ ExtInfoHot ext_info_hot = 4;
+ // 游戏
+ ExtInfoGame ext_info_game = 5;
+ }
+}
+
+// 拓展信息-游戏小卡
+message ExtInfoGame {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 拓展信息-热门视频
+message ExtInfoHot {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 拓展信息-lbs
+message ExtInfoLBS {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // poiType
+ int32 poi_type = 4;
+}
+
+// 拓展信息-话题小卡
+message ExtInfoTopic {
+ // 标题-话题名
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 折叠分类
+enum FoldType {
+ FoldTypeZero = 0; // 占位
+ FoldTypePublish = 1; // 用户发布折叠
+ FoldTypeFrequent = 2; // 转发超频折叠
+ FoldTypeUnite = 3; // 联合投稿折叠
+ FoldTypeLimit = 4; // 动态受限折叠
+}
+
+// 我的追番列表Item
+message FollowListItem {
+ // season_id
+ int32 season_id = 1;
+ // 标题
+ string title = 2;
+ // 封面图
+ string cover = 3;
+ // 跳转链接
+ string url = 4;
+ // 最新ep
+ NewEP new_ep = 5;
+}
+
+// 位置定位-响应
+message GeoCoderReply {
+ // 以行政区划+道路+门牌号等信息组成的标准格式化地址
+ string address = 1;
+ // 地址部件,address不满足需求时可自行拼接
+ AddressComponent address_component = 2;
+ // 行政区划信息
+ AdInfo ad_info = 3;
+}
+
+// 位置定位-请求
+message GeoCoderReq {
+ // 纬度
+ double lat = 1;
+ // 经度
+ double lng = 2;
+ // 页面来源
+ string from = 3;
+}
+
+// 行政区划中心点坐标
+message Gps {
+ // 纬度
+ double lat = 1;
+ // 经度
+ double lng = 2;
+}
+
+// 点赞动画
+message LikeAnimation {
+ // 开始动画
+ string begin = 1;
+ // 过程动画
+ string proc = 2;
+ // 结束动画
+ string end = 3;
+ // id
+ int64 like_icon_id = 4;
+}
+
+// 点赞拓展信息
+message LikeInfo {
+ // 点赞动画
+ LikeAnimation animation = 1;
+ // 是否点赞
+ int32 is_like = 2;
+}
+
+// 点赞用户
+message LikeUser {
+ // 用户mid
+ int64 uid = 1;
+ // 用户昵称
+ string uname = 2;
+ // 点击跳转链接
+ string uri = 3;
+}
+
+// 直播信息
+message LiveInfo {
+ // 是否在直播
+ // 0:未直播 1:正在直播
+ int32 is_living = 1;
+ // 跳转链接
+ string uri = 2;
+}
+
+// 播放器类型
+enum MediaType {
+ MediaTypeNone = 0; // 本地
+ MediaTypeUGC = 1; // UGC
+ MediaTypePGC = 2; // PGC
+ MediaTypeLive = 3; // 直播
+ MediaTypeVCS = 4; // 小视频
+}
+
+// 查看更多-列表单条数据
+message MixUpListItem {
+ // 用户mid
+ int64 uid = 1;
+ // 特别关注
+ // 0:否 1:是
+ int32 special_attention = 2;
+ // 小红点状态
+ // 0:没有 1:有
+ int32 reddot_state = 3;
+ // 直播信息
+ MixUpListLiveItem live_info = 4;
+ // 昵称
+ string name = 5;
+ // 头像
+ string face = 6;
+ // 认证信息
+ OfficialVerify official = 7;
+ // 大会员信息
+ VipInfo vip = 8;
+ // 关注状态
+ Relation relation = 9;
+ //
+ int32 premiere_state = 10;
+ //
+ string uri = 11;
+}
+
+// 直播信息
+message MixUpListLiveItem {
+ // 直播状态
+ // 0:未直播 1:直播中
+ bool status = 1;
+ // 房间号
+ int64 room_id = 2;
+ // 跳转地址
+ string uri = 3;
+}
+
+// 模块
+message Module {
+ // 类型
+ // fold:折叠 author:发布人 dynamic:动态卡片内容 state:计数信息 forward:转发 extend:小卡信息 dispute:争议小黄条 desc:描述信息
+ // likeUser:点赞用户 upList:最近访问列表 followList:我的追番
+ string module_type = 1;
+ oneof module_item{
+ // 折叠
+ ModuleFold module_fold = 2;
+ // 发布人
+ ModuleAuthor module_author = 3;
+ // 动态卡片内容
+ ModuleDynamic module_dynamic = 4;
+ // 计数信息
+ ModuleState module_state = 5;
+ // 转发
+ ModuleForward module_forward = 6;
+ // 小卡信息
+ ModuleExtend module_extend = 7;
+ // 争议小黄条
+ ModuleDispute module_dispute = 8;
+ // 描述信息
+ ModuleDesc module_desc = 9;
+ // 点赞用户
+ ModuleLikeUser module_likeUser = 10;
+ // 最近访问列表
+ ModuleDynUpList module_upList = 11;
+ // 我的追番
+ ModuleFollowList module_followList = 12;
+ }
+}
+
+// 作者信息模块
+message ModuleAuthor {
+ // 用户mid
+ int64 id = 1;
+ // 时间标签
+ string ptime_label_text = 2;
+ // 用户详情
+ UserInfo author = 3;
+ // 装扮卡片
+ DecorateCard decorate_card = 4;
+}
+
+// 文本内容模块
+message ModuleDesc {
+ // 文本描述
+ repeated Description desc = 1;
+}
+
+// 争议小黄条模块
+message ModuleDispute {
+ // 标题
+ string title = 1;
+ // 描述内容
+ string desc = 2;
+ // 跳转链接
+ string uri = 3;
+}
+
+// 动态详情模块
+message ModuleDynamic {
+ // 卡片类型
+ // ugc:ugc卡 pgc:pgc卡 currSeason:付费课程系列 currBatch:付费课程批次
+ string card_type = 1;
+ // 正文卡片
+ oneof card {
+ // ugc卡
+ CardUGC card_ugc = 2;
+ // pgc卡
+ CardPGC card_pgc = 3;
+ // 付费课程系列
+ CardCurrSeason card_curr_season = 4;
+ // 付费课程批次
+ CardCurrBatch card_curr_batch = 5;
+ }
+}
+
+// 最近访问up主列表
+message ModuleDynUpList {
+ // 标题展示文案
+ string module_title = 1;
+ // “全部”按钮文案
+ string show_all = 2;
+ // up主列表
+ repeated UpListItem list = 3;
+}
+
+// 拓展信息
+message ModuleExtend {
+ // 拓展
+ repeated Extend extend = 1;
+}
+
+// 折叠模块
+message ModuleFold {
+ // 折叠分类(该字段废弃)
+ int32 fold_type = 1;
+ // 折叠文案
+ string text = 2;
+ // 被折叠的动态
+ string fold_ids = 3;
+ // 被折叠的用户信息
+ repeated UserInfo fold_users = 4;
+ // 折叠分类
+ FoldType fold_type_v2 = 5;
+}
+
+// 我的追番列表
+message ModuleFollowList {
+ // 查看全部的跳转链接
+ string view_all_link = 1;
+ //
+ repeated FollowListItem list = 2;
+}
+
+// 转发模块
+message ModuleForward {
+ // 卡片类型
+ string card_type = 1;
+ // 嵌套模型
+ repeated Module modules = 2;
+}
+
+// 点赞用户模块
+message ModuleLikeUser {
+ // 点赞用户
+ repeated LikeUser like_users = 1;
+ // 文案
+ string display_text = 2;
+}
+
+// 计数信息模块
+message ModuleState {
+ // 转发数
+ int32 repost = 1;
+ // 点赞数
+ int32 like = 2;
+ // 评论数
+ int32 reply = 3;
+ // 点赞拓展信息
+ LikeInfo like_info = 4;
+ // 禁评
+ bool no_comment = 5;
+ // 禁转
+ bool no_forward = 6;
+}
+
+// 认证名牌
+message Nameplate {
+ // nid
+ int64 nid = 1;
+ // 名称
+ string name = 2;
+ // 图片地址
+ string image = 3;
+ // 小图地址
+ string image_small = 4;
+ // 等级
+ string level = 5;
+ // 获取条件
+ string condition = 6;
+}
+
+// 最新ep
+message NewEP {
+ // 最新话epid
+ int32 id = 1;
+ // 更新至XX话
+ string index_show = 2;
+ // 更新剧集的封面
+ string cover = 3;
+}
+
+// 空响应
+message NoReply {
+
+}
+
+// 空请求
+message NoReq {
+
+}
+
+// 认证信息
+message OfficialVerify {
+ // 认证类型
+ // 127:未认证 0:个人 1:机构
+ int32 type = 1;
+ // 认证描述
+ string desc = 2;
+ //
+ int32 is_atten = 3;
+}
+
+// 动态同城点击上报-响应
+message OurCityClickReportReply {
+
+}
+
+// 动态同城点击上报-请求
+message OurCityClickReportReq {
+ // 动态ID
+ string dynamic_id = 1;
+ // 城市ID
+ int64 city_id = 2;
+ // 纬度
+ double lat = 3;
+ // 经度
+ double lng = 4;
+}
+
+// PGC单季信息
+message PGCSeason {
+ // 是否完结
+ int32 is_finish = 1;
+ // 标题
+ string title = 2;
+ // 类型
+ int32 type = 3;
+}
+
+// 秒开参数
+message PlayerPreloadParams {
+ // 清晰度
+ int32 qn = 1;
+ // 流版本
+ int32 fnver = 2;
+ // 流类型
+ int32 fnval = 3;
+ // 是否强制使用域名
+ int32 force_host = 4;
+ // 是否4k
+ int32 fourk = 5;
+}
+
+// 动态tab弹窗详情
+message Popup {
+ // 标题
+ string title = 1;
+ // 文案
+ string desc = 2;
+ // 文案附加跳转地址
+ string uri = 3;
+}
+
+// 关注关系
+message Relation {
+ // 关注状态
+ RelationStatus status = 1;
+ // 关注
+ int32 is_follow = 2;
+ // 被关注
+ int32 is_followed = 3;
+ // 文案
+ string title = 4;
+}
+
+// 关注状态
+enum RelationStatus {
+ relation_status_none = 0; //
+ relation_status_nofollow = 1; // 未关注
+ relation_status_follow = 2; // 关注
+ relation_status_followed = 3; // 被关注
+ relation_status_mutual_concern = 4; // 互相关注
+ relation_status_special = 5; // 特别关注
+}
+
+// 分享需要
+message ShareInfo {
+ // 稿件avid
+ int64 aid = 1;
+ // 稿件bvid
+ string bvid = 2;
+ // 标题
+ string title = 3;
+ // 副标题
+ string subtitle = 4;
+ // 稿件封面
+ string cover = 5;
+ // up mid
+ int64 mid = 6;
+ // up昵称
+ string name = 7;
+}
+
+//
+enum StyleType {
+ STYLE_TYPE_NONE = 0; //
+ STYLE_TYPE_LIVE = 1; //
+ STYLE_TYPE_DYN_UP = 2; //
+}
+
+// 小视频卡片项
+message SVideoItem {
+ // 卡片类型
+ // av:稿件视频
+ string card_type = 1;
+ // 模块内容
+ repeated SVideoModule modules = 2;
+ // 动态ID str
+ string dyn_id_str = 3;
+ // 卡片游标
+ int64 index = 4;
+}
+
+// 小视频模块
+message SVideoModule {
+ // 类型
+ // author:发布人 player:播放器内容 desc:描述信息 stat:计数信息
+ string module_type = 1;
+ oneof module_item {
+ // 发布人
+ SVideoModuleAuthor module_author = 2;
+ // 播放器内容
+ SVideoModulePlayer module_player = 3;
+ // 描述信息
+ SVideoModuleDesc module_desc = 4;
+ // 计数信息
+ SVideoModuleStat module_stat = 5;
+ }
+}
+
+// 作者信息模块
+message SVideoModuleAuthor {
+ // 用户mid
+ int64 mid = 1;
+ // 用户昵称
+ string name = 2;
+ // 用户头像
+ string face = 3;
+ // 发布描述
+ string pub_desc = 4;
+ // 是否关注up
+ // 1:已关注
+ int32 is_attention = 5;
+ // 跳转地址
+ string uri = 6;
+}
+
+// 文本内容模块
+message SVideoModuleDesc {
+ // 文本内容
+ string text = 1;
+ // 跳转地址
+ string uri = 2;
+}
+
+// 播放器模块
+message SVideoModulePlayer {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 跳转地址,秒开地址如果有会拼接player_preload可参考天马
+ string uri = 3;
+ // aid
+ int64 aid = 4;
+ // cid
+ int64 cid = 5;
+ // 视频时长
+ int64 duration = 6;
+ // 尺寸信息
+ Dimension dimension = 7;
+}
+
+// 计数信息模块
+message SVideoModuleStat {
+ // 计数内容
+ repeated SVideoStatInfo stat_info = 1;
+ // 分享需要
+ ShareInfo share_info = 2;
+}
+
+// 小视频连播页-响应
+message SVideoReply {
+ // 列表
+ repeated SVideoItem list = 1;
+ // 翻页游标
+ string offset = 2;
+ // 是否还有更多数据
+ // 1:有
+ int32 has_more = 3;
+ // 顶部
+ SVideoTop top = 4;
+}
+
+// 小视频连播页-请求
+message SVideoReq {
+ // 当前素材的id
+ int64 oid = 1;
+ // 当前素材类型
+ // 1:动态(如果有oid则必传) 2:热门分类 3:热点聚合
+ SVideoType type = 2;
+ // 翻页offset
+ string offset = 3;
+ // 清晰度(旧版)
+ int32 qn = 4;
+ // 流版本(旧版)
+ int32 fnver = 5;
+ // 流类型(旧版)
+ int32 fnval = 6;
+ // 是否强制使用域名(旧版)
+ int32 force_host = 7;
+ // 是否4k(旧版)
+ int32 fourk = 8;
+ // 当前页面spm
+ string spmid = 9;
+ // 上级页面spm
+ string from_spmid = 10;
+ // 秒开参数
+ PlayerPreloadParams player_preload = 11;
+ // 热门进入联播页的锚点aid
+ int64 focus_aid = 12;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 13;
+}
+
+// 计数内容
+message SVideoStatInfo {
+ // 计数icon
+ // 1:分享符号 2:评论符号 3:点赞符号
+ int32 icon = 1;
+ // 计数值
+ int64 num = 2;
+ // 选中状态
+ // 1:选中
+ int32 selected = 3;
+ // 跳转链接(如评论)
+ string uri = 4;
+}
+
+// 顶部
+message SVideoTop {
+ // 联播页标题
+ string Title = 1;
+ // 联播页导语
+ string Desc = 2;
+}
+
+// 入口联播页类型
+enum SVideoType {
+ TypeNone = 0; // 无类型
+ TypeDynamic = 1; // 动态
+ TypePopularIndex = 2; // 热门分类
+ TypePopularHotword = 3; // 热点聚合
+}
+
+// 动态红点接口各tab offset信息
+message TabOffset {
+ // 1:综合页 2:视频页
+ int32 tab = 1;
+ // 上一次对应列表页offset
+ string offset = 2;
+}
+
+// up主列表
+message UpListItem {
+ // 是否有更新
+ // 0:没有 1:有
+ int32 has_update = 1;
+ // up主头像
+ string face = 2;
+ // up主昵称
+ string name = 3;
+ // up主uid
+ int64 uid = 4;
+}
+
+// 用户信息
+message UserInfo {
+ // 用户mid
+ int64 mid = 1;
+ // 用户昵称
+ string name = 2;
+ // 用户头像
+ string face = 3;
+ // 认证信息
+ OfficialVerify official = 4;
+ // 大会员信息
+ VipInfo vip = 5;
+ // 直播信息
+ LiveInfo live = 6;
+ // 空间页跳转链接
+ string uri = 7;
+ // 挂件信息
+ UserPendant pendant = 8;
+ // 认证名牌
+ Nameplate nameplate = 9;
+}
+
+// 头像挂件信息
+message UserPendant {
+ // pid
+ int64 pid = 1;
+ // 名称
+ string name = 2;
+ // 图片链接
+ string image = 3;
+ // 有效期
+ int64 expire = 4;
+}
+
+// 角标信息
+message VideoBadge {
+ // 文案
+ string text = 1;
+ // 文案颜色-日间
+ string text_color = 2;
+ // 文案颜色-夜间
+ string text_color_night = 3;
+ // 背景颜色-日间
+ string bg_color = 4;
+ // 背景颜色-夜间
+ string bg_color_night = 5;
+ // 边框颜色-日间
+ string border_color = 6;
+ // 边框颜色-夜间
+ string border_color_night = 7;
+ // 样式
+ int32 bg_style = 8;
+}
+
+// 番剧类型
+enum VideoSubType {
+ VideoSubTypeNone = 0; // 没有子类型
+ VideoSubTypeBangumi = 1; // 番剧
+ VideoSubTypeMovie = 2; // 电影
+ VideoSubTypeDocumentary = 3; // 纪录片
+ VideoSubTypeDomestic = 4; // 国创
+ VideoSubTypeTeleplay = 5; // 电视剧
+}
+
+// 大会员信息
+message VipInfo {
+ // 大会员类型
+ int32 Type = 1;
+ // 大会员状态
+ int32 status = 2;
+ // 到期时间
+ int64 due_date = 3;
+ // 标签
+ VipLabel label = 4;
+ // 主题
+ int32 theme_type = 5;
+}
+
+// 大会员标签
+message VipLabel {
+ // 图片地址
+ string path = 1;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/dynamic/v2/campus.proto b/bili-api/grpc/proto/bilibili/app/dynamic/v2/campus.proto
new file mode 100644
index 000000000..ee81f97e2
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/dynamic/v2/campus.proto
@@ -0,0 +1,67 @@
+syntax = "proto3";
+
+package bilibili.app.dynamic.v2;
+
+option java_multiple_files = true;
+
+import "bilibili/app/archive/middleware/v1/preload.proto";
+import "bilibili/pagination/pagination.proto";
+import "bilibili/app/dynamic/common/dynamic.proto";
+import "bilibili/app/dynamic/v2/dynamic.proto";
+
+service Campus {
+ //
+ //rpc WaterFlowRcmd (WaterFlowRcmdReq) returns (WaterFlowRcmdResp);
+}
+
+//
+message CampusWaterFlowItem {
+ //
+ int32 item_type = 1;
+ //
+ bilibili.app.dynamic.common.ItemWHRatio wh_ratio = 2;
+ //
+ oneof item {
+ WFItemDefault item_default = 3;
+ }
+}
+
+//
+message WaterFlowRcmdReq {
+ //
+ int64 campus_id = 1;
+ //
+ int32 page = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ //
+ //CampusRcmdReqFrom from = 4;
+}
+
+//
+message WaterFlowRcmdResp {
+ //
+ repeated CampusWaterFlowItem items = 1;
+ //
+ bilibili.pagination.FeedPaginationReply offset = 2;
+}
+
+//
+message WFItemDefault {
+ //
+ string title = 1;
+ //
+ string cover = 2;
+ //
+ //CoverIconWithText bottom_left_1 = 3;
+ //
+ //CoverIconWithText bottom_left_2 = 4;
+ //
+ //CoverIconWithText bottom_right_1 = 5;
+ //
+ string uri = 6;
+ //
+ //RcmdReason rcmd_reason = 7;
+ //
+ map annotations = 8;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/dynamic/v2/dynamic.proto b/bili-api/grpc/proto/bilibili/app/dynamic/v2/dynamic.proto
new file mode 100644
index 000000000..b4f96248d
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/dynamic/v2/dynamic.proto
@@ -0,0 +1,5873 @@
+syntax = "proto3";
+
+package bilibili.app.dynamic.v2;
+
+option java_multiple_files = true;
+
+import "google/protobuf/any.proto";
+import "bilibili/app/archive/middleware/v1/preload.proto";
+import "bilibili/dagw/component/avatar/v1/avatar.proto";
+
+// v2动态, rpc 按字母顺序排列
+service Dynamic {
+ //
+ rpc AlumniDynamics (AlumniDynamicsReq) returns (AlumniDynamicsReply);
+ //
+ rpc CampusBillBoard (CampusBillBoardReq) returns (CampusBillBoardReply);
+ //
+ rpc CampusEntryTab(CampusEntryTabReq) returns (CampusEntryTabResp);
+ //
+ rpc CampusFeedback(CampusFeedbackReq) returns (CampusFeedbackReply);
+ //
+ rpc CampusHomePages(CampusHomePagesReq) returns (CampusHomePagesReply);
+ //
+ rpc CampusMateLikeList(CampusMateLikeListReq) returns (CampusMateLikeListReply);
+ //
+ rpc CampusMngDetail(CampusMngDetailReq) returns (CampusMngDetailReply);
+ //
+ rpc CampusMngQuizOperate(CampusMngQuizOperateReq) returns (CampusMngQuizOperateReply);
+ //
+ rpc CampusMngSubmit(CampusMngSubmitReq) returns (CampusMngSubmitReply);
+ //
+ rpc CampusRcmd(CampusRcmdReq) returns (CampusRcmdReply);
+ //
+ rpc CampusRcmdFeed(CampusRcmdFeedReq) returns (CampusRcmdFeedReply);
+ //
+ rpc CampusRecommend(CampusRecommendReq) returns (CampusRecommendReply);
+ //
+ rpc CampusRedDot(CampusRedDotReq) returns (CampusRedDotReply);
+ //
+ rpc CampusSquare(CampusSquareReq) returns (CampusSquareReply);
+ //
+ rpc CampusTopicRcmdFeed(CampusTopicRcmdFeedReq) returns (CampusTopicRcmdFeedReply);
+ // 动态通用附加卡-follow/取消follow
+ rpc DynAdditionCommonFollow(DynAdditionCommonFollowReq) returns (DynAdditionCommonFollowReply);
+ // 动态综合页
+ rpc DynAll(DynAllReq) returns (DynAllReply);
+ // 综合页最近访问 - 个人feed流
+ rpc DynAllPersonal(DynAllPersonalReq) returns (DynAllPersonalReply);
+ // 综合页最近访问 - 标记已读
+ rpc DynAllUpdOffset(DynAllUpdOffsetReq) returns (NoReply);
+ // 动态详情页
+ rpc DynDetail(DynDetailReq) returns (DynDetailReply);
+ // 批量动态id获取动态详情
+ rpc DynDetails(DynDetailsReq) returns (DynDetailsReply);
+ // 动态发布生成临时卡
+ rpc DynFakeCard(DynFakeCardReq) returns (DynFakeCardReply);
+ //
+ rpc DynFriend(DynFriendReq) returns (DynFriendReply);
+ // 轻浏览
+ rpc DynLight(DynLightReq) returns (DynLightReply);
+ // 网关调用 - 查看更多-列表
+ rpc DynMixUpListViewMore(DynMixUpListViewMoreReq) returns (DynMixUpListViewMoreReply);
+ // 关注推荐up主换一换
+ rpc DynRcmdUpExchange(DynRcmdUpExchangeReq) returns (DynRcmdUpExchangeReply);
+ //
+ rpc DynSearch(DynSearchReq) returns (DynSearchReply);
+ //
+ rpc DynServerDetails(DynServerDetailsReq) returns (DynServerDetailsReply);
+ // 空间页动态
+ rpc DynSpace(DynSpaceReq) returns (DynSpaceRsp);
+ //
+ rpc DynSpaceSearchDetails(DynSpaceSearchDetailsReq) returns (DynSpaceSearchDetailsReply);
+ //
+ rpc DynTab(DynTabReq) returns (DynTabReply);
+ // 动态点赞
+ rpc DynThumb(DynThumbReq) returns (NoReply);
+ // 未登录页分区UP主推荐
+ rpc DynUnLoginRcmd(DynRcmdReq) returns (DynRcmdReply);
+ // 动态视频页
+ rpc DynVideo(DynVideoReq) returns (DynVideoReply);
+ // 视频页最近访问 - 个人feed流
+ rpc DynVideoPersonal(DynVideoPersonalReq) returns (DynVideoPersonalReply);
+ // 视频页最近访问 - 标记已读
+ rpc DynVideoUpdOffset(DynVideoUpdOffsetReq) returns (NoReply);
+ //
+ rpc DynVote(DynVoteReq) returns (DynVoteReply);
+ //
+ rpc FeedFilter(FeedFilterReq) returns (FeedFilterReply);
+ //
+ rpc FetchTabSetting(NoReq) returns (FetchTabSettingReply);
+ //
+ rpc HomeSubscribe(HomeSubscribeReq) returns (HomeSubscribeReply);
+ //
+ rpc LbsPoi(LbsPoiReq) returns (LbsPoiReply);
+ //
+ rpc LegacyTopicFeed(LegacyTopicFeedReq) returns (LegacyTopicFeedReply);
+ // 点赞列表
+ rpc LikeList(LikeListReq) returns (LikeListReply);
+ //
+ rpc OfficialAccounts(OfficialAccountsReq) returns (OfficialAccountsReply);
+ //
+ rpc OfficialDynamics(OfficialDynamicsReq) returns (OfficialDynamicsReply);
+ // 新版动态转发点赞列表 需要登录
+ rpc ReactionList(ReactionListReq) returns (ReactionListReply);
+ // 转发列表
+ rpc RepostList(RepostListReq) returns (RepostListRsp);
+ //
+ rpc SchoolRecommend(SchoolRecommendReq) returns (SchoolRecommendReply);
+ //
+ rpc SchoolSearch(SchoolSearchReq) returns (SchoolSearchReply);
+ //
+ rpc SetDecision(SetDecisionReq) returns (NoReply);
+ //
+ rpc SetRecentCampus(SetRecentCampusReq) returns (NoReply);
+ //
+ rpc SubscribeCampus(SubscribeCampusReq) returns (NoReply);
+ //
+ rpc TopicList(TopicListReq) returns (TopicListReply);
+ //
+ rpc TopicSquare(TopicSquareReq) returns (TopicSquareReply);
+ //
+ rpc UnfollowMatch(UnfollowMatchReq) returns (NoReply);
+ //
+ rpc UpdateTabSetting(UpdateTabSettingReq) returns (NoReply);
+}
+
+//
+enum AddButtonBgStyle {
+ fill = 0; // 默认填充
+ stroke = 1; // 描边
+ gray = 2; // 置灰
+}
+
+// 按钮类型
+enum AddButtonType {
+ bt_none = 0; // 占位
+ bt_jump = 1; // 跳转
+ bt_button = 2; // 按钮
+}
+
+// 活动皮肤
+message AdditionalActSkin {
+ // 动画SVGA资源
+ string svga = 1;
+ // 动画SVGA最后一帧图片资源
+ string last_image = 2;
+ // 动画播放次数
+ int64 play_times = 3;
+}
+
+// 动态-附加卡-按钮
+message AdditionalButton {
+ // 按钮类型
+ AddButtonType type = 1;
+ // jump-跳转样式
+ AdditionalButtonStyle jump_style = 2;
+ // jump-跳转链接
+ string jump_url = 3;
+ // button-未点样式
+ AdditionalButtonStyle uncheck = 4;
+ // button-已点样式
+ AdditionalButtonStyle check = 5;
+ // button-当前状态
+ AdditionalButtonStatus status = 6;
+ // 按钮点击样式
+ AdditionalButtonClickType click_type = 7;
+}
+
+// 附加卡按钮点击类型
+enum AdditionalButtonClickType {
+ click_none = 0; // 通用按钮
+ click_up = 1; // 预约卡按钮
+}
+
+//
+message AdditionalButtonInteractive {
+ // 是否弹窗
+ string popups = 1;
+ // 弹窗确认文案
+ string confirm = 2;
+ // 弹窗取消文案
+ string cancel = 3;
+ //
+ string desc = 4;
+}
+
+//
+message AdditionalButtonShare {
+ //
+ int32 show = 1;
+ //
+ string icon = 2;
+ //
+ string text = 3;
+}
+
+// 附加卡按钮状态
+enum AdditionalButtonStatus {
+ none = 0; //
+ uncheck = 1; //
+ check = 2; //
+}
+
+// 动态-附加卡-按钮样式
+message AdditionalButtonStyle {
+ // icon
+ string icon = 1;
+ // 文案
+ string text = 2;
+ // 按钮点击交互
+ AdditionalButtonInteractive interactive = 3;
+ // 当前按钮填充样式
+ AddButtonBgStyle bg_style = 4;
+ // toast文案, 当disable=1时有效
+ string toast = 5;
+ // 当前按钮样式,
+ // 0:高亮 1:置灰(按钮不可点击)
+ DisableState disable = 6;
+ //
+ AdditionalButtonShare share = 7;
+}
+
+// 动态-附加卡-番剧卡
+message AdditionalPGC {
+ // 头部说明文案
+ string head_text = 1;
+ // 标题
+ string title = 2;
+ // 展示图
+ string image_url = 3;
+ // 描述文字1
+ string desc_text_1 = 4;
+ // 描述文字2
+ string desc_text_2 = 5;
+ // 点击跳转链接
+ string url = 6;
+ // 按钮
+ AdditionalButton button = 7;
+ // 头部icon
+ string head_icon = 8;
+ // style
+ ImageStyle style = 9;
+ // 动态本身的类型 type
+ string type = 10;
+}
+
+//
+enum AdditionalShareShowType {
+ st_none = 0; //
+ st_show = 1; //
+}
+
+// 枚举-动态附加卡
+enum AdditionalType {
+ additional_none = 0; // 占位
+ additional_type_pgc = 1; // 附加卡-追番
+ additional_type_goods = 2; // 附加卡-商品
+ additional_type_vote = 3; // 附加卡投票
+ additional_type_common = 4; // 附加通用卡
+ additional_type_esport = 5; // 附加电竞卡
+ additional_type_up_rcmd = 6; // 附加UP主推荐卡
+ additional_type_ugc = 7; // 附加卡-ugc
+ additional_type_up_reservation = 8; // UP主预约卡
+}
+
+// 动态-附加卡-专栏
+message AdditionArticle {
+ //
+ string title = 1;
+ //
+ MdlDynDrawItem cover = 2;
+ //
+ string desc_text_left = 3;
+ //
+ string desc_text_right = 4;
+ //
+ string uri = 5;
+ //
+ string card_type = 6;
+}
+
+// 动态-附加卡-通用卡
+message AdditionCommon {
+ // 头部说明文案
+ string head_text = 1;
+ // 标题
+ string title = 2;
+ // 展示图
+ string image_url = 3;
+ // 描述文字1
+ string desc_text_1 = 4;
+ // 描述文字2
+ string desc_text_2 = 5;
+ // 点击跳转链接
+ string url = 6;
+ // 按钮
+ AdditionalButton button = 7;
+ // 头部icon
+ string head_icon = 8;
+ // style
+ ImageStyle style = 9;
+ // 动态本身的类型 type
+ string type = 10;
+ // 附加卡类型
+ string card_type = 11; // ogv manga
+}
+
+// 动态-附加卡-电竞卡
+message AdditionEsport {
+ // 电竞类型
+ EspaceStyle style = 1;
+ oneof item {
+ // moba类
+ AdditionEsportMoba addition_esport_moba = 2;
+ }
+ // 动态本身的类型 type
+ string type = 3;
+ // 附加卡类型
+ string card_type = 4; // ogv manga
+}
+
+// 动态-附加卡-电竞卡-moba类
+message AdditionEsportMoba {
+ // 头部说明文案
+ string head_text = 1;
+ // 标题
+ string title = 2;
+ // 战队列表
+ repeated MatchTeam match_team = 3;
+ // 比赛信息
+ AdditionEsportMobaStatus addition_esport_moba_status = 4;
+ // 卡片跳转
+ string uri = 5;
+ // 按钮
+ AdditionalButton button = 6;
+ // 副标题
+ string sub_title = 7;
+ // 动态本身的类型 type
+ string type = 10;
+ // 附加卡类型
+ string card_type = 11;
+ // 附加卡图标
+ string head_icon = 12;
+}
+
+// 动态-附加卡-电竞卡-moba类-比赛信息
+message AdditionEsportMobaStatus {
+ // 文案类
+ repeated AdditionEsportMobaStatusDesc addition_esport_moba_status_desc = 1;
+ // 比赛状态文案
+ string title = 2;
+ // 比赛状态状态
+ int32 status = 3;
+ // 日间色值
+ string color = 4;
+ // 夜间色值
+ string night_color = 5;
+}
+
+// 动态-附加卡-电竞卡-moba类-比赛信息-文案类
+message AdditionEsportMobaStatusDesc {
+ // 文案
+ string title = 1;
+ // 日间色值
+ string color = 2;
+ // 夜间色值
+ string night_color = 3;
+}
+
+// 动态-附加卡-商品卡
+message AdditionGoods {
+ // 推荐文案
+ string rcmd_desc = 1;
+ // 商品信息
+ repeated GoodsItem goods_items = 2;
+ // 附加卡类型
+ string card_type = 3;
+ // 头部icon
+ string icon = 4;
+ // 商品附加卡整卡跳转
+ string uri = 5;
+ // 商品类型
+ // 1:淘宝 2:会员购,注:实际是获取的goods_items里面的第一个source_type
+ int32 source_type = 6;
+ //
+ int32 jump_type = 7;
+ //
+ string app_name = 8;
+ //
+ string ad_mark_icon = 9;
+}
+
+// 动态-附加卡-直播附加卡
+message AdditionLiveRoom {
+ //
+ string title = 1;
+ //
+ string cover = 2;
+ //
+ VideoBadge badge = 3;
+ //
+ CoverIconWithText desc_text_upper = 4;
+ //
+ string desc_text_lower = 5;
+ //
+ string uri = 6;
+ //
+ string card_type = 7;
+}
+
+// 动态-附加卡-UGC视频附加卡
+message AdditionUgc {
+ // 说明文案
+ string head_text = 1;
+ // 稿件标题
+ string title = 2;
+ // 封面
+ string cover = 3;
+ // 描述文字1
+ string desc_text_1 = 4;
+ // 描述文字2
+ string desc_text_2 = 5;
+ // 接秒开
+ string uri = 6;
+ // 时长
+ string duration = 7;
+ // 标题支持换行-标题支持单行和双行,本期不支持填充up昵称,支持双行展示,字段默认为true
+ bool line_feed = 8;
+ // 附加卡类型
+ string card_type = 9;
+}
+
+// up主预约发布卡
+message AdditionUP {
+ // 标题
+ string title = 1;
+ // 高亮文本,描述文字1
+ HighlightText desc_text_1 = 2;
+ // 描述文字2
+ string desc_text_2 = 3;
+ // 点击跳转链接
+ string url = 4;
+ // 按钮
+ AdditionalButton button = 5;
+ // 附加卡类型
+ string card_type = 6;
+ // 预约人数(用于预约人数变化)
+ int64 reserve_total = 7;
+ // 活动皮肤
+ AdditionalActSkin act_skin = 8;
+ // 预约id
+ int64 rid = 9;
+ //
+ int32 lottery_type = 10;
+ //
+ HighlightText desc_text3 = 11;
+ //
+ int64 up_mid = 12;
+ //
+ AdditionUserInfo user_info = 13;
+ //
+ string dynamic_id = 14;
+ //
+ bool show_text2 = 15;
+ //
+ int64 dyn_type = 16;
+ //
+ string business_id = 17;
+ //
+ string badge_text = 18;
+ //
+ bool is_premiere = 19;
+}
+
+//
+message AdditionUserInfo {
+ //
+ string name = 1;
+ //
+ string face = 2;
+}
+
+// 动态-附加卡-投票
+message AdditionVote {
+ // 封面图
+ string image_url = 1;
+ // 标题
+ string title = 2;
+ // 展示项1
+ string text_1 = 3;
+ // button文案
+ string button_text = 4;
+ // 点击跳转链接
+ string url = 5;
+}
+
+// 动态模块-投票
+message AdditionVote2 {
+ // 投票类型
+ AdditionVoteType addition_vote_type = 1;
+ // 投票ID
+ int64 vote_id = 2;
+ // 标题
+ string title = 3;
+ // 已过期: xxx人参与· 投票已过期。button 展示去查看
+ // 未过期: xxx人参与· 剩xx天xx时xx分。button展示去投票
+ string label = 4;
+ // 剩余时间
+ int64 deadline = 5;
+ // 生效文案
+ string open_text = 6;
+ // 过期文案
+ string close_text = 7;
+ // 已投票
+ string voted_text = 8;
+ // 投票状态
+ AdditionVoteState state = 9;
+ // 投票信息
+ oneof item {
+ //
+ AdditionVoteWord addition_vote_word = 10;
+ //
+ AdditionVotePic addition_vote_pic = 11;
+ //
+ AdditionVoteDefaule addition_vote_defaule = 12;
+ }
+ // 业务类型
+ // 0:动态投票 1:话题h5组件
+ int32 biz_type = 13;
+ // 投票总人数
+ int64 total = 14;
+ // 附加卡类型
+ string card_type = 15;
+ // 异常提示
+ string tips = 16;
+ // 跳转地址
+ string uri = 17;
+ // 是否投票
+ bool is_voted = 18;
+ // 投票最多多选个数,单选为1
+ int32 choice_cnt = 19;
+ // 是否默认选中分享到动态
+ bool defaule_select_share = 20;
+}
+
+// 外露投票
+message AdditionVoteDefaule {
+ // 图片 多张
+ repeated string cover = 1;
+}
+
+// 外露图片类型
+message AdditionVotePic {
+ // 图片投票详情
+ repeated AdditionVotePicItem item = 1;
+}
+
+// 图片投票详情
+message AdditionVotePicItem {
+ // 选项索引,从1开始
+ int32 opt_idx = 1;
+ // 图片
+ string cover = 2;
+ // 选中状态
+ bool is_vote = 3;
+ // 人数
+ int32 total = 4;
+ // 占比
+ double persent = 5;
+ // 标题文案
+ string title = 6;
+ // 是否投票人数最多的选项
+ bool is_max_option = 7;
+}
+
+// 投票状态
+enum AdditionVoteState {
+ addition_vote_state_none = 0; //
+ addition_vote_state_open = 1; //
+ addition_vote_state_close = 2; //
+}
+
+// 投票类型
+enum AdditionVoteType {
+ addition_vote_type_none = 0; //
+ addition_vote_type_word = 1; //
+ addition_vote_type_pic = 2; //
+ addition_vote_type_default = 3; //
+}
+
+
+// 外露文字类型
+message AdditionVoteWord {
+ // 外露文字投票详情
+ repeated AdditionVoteWordItem item = 1;
+}
+
+// 外露文字投票详情
+message AdditionVoteWordItem {
+ // 选项索引,从1开始
+ int32 opt_idx = 1;
+ // 文案
+ string title = 2;
+ // 选中状态
+ bool is_vote = 3;
+ // 人数
+ int32 total = 4;
+ // 占比
+ double persent = 5;
+ // 是否投票人数最多的选项
+ bool is_max_option = 6;
+}
+
+// 综合页请求广告所需字段,由客户端-网关透传
+message AdParam {
+ // 综合页请求广告所需字段,由客户端-网关透传
+ string ad_extra = 1;
+ // request_id
+ string request_id = 2;
+}
+
+//
+message AlumniDynamicsReply {
+ //
+ repeated DynamicItem list = 1;
+ //
+ string toast = 2;
+}
+
+//
+message AlumniDynamicsReq {
+ //
+ int64 campus_id = 1;
+ //
+ int32 first_time = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ //
+ int32 local_time = 4;
+ //
+ int32 page = 5;
+ //
+ int32 from_type = 6;
+}
+
+//
+message CampusBannerInfo {
+ //
+ string image = 1;
+ //
+ string jump_url = 2;
+}
+
+//
+message CampusBillboardInternalReq {
+ //
+ int64 mid = 1;
+ //
+ int64 campus_id = 2;
+ //
+ string version_code = 3;
+}
+
+//
+message CampusBillBoardReply {
+ //
+ string title = 1;
+ //
+ string help_uri = 2;
+ //
+ string campus_name = 3;
+ //
+ int64 build_time = 4;
+ //
+ string version_code = 5;
+ //
+ repeated OfficialItem list = 6;
+ //
+ string share_uri = 7;
+ //
+ int32 bind_notice = 8;
+ //
+ string update_toast = 9;
+ //
+ int64 campus_id = 10;
+ //
+ CampusFeatureProgress open_progress = 11;
+}
+
+//
+message CampusBillBoardReq {
+ //
+ int64 campus_id = 1;
+ //
+ string version_code = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ //
+ CampusReqFromType from_type = 4;
+}
+
+//
+message CampusEntryTabReq {
+ //
+ int64 campus_id = 1;
+}
+
+//
+message CampusEntryTabResp {
+ //
+ CampusEntryType entry_type = 1;
+}
+
+//
+enum CampusEntryType {
+ //
+ NONE = 0;
+ //
+ ENTRY_DYNAMIC = 1;
+ //
+ ENTRY_HOME = 2;
+}
+
+//
+message CampusFeatureProgress {
+ //
+ int64 progress_full = 1;
+ //
+ int64 progress_achieved = 2;
+ //
+ string desc_title = 3;
+ //
+ string desc_1 = 4;
+ //
+ CampusLabel btn = 5;
+}
+
+//
+message CampusFeedbackInfo {
+ //
+ int32 biz_type = 1;
+ //
+ int64 biz_id = 2;
+ //
+ int64 campus_id = 3;
+ //
+ string reason = 4;
+}
+
+//
+message CampusFeedbackReply {
+ //
+ string message = 1;
+}
+
+//
+message CampusFeedbackReq {
+ //
+ repeated CampusFeedbackInfo infos = 1;
+ //
+ int32 from = 2;
+}
+
+//
+message CampusHomePagesReply {
+ //
+ CampusRcmdTop top = 1;
+ //
+ CampusTop campus_top = 2;
+ //
+ int32 page_type = 3;
+}
+
+//
+message CampusHomePagesReq {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ double lat = 3;
+ //
+ double lng = 4;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
+ //
+ int32 page_type = 6;
+}
+
+enum CampusRcmdReqFrom {
+ CAMPUS_RCMD_FROM_UNKNOWN = 0;
+ CAMPUS_RCMD_FROM_HOME_UN_OPEN = 1;
+ CAMPUS_RCMD_FROM_VISIT_OTHER = 2;
+ CAMPUS_RCMD_FROM_HOME_MOMENT = 3;
+ CAMPUS_RCMD_FROM_DYN_MOMENT = 4;
+ CAMPUS_RCMD_FROM_PAGE_SUBORDINATE_MOMENT = 5;
+}
+
+//
+enum CampusHomePageType {
+ //
+ PAGE_MAJOR = 0;
+ //
+ PAGE_SUBORDINATE = 1;
+ //
+ PAGE_MAJOR_DETAIL = 2;
+}
+
+//
+message CampusHomeRcmdTopic {
+ //
+ ModuleTitle title = 1;
+ //
+ repeated TopicItem topic = 2;
+}
+
+//
+message CampusInfo {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ string desc = 3;
+ //
+ int64 online = 4;
+ //
+ string url = 5;
+}
+
+//
+message CampusLabel {
+ //
+ string text = 1;
+ //
+ string url = 2;
+ //
+ string desc = 3;
+}
+
+//
+message CampusMateLikeListReply {
+ //
+ repeated ModuleAuthor list = 1;
+}
+
+//
+message CampusMateLikeListReq {
+ //
+ int64 dynamic_id = 1;
+ //
+ CampusReqFromType from_type = 2;
+}
+
+//
+enum CampusMngAuditStatus {
+ //
+ campus_mng_audit_none = 0;
+ //
+ campus_mng_audit_in_process = 1;
+ //
+ campus_mng_audit_failed = 2;
+}
+
+//
+message CampusMngBadge {
+ //
+ string title = 1;
+ //
+ string badge_url = 2;
+ //
+ string upload_hint_msg = 3;
+}
+
+//
+message CampusMngBasicInfo {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ string hint_msg = 3;
+}
+
+//
+message CampusMngDetailReply {
+ //
+ repeated CampusMngItem items = 1;
+ //
+ string top_hint_bar_msg = 2;
+ //
+ string bottom_submit_hint_msg = 3;
+ //
+ int64 campus_id = 4;
+ //
+ string campus_name = 5;
+}
+
+//
+message CampusMngDetailReq {
+ //
+ int64 campus_id = 1;
+}
+
+//
+message CampusMngItem {
+ //
+ int32 audit_status = 1;
+ //
+ string audit_message = 2;
+ //
+ int32 item_type = 3;
+ //
+ string mng_item_id = 4;
+ //
+ bool is_del = 5;
+ // Oneof field:
+ oneof item {
+ //
+ CampusMngBasicInfo basic_info = 6;
+ //
+ CampusMngBadge badge = 7;
+ //
+ string slogan = 8;
+ //
+ CampusMngQuiz quiz = 9;
+ }
+}
+
+//
+enum CampusMngItemType {
+ //
+ campus_mng_none = 0;
+ //
+ campus_mng_basic_info = 1;
+ //
+ campus_mng_badge = 2;
+ //
+ campus_mng_slogan = 3;
+ //
+ campus_mng_quiz = 4;
+}
+
+//
+message CampusMngQuiz {
+ //
+ string title = 1;
+ //
+ CampusLabel more_label = 2;
+ //
+ string add_label = 3;
+ //
+ string submit_label = 4;
+ //
+ int64 quiz_count = 5;
+}
+
+//
+enum CampusMngQuizAction {
+ //
+ campus_mng_quiz_act_list = 0;
+ //
+ campus_mng_quiz_act_add = 1;
+ //
+ campus_mng_quiz_act_del = 2;
+}
+
+//
+message CampusMngQuizDetail {
+ //
+ int64 quiz_id = 1;
+ //
+ string question = 2;
+ //
+ string correct_answer = 3;
+ //
+ repeated string wrong_answer_list = 4;
+ //
+ int32 audit_status = 5;
+ //
+ string audit_message = 6;
+}
+
+//
+message CampusMngQuizOperateReply {
+ //
+ string toast = 1;
+ //
+ repeated CampusMngQuizDetail quiz = 2;
+ //
+ int64 quiz_total = 3;
+}
+
+//
+message CampusMngQuizOperateReq {
+ //
+ int32 action = 1;
+ //
+ int64 campus_id = 2;
+ //
+ repeated CampusMngQuizDetail quiz = 3;
+}
+
+//
+message CampusMngSlogan {
+ //
+ string title = 1;
+ //
+ string slogan = 2;
+ //
+ string input_hint_msg = 3;
+}
+
+//
+message CampusMngSubmitReply {
+ //
+ string toast = 1;
+}
+
+//
+message CampusMngSubmitReq {
+ //
+ int64 campus_id = 1;
+ //
+ repeated CampusMngItem modified_items = 2;
+}
+
+//
+message CampusNoticeInfo {
+ //
+ string title = 1;
+ //
+ string desc = 2;
+ //
+ CampusLabel button = 3;
+}
+
+//
+enum CampusOnlineStatus {
+ //
+ campus_online_offline = 0;
+ //
+ campus_online_online = 1;
+}
+
+//
+message CampusRcmdFeedReply {
+ //
+ repeated DynamicItem list = 1;
+ //
+ string toast = 2;
+ //
+ GuideBarInfo guide_bar = 3;
+ //
+ bool has_more = 4;
+ //
+ bool update = 5;
+}
+
+//
+message CampusRcmdFeedReq {
+ //
+ int64 campus_id = 1;
+ //
+ int32 first_time = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ //
+ int32 local_time = 4;
+ //
+ int32 page = 5;
+ //
+ int32 scroll = 6;
+ //
+ string view_dyn_id = 7;
+ //
+ CampusReqFromType from_type = 8;
+}
+
+//
+message CampusRcmdInfo {
+ //
+ string title = 1;
+ //
+ repeated CampusRcmdItem items = 2;
+}
+
+//
+message CampusRcmdItem {
+ //
+ string title = 1;
+ //
+ repeated RcmdItem items = 2;
+ //
+ int64 campus_id = 3;
+ //
+ CampusLabel entry_label = 4;
+}
+
+//
+message CampusRcmdReply {
+ //
+ CampusRcmdTop top = 1;
+ //
+ CampusRcmdInfo rcmd = 2;
+ //
+ CampusTop campus_top = 3;
+ //
+ int32 page_type = 4;
+ //
+ int32 jump_home_pop = 5;
+}
+
+//
+message CampusRcmdReq {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ double lat = 3;
+ //
+ double lng = 4;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
+ //
+ CampusReqFromType from_type = 6;
+ //
+ CampusHomePageType page_type = 7;
+}
+
+//
+message CampusRcmdTop {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ string title = 3;
+ //
+ string desc = 4;
+ //
+ int32 type = 5;
+ //
+ RcmdTopButton button = 6;
+ //
+ CampusLabel switch_label = 7;
+ //
+ CampusLabel notice_label = 8;
+ //
+ string desc2 = 9;
+ //
+ string desc3 = 10;
+ //
+ CampusLabel invite_label = 11;
+ //
+ CampusLabel reserve_label = 12;
+ //
+ int64 reserve_number = 13;
+ //
+ int64 max_reserve = 14;
+ //
+ CampusLabel school_label = 15;
+ //
+ CampusLabel mng_label = 16;
+ //
+ CampusHomeRcmdTopic rcmd_topic = 17;
+ //
+ bool audit_before_open = 18;
+ //
+ string audit_message = 19;
+}
+
+//
+message CampusRecommendReply {
+ //
+ repeated RcmdItem items = 1;
+ //
+ bool has_more = 2;
+}
+
+//
+message CampusRecommendReq {
+ //
+ int64 campus_id = 1;
+ //
+ int64 page_no = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ //
+ //CampusRcmdReqFrom from = 4;
+}
+
+//
+message CampusRedDotReply {
+ //
+ int32 red_dot = 1;
+}
+
+//
+message CampusRedDotReq {
+ //
+ int64 campus_id = 1;
+ //
+ CampusReqFromType from_type = 2;
+}
+
+//
+enum CampusReqFromType {
+ //
+ DYNAMIC = 0;
+ //
+ HOME = 1;
+}
+
+//
+message CampusShowTabInfo {
+ //
+ string name = 1;
+ //
+ string url = 2;
+ //
+ int32 type = 3;
+ //
+ int32 red_dot = 4;
+ //
+ string icon_url = 5;
+}
+
+//
+message CampusSquareReply {
+ //
+ string title = 1;
+ //
+ repeated RcmdCampusBrief list = 2;
+ //
+ CampusLabel button = 3;
+}
+
+//
+message CampusSquareReq {
+ //
+ int64 campus_id = 1;
+ //
+ double lat = 2;
+ //
+ double lng = 3;
+}
+
+//
+enum CampusTabType {
+ campus_none = 0; //
+ campus_school = 1; //
+ campus_dynamic = 2; //
+ campus_account = 3; //
+ campus_billboard = 4; //
+ campus_topic = 5; //
+ campues_other = 6; //
+}
+
+//
+message CampusTop {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ repeated CampusShowTabInfo tabs = 3;
+ //
+ CampusLabel switch_label = 4;
+ //
+ string title = 5;
+ //
+ repeated CampusBannerInfo banner = 6;
+ //
+ CampusLabel invite_label = 7;
+ //
+ CampusNoticeInfo notice = 8;
+ //
+ TopicSquareInfo topic_square = 9;
+ //
+ string campus_badge = 10;
+ //
+ string campus_background = 11;
+ //
+ string campus_motto = 12;
+ //
+ CampusLabel mng_entry = 13;
+ //
+ string campus_intro = 14;
+ //
+ string campus_name_link = 15;
+ //
+ string bottom_left_text = 16;
+}
+
+//
+message CampusTopicRcmdFeedReply {
+ //
+ repeated DynamicItem list = 1;
+ //
+ string toast = 2;
+ //
+ bool has_more = 3;
+ //
+ string offset = 4;
+ //
+ IconButton join_discuss = 5;
+}
+
+//
+message CampusTopicRcmdFeedReq {
+ //
+ int64 campus_id = 1;
+ //
+ string offset = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ //
+ int32 local_time = 4;
+ //
+ CampusReqFromType from_type = 5;
+}
+
+//
+message CardParagraph {
+ //
+ ModuleAdditional additional_card = 1;
+ //
+ string biz_id = 3;
+ //
+ LinkNodeType biz_type = 2;
+}
+
+// 动态卡片列表
+message CardVideoDynList {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 更新的动态数
+ int64 update_num = 2;
+ // 历史偏移
+ string history_offset = 3;
+ // 更新基础信息
+ string update_baseline = 4;
+ // 是否还有更多数据
+ bool has_more = 5;
+}
+
+// 视频页-我的追番
+message CardVideoFollowList {
+ // 查看全部(跳转链接)
+ string view_all_link = 1;
+ // 追番列表
+ repeated FollowListItem list = 2;
+}
+
+// 视频页-最近访问
+message CardVideoUpList {
+ // 标题展示文案
+ string title = 1;
+ // up主列表
+ repeated UpListItem list = 2;
+ // 服务端生成的透传上报字段
+ string footprint = 3;
+ // 直播数
+ int32 show_live_num = 4;
+ // 跳转label
+ UpListMoreLabel more_label = 5;
+ // 标题开关(综合页)
+ int32 title_switch = 6;
+ // 是否展示右上角查看更多label
+ bool show_more_label = 7;
+ // 是否在快速消费页查看更多按钮
+ bool show_in_personal = 8;
+ // 是否展示右侧查看更多按钮
+ bool show_more_button = 9;
+ //
+ repeated UpListItem list_second = 10;
+}
+
+//
+message ChannelInfo {
+ //
+ int64 channel_id = 1;
+ //
+ string channel_name = 2;
+ //
+ string desc = 3;
+ //
+ bool is_atten = 4;
+ //
+ string type_icon = 5;
+ //
+ repeated RcmdItem items = 6;
+ //
+ string icon = 7;
+ //
+ string jump_uri = 8;
+}
+
+// 评论外露展示项
+message CmtShowItem {
+ // 用户mid
+ int64 uid = 1;
+ // 用户昵称
+ string uname = 2;
+ // 点击跳转链接
+ string uri = 3;
+ // 评论内容
+ string comment = 4;
+}
+
+//
+message Colors {
+ //
+ string color_day = 1;
+ //
+ string color_night = 2;
+}
+
+// 精选评论区
+message CommentDetail {
+ // 该功能能不能用
+ bool can_modify = 1;
+ // up关闭评论区功能 1允许关闭 0允许开放
+ // 精选评论区功能 1允许停止评论精选 0允许评论精选
+ int64 status = 2;
+}
+
+//
+message CommonShareCardInfo {
+ //
+ int64 sketch_id = 1;
+ //
+ int64 biz_type = 2;
+ //
+ int64 biz_id = 3;
+}
+
+//
+message Config {
+ //
+ bool story_vertical_exp = 1;
+ //
+ int64 detail_view_bits = 2;
+}
+
+//
+enum CoverIcon {
+ cover_icon_none = 0; // 占位 啥都不展示
+ cover_icon_play = 1; // 播放icon
+ cover_icon_danmaku = 2; //
+ cover_icon_up = 3; //
+ cover_icon_vt = 4; // ? 竖屏模式 icon
+}
+
+//
+message CoverIconWithText {
+ //
+ int32 icon = 1;
+ //
+ string text = 2;
+}
+
+// 装扮卡片-粉丝勋章信息
+message DecoCardFan {
+ // 是否是粉丝
+ int32 is_fan = 1;
+ // 数量
+ int32 number = 2;
+ // 数量 str
+ string number_str = 3;
+ // 颜色
+ string color = 4;
+}
+
+// 装扮卡片
+message DecorateCard {
+ // 装扮卡片id
+ int64 id = 1;
+ // 装扮卡片链接
+ string card_url = 2;
+ // 装扮卡片点击跳转链接
+ string jump_url = 3;
+ // 粉丝样式
+ DecoCardFan fan = 4;
+}
+
+// 文本描述
+message Description {
+ // 文本内容
+ string text = 1;
+ // 文本类型
+ DescType type = 2;
+ // 点击跳转链接
+ string uri = 3;
+ // emoji类型
+ EmojiType emoji_type = 4;
+ // 商品类型
+ string goods_type = 5;
+ // 前置Icon
+ string icon_url = 6;
+ // icon_name
+ string icon_name = 7;
+ // 资源ID
+ string rid = 8;
+ // 商品卡特殊字段
+ ModuleDescGoods goods = 9;
+ // 文本原始文案
+ string orig_text = 10;
+ //
+ int32 emoji_size = 11;
+ //
+ EmojiSizeSpec emoji_size_spec = 12;
+}
+
+// 文本类型
+enum DescType {
+ desc_type_none = 0; // 占位
+ desc_type_text = 1; // 文本
+ desc_type_aite = 2; // @
+ desc_type_lottery = 3; // 抽奖
+ desc_type_vote = 4; // 投票
+ desc_type_topic = 5; // 话题
+ desc_type_goods = 6; // 商品
+ desc_type_bv = 7; // bv
+ desc_type_av = 8; // av
+ desc_type_emoji = 9; // 表情
+ desc_type_user = 10; // 外露用户
+ desc_type_cv = 11; // 专栏
+ desc_type_vc = 12; // 小视频
+ desc_type_web = 13; // 网址
+ desc_type_taobao = 14; // 淘宝
+ desc_type_mail = 15; // 邮箱
+ desc_type_ogv_season = 16; // 番剧season
+ desc_type_ogv_ep = 17; // 番剧ep
+ desc_type_search_word = 18; //
+}
+
+
+// 尺寸信息
+message Dimension {
+ //
+ int64 height = 1;
+ //
+ int64 width = 2;
+ //
+ int64 rotate = 3;
+}
+
+//
+enum DisableState {
+ highlight = 0; // 高亮
+ gary = 1; // 置灰(按钮不可点击)
+}
+
+// 动态通用附加卡-follow/取消follow-响应
+message DynAdditionCommonFollowReply {
+ //
+ AdditionalButtonStatus status = 1;
+}
+
+// 动态通用附加卡-follow/取消follow-请求
+message DynAdditionCommonFollowReq {
+ //
+ AdditionalButtonStatus status = 1;
+ //
+ string dyn_id = 2;
+ //
+ string card_type = 3;
+}
+
+// 最近访问-个人feed流列表-返回
+message DynAllPersonalReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 偏移量
+ string offset = 2;
+ // 是否还有更多数据
+ bool has_more = 3;
+ // 已读进度
+ string read_offset = 4;
+ // 关注状态
+ Relation relation = 5;
+ // 顶部预约卡
+ TopAdditionUP addition_up = 6;
+ //
+ string title = 7;
+ //
+ string title_sub = 8;
+}
+
+// 最近访问-个人feed流列表-请求
+message DynAllPersonalReq {
+ // 被访问者的 UID
+ int64 host_uid = 1;
+ // 偏移量 第一页可传空
+ string offset = 2;
+ // 标明下拉几次
+ int32 page = 3;
+ // 是否是预加载 默认是1;客户端预加载。1:是预加载,不更新已读进度,不会影响小红点;0:非预加载,更新已读进度
+ int32 is_preload = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 6;
+ // 服务端生成的透传上报字段
+ string footprint = 7;
+ // 来源
+ string from = 8;
+ // 秒开用
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 9;
+ //
+ string personal_extra = 10;
+}
+
+// 动态综合页-响应
+message DynAllReply {
+ // 卡片列表
+ DynamicList dynamic_list = 1;
+ // 顶部up list
+ CardVideoUpList up_list = 2;
+ // 话题广场
+ TopicList topic_list = 3;
+ // 无关注推荐
+ Unfollow unfollow = 4;
+ // 分区UP推荐
+ DynRegionRcmd region_rcmd = 5;
+ //
+ Config config = 6;
+}
+
+// 动态综合页-请求
+message DynAllReq {
+ // 透传 update_baseline
+ string update_baseline = 1;
+ // 透传 history_offset
+ string offset = 2;
+ // 向下翻页数
+ int32 page = 3;
+ // 刷新方式 1向上刷新 2向下翻页
+ Refresh refresh_type = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 综合页当前更新的最大值
+ string assist_baseline = 6;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 7;
+ // 推荐up主入参(new的时候传)
+ RcmdUPsParam rcmd_ups_param = 8;
+ // 广告参数
+ AdParam ad_param = 9;
+ // 是否冷启
+ int32 cold_start = 10;
+ // 来源
+ string from = 11;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 12;
+ //
+ int64 tab_recall_uid = 13;
+ //
+ int32 tab_recall_type = 14;
+}
+
+// 最近访问-标记已读-请求
+message DynAllUpdOffsetReq {
+ // 被访问者的UID
+ int64 host_uid = 1;
+ // 用户已读进度
+ string read_offset = 2;
+ // 服务端生成的透传上报字段
+ string footprint = 3;
+ //
+ string personal_extra = 4;
+}
+
+
+// 动态卡片
+message DynamicItem {
+ // 动态卡片类型
+ DynamicType card_type = 1;
+ // 转发类型下,源卡片类型
+ DynamicType item_type = 2;
+ // 模块内容
+ repeated Module modules = 3;
+ // 操作相关字段
+ Extend extend = 4;
+ // 该卡片下面是否含有折叠卡
+ int32 has_fold = 5;
+ // 透传到客户端的埋点字段。
+ string server_info = 6;
+}
+
+//动态卡片列表
+message DynamicList {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 更新的动态数
+ int64 update_num = 2;
+ // 历史偏移
+ string history_offset = 3;
+ // 更新基础信息
+ string update_baseline = 4;
+ // 是否还有更多数据
+ bool has_more = 5;
+}
+
+// 枚举-动态类型
+enum DynamicType {
+ dyn_none = 0; // 占位
+ forward = 1; // 转发
+ av = 2; // 稿件: ugc、小视频、短视频、UGC转PGC
+ pgc = 3; // pgc:番剧、PGC番剧、PGC电影、PGC电视剧、PGC国创、PGC纪录片
+ courses = 4; // 付费更新批次
+ fold = 5; // 折叠
+ word = 6; // 纯文字
+ draw = 7; // 图文
+ article = 8; // 专栏 原仅phone端
+ music = 9; // 音频 原仅phone端
+ common_square = 10; // 通用卡 方形
+ common_vertical = 11; // 通用卡 竖形
+ live = 12; // 直播卡 只有转发态
+ medialist = 13; // 播单 原仅phone端 只有转发态
+ courses_season = 14; // 付费更新批次 只有转发态
+ ad = 15; // 广告卡
+ applet = 16; // 小程序卡
+ subscription = 17; // 订阅卡
+ live_rcmd = 18; // 直播推荐卡
+ banner = 19; // 通栏
+ ugc_season = 20; // 合集卡
+ subscription_new = 21; // 新订阅卡
+ story = 22; //
+ topic_rcmd = 23; //
+ cour_up = 24; //
+ topic_set = 25; //
+ notice = 26; //
+ text_notice = 27; //
+}
+
+// 动态详情页-响应
+message DynDetailReply {
+ // 动态详情
+ DynamicItem item = 1;
+}
+
+// 动态详情页-请求
+message DynDetailReq {
+ // up主uid
+ int64 uid = 1;
+ // 动态ID
+ string dynamic_id = 2;
+ // 动态类型
+ int64 dyn_type = 3;
+ // 业务方资源id
+ int64 rid = 4;
+ // 广告参数
+ AdParam ad_param = 5;
+ // From来源
+ string from = 6;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 7;
+ // 分享id
+ string share_id = 8;
+ // 分享类型
+ // 1:文字 2:图片 3:链接 4:视频 5:音频
+ int32 share_mode = 9;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 10;
+ // pattern
+ string pattern = 11;
+ //
+ Config config = 12;
+}
+
+// 批量动态id获取动态详情-响应
+message DynDetailsReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+}
+
+// 批量动态id获取动态详情-请求
+message DynDetailsReq {
+ // 动态id
+ string dynamic_ids = 1;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 2;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 3;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+ //
+ Config config = 5;
+}
+
+// 动态小卡类型
+enum DynExtendType {
+ dyn_ext_type_none = 0; // 占位
+ dyn_ext_type_topic = 1; // 话题小卡
+ dyn_ext_type_lbs = 2; // lbs小卡
+ dyn_ext_type_hot = 3; // 热门小卡
+ dyn_ext_type_game = 4; // 游戏小卡
+ dyn_ext_type_common = 5; // 通用小卡
+ dyn_ext_type_biliCut = 6; // 必剪小卡
+ dyn_ext_type_ogv = 7; // ogv小卡
+ dyn_ext_type_auto_ogv = 8; // 自动附加ogv小卡
+}
+
+// 动态发布生成临时卡-响应
+message DynFakeCardReply {
+ // 动态卡片
+ DynamicItem item = 1;
+}
+
+// 动态发布生成临时卡-请求
+message DynFakeCardReq {
+ //卡片内容json string
+ string content = 1;
+}
+
+//
+message DynFeatureGate {
+ //
+ bool enhanced_interaction = 1;
+}
+
+//
+message DynFriendReply {
+ //
+ repeated DynamicItem dyn_list = 1;
+ //
+ bool has_more = 2;
+ //
+ string offset = 3;
+}
+
+//
+message DynFriendReq {
+ //
+ string offset = 1;
+ //
+ int32 local_time = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+}
+
+// 轻浏览-响应
+message DynLightReply {
+ // 卡片列表
+ DynamicList dynamic_list = 1;
+}
+
+// 轻浏览-请求
+message DynLightReq {
+ // 透传 history_offset
+ string history_offset = 1;
+ // 向下翻页数
+ int32 page = 2;
+ // 来源
+ string from = 3;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 5;
+ //
+ int32 from_type = 6;
+ //
+ int64 fake_uid = 7;
+}
+
+// 查看更多-列表-响应
+message DynMixUpListViewMoreReply {
+ //
+ repeated MixUpListItem items = 1;
+ //
+ string search_default_text = 2;
+ // 排序类型列表
+ repeated SortType sort_types = 3;
+ // 是否展示更多的排序策略
+ bool show_more_sort_types = 4;
+ // 默认排序策略
+ int32 default_sort_type = 5;
+}
+
+// 查看更多-请求
+message DynMixUpListViewMoreReq {
+ // 排序策略
+ // 1:推荐排序 2:最常访问 3:最近关注,其他值为默认排序
+ int32 sort_type = 1;
+}
+
+// 动态模块类型
+enum DynModuleType {
+ module_none = 0; // 占位
+ module_author = 1; // 发布人模块
+ module_dispute = 2; // 争议小黄条
+ module_desc = 3; // 描述文案
+ module_dynamic = 4; // 动态卡片
+ module_forward = 5; // 转发模块
+ module_likeUser = 6; // 点赞用户(废弃)
+ module_extend = 7; // 小卡模块
+ module_additional = 8; // 附加卡
+ module_stat = 9; // 计数信息
+ module_fold = 10; // 折叠
+ module_comment = 11; // 评论外露(废弃)
+ module_interaction = 12; // 外露交互模块(点赞、评论)
+ module_author_forward = 13; // 转发卡的发布人模块
+ module_ad = 14; // 广告卡模块
+ module_banner = 15; // 通栏模块
+ module_item_null = 16; // 获取物料失败模块
+ module_share_info = 17; // 分享组件
+ module_recommend = 18; // 相关推荐模块
+ module_stat_forward = 19; // 转发卡计数信息
+ module_top = 20; // 顶部模块
+ module_bottom = 21; // 底部模块
+ module_story = 22; //
+ module_topic = 23; //
+ module_topic_details_ext = 24; //
+ module_top_tag = 25; //
+ module_topic_brief = 26; //
+ module_title = 27; //
+ module_button = 28;
+ module_notice = 29;
+ module_opus_summary = 30;
+ module_copyright = 31;
+ module_paragraph = 32;
+ module_blocked = 33;
+ module_text_notice = 34;
+ module_opus_collection = 35;
+}
+
+// 推荐页-响应
+message DynRcmdReply {
+ // 推荐页返回参数
+ DynRegionRcmd region_rcmd = 1;
+ //
+ DynamicList dynamic_list = 2;
+}
+
+// 推荐页-请求
+message DynRcmdReq {
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 1;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 2;
+ //
+ int64 fake_uid = 3;
+ //
+ bool is_refresh = 4;
+}
+
+// 关注推荐up主换一换-响应
+message DynRcmdUpExchangeReply {
+ // 无关注推荐
+ Unfollow unfollow = 1;
+}
+
+// 关注推荐up主换一换-请求
+message DynRcmdUpExchangeReq {
+ // 登录用户id
+ int64 uid = 1;
+ // 上一次不感兴趣的ts,单位:秒;该字段透传给搜索
+ int64 dislikeTs = 2;
+ // 需要与服务端确认或参照客户端现有参数
+ string from = 3;
+}
+
+// 推荐页返回参数
+message DynRegionRcmd {
+ // 分区推荐项目列表
+ repeated DynRegionRcmdItem items = 1;
+ // 分区聚类推荐选项
+ RcmdOption opts = 2;
+}
+
+// 分区推荐项目
+message DynRegionRcmdItem {
+ // 分区id
+ int64 rid = 1;
+ // 标题
+ string title = 2;
+ // 推荐模块
+ repeated ModuleRcmd items = 3;
+}
+
+//
+message DynScreenTab {
+ //
+ string title = 1;
+ //
+ string name = 2;
+ //
+ bool default_tab = 3;
+ //
+ bool strategy_show_on_entrance = 4;
+ //
+ bool strategy_show_on_refresh = 5;
+ //
+ bool strategy_show_on_pull_up = 6;
+}
+
+//
+message DynSearchReply {
+ //
+ SearchChannel channel_info = 1;
+ //
+ SearchTopic search_topic = 2;
+ //
+ SearchInfo search_info = 3;
+}
+
+//
+message DynSearchReq {
+ //
+ string keyword = 1;
+ //
+ int32 page = 2;
+ //
+ int32 local_time = 3;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+}
+
+//
+message DynServerDetailsReply {
+ //
+ map items = 1;
+}
+
+//
+message DynServerDetailsReq {
+ //
+ int32 local_time = 2;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ //
+ string mobi_app = 4;
+ //
+ string device = 5;
+ //
+ string buvid = 6;
+ //
+ int64 build = 7;
+ //
+ int64 mid = 8;
+ //
+ string platform = 9;
+ //
+ bool is_master = 10;
+ //
+ repeated int64 top_dynamic_ids = 11;
+}
+
+// 空间页动态-请求
+message DynSpaceReq {
+ // 被访问者,也就是空间主人的uid
+ int64 host_uid = 1;
+ // 动态偏移history_offset
+ string history_offset = 2;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 3;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 4;
+ // 向下翻页数,默认从1开始
+ int64 page = 5;
+ // 来源,空间页:space,直播tab:live
+ string from = 6;
+}
+
+// 空间页动态-响应
+message DynSpaceRsp {
+ // 卡片列表
+ repeated DynamicItem list = 1;
+ // 历史偏移
+ string history_offset = 2;
+ // 是否还有更多数据
+ bool has_more = 3;
+}
+
+//
+message DynSpaceSearchDetailsReply {
+ //
+ map items = 1;
+}
+
+//
+message DynSpaceSearchDetailsReq {
+ //
+ repeated string search_words = 2;
+ //
+ int32 local_time = 3;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+ //
+ string mobi_app = 5;
+ //
+ string device = 6;
+ //
+ string buvid = 7;
+ //
+ int64 build = 8;
+ //
+ int64 mid = 9;
+ //
+ string platform = 10;
+ //
+ string ip = 11;
+ //
+ int32 net_type = 12;
+ //
+ int32 tf_type = 13;
+}
+
+//
+message DynTab {
+ //
+ string title = 1;
+ //
+ string uri = 2;
+ //
+ string bubble = 3;
+ //
+ int32 red_point = 4;
+ //
+ int64 city_id = 5;
+ //
+ int32 is_popup = 6;
+ //
+ Popup popup = 7;
+ //
+ bool default_tab = 8;
+ //
+ string sub_title = 9;
+ //
+ string anchor = 10;
+ //
+ string internal_test = 11;
+ //
+ int32 type = 12;
+ //
+ DynTab back_up = 13;
+}
+
+//
+message DynTabReply {
+ //
+ repeated DynTab dyn_tab = 1;
+ //
+ repeated DynScreenTab screen_tab = 2;
+}
+
+//
+message DynTabReq {
+ //
+ int32 teenagers_mode = 1;
+ //
+ CampusReqFromType from_type = 2;
+}
+
+// 动态点赞-请求
+message DynThumbReq {
+ // 用户uid
+ int64 uid = 1;
+ // 动态id
+ string dyn_id = 2;
+ // 动态类型(透传extend中的dyn_type)
+ int64 dyn_type = 3;
+ // 业务方资源id
+ string rid = 4;
+ // 点赞类型
+ ThumbType type = 5;
+}
+
+// 最近访问-个人feed流列表-响应
+message DynVideoPersonalReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 偏移量
+ string offset = 2;
+ // 是否还有更多数据
+ bool has_more = 3;
+ // 已读进度
+ string read_offset = 4;
+ // 关注状态
+ Relation relation = 5;
+ // 顶部预约卡
+ TopAdditionUP addition_up = 6;
+ //
+ string title = 7;
+ //
+ string title_sub = 8;
+}
+
+// 最近访问-个人feed流列表-请求
+message DynVideoPersonalReq {
+ // 被访问者的 UID
+ int64 host_uid = 1;
+ // 偏移量 第一页可传空
+ string offset = 2;
+ // 标明下拉几次
+ int32 page = 3;
+ // 是否是预加载
+ int32 is_preload = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 6;
+ // 服务端生成的透传上报字段
+ string footprint = 7;
+ // 来源
+ string from = 8;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 9;
+ //
+ int64 pegasus_avid = 10;
+ //
+ string personal_extra = 11;
+}
+
+// 动态视频页-响应
+message DynVideoReply {
+ // 卡片列表
+ CardVideoDynList dynamic_list = 1;
+ // 动态卡片
+ CardVideoUpList video_up_list = 2;
+ // 视频页-我的追番
+ CardVideoFollowList video_follow_list = 3;
+}
+
+// 动态视频页-请求
+message DynVideoReq {
+ // 透传 update_baseline
+ string update_baseline = 1;
+ // 透传 history_offset
+ string offset = 2;
+ // 向下翻页数
+ int32 page = 3;
+ // 刷新方式
+ // 1:向上刷新 2:向下翻页
+ Refresh refresh_type = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 综合页当前更新的最大值
+ string assist_baseline = 6;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 7;
+ // 来源
+ string from = 8;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 9;
+}
+
+// 最近访问-标记已读-请求
+message DynVideoUpdOffsetReq {
+ // 被访问者的UID
+ int64 host_uid = 1;
+ // 用户已读进度
+ string read_offset = 2;
+ // 服务端生成的透传上报字段
+ string footprint = 3;
+ //
+ string personal_extra = 4;
+}
+
+// 投票操作-响应
+message DynVoteReply {
+ // 投票详情
+ AdditionVote2 item = 1;
+ // 投票操作返回状态
+ string toast = 2;
+}
+
+// 投票操作-请求
+message DynVoteReq {
+ // 投票ID
+ int64 vote_id = 1;
+ // 选项索引数组
+ repeated int64 votes = 2;
+ // 状态
+ VoteStatus status = 3;
+ // 动态ID
+ string dynamic_id = 4;
+ // 是否分享
+ bool share = 5;
+}
+
+//
+message EmojiSizeSpec {
+ //
+ int64 width = 1;
+}
+
+// 表情包类型
+enum EmojiType {
+ emoji_none = 0; // 占位
+ emoji_old = 1; // emoji旧类型
+ emoji_new = 2; // emoji新类型
+ vip = 3; // 大会员表情
+}
+
+//
+message EmoteNode {
+ //
+ string emote_url = 2;
+ //
+ EmoteSize emote_width = 3;
+ //
+ ImgInlineCfg inline_img_cfg = 5;
+ //
+ bool is_inline_img = 4;
+ //
+ WordNode raw_text = 1;
+}
+
+//
+message EmoteSize {
+ //
+ double width = 1;
+ //
+ int32 emoji_size = 2;
+}
+
+// 附加大卡-电竞卡样式
+enum EspaceStyle {
+ moba = 0; // moba类
+}
+
+// 扩展字段,用于动态部分操作使用
+message Extend {
+ // 动态id
+ string dyn_id_str = 1;
+ // 业务方id
+ string business_id = 2;
+ // 源动态id
+ string orig_dyn_id_str = 3;
+ // 转发卡:用户名
+ string orig_name = 4;
+ // 转发卡:图片url
+ string orig_img_url = 5;
+ // 转发卡:文字内容
+ repeated Description orig_desc = 6;
+ // 填充文字内容
+ repeated Description desc = 7;
+ // 被转发的源动态类型
+ DynamicType orig_dyn_type = 8;
+ // 分享到站外展示类型
+ string share_type = 9;
+ // 分享的场景
+ string share_scene = 10;
+ // 是否快速转发
+ bool is_fast_share = 11;
+ // r_type 分享和转发
+ int32 r_type = 12;
+ // 数据源的动态类型
+ int64 dyn_type = 13;
+ // 用户id
+ int64 uid = 14;
+ // 卡片跳转
+ string card_url = 15;
+ // 透传字段
+ google.protobuf.Any source_content = 16;
+ // 转发卡:用户头像
+ string orig_face = 17;
+ // 评论跳转
+ ExtendReply reply = 18;
+ //
+ string track_id = 19;
+ //
+ ModuleOpusSummary opus_summary = 20;
+ //
+ OnlyFansProperty only_fans_property = 21;
+ //
+ DynFeatureGate feature_gate = 22;
+ //
+ bool is_in_audit = 23;
+ //
+ map history_report = 24;
+}
+
+// 评论扩展
+message ExtendReply {
+ // 基础跳转地址
+ string uri = 1;
+ // 参数部分
+ repeated ExtendReplyParam params = 2;
+}
+
+// 评论扩展参数部分
+message ExtendReplyParam {
+ // 参数名
+ string key = 1;
+ // 参数值
+ string value = 2;
+}
+
+// 动态-拓展小卡模块-通用小卡
+message ExtInfoCommon {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // poiType
+ int32 poi_type = 4;
+ // 类型
+ DynExtendType type = 5;
+ // 客户端埋点用
+ string sub_module = 6;
+ // 行动点文案
+ string action_text = 7;
+ // 行动点链接
+ string action_url = 8;
+ // 资源rid
+ int64 rid = 9;
+ // 轻浏览是否展示
+ bool is_show_light = 10;
+}
+
+// 动态-拓展小卡模块-游戏小卡
+message ExtInfoGame {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 动态-拓展小卡模块-热门小卡
+message ExtInfoHot {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 动态-拓展小卡模块-lbs小卡
+message ExtInfoLBS {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // poiType
+ int32 poi_type = 4;
+}
+
+// 动态-拓展小卡模块-ogv小卡
+message ExtInfoOGV {
+ // ogv小卡
+ repeated InfoOGV info_ogv = 1;
+}
+
+// 动态-拓展小卡模块-话题小卡
+message ExtInfoTopic {
+ // 标题-话题名
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+//
+message FeedFilterReply {
+ //
+ string offset = 1;
+ //
+ bool has_more = 2;
+ //
+ repeated DynamicItem list = 3;
+}
+
+//
+message FeedFilterReq {
+ //
+ string offset = 1;
+ //
+ string tab = 2;
+ //
+ int32 local_time = 3;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+ //
+ AdParam ad_param = 5;
+ //
+ int32 cold_start = 6;
+ //
+ int64 page = 7;
+}
+
+//
+message FetchTabSettingReply {
+ //
+ int32 status = 1;
+}
+
+// 折叠类型
+enum FoldType {
+ FoldTypeZore = 0; // 占位
+ FoldTypePublish = 1; // 用户发布折叠
+ FoldTypeFrequent = 2; // 转发超频折叠
+ FoldTypeUnite = 3; // 联合投稿折叠
+ FoldTypeLimit = 4; // 动态受限折叠
+ FoldTypeTopicMerged = 5;
+}
+
+// 视频页-我的追番-番剧信息
+message FollowListItem {
+ // season_id
+ int64 season_id = 1;
+ // 标题
+ string title = 2;
+ // 封面图
+ string cover = 3;
+ // 跳转链接
+ string url = 4;
+ // new_ep
+ NewEP new_ep = 5;
+ // 子标题
+ string sub_title = 6;
+ // 卡片位次
+ int64 pos = 7;
+}
+
+//
+enum FollowType {
+ ft_not_follow = 0; //
+ ft_follow = 1; //
+}
+
+// 动态-附加卡-商品卡-商品
+message GoodsItem {
+ // 图片
+ string cover = 1;
+ // schemaPackageName(Android用)
+ string schema_package_name = 2;
+ // 商品类型
+ // 1:淘宝 2:会员购
+ int32 source_type = 3;
+ // 跳转链接
+ string jump_url = 4;
+ // 跳转文案
+ string jump_desc = 5;
+ // 标题
+ string title = 6;
+ // 摘要
+ string brief = 7;
+ // 价格
+ string price = 8;
+ // item_id
+ int64 item_id = 9;
+ // schema_url
+ string schema_url = 10;
+ // open_white_list
+ repeated string open_white_list = 11;
+ // use_web_v2
+ bool user_web_v2 = 12;
+ // ad mark
+ string ad_mark = 13;
+ //
+ string app_name = 14;
+ //
+ GoodsJumpType jump_type = 15;
+}
+
+//
+enum GoodsJumpType {
+ goods_none = 0;
+ goods_schema = 1;
+ goods_url = 2;
+}
+
+//
+message GuideBarInfo {
+ //
+ int32 show = 1;
+ //
+ int32 page = 2;
+ //
+ int32 position = 3;
+ //
+ string desc = 4;
+ //
+ int32 jump_page = 5;
+ //
+ int32 jump_position = 6;
+}
+
+// 高亮文本
+message HighlightText {
+ // 展示文本
+ string text = 1;
+ // 高亮类型
+ HighlightTextStyle text_style = 2;
+ //
+ string jump_url = 3;
+ //
+ string icon = 4;
+}
+
+// 文本高亮枚举
+enum HighlightTextStyle {
+ style_none = 0; // 默认
+ style_highlight = 1; // 高亮
+}
+
+//
+enum HomePageTabSttingStatus {
+ SETTING_INVALID = 0;
+ SETTING_OPEN = 1;
+ SETTING_CLOSE = 2;
+}
+
+//
+message HomeSubscribeReply {
+ //
+ int32 online = 1;
+}
+
+//
+message HomeSubscribeReq {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+}
+
+//
+message IconBadge {
+ //
+ string icon_bg_url = 1;
+ //
+ string text = 2;
+}
+
+//
+message IconButton {
+ //
+ string text = 1;
+ //
+ string icon_head = 2;
+ //
+ string icon_tail = 3;
+ //
+ string jump_uri = 4;
+}
+
+//
+enum IconResLocal {
+ ICON_RES_LOCAL_NONE = 0;
+ ICON_RES_LOCAL_LIVE = 1;
+}
+
+//
+message ImageSet {
+ //
+ string img_day = 1;
+ //
+ string img_dark = 2;
+}
+
+// 枚举-附加卡样式
+enum ImageStyle {
+ add_style_vertical = 0; //
+ add_style_square = 1; //
+}
+
+//
+message ImgInlineCfg {
+ //
+ double width = 1;
+ //
+ double height = 2;
+ //
+ Colors color = 3;
+}
+
+// 动态-拓展小卡模块-ogv小卡-(one of 片单、榜单、分区)
+message InfoOGV {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // 客户端埋点用
+ string sub_module = 4;
+}
+
+//
+message InteractionFace {
+ //
+ int64 mid = 1;
+ //
+ string face = 2;
+}
+
+// 外露交互模块
+message InteractionItem {
+ // 外露模块类型
+ LocalIconType icon_type = 1;
+ // 外露模块文案
+ repeated Description desc = 2;
+ // 外露模块uri相关 根据type不同用法不同
+ string uri = 3;
+ // 动态id
+ string dynamic_id = 4;
+ // 评论mid
+ int64 comment_mid = 6;
+ //
+ repeated InteractionFace faces = 7;
+ //
+ InteractionStat stat = 8;
+ //
+ string icon = 9;
+}
+
+//
+message InteractionStat {
+ //
+ int64 like = 1;
+}
+
+//
+message LbsPoiDetail {
+ //
+ string poi = 1;
+ //
+ int64 type = 2;
+ //
+ repeated string base_pic = 3;
+ //
+ repeated string cover = 4;
+ //
+ string address = 5;
+ //
+ string title = 6;
+}
+
+//
+message LbsPoiReply {
+ //
+ bool has_more = 1;
+ //
+ string offset = 2;
+ //
+ LbsPoiDetail detail = 3;
+ //
+ repeated DynamicItem list = 4;
+}
+
+//
+message LbsPoiReq {
+ //
+ string poi = 1;
+ //
+ int64 type = 2;
+ //
+ string offset = 3;
+ //
+ int32 refresh_type = 4;
+ //
+ int32 local_time = 5;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
+}
+
+//
+message LegacyTopicFeedReply {
+ //
+ repeated DynamicItem list = 1;
+ //
+ bool has_more = 2;
+ //
+ string offset = 3;
+ //
+ repeated SortType supported_sort_types = 4;
+ //
+ repeated SortType feed_card_filters = 5;
+}
+
+//
+message LegacyTopicFeedReq {
+ //
+ int64 topic_id = 1;
+ //
+ string topic_name = 2;
+ //
+ string offset = 3;
+ //
+ SortType sort_type = 4;
+ //
+ SortType card_filter = 5;
+}
+
+//
+enum LightFromType {
+ from_login = 0; //
+ from_unlogin = 1; //
+}
+
+// 点赞动画
+message LikeAnimation {
+ // 开始动画
+ string begin = 1;
+ // 过程动画
+ string proc = 2;
+ // 结束动画
+ string end = 3;
+ // id
+ int64 like_icon_id = 4;
+}
+
+// 点赞拓展信息
+message LikeInfo {
+ // 点赞动画
+ LikeAnimation animation = 1;
+ // 是否点赞
+ bool is_like = 2;
+}
+
+// 点赞列表-响应
+message LikeListReply {
+ // 用户模块列表
+ repeated ModuleAuthor list = 1;
+ // 是否还有更多数据
+ bool has_more = 2;
+ // 点赞总数
+ int64 total_count = 3;
+}
+
+// 点赞列表-请求
+message LikeListReq {
+ // 动态ID
+ string dynamic_id = 1;
+ // 动态类型
+ int64 dyn_type = 2;
+ // 业务方资源id
+ int64 rid = 3;
+ //上一页最后一个uid
+ int64 uid_offset = 4;
+ // 下拉页数
+ int32 page = 5;
+}
+
+// 点赞用户
+message LikeUser {
+ // 用户mid
+ int64 uid = 1;
+ // 用户昵称
+ string uname = 2;
+ // 点击跳转链接
+ string uri = 3;
+}
+
+//
+message LineParagraph {
+ //
+ MdlDynDrawItem pic = 1;
+}
+
+//
+message LinkNode {
+ //
+ WordNode show_text = 1;
+ //
+ string link = 2;
+ //
+ string icon = 3;
+ //
+ string icon_suffix = 4;
+ //
+ string link_type = 5;
+ //
+ LinkNodeType link_type_enum = 6;
+ //
+ string biz_id = 7;
+ //
+ int64 timestamp = 8;
+ //
+ GoodsItem goods_item = 9;
+ //
+ NoteVideoTS note_video_ts = 10;
+}
+
+//
+enum LinkNodeType {
+ INVALID = 0;
+ VIDEO = 1;
+ RESERVE = 2;
+ VOTE = 3;
+ LIVE = 4;
+ LOTTERY = 5;
+ MATCH = 6;
+ GOODS = 7;
+ OGV_SS = 8;
+ OGV_EP = 9;
+ MANGA = 10;
+ CHEESE = 11;
+ VIDEO_TS = 12;
+ AT = 13;
+ HASH_TAG = 14;
+ ARTICLE = 15;
+ URL = 16;
+ MAIL = 17;
+ LBS = 18;
+ ACTIVITY = 19;
+ ATTACH_CARD_OFFICIAL_ACTIVITY = 20;
+ GAME = 21;
+ DECORATION = 22;
+ UP_TOPIC = 23;
+ UP_ACTIVITY = 24;
+ UP_MAOER = 25;
+ MEMBER_GOODS = 26;
+ OPENMALL_UP_ITEMS = 27;
+ SEARCH = 28;
+}
+
+// 直播信息
+message LiveInfo {
+ // 是否在直播
+ // 0:未直播 1:正在直播 (废弃)
+ int32 is_living = 1;
+ // 跳转链接
+ string uri = 2;
+ // 直播状态
+ LiveState live_state = 3;
+}
+
+//
+message LivePendant {
+ //
+ string text = 1;
+ //
+ string icon = 2;
+ //
+ int64 pendant_id = 3;
+}
+
+// 直播状态
+enum LiveState {
+ live_none = 0; // 未直播
+ live_live = 1; // 直播中
+ live_rotation = 2; // 轮播中
+}
+
+// 外露模块类型
+enum LocalIconType {
+ local_icon_comment = 0; //
+ local_icon_like = 1; //
+ local_icon_avatar = 2;
+ local_icon_cover = 3;
+ local_icon_like_and_forward = 4;
+}
+
+// 动态-附加卡-电竞卡-战队
+message MatchTeam {
+ // 战队ID
+ int64 id = 1;
+ // 战队名
+ string name = 2;
+ // 战队图标
+ string cover = 3;
+ // 日间色值
+ string color = 4;
+ // 夜间色值
+ string night_color = 5;
+}
+
+//
+enum MdlBlockedStyle {
+ BLOCKED_STYLE_DEFAULT = 0;
+ BLOCKED_STYLE_IN_AUDIT = 1;
+ BLOCKED_STYLE_ONLY_FANS_LIST = 2;
+ BLOCKED_STYLE_ONLY_FANS_VIDEO = 3;
+}
+
+// 动态列表渲染部分-详情模块-小程序/小游戏
+message MdlDynApplet {
+ // 小程序id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 主标题
+ string title = 4;
+ // 副标题
+ string sub_title = 5;
+ // 封面图
+ string cover = 6;
+ // 小程序icon
+ string icon = 7;
+ // 小程序标题
+ string label = 8;
+ // 按钮文案
+ string button_title = 9;
+}
+
+// 动态-详情模块-稿件
+message MdlDynArchive {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // avid
+ int64 avid = 7;
+ // cid
+ int64 cid = 8;
+ // 视频源类型
+ MediaType media_type = 9;
+ // 尺寸信息
+ Dimension dimension = 10;
+ // 角标,多个角标之前有间距
+ repeated VideoBadge badge = 11;
+ // 是否能够自动播放
+ bool can_play = 12;
+ // stype
+ VideoType stype = 13;
+ // 是否PGC
+ bool isPGC = 14;
+ // inline播放地址
+ string inlineURL = 15;
+ // PGC的epid
+ int64 EpisodeId = 16;
+ // 子类型
+ int32 SubType = 17;
+ // PGC的ssid
+ int64 PgcSeasonId = 18;
+ // 播放按钮
+ string play_icon = 19;
+ // 时长
+ int64 duration = 20;
+ // 跳转地址
+ string jump_url = 21;
+ // 番剧是否为预览视频
+ bool is_preview = 22;
+ // 新角标,多个角标之前没有间距
+ repeated VideoBadge badge_category = 23;
+ // 当前是否是pgc正片
+ bool is_feature = 24;
+ // 是否是预约召回
+ ReserveType reserve_type = 25;
+ // bvid
+ string bvid = 26;
+ // 播放数
+ int32 view = 27;
+ //
+ bool show_premiere_badge = 28;
+ //
+ bool premiere_card = 29;
+ //
+ bool show_progress = 30;
+ //
+ int64 part_duration = 31;
+ //
+ int64 part_progress = 32;
+}
+
+// 动态列表渲染部分-详情模块-专栏模块
+message MdlDynArticle {
+ // 专栏id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 标题
+ string title = 3;
+ // 文案部分
+ string desc = 4;
+ // 配图
+ repeated string covers = 5;
+ // 阅读量标签
+ string label = 6;
+ // 模板类型
+ int32 templateID = 7;
+}
+
+//
+message MdlDynChargingArchive {
+ //
+ MdlDynArchive archive_info = 1;
+ //
+ bool has_permission = 2;
+ //
+ bool can_inline = 3;
+ //
+ string charging_bundle_name = 4;
+ //
+ int64 cfg_preview_end_toast_countdown = 5;
+ //
+ int64 cfg_normal_inline_toast_duration = 6;
+ //
+ OneLineText video_bottom_text_upper = 7;
+ //
+ OneLineText video_bottom_text_lower = 8;
+ //
+ string archive_cover = 9;
+ //
+ string archive_title = 10;
+ //
+ IconButton act_btn = 11;
+ //
+ OneLineText text_normal_inline_toast = 12;
+ //
+ OneLineText text_append_preview_end_toast = 13;
+}
+
+// 动态列表渲染部分-详情模块-通用
+message MdlDynCommon {
+ // 物料id
+ int64 oid = 1;
+ // 跳转地址
+ string uri = 2;
+ // 标题
+ string title = 3;
+ // 描述 漫画卡标题下第一行
+ string desc = 4;
+ // 封面
+ string cover = 5;
+ // 标签1 漫画卡标题下第二行
+ string label = 6;
+ // 所属业务类型
+ int32 bizType = 7;
+ // 镜像数据ID
+ int64 sketchID = 8;
+ // 卡片样式
+ MdlDynCommonType style = 9;
+ // 角标
+ repeated VideoBadge badge = 10;
+ //
+ AdditionalButton button = 11;
+}
+
+//
+enum MdlDynCommonType {
+ mdl_dyn_common_none = 0; //
+ mdl_dyn_common_square = 1; //
+ mdl_dyn_common_vertica = 2; //
+}
+
+// 动态-详情模块-付费课程批次
+message MdlDynCourBatch {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 跳转地址
+ string uri = 3;
+ // 展示项 1(本集标题)
+ string text_1 = 4;
+ // 展示项 2(更新了多少个视频)
+ string text_2 = 5;
+ // 角标
+ VideoBadge badge = 6;
+ // 播放按钮
+ string play_icon = 7;
+ //
+ bool can_play = 8;
+ //
+ bool is_preview = 9;
+ //
+ string cover_left_text_1 = 10;
+ //
+ string cover_left_text_2 = 11;
+ //
+ string cover_left_text_3 = 12;
+ //
+ int64 avid = 13;
+ //
+ int64 cid = 14;
+ //
+ int64 epid = 15;
+ //
+ int64 duration = 16;
+ //
+ int64 season_id = 17;
+}
+
+// 动态-详情模块-付费课程系列
+message MdlDynCourSeason {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 跳转地址
+ string uri = 3;
+ // 展示项 1(更新信息)
+ string text_1 = 4;
+ // 描述信息
+ string desc = 5;
+ // 角标
+ VideoBadge badge = 6;
+ // 播放按钮
+ string play_icon = 7;
+ //
+ bool can_play = 8;
+ //
+ bool is_preview = 9;
+ //
+ int64 avid = 10;
+ //
+ int64 cid = 11;
+ //
+ int64 epid = 12;
+ //
+ int64 duration = 13;
+ //
+ int64 season_id = 14;
+}
+
+//
+message MdlDynCourUp {
+ //
+ string title = 1;
+ //
+ string desc = 2;
+ //
+ string cover = 3;
+ //
+ string uri = 4;
+ //
+ string text_1 = 5;
+ //
+ VideoBadge badge = 6;
+ //
+ string play_icon = 7;
+ //
+ bool can_play = 8;
+ //
+ bool is_preview = 9;
+ //
+ int64 avid = 10;
+ //
+ int64 cid = 11;
+ //
+ int64 epid = 12;
+ //
+ int64 duration = 13;
+ //
+ int64 season_id = 14;
+}
+
+// 动态列表渲染部分-详情模块-图文模块
+message MdlDynDraw {
+ // 图片
+ repeated MdlDynDrawItem items = 1;
+ // 跳转地址
+ string uri = 2;
+ // 图文ID
+ int64 id = 3;
+ //
+ bool is_draw_first = 4;
+ //
+ bool is_big_cover = 5;
+ //
+ bool is_article_cover = 6;
+}
+
+// 动态列表渲染部分-详情模块-图文
+message MdlDynDrawItem {
+ // 图片链接
+ string src = 1;
+ // 图片宽度
+ int64 width = 2;
+ // 图片高度
+ int64 height = 3;
+ // 图片大小
+ float size = 4;
+ // 图片标签
+ repeated MdlDynDrawTag tags = 5;
+}
+
+// 动态列表渲染部分-详情模块-图文-标签
+message MdlDynDrawTag {
+ // 标签类型
+ MdlDynDrawTagType type = 1;
+ // 标签详情
+ MdlDynDrawTagItem item = 2;
+}
+
+// 动态列表部分-详情模块-图文-标签详情
+message MdlDynDrawTagItem {
+ // 跳转链接
+ string url = 1;
+ // 标签内容
+ string text = 2;
+ // 坐标-x
+ int64 x = 3;
+ // 坐标-y
+ int64 y = 4;
+ // 方向
+ int32 orientation = 5;
+ // 来源
+ // 0:未知 1:淘宝 2:自营
+ int32 source = 6;
+ // 商品id
+ int64 item_id = 7;
+ // 用户mid
+ int64 mid = 8;
+ // 话题id
+ int64 tid = 9;
+ // lbs信息
+ string poi = 10;
+ // 商品标签链接
+ string schema_url = 11;
+}
+
+// 图文标签类型
+enum MdlDynDrawTagType {
+ mdl_draw_tag_none = 0; // 占位
+ mdl_draw_tag_common = 1; // 普通标签
+ mdl_draw_tag_goods = 2; // 商品标签
+ mdl_draw_tag_user = 3; // 用户昵称
+ mdl_draw_tag_topic = 4; // 话题名称
+ mdl_draw_tag_lbs = 5; // lbs标签
+}
+
+// 动态列表渲染部分-详情模块-转发模块
+message MdlDynForward {
+ // 动态转发核心模块 套娃
+ DynamicItem item = 1;
+ // 透传类型
+ // 0:分享 1:转发
+ int32 rtype = 2;
+}
+
+// 动态列表渲染部分-详情模块-直播
+message MdlDynLive {
+ // 房间号
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 直播间标题
+ string title = 3;
+ // 直播间封面
+ string cover = 4;
+ // 标题1 例: 陪伴学习
+ string cover_label = 5;
+ // 标题2 例: 54.6万人气
+ string cover_label2 = 6;
+ // 直播状态
+ LiveState live_state = 7;
+ // 直播角标
+ VideoBadge badge = 8;
+ // 是否是预约召回
+ ReserveType reserve_type = 9;
+}
+
+// 动态列表渲染部分-详情模块-直播推荐
+message MdlDynLiveRcmd {
+ // 直播数据
+ string content = 1;
+ // 是否是预约召回
+ ReserveType reserve_type = 2;
+ //
+ LivePendant pendant = 3;
+}
+
+// 动态列表渲染部分-详情模块-播单
+message MdlDynMedialist {
+ // 播单id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 主标题
+ string title = 3;
+ // 副标题
+ string sub_title = 4;
+ // 封面图
+ string cover = 5;
+ // 封面类型
+ int32 cover_type = 6;
+ // 角标
+ VideoBadge badge = 7;
+}
+
+// 动态列表渲染部分-详情模块-音频模块
+message MdlDynMusic {
+ // 音频id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // upId
+ int64 up_id = 3;
+ // 歌名
+ string title = 4;
+ // 专辑封面
+ string cover = 5;
+ // 展示项1
+ string label1 = 6;
+ // upper
+ string upper = 7;
+}
+
+// 动态-详情模块-pgc
+message MdlDynPGC {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // cid
+ int64 cid = 7;
+ // season_id
+ int64 season_id = 8;
+ // epid
+ int64 epid = 9;
+ // aid
+ int64 aid = 10;
+ // 视频源类型
+ MediaType media_type = 11;
+ // 番剧类型
+ VideoSubType sub_type = 12;
+ // 番剧是否为预览视频
+ bool is_preview = 13;
+ // 尺寸信息
+ Dimension dimension = 14;
+ // 角标,多个角标之前有间距
+ repeated VideoBadge badge = 15;
+ // 是否能够自动播放
+ bool can_play = 16;
+ // season
+ PGCSeason season = 17;
+ // 播放按钮
+ string play_icon = 18;
+ // 时长
+ int64 duration = 19;
+ // 跳转地址
+ string jump_url = 20;
+ // 新角标,多个角标之前没有间距
+ repeated VideoBadge badge_category = 21;
+ // 当前是否是pgc正片
+ bool is_feature = 22;
+}
+
+//
+message MdlDynShareChargingQA {
+ //
+ ImageSet background_img = 1;
+ //
+ ImageSet left_icon_img = 2;
+ //
+ string title = 3;
+ //
+ IconButton jump_button = 4;
+ //
+ string uri = 5;
+ //
+ CommonShareCardInfo share_card_meta_info = 6;
+ //
+ string title_prefix_bold = 7;
+}
+
+// 动态列表渲染部分-详情模块-订阅卡
+message MdlDynSubscription {
+ // 卡片物料id
+ int64 id = 1;
+ // 广告创意id
+ int64 ad_id = 2;
+ // 跳转地址
+ string uri = 3;
+ // 标题
+ string title = 4;
+ // 封面图
+ string cover = 5;
+ // 广告标题
+ string ad_title = 6;
+ // 角标
+ VideoBadge badge = 7;
+ // 小提示
+ string tips = 8;
+}
+
+// 动态新附加卡
+message MdlDynSubscriptionNew {
+ //样式类型
+ MdlDynSubscriptionNewStyle style = 1;
+ // 新订阅卡数据
+ oneof item {
+ //
+ MdlDynSubscription dyn_subscription = 2;
+ // 直播推荐
+ MdlDynLiveRcmd dyn_live_rcmd = 3;
+ }
+}
+
+//
+enum MdlDynSubscriptionNewStyle {
+ mdl_dyn_subscription_new_style_nont = 0; // 占位
+ mdl_dyn_subscription_new_style_live = 1; // 直播
+ mdl_dyn_subscription_new_style_draw = 2; // 图文
+}
+
+//
+message MdlDynTopicSet {
+ //
+ repeated TopicItem topics = 1;
+ //
+ IconButton more_btn = 2;
+ //
+ int64 topic_set_id = 3;
+ //
+ int64 push_id = 4;
+}
+
+// 动态列表渲染部分-UGC合集
+message MdlDynUGCSeason {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // 卡片物料id
+ int64 id = 7;
+ // inline播放地址
+ string inlineURL = 8;
+ // 是否能够自动播放
+ bool can_play = 9;
+ // 播放按钮
+ string play_icon = 10;
+ // avid
+ int64 avid = 11;
+ // cid
+ int64 cid = 12;
+ // 尺寸信息
+ Dimension dimension = 13;
+ // 时长
+ int64 duration = 14;
+ // 跳转地址
+ string jump_url = 15;
+}
+
+// 播放器类型
+enum MediaType {
+ MediaTypeNone = 0; // 本地
+ MediaTypeUGC = 1; // UGC
+ MediaTypePGC = 2; // PGC
+ MediaTypeLive = 3; // 直播
+ MediaTypeVCS = 4; // 小视频
+}
+
+// 查看更多-列表单条数据
+message MixUpListItem {
+ // 用户mid
+ int64 uid = 1;
+ // 特别关注
+ // 0:否 1:是
+ int32 special_attention = 2;
+ // 小红点状态
+ // 0:没有 1:有
+ int32 reddot_state = 3;
+ // 直播信息
+ MixUpListLiveItem live_info = 4;
+ // 昵称
+ string name = 5;
+ // 头像
+ string face = 6;
+ // 认证信息
+ OfficialVerify official = 7;
+ // 大会员信息
+ VipInfo vip = 8;
+ // 关注状态
+ Relation relation = 9;
+ //
+ int32 permire_state = 10;
+ //
+ string uri = 11;
+}
+
+message MixUpListLiveItem {
+ // 直播状态
+ // 0:未直播 1:直播中
+ bool status = 1;
+ // 房间号
+ int64 room_id = 2;
+ // 跳转地址
+ string uri = 3;
+}
+
+// 动态模块
+message Module {
+ // 类型
+ DynModuleType module_type = 1;
+ oneof module_item {
+ // 用户模块 1
+ ModuleAuthor module_author = 2;
+ // 争议黄条模块 2
+ ModuleDispute module_dispute = 3;
+ // 动态正文模块 3
+ ModuleDesc module_desc = 4;
+ // 动态卡模块 4
+ ModuleDynamic module_dynamic = 5;
+ // 点赞外露(废弃)
+ ModuleLikeUser module_likeUser = 6;
+ // 小卡模块 6
+ ModuleExtend module_extend = 7;
+ // 大卡模块 5
+ ModuleAdditional module_additional = 8;
+ // 计数模块 8
+ ModuleStat module_stat = 9;
+ // 折叠模块 9
+ ModuleFold module_fold = 10;
+ // 评论外露(废弃)
+ ModuleComment module_comment = 11;
+ // 外露交互模块(点赞、评论) 7
+ ModuleInteraction module_interaction = 12;
+ // 转发卡-原卡用户模块
+ ModuleAuthorForward module_author_forward = 13;
+ // 广告卡
+ ModuleAd module_ad = 14;
+ // 通栏
+ ModuleBanner module_banner = 15;
+ // 获取物料失败
+ ModuleItemNull module_item_null = 16;
+ // 分享组件
+ ModuleShareInfo module_share_info = 17;
+ // 相关推荐模块
+ ModuleRecommend module_recommend = 18;
+ // 顶部模块
+ ModuleTop module_top = 19;
+ // 底部模块
+ ModuleButtom module_buttom = 20;
+ // 转发卡计数模块
+ ModuleStat module_stat_forward = 21;
+ //
+ ModuleStory module_story = 22;
+ //
+ ModuleTopic module_topic = 23;
+ //
+ ModuleTopicDetailsExt module_topic_details_ext = 24;
+ //
+ ModuleTopTag module_top_tag = 25;
+ //
+ ModuleTopicBrief module_topic_brief = 26;
+ //
+ ModuleTitle module_title = 27;
+ //
+ ModuleButton module_button = 28;
+ //
+ ModuleNotice module_notice = 29;
+ //
+ ModuleOpusSummary module_opus_summary = 30;
+ //
+ ModuleCopyright module_copyright = 31;
+ //
+ ModuleParagraph module_paragraph = 32;
+ //
+ ModuleBlocked module_blocked = 33;
+ //
+ ModuleTextNotice module_text_notice = 34;
+ //
+ ModuleOpusCollection module_opus_collection = 35;
+ }
+}
+
+// 动态列表-用户模块-广告卡
+message ModuleAd {
+ // 广告透传信息
+ google.protobuf.Any source_content = 1;
+ // 用户模块
+ ModuleAuthor module_author = 2;
+ //
+ int32 ad_content_type = 3;
+ //
+ string cover_left_text1 = 4;
+ //
+ string cover_left_text2 = 5;
+ //
+ string cover_left_text3 = 6;
+}
+
+// 动态-附加卡模块
+message ModuleAdditional {
+ // 类型
+ AdditionalType type = 1;
+ oneof item {
+ // 废弃
+ AdditionalPGC pgc = 2;
+ //
+ AdditionGoods goods = 3;
+ // 废弃
+ AdditionVote vote = 4;
+ //
+ AdditionCommon common = 5;
+ //
+ AdditionEsport esport = 6;
+ // 投票
+ AdditionVote2 vote2 = 8;
+ //
+ AdditionUgc ugc = 9;
+ // up主预约发布卡
+ AdditionUP up = 10;
+ //
+ AdditionArticle article = 12;
+ //
+ AdditionLiveRoom live = 13;
+ }
+ // 附加卡物料ID
+ int64 rid = 7;
+ //
+ bool need_write_calender = 11;
+}
+
+// 动态-发布人模块
+message ModuleAuthor {
+ // 用户mid
+ int64 mid = 1;
+ // 时间标签
+ string ptime_label_text = 2;
+ // 用户详情
+ UserInfo author = 3;
+ // 装扮卡片
+ DecorateCard decorate_card = 4;
+ // 点击跳转链接
+ string uri = 5;
+ // 右侧操作区域 - 三点样式
+ repeated ThreePointItem tp_list = 6;
+ // 右侧操作区域样式枚举
+ ModuleAuthorBadgeType badge_type = 7;
+ // 右侧操作区域 - 按钮样式
+ ModuleAuthorBadgeButton badge_button = 8;
+ // 是否关注
+ // 1:关注 0:不关注 默认0,注:点赞列表使用,其他场景不使用该字段
+ int32 attend = 9;
+ // 关注状态
+ Relation relation = 10;
+ // 右侧操作区域 - 提权样式
+ Weight weight = 11;
+ // 是否展示关注
+ bool show_follow = 12;
+ // 是否置顶
+ bool is_top = 13;
+ // ip属地
+ string ptime_location_text = 14;
+ //
+ bool show_level = 15;
+ //
+ OnlyFans only_fans = 16;
+}
+
+// 动态列表渲染部分-用户模块-按钮
+message ModuleAuthorBadgeButton {
+ // 图标
+ string icon = 1;
+ // 文案
+ string title = 2;
+ // 状态
+ int32 state = 3;
+ // 物料ID
+ int64 id = 4;
+}
+
+// 右侧操作区域样式枚举
+enum ModuleAuthorBadgeType {
+ module_author_badge_type_none = 0; // 占位
+ module_author_badge_type_threePoint = 1; // 三点
+ module_author_badge_type_button = 2; // 按钮类型
+ module_author_badge_type_weight = 3; // 提权
+}
+
+// 动态列表-用户模块-转发模板
+message ModuleAuthorForward {
+ // 展示标题
+ repeated ModuleAuthorForwardTitle title = 1;
+ // 源卡片跳转链接
+ string url = 2;
+ // 用户uid
+ int64 uid = 3;
+ // 时间标签
+ string ptime_label_text = 4;
+ // 是否展示关注
+ bool show_follow = 5;
+ // 源up主头像
+ string face_url = 6;
+ // 双向关系
+ Relation relation = 7;
+ // 右侧操作区域 - 三点样式
+ repeated ThreePointItem tp_list = 8;
+}
+
+// 动态列表-用户模块-转发模板-title部分
+message ModuleAuthorForwardTitle {
+ // 文案
+ string text = 1;
+ // 跳转链接
+ string url = 2;
+}
+
+// 动态列表-通栏
+message ModuleBanner {
+ // 模块标题
+ string title = 1;
+ // 卡片类型
+ ModuleBannerType type = 2;
+ // 卡片
+ oneof item{
+ ModuleBannerUser user = 3;
+ }
+ // 不感兴趣文案
+ string dislike_text = 4;
+ // 不感兴趣图标
+ string dislike_icon = 5;
+}
+
+// 动态列表-通栏类型
+enum ModuleBannerType {
+ module_banner_type_none = 0; //
+ module_banner_type_user = 1; //
+}
+
+// 动态通栏-用户
+message ModuleBannerUser {
+ // 卡片列表
+ repeated ModuleBannerUserItem list = 1;
+}
+
+// 动态通栏-推荐用户卡
+message ModuleBannerUserItem {
+ // up主头像
+ string face = 1;
+ // up主昵称
+ string name = 2;
+ // up主uid
+ int64 uid = 3;
+ // 直播状态
+ LiveState live_state = 4;
+ // 认证信息
+ OfficialVerify official = 5;
+ // 大会员信息
+ VipInfo vip = 6;
+ // 标签信息
+ string label = 7;
+ // 按钮
+ AdditionalButton button = 8;
+ // 跳转地址
+ string uri = 9;
+ //
+ Relation relation = 10;
+}
+
+//
+message ModuleBlocked {
+ //
+ ImageSet icon = 1;
+ //
+ ImageSet bg_img = 2;
+ //
+ string hint_message = 3;
+ //
+ IconButton act_btn = 4;
+ //
+ MdlBlockedStyle block_style = 5;
+ //
+ string sub_hint_message = 6;
+ //
+ OneLineText video_bottom_text_upper = 7;
+ //
+ OneLineText video_bottom_text_lower = 8;
+ //
+ string archive_title = 9;
+ //
+ OneLineText hint_message_one_line = 10;
+}
+
+// 底部模块
+message ModuleButtom {
+ enum InteractionIcon {
+ ICON_INVALID = 0;
+ ICON_FORWARD = 1;
+ ICON_COMMENT = 2;
+ ICON_FAVORITE = 3;
+ ICON_LIKE = 4;
+ }
+ // 计数模块
+ ModuleStat module_stat = 1;
+ //
+ bool comment_box = 2;
+ //
+ string comment_box_msg = 3;
+ //
+ repeated InteractionIcon interaction_icons = 4;
+ //
+ repeated InteractionFace faces = 5;
+}
+
+//
+message ModuleButton {
+ //
+ IconButton btn = 1;
+}
+
+// 评论外露模块
+message ModuleComment {
+ // 评论外露展示项
+ repeated CmtShowItem cmtShowItem = 1;
+}
+
+//
+message ModuleCopyright {
+ //
+ string left_text = 1;
+ //
+ string right_text = 2;
+}
+
+// 动态-描述文字模块
+message ModuleDesc {
+ // 描述信息(已按高亮拆分)
+ repeated Description desc = 1;
+ // 点击跳转链接
+ string jump_uri = 2;
+ // 文本原本
+ string text = 3;
+}
+
+// 正文商品卡参数
+message ModuleDescGoods {
+ // 商品类型
+ // 1:淘宝 2:会员购
+ int32 source_type = 1;
+ // 跳转链接
+ string jump_url = 2;
+ // schema_url
+ string schema_url = 3;
+ // item_id
+ int64 item_id = 4;
+ // open_white_list
+ repeated string open_white_list = 5;
+ // use_web_v2
+ bool user_web_v2 = 6;
+ // ad mark
+ string ad_mark = 7;
+ // schemaPackageName(Android用)
+ string schema_package_name = 8;
+ //
+ int32 jump_type = 9;
+ //
+ string app_name = 10;
+}
+
+// 动态-争议小黄条模块
+message ModuleDispute {
+ // 标题
+ string title = 1;
+ // 描述内容
+ string desc = 2;
+ // 跳转链接
+ string uri = 3;
+}
+
+// 动态-详情模块
+message ModuleDynamic {
+ // 类型
+ ModuleDynamicType type = 1;
+ oneof module_item {
+ //稿件
+ MdlDynArchive dyn_archive = 2;
+ //pgc
+ MdlDynPGC dyn_pgc = 3;
+ //付费课程-系列
+ MdlDynCourSeason dyn_cour_season = 4;
+ //付费课程-批次
+ MdlDynCourBatch dyn_cour_batch = 5;
+ //转发卡
+ MdlDynForward dyn_forward = 6;
+ //图文
+ MdlDynDraw dyn_draw = 7;
+ //专栏
+ MdlDynArticle dyn_article = 8;
+ //音频
+ MdlDynMusic dyn_music = 9;
+ //通用卡方
+ MdlDynCommon dyn_common = 10;
+ //直播卡
+ MdlDynLive dyn_common_live = 11;
+ //播单
+ MdlDynMedialist dyn_medialist = 12;
+ //小程序卡
+ MdlDynApplet dyn_applet = 13;
+ //订阅卡
+ MdlDynSubscription dyn_subscription = 14;
+ //直播推荐卡
+ MdlDynLiveRcmd dyn_live_rcmd = 15;
+ //UGC合集
+ MdlDynUGCSeason dyn_ugc_season = 16;
+ //订阅卡
+ MdlDynSubscriptionNew dyn_subscription_new = 17;
+ //课程
+ MdlDynCourUp dyn_cour_batch_up = 18;
+ //话题集合
+ MdlDynTopicSet dyn_topic_set = 19;
+ //充电稿件
+ MdlDynChargingArchive dyn_charging_archive = 20;
+ //
+ MdlDynShareChargingQA dyn_share_charging_qa = 21;
+ }
+}
+
+// 动态详情模块类型
+enum ModuleDynamicType {
+ mdl_dyn_archive = 0; // 稿件
+ mdl_dyn_pgc = 1; // pgc
+ mdl_dyn_cour_season = 2; // 付费课程-系列
+ mdl_dyn_cour_batch = 3; // 付费课程-批次
+ mdl_dyn_forward = 4; // 转发卡
+ mdl_dyn_draw = 5; // 图文
+ mdl_dyn_article = 6; // 专栏
+ mdl_dyn_music = 7; // 音频
+ mdl_dyn_common = 8; // 通用卡方
+ mdl_dyn_live = 9; // 直播卡
+ mdl_dyn_medialist = 10; // 播单
+ mdl_dyn_applet = 11; // 小程序卡
+ mdl_dyn_subscription = 12; // 订阅卡
+ mdl_dyn_live_rcmd = 13; // 直播推荐卡
+ mdl_dyn_ugc_season = 14; // UGC合集
+ mdl_dyn_subscription_new = 15; // 订阅卡
+ mdl_dyn_cour_batch_up = 16; // 课程
+ mdl_dyn_topic_set = 17; // 话题集合
+}
+
+// 动态-小卡模块
+message ModuleExtend {
+ // 详情
+ repeated ModuleExtendItem extend = 1;
+ // 模块整体跳转uri
+ string uri = 2; // 废弃
+}
+
+// 动态-拓展小卡模块
+message ModuleExtendItem {
+ // 类型
+ DynExtendType type = 1;
+ // 卡片详情
+ oneof extend {
+ // 废弃
+ ExtInfoTopic ext_info_topic = 2;
+ // 废弃
+ ExtInfoLBS ext_info_lbs = 3;
+ // 废弃
+ ExtInfoHot ext_info_hot = 4;
+ // 废弃
+ ExtInfoGame ext_info_game = 5;
+ //
+ ExtInfoCommon ext_info_common = 6;
+ //
+ ExtInfoOGV ext_info_ogv = 7;
+ }
+}
+
+// 动态-折叠模块
+message ModuleFold {
+ // 折叠分类
+ FoldType fold_type = 1;
+ // 折叠文案
+ string text = 2;
+ // 被折叠的动态
+ string fold_ids = 3;
+ // 被折叠的用户信息
+ repeated UserInfo fold_users = 4;
+ //
+ TopicMergedResource topic_merged_resource = 5;
+}
+
+// 外露交互模块
+message ModuleInteraction {
+ // 外露交互模块
+ repeated InteractionItem interaction_item = 1;
+}
+
+// 获取物料失败模块
+message ModuleItemNull {
+ // 图标
+ string icon = 1;
+ // 文案
+ string text = 2;
+}
+
+// 动态-点赞用户模块
+message ModuleLikeUser {
+ // 点赞用户
+ repeated LikeUser like_users = 1;
+ // 文案
+ string display_text = 2;
+}
+
+//
+message ModuleNotice {
+ //
+ string identity = 1;
+ //
+ string icon = 2;
+ //
+ string title = 3;
+ //
+ string url = 4;
+ //
+ int32 notice_type = 5;
+}
+
+//
+message ModuleOpusCollection {
+ //
+ OpusCollection collection_info = 1;
+ //
+ string title_upper = 2;
+ //
+ string title = 3;
+ //
+ string title_prefix_icon = 4;
+ //
+ string total_text = 5;
+}
+
+//
+message ModuleOpusSummary {
+ //
+ Paragraph title = 1;
+ //
+ Paragraph summary = 2;
+ //
+ string summary_jump_btn_text = 3;
+ //
+ repeated MdlDynDrawItem covers = 4;
+}
+
+//
+message ModuleParagraph {
+ //
+ Paragraph paragraph = 1;
+ //
+ bool is_article_title = 2;
+ //
+ ParaSpacing para_spacing = 3;
+}
+
+// 推荐模块
+message ModuleRcmd {
+ // 用户头像
+ RcmdAuthor author = 1;
+ // 推荐卡片列表
+ repeated RcmdItem items = 2;
+ // 透传到客户端的埋点字段
+ string server_info = 3;
+}
+
+// 相关推荐模块
+message ModuleRecommend {
+ // 模块标题
+ string module_title = 1;
+ // 图片
+ string image = 2;
+ // 标签
+ string tag = 3;
+ // 标题
+ string title = 4;
+ // 跳转链接
+ string jump_url = 5;
+ // 序列化的广告信息
+ repeated google.protobuf.Any ad = 6;
+}
+
+// 分享模块
+message ModuleShareInfo {
+ // 展示标题
+ string title = 1;
+ // 分享组件列表
+ repeated ShareChannel share_channels = 2;
+ // share_origin
+ string share_origin = 3;
+ // 业务id
+ string oid = 4;
+ // sid
+ string sid = 5;
+}
+
+// 动态-计数模块
+message ModuleStat {
+ // 转发数
+ int64 repost = 1;
+ // 点赞数
+ int64 like = 2;
+ // 评论数
+ int64 reply = 3;
+ // 点赞拓展信息
+ LikeInfo like_info = 4;
+ // 禁评
+ bool no_comment = 5;
+ // 禁转
+ bool no_forward = 6;
+ // 点击评论跳转链接
+ string reply_url = 7;
+ // 禁评文案
+ string no_comment_text = 8;
+ // 禁转文案
+ string no_forward_text = 9;
+}
+
+//
+message ModuleStory {
+ //
+ string title = 1;
+ //
+ repeated StoryItem items = 2;
+ //
+ bool show_publish_entrance = 3;
+ //
+ int64 fold_state = 4;
+ //
+ string uri = 5;
+ //
+ string cover = 6;
+ //
+ string publish_text = 7;
+}
+
+//
+message ModuleTextNotice {
+ //
+ OneLineText notice = 1;
+}
+
+//
+message ModuleTitle {
+ //
+ string title = 1;
+ //
+ IconButton right_btn = 2;
+ //
+ int32 title_style = 3;
+}
+
+// 顶部模块
+message ModuleTop {
+ // 三点模块
+ repeated ThreePointItem tp_list = 1;
+ //
+ MdlDynArchive archive = 2;
+ //
+ ModuleAuthor author = 3;
+ //
+ bool hidden_nav_bar = 4;
+}
+
+//
+message ModuleTopic {
+ //
+ int64 id = 1;
+ //
+ string name = 2;
+ //
+ string url = 3;
+}
+
+//
+message ModuleTopicBrief {
+ //
+ TopicItem topic = 1;
+}
+
+//
+message ModuleTopicDetailsExt {
+ //
+ string comment_guide = 1;
+}
+
+//
+message ModuleTopTag {
+ //
+ string tag_name = 1;
+}
+
+// 认证名牌
+message Nameplate {
+ // nid
+ int64 nid = 1;
+ // 名称
+ string name = 2;
+ // 图片地址
+ string image = 3;
+ // 小图地址
+ string image_small = 4;
+ // 等级
+ string level = 5;
+ // 获取条件
+ string condition = 6;
+}
+
+enum NetworkType {
+ NT_UNKNOWN = 0; //
+ WIFI = 1; //
+ CELLULAR = 2; //
+ OFFLINE = 3; //
+ OTHERNET = 4; //
+ ETHERNET = 5; //
+}
+
+// 最新ep
+message NewEP {
+ // 最新话epid
+ int32 id = 1;
+ // 更新至XX话
+ string index_show = 2;
+ // 更新剧集的封面
+ string cover = 3;
+}
+
+//
+message NFTInfo {
+ //
+ NFTRegionType region_type = 1;
+ //
+ string region_icon = 2;
+ //
+ NFTShowStatus region_show_status = 3;
+}
+
+//
+enum NFTRegionType {
+ nft_region_default = 0;
+ nft_region_mainlang = 1;
+ nft_region_gat = 2;
+}
+
+//
+enum NFTShowStatus {
+ nft_show_default = 0;
+ nft_show_zoominmainlang = 1;
+ nft_show_raw = 2;
+}
+
+// 空响应
+message NoReply {
+
+}
+
+// 空请求
+message NoReq {
+
+}
+
+//
+message NoteVideoTS {
+ //
+ int64 cid = 1;
+ //
+ int64 oid_type = 2;
+ //
+ int64 status = 3;
+ //
+ int64 index = 4;
+ //
+ int64 seconds = 5;
+ //
+ int64 cid_count = 6;
+ //
+ string key = 7;
+ //
+ int64 epid = 9;
+ //
+ string title = 8;
+ //
+ string desc = 10;
+}
+
+//
+message OfficialAccountInfo {
+ //
+ UserInfo author = 1;
+ //
+ int64 mid = 2;
+ //
+ string uri = 3;
+ //
+ Relation relation = 4;
+ //
+ string desc_text1 = 5;
+ //
+ string desc_text2 = 6;
+}
+
+//
+message OfficialAccountsReply {
+ //
+ repeated OfficialAccountInfo items = 1;
+ //
+ bool has_more = 2;
+ //
+ int64 offset = 3;
+}
+
+//
+message OfficialAccountsReq {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ int64 offset = 3;
+}
+
+//
+message OfficialDynamicsReply {
+ //
+ repeated OfficialItem items = 1;
+ //
+ int64 offset = 2;
+ //
+ bool has_more = 3;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+}
+
+//
+message OfficialDynamicsReq {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ int64 offset = 3;
+}
+
+message OfficialItem {
+ int32 type = 1;
+ oneof rcmd_item {
+ OfficialRcmdArchive rcmd_archive = 2;
+ OfficialRcmdDynamic rcmd_dynamic = 3;
+ };
+}
+
+//
+message OfficialRcmdArchive {
+ //
+ string title = 1;
+ //
+ string cover = 2;
+ //
+ string cover_right_text = 3;
+ //
+ int32 desc_icon1 = 4;
+ //
+ string desc_text1 = 5;
+ //
+ int32 desc_icon2 = 6;
+ //
+ string desc_text2 = 7;
+ //
+ string reason = 8;
+ //
+ bool show_three_point = 9;
+ //
+ string uri = 10;
+ //
+ int64 aid = 11;
+ //
+ int64 mid = 12;
+ //
+ string name = 13;
+ //
+ int64 dynamic_id = 14;
+ //
+ int64 cid = 15;
+}
+
+//
+message OfficialRcmdDynamic {
+ //
+ string title = 1;
+ //
+ string cover = 2;
+ //
+ string cover_right_top_text = 3;
+ //
+ int32 desc_icon1 = 4;
+ //
+ string desc_text1 = 5;
+ //
+ int32 desc_icon2 = 6;
+ //
+ string desc_text2 = 7;
+ //
+ string reason = 8;
+ //
+ string uri = 9;
+ //
+ int64 dynamic_id = 10;
+ //
+ int64 mid = 11;
+ //
+ string user_name = 12;
+ //
+ int64 rid = 13;
+}
+
+// 认证信息
+message OfficialVerify {
+ // 127:未认证 0:个人 1:机构
+ int32 type = 1;
+ // 认证描述
+ string desc = 2;
+ // 是否关注
+ int32 is_atten = 3;
+}
+
+//
+message OneLineText {
+ //
+ repeated TextWithPriority texts = 1;
+}
+
+//
+message OnlyFans {
+ //
+ bool is_only_fans = 1;
+ //
+ IconBadge badge = 2;
+}
+
+//
+message OnlyFansProperty {
+ //
+ bool has_privilege = 1;
+ //
+ bool is_only_fans = 2;
+}
+
+//
+message OpusCollection {
+ //
+ int64 collection_id = 1;
+ //
+ OneLineText title = 2;
+ //
+ string detail_uri = 3;
+ //
+ string intro = 4;
+ //
+ repeated OpusCollectionItem all_items = 5;
+}
+
+//
+message OpusCollectionItem {
+ //
+ int64 opus_id = 1;
+ //
+ string title = 2;
+ //
+ string pub_time = 3;
+ //
+ string uri = 4;
+ //
+ bool is_selected_highlight = 5;
+}
+
+//
+message Paragraph {
+ //
+ message ListFormat {
+ //
+ int32 level = 1;
+ //
+ int32 order = 2;
+ //
+ string theme = 3;
+ }
+ enum ParagraphAlign {
+ LEFT = 0;
+ MIDDLE = 1;
+ RIGHT = 2;
+ }
+ //
+ message ParagraphFormat {
+ //
+ ParagraphAlign align = 1;
+ //
+ ListFormat list_format = 2;
+ }
+ //
+ enum ParagraphType {
+ INVALID = 0;
+ TEXT = 1;
+ PICTURES = 2;
+ LINE = 3;
+ REFERENCE = 4;
+ SORTED_LIST = 5;
+ UNSORTED_LIST = 6;
+ LINK_CARD = 7;
+ }
+ //
+ ParagraphType para_type = 1;
+ //
+ ParagraphFormat para_format = 2;
+ //
+ oneof content {
+ TextParagraph text = 3;
+ PicParagraph pic = 4;
+ LineParagraph line = 5;
+ CardParagraph link_card = 6;
+ }
+}
+
+//
+message ParaSpacing {
+ //
+ double spacing_before_para = 1;
+ //
+ double spacing_after_para = 2;
+ //
+ double line_spacing = 3;
+}
+
+// PGC单季信息
+message PGCSeason {
+ // 是否完结
+ int32 is_finish = 1;
+ // 标题
+ string title = 2;
+ // 类型
+ int32 type = 3;
+}
+
+//
+message PicParagraph {
+ //
+ enum PicParagraphStyle {
+ INVALID = 0;
+ NINE_CELL = 1;
+ BIG_SCROLL = 2;
+ }
+ //
+ MdlDynDraw pics = 1;
+ //
+ PicParagraphStyle style = 2;
+}
+
+// 秒开通用参数
+message PlayurlParam {
+ // 清晰度
+ int32 qn = 1;
+ // 流版本
+ int32 fnver = 2;
+ // 流类型
+ int32 fnval = 3;
+ // 是否强制使用域名
+ int32 force_host = 4;
+ // 是否4k
+ int32 fourk = 5;
+}
+
+//
+message Popup {
+ //
+ string title = 1;
+ //
+ string desc = 2;
+ //
+ string uri = 3;
+}
+
+//
+message RcmdArchive {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 视频封面展示项 1
+ CoverIcon cover_left_icon_1 = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 秒开地址
+ string uri = 5;
+ // 是否PGC
+ bool is_pgc = 6;
+ // aid
+ int64 aid = 7;
+ //
+ IconBadge badge = 8;
+ //
+ int32 cover_left_icon2 = 9;
+ //
+ string cover_left_text2 = 10;
+ //
+ int32 cover_left_icon3 = 11;
+ //
+ string cover_left_text3 = 12;
+}
+
+// 推荐UP主用户模块
+message RcmdAuthor {
+ // 用户详情
+ UserInfo author = 1;
+ // 描述:粉丝数、推荐理由
+ string desc = 2;
+ // 关注状态
+ Relation relation = 3;
+}
+
+//
+message RcmdCampusBrief {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ string campus_badge = 4;
+ //
+ string url = 5;
+}
+
+// 推荐卡片列表
+message RcmdItem {
+ // 卡片类型
+ RcmdType type = 1;
+ // 卡片列表
+ oneof rcmd_item {
+ //
+ RcmdArchive rcmd_archive = 2;
+ }
+}
+
+// 分区聚类推荐选项
+message RcmdOption{
+ // 视频是否展示标题
+ bool show_title = 1;
+}
+
+//
+message RcmdReason {
+ //
+ string campus_name = 1;
+ //
+ RcmdReasonStyle style = 2;
+ //
+ string rcmd_reason = 3;
+ //
+ string up_name = 4;
+}
+
+//
+enum RcmdReasonStyle {
+ rcmd_reason_style_none = 0;
+ rcmd_reason_style_campus_nearby = 1;
+ rcmd_reason_style_campus_up = 2;
+ rcmd_reason_style_campus_near_up_mix = 3;
+}
+
+//
+message RcmdTopButton {
+ //
+ string text = 1;
+ //
+ string url = 2;
+}
+
+// 推荐模块数据类型
+enum RcmdType {
+ rcmd_archive = 0; // 稿件
+ rcmd_dynamic = 1; // 动态
+}
+
+// 推荐up主入参
+message RcmdUPsParam {
+ int64 dislike_ts = 1;
+}
+
+message ReactionListItem {
+ // 用户信息
+ UserInfo user = 1;
+ // 关注关系
+ Relation relation = 2;
+ // 显示文字
+ string act_text = 3;
+ //
+ string rcmd_reason = 4;
+}
+
+
+// 新版动态转发点赞列表-响应
+message ReactionListReply {
+ // 标题
+ string title = 1;
+ // 列表
+ repeated ReactionListItem list = 2;
+ // 偏移
+ string offset = 3;
+ // 是否还有更多
+ bool has_more = 4;
+}
+
+// 新版动态转发点赞列表-请求
+message ReactionListReq {
+ // 动态ID
+ int64 dynamic_id = 1;
+ // 动态类型
+ int64 dyn_type = 2;
+ // 业务方资源id
+ int64 rid = 3;
+ // 偏移,使用上一页回包中的offset字段;第一页不传。
+ string offset = 4;
+}
+
+// 刷新方式
+enum Refresh {
+ refresh_new = 0; // 刷新列表
+ refresh_history = 1; // 请求历史
+}
+
+// 关注关系
+message Relation {
+ // 关注状态
+ RelationStatus status = 1;
+ // 关注
+ int32 is_follow = 2;
+ // 被关注
+ int32 is_followed = 3;
+ // 文案
+ string title = 4;
+}
+
+// 关注关系 枚举
+enum RelationStatus {
+ // 1-未关注 2-关注 3-被关注 4-互相关注 5-特别关注
+ relation_status_none = 0;
+ relation_status_nofollow = 1;
+ relation_status_follow = 2;
+ relation_status_followed = 3;
+ relation_status_mutual_concern = 4;
+ relation_status_special = 5;
+}
+
+// 转发列表-请求
+message RepostListReq {
+ // 动态ID
+ string dynamic_id = 1;
+ // 动态类型
+ int64 dyn_type = 2;
+ // 业务方资源id
+ int64 rid = 3;
+ // 偏移,使用上一页回包中的offset字段;第一页不传。
+ string offset = 4;
+ // 来源
+ string from = 5;
+ // 评论类型
+ RepostType repost_type = 6;
+}
+
+// 转发列表-响应
+message RepostListRsp {
+ // 列表
+ repeated DynamicItem list = 1;
+ // 偏移
+ string offset = 2;
+ // 是否还有更多
+ bool has_more = 3;
+ // 转发总数
+ int64 total_count = 4;
+ // 评论类型
+ RepostType repost_type = 5;
+}
+
+// 评论类型
+enum RepostType {
+ repost_hot = 0; // 热门评论
+ repost_general = 1; // 普通评论
+}
+
+//
+enum ReserveRelationLotteryType {
+ reserve_relation_lottery_type_default = 0; //
+ reserve_relation_lottery_type_cron = 1; //
+}
+
+//
+enum ReserveType {
+ reserve_none = 0; // 占位
+ reserve_recall = 1; // 预约召回
+}
+
+enum RouterAction {
+ OPEN = 0;
+ EMBED = 1;
+}
+
+//
+message SchoolRecommendReply {
+ //
+ repeated CampusInfo items = 1;
+}
+
+//
+message SchoolRecommendReq {
+ //
+ float lat = 1;
+ //
+ float lng = 2;
+ //
+ CampusReqFromType from_type = 3;
+}
+
+//
+message SchoolSearchReply {
+ //
+ repeated CampusInfo items = 1;
+ //
+ SearchToast toast = 2;
+}
+
+//
+message SchoolSearchReq {
+ //
+ string keyword = 1;
+ //
+ CampusReqFromType from_type = 2;
+}
+
+//
+message SearchChannel {
+ //
+ string title = 1;
+ //
+ SearchTopicButton more_button = 2;
+ //
+ repeated ChannelInfo channels = 3;
+}
+
+//
+message SearchInfo {
+ //
+ string title = 1;
+ //
+ repeated DynamicItem list = 2;
+ //
+ string track_id = 3;
+ //
+ int64 total = 4;
+ //
+ bool has_more = 5;
+ //
+ string version = 6;
+}
+
+//
+message SearchToast {
+ //
+ string desc_text1 = 1;
+ //
+ string desc_text2 = 2;
+}
+
+//
+message SearchTopic {
+ //
+ string title = 1;
+ //
+ SearchTopicButton more_button = 2;
+ //
+ repeated SearchTopicItem items = 3;
+}
+
+//
+message SearchTopicButton {
+ //
+ string title = 1;
+ //
+ string jump_uri = 2;
+}
+
+//
+message SearchTopicItem {
+ //
+ int64 topic_id = 1;
+ //
+ string topic_name = 2;
+ //
+ string desc = 3;
+ //
+ string url = 4;
+ //
+ bool is_activity = 5;
+}
+
+//
+message SetDecisionReq {
+ //
+ int32 result = 1;
+ //
+ CampusReqFromType from_type = 2;
+}
+
+//
+message SetRecentCampusReq {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ CampusReqFromType from_type = 3;
+}
+
+// 分享渠道组件
+message ShareChannel {
+ // 分享名称
+ string name = 1;
+ // 分享按钮图片
+ string image = 2;
+ // 分享渠道
+ string channel = 3;
+ // 预约卡分享图信息,仅分享有预约信息的动态时存在
+ ShareReserve reserve = 4;
+}
+
+// 预约卡分享图信息
+message ShareReserve {
+ // 展示标题
+ string title = 1;
+ // 描述(时间+类型)
+ string desc = 2;
+ // 二维码附带icon
+ string qr_code_icon = 3;
+ // 二维码附带文本
+ string qr_code_text = 4;
+ // 二维码url
+ string qr_code_url = 5;
+ //
+ AdditionUserInfo user_info = 6;
+}
+
+//
+enum ShowType {
+ show_type_none = 0; //
+ show_type_backup = 1; //
+}
+
+// 排序类型
+message SortType {
+ // 排序策略
+ // 1:推荐排序 2:最常访问 3:最近关注
+ int32 sort_type = 1;
+ // 排序策略名称
+ string sort_type_name = 2;
+}
+
+//
+message StoryArchive {
+ //
+ string cover = 1;
+ //
+ int64 aid = 2;
+ //
+ string uri = 3;
+ //
+ Dimension dimension = 4;
+}
+
+//
+message StoryItem {
+ //
+ UserInfo author = 1;
+ //
+ string desc = 2;
+ //
+ int64 status = 3;
+ //
+ int32 type = 4;
+ oneof rcmd_item {
+ //
+ StoryArchive story_archive = 5;
+ }
+}
+
+//
+enum StyleType {
+ STYLE_TYPE_NONE = 0; //
+ STYLE_TYPE_LIVE = 1; //
+ STYLE_TYPE_DYN_UP = 2; //
+}
+
+//
+message SubscribeCampusReq {
+ //
+ int64 campus_id = 1;
+ //
+ string campus_name = 2;
+ //
+ CampusReqFromType from_type = 3;
+}
+
+//
+message TextNode {
+ enum TextNodeType {
+ INVALID = 0;
+ WORDS = 1;
+ EMOTE = 2;
+ AT = 3;
+ BIZ_LINK = 4;
+ }
+ //
+ TextNodeType node_type = 1;
+ string raw_text = 2;
+ //
+ oneof text {
+ WordNode word = 3;
+ EmoteNode emote = 4;
+ LinkNode link = 5;
+ }
+}
+
+//
+message TextParagraph {
+ //
+ repeated TextNode nodes = 1;
+}
+
+//
+message TextWithPriority {
+ //
+ string text = 1;
+ //
+ int64 priority = 2;
+}
+
+// 免流类型
+enum TFType {
+ TF_UNKNOWN = 0; // 未知
+ U_CARD = 1; // 联通卡
+ U_PKG = 2; // 联通免流包
+ C_CARD = 3; // 移动卡
+ C_PKG = 4; // 移动免流包
+ T_CARD = 5; // 电信卡
+ T_PKG = 6; // 电信免流包
+}
+
+// 三点-关注
+message ThreePointAttention {
+ // attention icon
+ string attention_icon = 1;
+ // 关注时显示的文案
+ string attention_text = 2;
+ // not attention icon
+ string not_attention_icon = 3;
+ // 未关注时显示的文案
+ string not_attention_text = 4;
+ // 当前关注状态
+ ThreePointAttentionStatus status = 5;
+}
+
+// 枚举-三点关注状态
+enum ThreePointAttentionStatus {
+ tp_not_attention = 0; //
+ tp_attention = 1; //
+}
+
+// 三点-自动播放 旧版不维护
+message ThreePointAutoPlay {
+ // open icon
+ string open_icon = 1;
+ // 开启时显示文案
+ string open_text = 2;
+ // close icon
+ string close_icon = 3;
+ // 关闭时显示文案
+ string close_text = 4;
+ // 开启时显示文案v2
+ string open_text_v2 = 5;
+ // 关闭时显示文案v2
+ string close_text_v2 = 6;
+ // 仅wifi/免流 icon
+ string only_icon = 7;
+ // 仅wifi/免流 文案
+ string only_text = 8;
+ // open icon v2
+ string open_icon_v2 = 9;
+ // close icon v2
+ string close_icon_v2 = 10;
+}
+
+// 三点-评论
+message ThreePointComment {
+ // 精选评论区功能
+ CommentDetail up_selection = 1;
+ // up关闭评论区功能
+ CommentDetail up_close = 2;
+ // icon
+ string icon = 3;
+ // 标题
+ string title = 4;
+}
+
+// 三点-默认结构(使用此背景、举报、删除)
+message ThreePointDefault {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+ // 跳转链接
+ string uri = 3;
+ // id
+ string id = 4;
+ //
+ ThreePointDefaultToast toast = 5;
+}
+
+//
+message ThreePointDefaultToast {
+ //
+ string title = 1;
+ //
+ string desc = 2;
+}
+
+// 三点-不感兴趣
+message ThreePointDislike {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+}
+
+// 三点-收藏
+message ThreePointFavorite {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+ // 物料ID
+ int64 id = 3;
+ // 是否订阅
+ bool is_favourite = 4;
+ // 取消收藏图标
+ string cancel_icon = 5;
+ // 取消收藏文案
+ string cancel_title = 6;
+}
+
+//
+message ThreePointHide {
+ //
+ string icon = 1;
+ //
+ string title = 2;
+ //
+ ThreePointHideInteractive interactive = 3;
+ //
+ int64 blook_fid = 4;
+ //
+ string blook_type = 5;
+}
+
+//
+message ThreePointHideInteractive {
+ //
+ string title = 1;
+ //
+ string confirm = 2;
+ //
+ string cancel = 3;
+ //
+ string toast = 4;
+}
+
+// 三点Item
+message ThreePointItem {
+ //类型
+ ThreePointType type = 1;
+ oneof item {
+ // 默认结构
+ ThreePointDefault default = 2;
+ // 自动播放
+ ThreePointAutoPlay auto_player = 3;
+ // 分享
+ ThreePointShare share = 4;
+ // 关注
+ ThreePointAttention attention = 5;
+ // 稍后在看
+ ThreePointWait wait = 6;
+ // 不感兴趣
+ ThreePointDislike dislike = 7;
+ // 收藏
+ ThreePointFavorite favorite = 8;
+ // 置顶
+ ThreePointTop top = 9;
+ // 评论
+ ThreePointComment comment = 10;
+ //
+ ThreePointHide hide = 11;
+ //
+ ThreePointTopicIrrelevant topic_irrelevant = 12;
+ }
+}
+
+// 三点-分享
+message ThreePointShare {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+ // 分享渠道
+ repeated ThreePointShareChannel channel = 3;
+ // 分享渠道名
+ string channel_name = 4;
+ // 预约卡分享图信息,仅分享有预约信息的动态时存在
+ ShareReserve reserve = 5;
+}
+
+// 三点-分享渠道
+message ThreePointShareChannel {
+ // icon
+ string icon = 1;
+ // 名称
+ string title = 2;
+}
+
+// 三点-置顶
+message ThreePointTop {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+ // 状态
+ TopType type = 3;
+}
+
+//
+message ThreePointTopicIrrelevant {
+ //
+ string icon = 1;
+ //
+ string title = 2;
+ //
+ string toast = 3;
+ //
+ int64 topic_id = 4;
+ //
+ int64 res_id = 5;
+ //
+ int64 res_type = 6;
+ //
+ string reason = 7;
+}
+
+// 三点类型
+enum ThreePointType {
+ tp_none = 0; // 占位
+ background = 1; // 使用此背景
+ auto_play = 2; // 自动播放
+ share = 3; // 分享
+ wait = 4; // 稍后再播
+ attention = 5; // 关注
+ report = 6; // 举报
+ delete = 7; // 删除
+ dislike = 8; // 不感兴趣
+ favorite = 9; // 收藏
+ top = 10; // 置顶
+ comment = 11; // 评论
+ hide = 12; //
+ campus_delete = 13; //
+ topic_irrelevant = 14; //
+}
+
+// 三点-稍后在看
+message ThreePointWait {
+ // addition icon
+ string addition_icon = 1;
+ // 已添加时的文案
+ string addition_text = 2;
+ // no addition icon
+ string no_addition_icon = 3;
+ // 未添加时的文案
+ string no_addition_text = 4;
+ // avid
+ int64 id = 5;
+}
+
+//
+enum ThumbType {
+ cancel = 0; //
+ thumb = 1; //
+}
+
+// 顶部预约卡
+message TopAdditionUP {
+ // 预约卡
+ repeated AdditionUP up = 1;
+ // 折叠数量,大于多少个进行折叠
+ int32 has_fold = 2;
+}
+
+// 话题广场操作按钮
+message TopicButton {
+ // 按钮图标
+ string icon = 1;
+ // 按钮文案
+ string title = 2;
+ // 跳转
+ string jump_uri = 3;
+ //
+ bool red_dot = 4;
+}
+
+//
+message TopicItem {
+ //
+ int64 topic_id = 1;
+ //
+ string topic_name = 2;
+ //
+ string url = 3;
+ //
+ string desc = 4;
+ //
+ string desc2 = 5;
+ //
+ string rcmd_desc = 6;
+}
+
+// 综合页-话题广场
+message TopicList {
+ // 模块标题
+ string title = 1;
+ // 话题列表
+ repeated TopicListItem topic_list_item = 2;
+ // 发起活动
+ TopicButton act_button = 3;
+ // 查看更多
+ TopicButton more_button = 4;
+ // 透传服务端上报
+ string server_info = 5;
+}
+
+// 综合页-话题广场-话题
+message TopicListItem {
+ // 前置图标
+ string icon = 1;
+ // 前置图标文案
+ string icon_title = 2;
+ // 话题id
+ int64 topic_id = 3;
+ // 话题名
+ string topic_name = 4;
+ // 跳转链接
+ string url = 5;
+ // 卡片位次
+ int64 pos = 6;
+ // 透传服务端上报
+ string server_info = 7;
+ //
+ string head_icon_url = 8;
+ //
+ int64 up_mid = 9;
+ //
+ string tail_icon_url = 10;
+ //
+ string extension = 11;
+}
+
+//
+message TopicListReply {
+ //
+ repeated TopicItem items = 1;
+ //
+ bool has_more = 2;
+ //
+ string offset = 3;
+}
+
+//
+message TopicListReq {
+ //
+ int64 campus_id = 1;
+ //
+ string offset = 2;
+}
+
+//
+message TopicMergedResource {
+ //
+ int32 merge_type = 1;
+ //
+ int32 merged_res_cnt = 2;
+}
+
+//
+message TopicRcmdCard {
+ //
+ int64 topic_id = 1;
+ //
+ string topic_name = 2;
+ //
+ string url = 3;
+ //
+ CampusLabel button = 4;
+ //
+ string desc1 = 5;
+ //
+ string desc2 = 6;
+ //
+ string update_desc = 7;
+}
+
+//
+message TopicSquareInfo {
+ //
+ string title = 1;
+ //
+ CampusLabel button = 2;
+ //
+ TopicRcmdCard rcmd = 3;
+}
+
+//
+message TopicSquareReply {
+ //
+ TopicSquareInfo info = 1;
+}
+
+//
+message TopicSquareReq {
+ //
+ int64 campus_id = 1;
+}
+
+// 状态
+enum TopType {
+ top_none = 0; // 默认 置顶
+ top_cancel = 1; // 取消置顶
+}
+
+// 综合页-无关注列表
+message Unfollow {
+ // 标题展示文案
+ string title = 1;
+ // 无关注列表
+ repeated UnfollowUserItem list = 2;
+ // trackID
+ string TrackId = 3;
+}
+
+//
+message UnfollowMatchReq {
+ //
+ int64 cid = 1;
+}
+
+// 综合页-无关注列表
+message UnfollowUserItem {
+ // 是否有更新
+ bool has_update = 1;
+ // up主头像
+ string face = 2;
+ // up主昵称
+ string name = 3;
+ // up主uid
+ int64 uid = 4;
+ // 排序字段 从1开始
+ int32 pos = 5;
+ // 直播状态
+ LiveState live_state = 6;
+ // 认证信息
+ OfficialVerify official = 7;
+ // 大会员信息
+ VipInfo vip = 8;
+ // up介绍
+ string sign = 9;
+ // 标签信息
+ string label = 10;
+ // 按钮
+ AdditionalButton button = 11;
+ // 跳转地址
+ string uri = 12;
+}
+
+//
+message UpdateTabSettingReq {
+ //
+ HomePageTabSttingStatus status = 1;
+}
+
+// 动态顶部up列表-up主信息
+message UpListItem {
+ // 是否有更新
+ bool has_update = 1;
+ // up主头像
+ string face = 2;
+ // up主昵称
+ string name = 3;
+ // up主uid
+ int64 uid = 4;
+ // 排序字段 从1开始
+ int64 pos = 5;
+ // 用户类型
+ UserItemType user_item_type = 6;
+ // 直播头像样式-日
+ UserItemStyle display_style_day = 7;
+ // 直播头像样式-夜
+ UserItemStyle display_style_night = 8;
+ // 直播埋点
+ int64 style_id = 9;
+ // 直播状态
+ LiveState live_state = 10;
+ // 分割线
+ bool separator = 11;
+ // 跳转
+ string uri = 12;
+ // UP主预约上报使用
+ bool is_recall = 13;
+ //
+ IconBadge update_icon = 14;
+ //
+ string live_rcmd_reason = 15;
+ //
+ string live_cover = 16;
+ //
+ string personal_extra = 17;
+}
+
+// 最常访问-查看更多
+message UpListMoreLabel {
+ // 文案
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+}
+
+// 用户信息
+message UserInfo {
+ // 用户mid
+ int64 mid = 1;
+ // 用户昵称
+ string name = 2;
+ // 用户头像
+ string face = 3;
+ // 认证信息
+ OfficialVerify official = 4;
+ // 大会员信息
+ VipInfo vip = 5;
+ // 直播信息
+ LiveInfo live = 6;
+ // 空间页跳转链接
+ string uri = 7;
+ // 挂件信息
+ UserPendant pendant = 8;
+ // 认证名牌
+ Nameplate nameplate = 9;
+ // 用户等级
+ int32 level = 10;
+ // 用户简介
+ string sign = 11;
+ //
+ int32 face_nft = 12;
+ //
+ int32 face_nft_new = 13;
+ //
+ NFTInfo nft_info = 14;
+ //
+ int32 is_senior_member = 15;
+ //
+ bilibili.dagw.component.avatar.v1.AvatarItem avatar = 16;
+}
+
+// 直播头像样式
+message UserItemStyle {
+ //
+ string rect_text = 1;
+ //
+ string rect_text_color = 2;
+ //
+ string rect_icon = 3;
+ //
+ string rect_bg_color = 4;
+ //
+ string outer_animation = 5;
+}
+
+// 用户类型
+enum UserItemType {
+ user_item_type_none = 0; //
+ user_item_type_live = 1; //
+ user_item_type_live_custom = 2; //
+ user_item_type_normal = 3; //
+ user_item_type_extend = 4; //
+ user_item_type_premiere_reserve = 5;
+ user_item_type_premiere = 6;
+ user_item_type_live_card = 7;
+ user_item_type_ogv_season = 8;
+ user_item_type_ugc_season = 9;
+}
+
+// 头像挂件信息
+message UserPendant {
+ // pid
+ int64 pid = 1;
+ // 名称
+ string name = 2;
+ // 图片链接
+ string image = 3;
+ // 有效期
+ int64 expire = 4;
+}
+
+// 角标信息
+message VideoBadge {
+ // 文案
+ string text = 1;
+ // 文案颜色-日间
+ string text_color = 2;
+ // 文案颜色-夜间
+ string text_color_night = 3;
+ // 背景颜色-日间
+ string bg_color = 4;
+ // 背景颜色-夜间
+ string bg_color_night = 5;
+ // 边框颜色-日间
+ string border_color = 6;
+ // 边框颜色-夜间
+ string border_color_night = 7;
+ // 样式
+ int32 bg_style = 8;
+ // 背景透明度-日间
+ int32 bg_alpha = 9;
+ // 背景透明度-夜间
+ int32 bg_alpha_night = 10;
+}
+
+// 番剧类型
+enum VideoSubType {
+ VideoSubTypeNone = 0; // 没有子类型
+ VideoSubTypeBangumi = 1; // 番剧
+ VideoSubTypeMovie = 2; // 电影
+ VideoSubTypeDocumentary = 3; // 纪录片
+ VideoSubTypeDomestic = 4; // 国创
+ VideoSubTypeTeleplay = 5; // 电视剧
+}
+
+// 视频类型
+enum VideoType {
+ video_type_general = 0; //普通视频
+ video_type_dynamic = 1; //动态视频
+ video_type_playback = 2; //直播回放视频
+ video_type_story = 3; //
+}
+
+// 大会员信息
+message VipInfo {
+ // 大会员类型
+ int32 Type = 1;
+ // 大会员状态
+ int32 status = 2;
+ // 到期时间
+ int64 due_date = 3;
+ // 标签
+ VipLabel label = 4;
+ // 主题
+ int32 theme_type = 5;
+ // 大会员角标
+ // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
+ int32 avatar_subscript = 6;
+ // 昵称色值,可能为空,色值示例:#FFFB9E60
+ string nickname_color = 7;
+}
+
+// 大会员标签
+message VipLabel {
+ // 图片地址
+ string path = 1;
+ // 文本值
+ string text = 2;
+ // 对应颜色类型
+ string label_theme = 3;
+}
+
+// 状态
+enum VoteStatus {
+ normal = 0; // 正常
+ anonymous = 1; // 匿名
+}
+
+// 提权样式
+message Weight {
+ // 提权展示标题
+ string title = 1;
+ // 下拉框内容
+ repeated WeightItem items = 2;
+ // icon
+ string icon = 3;
+}
+
+// 热门默认跳转按钮
+message WeightButton {
+ string jump_url = 1;
+ // 展示文案
+ string title = 2;
+}
+
+// 提权不感兴趣
+message WeightDislike {
+ // 负反馈业务类型 作为客户端调用负反馈接口的参数
+ string feed_back_type = 1;
+ // 展示文案
+ string title = 2;
+}
+
+// 提权样式
+message WeightItem {
+ // 类型
+ WeightType type = 1;
+ oneof item {
+ // 热门默认跳转按钮
+ WeightButton button = 2;
+ // 提权不感兴趣
+ WeightDislike dislike = 3;
+ }
+}
+
+// 枚举-提权类型
+enum WeightType {
+ weight_none = 0; // 默认 占位
+ weight_dislike = 1; // 不感兴趣
+ weight_jump = 2; // 跳链
+}
+
+//
+enum WFItemType {
+ WATER_FLOW_TYPE_NONE = 0;
+ WATER_FLOW_TYPE_ARCHIVE = 1;
+ WATER_FLOW_TYPE_DYNAMIC = 2;
+}
+
+//
+message WordNode {
+ //
+ message WordNodeStyle {
+ //
+ bool bold = 1;
+ //
+ bool italic = 2;
+ //
+ bool strikethrough = 3;
+ //
+ bool underline = 4;
+ }
+ //
+ string words = 1;
+ //
+ double font_size = 2;
+ //
+ Colors color = 3;
+ //
+ WordNodeStyle style = 4;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/dynamic/v2/opus.proto b/bili-api/grpc/proto/bilibili/app/dynamic/v2/opus.proto
new file mode 100644
index 000000000..ec3dfcbb2
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/dynamic/v2/opus.proto
@@ -0,0 +1,60 @@
+syntax = "proto3";
+
+package bilibili.app.dynamic.v2;
+
+option java_multiple_files = true;
+
+import "bilibili/app/archive/middleware/v1/preload.proto";
+import "bilibili/app/dynamic/v2/dynamic.proto";
+
+service Opus {
+ //
+ rpc OpusDetail (OpusDetailReq) returns (OpusDetailResp);
+}
+
+//
+message OpusDetailReq {
+ //
+ OpusType opus_type = 1;
+ //
+ int64 oid = 2;
+ //
+ int64 dyn_type = 3;
+ //
+ string share_id = 4;
+ //
+ int32 share_mode = 9;
+ //
+ int32 local_time = 10;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 11;
+ //
+ Config config = 12;
+}
+
+//
+message OpusDetailResp {
+ //
+ OpusItem opus_item = 1;
+}
+
+//
+message OpusItem {
+ //
+ int64 opus_id = 1;
+ //
+ OpusType opus_type = 2;
+ //
+ int64 oid = 3;
+ //
+ repeated Module modules = 4;
+ //
+ Extend extend = 5;
+}
+
+enum OpusType {
+ OPUS_TYPE_DYN = 0;
+ OPUS_TYPE_ARTICLE = 1;
+ OPUS_TYPE_NOTE = 2;
+ OPUS_TYPE_WORD = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/interfaces/v1/history.proto b/bili-api/grpc/proto/bilibili/app/interfaces/v1/history.proto
new file mode 100644
index 000000000..8f407ce2d
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/interfaces/v1/history.proto
@@ -0,0 +1,379 @@
+syntax = "proto3";
+
+package bilibili.app.interface.v1;
+
+option java_package = "bilibili.app.interfaces.v1";
+option java_multiple_files = true;
+
+import "bilibili/app/archive/middleware/v1/preload.proto";
+
+// 历史记录
+service History {
+ // 获取历史记录tab
+ rpc HistoryTab (HistoryTabReq) returns (HistoryTabReply);
+ // 获取历史记录列表(旧版)
+ rpc Cursor (CursorReq) returns (CursorReply);
+ // 获取历史记录列表
+ rpc CursorV2 (CursorV2Req) returns (CursorV2Reply);
+ // 删除历史记录
+ rpc Delete (DeleteReq) returns (NoReply);
+ // 搜索历史记录
+ rpc Search (SearchReq) returns (SearchReply);
+ // 清空历史记录
+ rpc Clear (ClearReq) returns (NoReply);
+ // 获取最新的历史记录
+ rpc LatestHistory (LatestHistoryReq) returns (LatestHistoryReply);
+}
+
+// 专栏卡片
+message CardArticle {
+ // 封面url
+ repeated string covers = 1;
+ // UP主昵称
+ string name = 2;
+ // UP主mid
+ int64 mid = 3;
+ // 是否展示关注按钮
+ bool displayAttention = 4;
+ // 角标
+ string badge = 5;
+ // 关系信息
+ Relation relation = 6;
+}
+
+// 课程卡片
+message CardCheese {
+ // 封面url
+ string cover = 1;
+ // 观看进度
+ int64 progress = 2;
+ // 总计时长
+ int64 duration = 3;
+ // 单集标题
+ string subtitle = 4;
+ //
+ int64 state = 5;
+}
+
+// 直播卡片
+message CardLive {
+ // 封面url
+ string cover = 1;
+ // 主播昵称
+ string name = 2;
+ // 主播mid
+ int64 mid = 3;
+ // 直播分区名
+ string tag = 4;
+ // 直播状态
+ int32 ststus = 5;
+ // 是否展示关注按钮
+ bool display_attention = 6;
+ // 关系信息
+ Relation relation = 7;
+}
+
+// pgc稿件卡片
+message CardOGV {
+ // 封面url
+ string cover = 1;
+ // 观看进度
+ int64 progress = 2;
+ // 总计时长
+ int64 duration = 3;
+ // 单集标题
+ string subtitle = 4;
+ //
+ string badge = 5;
+ //
+ int64 state = 6;
+}
+
+// ugc稿件卡片
+message CardUGC {
+ // 封面url
+ string cover = 1;
+ // 观看进度
+ int64 progress = 2;
+ // 视频长度
+ int64 duration = 3;
+ // UP主昵称
+ string name = 4;
+ // UP主mid
+ int64 mid = 5;
+ // 是否展示关注按钮
+ bool display_attention = 6;
+ // 历史观看视频cid
+ int64 cid = 7;
+ // 历史观看视频分P
+ int32 page = 8;
+ // 历史观看视频分P的标题
+ string subtitle = 9;
+ // 关系信息
+ Relation relation = 10;
+ // 稿件bvid
+ string bvid = 11;
+ // 总分P数
+ int64 videos = 12;
+ // 短链接
+ string short_link = 13;
+ // 分享副标题
+ string share_subtitle = 14;
+ // 播放数
+ int64 view = 15;
+ //
+ int64 state = 16;
+}
+
+// 清空历史记录-请求
+message ClearReq {
+ // 业务类型
+ // archive:视频 live:直播 article:专栏 goods:商品 show:展演
+ string business = 1;
+}
+
+// 游标信息
+message Cursor {
+ // 本页最大值游标值
+ int64 max = 1;
+ // 本页最大值游标类型
+ int32 maxTp = 2;
+}
+
+// 历史记录卡片信息
+message CursorItem {
+ // 主体数据
+ oneof card_item {
+ // ugc稿件
+ CardUGC card_ugc = 1;
+ // pgc稿件
+ CardOGV card_ogv = 2;
+ // 专栏
+ CardArticle card_article = 3;
+ // 直播
+ CardLive card_live = 4;
+ // 课程
+ CardCheese card_cheese = 5;
+ }
+ // 标题
+ string title = 6;
+ // 目标uri/url
+ string uri = 7;
+ // 观看时间
+ int64 viewAt = 8;
+ // 历史记录id
+ int64 kid = 9;
+ // 业务id
+ int64 oid = 10;
+ // 业务类型
+ // archive:视频 live:直播 article:专栏 goods:商品 show:展演
+ string business = 11;
+ // 业务类型代码
+ int32 tp = 12;
+ // 设备标识
+ DeviceType dt = 13;
+ // 是否有分享按钮
+ bool has_share = 14;
+}
+
+// 获取历史记录列表(旧版)-响应
+message CursorReply {
+ // 卡片内容
+ repeated CursorItem items = 1;
+ // 顶部tab
+ repeated CursorTab tab = 2;
+ // 游标信息
+ Cursor cursor = 3;
+ // 是否未拉取完
+ bool hasMore = 4;
+}
+
+// 获取历史记录列表(旧版)-请求
+message CursorReq {
+ // 游标信息
+ Cursor cursor = 1;
+ // 业务类型
+ // all:全部 archive:视频 live:直播 article:专栏
+ string business = 2;
+ // 秒开参数(旧版)
+ PlayerPreloadParams player_preload = 3;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+}
+
+// 业务分类表
+message CursorTab {
+ // 业务类型
+ string business = 1;
+ // 名称
+ string name = 2;
+ // 路由uri
+ string router = 3;
+ // tab定位
+ bool focus = 4;
+}
+
+// 获取历史记录列表-响应
+message CursorV2Reply {
+ // 卡片内容
+ repeated CursorItem items = 1;
+ // 游标信息
+ Cursor cursor = 2;
+ // 是否未拉取完
+ bool hasMore = 3;
+ //
+ string empty_link = 4;
+}
+
+// 获取历史记录列表-请求
+message CursorV2Req {
+ // 游标信息
+ Cursor cursor = 1;
+ // 业务类型
+ // archive:视频 live:直播 article:专栏 goods:商品 show:展演
+ string business = 2;
+ // 秒开参数(旧版)
+ PlayerPreloadParams player_preload = 3;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 4;
+ // 是否选择本机的播放历史
+ bool is_local = 5;
+}
+
+// 设备标识代码
+enum DT {
+ Unknown = 0; // 未知
+ Phone = 1; // 手机端
+ Pad = 2; // ipad端
+ PC = 3; // web端
+ TV = 4; // TV端
+ Car = 5; // 车机端
+ Iot = 6; // 物联设备
+ AndPad = 7; // apad端
+}
+
+// 删除历史记录-请求
+message DeleteReq {
+ // 历史记录信息
+ HisInfo his_info = 1;
+}
+
+// 设备类型
+message DeviceType {
+ // 设备标识代码
+ DT type = 1;
+ // 图标url
+ string icon = 2;
+}
+
+// 历史记录信息
+message HisInfo {
+ // 业务类型
+ // archive:视频 live:直播 article:专栏 goods:商品 show:展演
+ string business = 1;
+ // 历史记录id
+ int64 kid = 2;
+}
+
+// 搜索历史记录来源
+enum HistorySource {
+ history_VALUE = 0; // 主站历史记录页
+ shopping_VALUE = 1; // 会员购浏览记录
+}
+
+// 获取历史记录tab-响应
+message HistoryTabReply {
+ // tab列表
+ repeated CursorTab tab = 1;
+}
+
+// 获取历史记录tab-请求
+message HistoryTabReq {
+ // 业务类型
+ // archive:视频 live:直播 article:专栏 goods:商品 show:展演
+ string business = 1;
+ // 查询请求来源
+ HistorySource source = 2;
+ // 搜索关键词
+ string keyword = 3;
+}
+
+// 获取最新的历史记录-响应
+message LatestHistoryReply {
+ // 卡片内容
+ CursorItem items = 1;
+ // 场景
+ string scene = 2;
+ // 弹窗停留时间
+ int64 rtime = 3;
+ // 分组的标志(客户端埋点上报)
+ string flag = 4;
+}
+
+// 获取最新的历史记录-请求
+message LatestHistoryReq {
+ // 业务类型
+ // archive:视频 live:直播 article:专栏 goods:商品 show:展演
+ string business = 1;
+ // 秒开参数
+ PlayerPreloadParams player_preload = 2;
+}
+
+// 空响应
+message NoReply {
+
+}
+
+// 页面信息
+message Page {
+ // 当前页码
+ int64 pn = 1;
+ // 总计条目数
+ int64 total = 2;
+}
+
+// 秒开参数
+message PlayerPreloadParams {
+ //清晰度
+ int64 qn = 1;
+ // 流版本
+ int64 fnver = 2;
+ // 流类型
+ int64 fnval = 3;
+ // 是否强制域名
+ int64 forceHost = 4;
+ // 是否4K
+ int64 fourk = 5;
+}
+
+// 关系信息
+message Relation {
+ // 关系状态
+ // 1:未关注 2:已关注 3:被关注 4:互关
+ int32 status = 1;
+ // 用户关注UP主
+ int32 is_follow = 2;
+ // UP主关注用户
+ int32 is_followed = 3;
+}
+
+// 搜索历史记录-响应
+message SearchReply {
+ // 卡片内容
+ repeated CursorItem items = 1;
+ // 是否未拉取完
+ bool hasMore = 2;
+ // 页面信息
+ Page page = 3;
+}
+
+// 搜索历史记录-请求
+message SearchReq {
+ // 关键词
+ string keyword = 1;
+ // 页码
+ int64 pn = 2;
+ // 业务类型
+ // archive:视频 live:直播 article:专栏 goods:商品 show:展演
+ string business = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/interfaces/v1/media.proto b/bili-api/grpc/proto/bilibili/app/interfaces/v1/media.proto
new file mode 100644
index 000000000..50bf700b4
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/interfaces/v1/media.proto
@@ -0,0 +1,331 @@
+syntax = "proto3";
+
+package bilibili.app.interface.v1;
+
+option java_package = "bilibili.app.interfaces.v1";
+option java_multiple_files = true;
+
+//
+service Media {
+ //
+ rpc MediaTab(MediaTabReq) returns (MediaTabReply);
+ //
+ rpc MediaDetail(MediaDetailReq) returns (MediaDetailReply);
+ //
+ rpc MediaVideo(MediaVideoReq) returns (MediaVideoReply);
+ //
+ rpc MediaRelation(MediaRelationReq) returns (MediaRelationReply);
+ //
+ rpc MediaFollow(MediaFollowReq) returns (MediaFollowReply);
+}
+
+//
+message BigItem {
+ //
+ string title = 1;
+ //
+ string cover_image_uri = 2;
+ //
+ string uri = 3;
+ //
+ string cover_right_text = 4;
+ //
+ string cover_left_text1 = 5;
+ //
+ int64 cover_left_icon1 = 6;
+ //
+ string cover_left_text2 = 7;
+ //
+ int64 cover_left_icon2 = 8;
+ //
+ UserCard user_card = 9;
+ //
+ LikeButton like_button = 10;
+ //
+ int64 param = 11;
+}
+
+//
+message Button {
+ //
+ string title = 1;
+ //
+ string link = 2;
+ //
+ string id = 3;
+ //
+ int64 icon = 4;
+ //
+ ButType but_type = 5;
+ //
+ int32 follow_state = 6;
+ //
+ string has_title = 7;
+}
+
+//
+enum ButType {
+ BUT_INVALID = 0; //
+ BUT_REDIRECT = 1; //
+ BUT_LIKE = 2; //
+}
+
+//
+message Cast {
+ //
+ repeated MediaPerson person = 1;
+ //
+ string title = 2;
+}
+
+//
+message ChannelInfo {
+ //
+ int64 channel_id = 1;
+ //
+ bool subscribed = 2;
+}
+
+//
+message LikeButton {
+ //
+ int64 aid = 1;
+ //
+ int32 count = 2;
+ //
+ bool show_count = 3;
+ //
+ string event = 4;
+ //
+ int32 selected = 5;
+ //
+ string event_v2 = 6;
+ //
+ LikeButtonResource like_resource = 7;
+ //
+ LikeButtonResource dis_like_resource = 8;
+ //
+ LikeButtonResource like_night_resource = 9;
+ //
+ LikeButtonResource dis_like_night_resource = 10;
+}
+
+//
+message LikeButtonResource {
+ //
+ string url = 1;
+ //
+ string hash = 2;
+}
+
+//
+message LikeCard {
+ //
+ int64 like = 1;
+ //
+ bool is_follow = 2;
+}
+
+//
+message MediaCard {
+ //
+ string cover = 1;
+ //
+ string cur_title = 2;
+ //
+ string style = 3;
+ //
+ string label = 4;
+ //
+ Button but_first = 5;
+}
+
+//
+message MediaDetailReply {
+ //
+ Cast cast = 1;
+ //
+ Staff staff = 2;
+ //
+ Overview overview = 3;
+}
+
+//
+message MediaDetailReq {
+ //
+ int64 biz_id = 1;
+ //
+ int64 biz_type = 2;
+}
+
+//
+message MediaFollowReply {
+
+}
+
+//
+message MediaFollowReq {
+ //
+ string id = 1;
+ //
+ int32 type = 2;
+}
+
+//
+message MediaPerson {
+ //
+ string real_name = 1;
+ //
+ string square_url = 2;
+ //
+ string character = 3;
+ //
+ int64 person_id = 4;
+ //
+ string type = 5;
+}
+
+//
+message MediaRelationReply {
+ //
+ string offset = 1;
+ //
+ bool has_more = 2;
+ //
+ repeated SmallItem list = 3;
+}
+
+//
+message MediaRelationReq {
+ //
+ int64 biz_id = 1;
+ //
+ int64 biz_type = 2;
+ //
+ int64 feed_id = 3;
+ //
+ string offset = 5;
+ //
+ int32 ps = 6;
+}
+
+//
+message MediaTabReply {
+ //
+ MediaCard media_card = 1;
+ //
+ repeated ShowTab tab = 2;
+ //
+ int64 default_tab_index = 3;
+ //
+ ChannelInfo channel_info = 4;
+}
+
+//
+message MediaTabReq {
+ //
+ int64 biz_id = 1;
+ //
+ int64 biz_type = 2;
+ //
+ string source = 3;
+ //
+ string spmid = 4;
+ //
+ map args = 5;
+}
+
+//
+message MediaVideoReply {
+ //
+ string offset = 1;
+ //
+ bool has_more = 2;
+ //
+ repeated BigItem list = 3;
+}
+
+//
+message MediaVideoReq {
+ //
+ int64 biz_id = 1;
+ //
+ int64 biz_type = 2;
+ //
+ int64 feed_id = 3;
+ //
+ string offset = 5;
+ //
+ int32 ps = 6;
+}
+
+//
+message Overview {
+ //
+ string title = 1;
+ //
+ string text = 2;
+}
+
+//
+message ShowTab {
+ //
+ TabType tab_type = 1;
+ //
+ string title = 2;
+ //
+ string url = 3;
+}
+
+//
+message SmallItem {
+ //
+ string title = 1;
+ //
+ string cover_image_uri = 2;
+ //
+ string uri = 3;
+ //
+ string cover_right_text = 4;
+ //
+ string cover_left_text1 = 5;
+ //
+ int64 cover_left_icon1 = 6;
+ //
+ string cover_left_text2 = 7;
+ //
+ int64 cover_left_icon2 = 8;
+ //
+ int64 param = 9;
+ //
+ int64 mid = 10;
+}
+
+//
+message Staff {
+ //
+ string title = 1;
+ //
+ string text = 2;
+}
+
+//
+enum TabType {
+ TAB_INVALID = 0; //
+ TAB_OGV_DETAIL = 6; //
+ TAB_OGV_REPLY = 7; //
+ TAB_FEED_BID = 8; //
+ TAB_FEED_SMALL = 9; //
+}
+
+//
+message UserCard {
+ //
+ string user_name = 1;
+ //
+ string user_face = 2;
+ //
+ string user_url = 3;
+ //
+ int64 mid = 4;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/interfaces/v1/search.proto b/bili-api/grpc/proto/bilibili/app/interfaces/v1/search.proto
new file mode 100644
index 000000000..ab53deaac
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/interfaces/v1/search.proto
@@ -0,0 +1,190 @@
+syntax = "proto3";
+
+package bilibili.app.interface.v1;
+
+option java_package = "bilibili.app.interfaces.v1";
+option java_multiple_files = true;
+
+// 搜索
+service Search {
+ // 获取搜索建议
+ rpc Suggest3 (SuggestionResult3Req) returns (SuggestionResult3Reply);
+ //
+ rpc DefaultWords(DefaultWordsReq) returns (DefaultWordsReply);
+}
+
+//
+service SearchTest {
+ //
+ rpc NotExist(SuggestionResult3Req) returns (SuggestionResult3Reply);
+}
+
+//
+message DefaultWordsReply {
+ //
+ string trackid = 1;
+ //
+ string param = 2;
+ //
+ string show = 3;
+ //
+ string word = 4;
+ //
+ int64 show_front = 5;
+ //
+ string exp_str = 6;
+ //
+ string goto = 7;
+ //
+ string value = 8;
+ //
+ string uri = 9;
+}
+
+//
+message NftFaceIcon {
+ //
+ int32 region_type = 1;
+ //
+ string icon = 2;
+ //
+ int32 show_status = 3;
+}
+
+//
+message DefaultWordsReq {
+ //
+ int64 from = 1;
+ //
+ int64 login_event = 2;
+ //
+ int32 teenagers_mode = 3;
+ //
+ int32 lessons_mode = 4;
+ //
+ string tab = 5;
+ //
+ string event_id = 6;
+ //
+ string avid = 7;
+ //
+ string query = 8;
+ //
+ int64 an = 9;
+ //
+ int64 is_fresh = 10;
+}
+
+// 获取搜索建议-响应
+message SuggestionResult3Reply {
+ // 搜索追踪id
+ string trackid = 1;
+ // 搜索建议条目列表
+ repeated ResultItem list = 2;
+ // 搜索的abtest 实验信息
+ string exp_str = 3;
+}
+
+// 获取搜索建议-请求
+message SuggestionResult3Req {
+ // 关键字
+ string keyword = 1;
+ // 是否语法高亮
+ // 0:不显示 1:显示
+ int32 highlight = 2;
+ // 是否青少年模式
+ // 1:开启青少年模式
+ int32 teenagers_mode = 3;
+}
+
+// 搜索建议条目
+message ResultItem {
+ // 来源
+ string from = 1;
+ // 显示结果(语法高亮)
+ string title = 2;
+ // 搜索关键字
+ string keyword = 3;
+ // 序号
+ int32 position = 4;
+ // 图片
+ string cover = 5;
+ // 图片尺寸
+ double cover_size = 6;
+ // sug词类型
+ string sug_type = 7;
+ // 词条大类型
+ int32 term_type = 8;
+ // 跳转类型
+ string goto = 9;
+ // 跳转uri
+ string uri = 10;
+ // 认证信息
+ OfficialVerify official_verify = 11;
+ // 跳转参数
+ string param = 12;
+ // up主mid
+ int64 mid = 13;
+ // 粉丝数
+ int32 fans = 14;
+ // up主等级
+ int32 level = 15;
+ // up主稿件数
+ int32 archives = 16;
+ // 投稿时间
+ int64 ptime = 17;
+ // season类型名称
+ string season_type_name = 18;
+ // 地区
+ string area = 19;
+ // 作品风格
+ string style = 20;
+ // 描述信息
+ string label = 21;
+ // 评分
+ double rating = 22;
+ // 投票数
+ int32 vote = 23;
+ // 角标
+ repeated ReasonStyle badges = 24;
+ //
+ string styles = 25;
+ //
+ int64 module_id = 26;
+ //
+ string live_link = 27;
+ //
+ int32 face_nft_new = 28;
+ //
+ NftFaceIcon nft_face_icon = 29;
+}
+
+// 认证信息
+message OfficialVerify {
+ // 认证类型
+ // 127:未认证 0:个人 1:机构
+ int32 type = 1;
+ // 认证描述
+ string desc = 2;
+}
+
+// 角标
+message ReasonStyle {
+ // 角标文案
+ string text = 1;
+ // 文案日间色值
+ string text_color = 2;
+ // 文案夜间色值
+ string text_color_night = 3;
+ // 背景日间色值
+ string bg_color = 4;
+ // 背景夜间色值
+ string bg_color_night = 5;
+ // 边框日间色值
+ string border_color = 6;
+ // 边框夜间色值
+ string border_color_night = 7;
+ // 角标样式
+ // 1:填充模式 2:镂空模式
+ int32 bg_style = 8;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/interfaces/v1/space.proto b/bili-api/grpc/proto/bilibili/app/interfaces/v1/space.proto
new file mode 100644
index 000000000..0607fd752
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/interfaces/v1/space.proto
@@ -0,0 +1,109 @@
+syntax = "proto3";
+
+package bilibili.app.interface.v1;
+
+option java_package = "bilibili.app.interfaces.v1";
+option java_multiple_files = true;
+
+import "bilibili/app/archive/middleware/v1/preload.proto";
+import "bilibili/app/archive/v1/archive.proto";
+import "bilibili/app/dynamic/v2/dynamic.proto";
+
+//
+service Space {
+ //
+ rpc SearchTab(SearchTabReq) returns (SearchTabReply);
+ //
+ rpc SearchArchive(SearchArchiveReq) returns (SearchArchiveReply);
+ //
+ rpc SearchDynamic(SearchDynamicReq) returns (SearchDynamicReply);
+}
+
+//
+message Arc {
+ //
+ bilibili.app.archive.v1.Arc archive = 1;
+ //
+ string uri = 2;
+}
+
+//
+message Dynamic {
+ //
+ bilibili.app.dynamic.v2.DynamicItem dynamic = 1;
+}
+
+enum From {
+ ArchiveTab = 0; //
+ DynamicTab = 1; //
+}
+
+//
+message SearchTabReply {
+ //
+ int64 focus = 1;
+ //
+ repeated Tab tabs = 2;
+}
+
+//
+message SearchTabReq {
+ //
+ string keyword = 1;
+ //
+ int64 mid = 2;
+ //
+ int32 from = 3;
+}
+
+//
+message SearchArchiveReply {
+ //
+ repeated Arc archives = 1;
+ //
+ int64 total = 2;
+}
+
+//
+message SearchArchiveReq {
+ //
+ string keyword = 1;
+ //
+ int64 mid = 2;
+ //
+ int64 pn = 3;
+ //
+ int64 ps = 4;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
+}
+
+//
+message SearchDynamicReply {
+ //
+ repeated Dynamic dynamics = 1;
+ //
+ int64 total = 2;
+}
+
+//
+message SearchDynamicReq {
+ //
+ string keyword = 1;
+ //
+ int64 mid = 2;
+ //
+ int64 pn = 3;
+ //
+ int64 ps = 4;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
+}
+
+//
+message Tab {
+ //
+ string title = 1;
+ //
+ string uri = 2;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/listener/v1/listener.proto b/bili-api/grpc/proto/bilibili/app/listener/v1/listener.proto
new file mode 100644
index 000000000..7fec95161
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/listener/v1/listener.proto
@@ -0,0 +1,1331 @@
+syntax = "proto3";
+
+package bilibili.app.listener.v1;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+import "bilibili/app/archive/middleware/v1/preload.proto";
+import "bilibili/app/interfaces/v1/history.proto";
+import "bilibili/app/playurl/v1/playurl.proto";
+
+// 听视频
+service Listener {
+ //
+ rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty);
+ // 获取音频URL
+ rpc PlayUrl (PlayURLReq) returns (PlayURLResp);
+ //
+ rpc BkarcDetails (BKArcDetailsReq) returns (BKArcDetailsResp);
+ //
+ rpc Playlist (PlaylistReq) returns (PlaylistResp);
+ //
+ rpc PlaylistAdd (PlaylistAddReq) returns (google.protobuf.Empty);
+ //
+ rpc PlaylistDel (PlaylistDelReq) returns (google.protobuf.Empty);
+ // 推荐列表
+ rpc RcmdPlaylist (RcmdPlaylistReq) returns (RcmdPlaylistResp);
+ //
+ rpc PlayHistory (PlayHistoryReq) returns (PlayHistoryResp);
+ // 添加历史记录
+ rpc PlayHistoryAdd (PlayHistoryAddReq) returns (google.protobuf.Empty);
+ //
+ rpc PlayHistoryDel (PlayHistoryDelReq) returns (google.protobuf.Empty);
+ // 播放上报
+ rpc PlayActionReport (PlayActionReportReq) returns (google.protobuf.Empty);
+ // 三联
+ rpc TripleLike (TripleLikeReq) returns (TripleLikeResp);
+ // 点赞
+ rpc ThumbUp (ThumbUpReq) returns (ThumbUpResp);
+ // 投币
+ rpc CoinAdd (CoinAddReq) returns (CoinAddResp);
+ //
+ rpc FavItemAdd (FavItemAddReq) returns (FavItemAddResp);
+ //
+ rpc FavItemDel (FavItemDelReq) returns (FavItemDelResp);
+ // 批量处理收藏
+ rpc FavItemBatch (FavItemBatchReq) returns (FavItemBatchResp);
+ //
+ rpc FavoredInAnyFolders (FavoredInAnyFoldersReq) returns (FavoredInAnyFoldersResp);
+ // 用户收藏夹列表
+ rpc FavFolderList (FavFolderListReq) returns (FavFolderListResp);
+ // 收藏夹详细信息
+ rpc FavFolderDetail (FavFolderDetailReq) returns (FavFolderDetailResp);
+ // 创建收藏夹
+ rpc FavFolderCreate (FavFolderCreateReq) returns (FavFolderCreateResp);
+ //
+ rpc FavFolderDelete (FavFolderDeleteReq) returns (FavFolderDeleteResp);
+ // 每日播单列表
+ rpc PickFeed (PickFeedReq) returns (PickFeedResp);
+ // 每日播单详情
+ rpc PickCardDetail (PickCardDetailReq) returns (PickCardDetailResp);
+ //
+ rpc Medialist(MedialistReq) returns (MedialistResp);
+ //
+ rpc Event(EventReq) returns (EventResp);
+}
+
+//
+service Music {
+ //
+ rpc FavTabShow(FavTabShowReq) returns (FavTabShowResp);
+ //
+ rpc MainFavMusicSubTabList(MainFavMusicSubTabListReq) returns (MainFavMusicSubTabListResp);
+ //
+ rpc MainFavMusicMenuList(MainFavMusicMenuListReq) returns (MainFavMusicMenuListResp);
+ //
+ rpc MenuEdit(MenuEditReq) returns (MenuEditResp);
+ //
+ rpc MenuDelete(MenuDeleteReq) returns (MenuDeleteResp);
+ //
+ rpc MenuSubscribe(MenuSubscribeReq) returns (MenuSubscribeResp);
+ //
+ rpc Click(ClickReq) returns (ClickResp);
+}
+
+//
+message Author {
+ //
+ int64 mid = 1;
+ //
+ string name = 2;
+ //
+ string avatar = 3;
+ //
+ FollowRelation relation = 4;
+}
+
+//
+message BKArcDetailsReq {
+ //
+ repeated PlayItem items = 1;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs playerArgs = 2;
+}
+
+//
+message BKArcDetailsResp {
+ //
+ repeated DetailItem list = 1;
+}
+
+//
+message BKArchive {
+ //
+ int64 oid = 1;
+ //
+ string title = 2;
+ //
+ string cover = 3;
+ //
+ string desc = 4;
+ //
+ int64 duration = 5;
+ //
+ int32 rid = 6;
+ //
+ string rname = 7;
+ //
+ int64 publish = 8;
+ //
+ string displayed_oid = 9;
+ //
+ int32 copyright = 10;
+ //
+ BKArcRights rights = 11;
+}
+
+//
+message BKArcPart {
+ //
+ int64 oid = 1;
+ //
+ int64 sub_id = 2;
+ //
+ string title = 3;
+ //
+ int64 duration = 4;
+ //
+ int32 page = 5;
+}
+
+//
+message BKArcRights {
+ //
+ int32 no_reprint = 1;
+}
+
+//
+message BKStat {
+ //
+ int32 like = 1;
+ //
+ int32 coin = 2;
+ //
+ int32 favourite = 3;
+ //
+ int32 reply = 4;
+ //
+ int32 share = 5;
+ //
+ int32 view = 6;
+ //
+ bool has_like = 7;
+ //
+ bool has_coin = 8;
+ //
+ bool has_fav = 9;
+}
+
+//
+message CardModule {
+ //
+ int32 module_type = 1;
+ oneof module {
+ //
+ PkcmHeader module_header = 2;
+ //
+ PkcmArchive module_archive = 3;
+ //
+ PkcmCenterButton module_cbtn = 4;
+ }
+}
+
+//
+enum CardModuleType {
+ Module_invalid = 0;
+ Module_header = 1;
+ Module_archive = 2;
+ Module_cbtn = 3;
+}
+
+//
+message ClickReq {
+ //
+ int64 sid = 1;
+ //
+ int32 action = 2;
+}
+
+//
+message ClickResp {
+
+}
+
+//
+message CoinAddReq {
+ //
+ PlayItem item = 1;
+ //
+ int32 num = 2;
+ //
+ bool thumb_up = 3;
+}
+
+//
+message CoinAddResp {
+ //
+ string message = 1;
+}
+
+//
+message DashItem {
+ //
+ int32 id = 1;
+ //
+ string base_url = 2;
+ //
+ repeated string backup_url = 3;
+ //
+ int32 bandwidth = 4;
+ //
+ string mime_type = 5;
+ //
+ string codecs = 6;
+ //
+ DashSegmentBase segment_base = 12;
+ //
+ int32 codecid = 13;
+ //
+ string md5 = 14;
+ //
+ int64 size = 15;
+}
+
+//
+message DashSegmentBase {
+ //
+ string initialization = 1;
+ //
+ string index_range = 2;
+}
+
+//
+message DetailItem {
+ //
+ PlayItem item = 1;
+ //
+ BKArchive arc = 2;
+ //
+ repeated BKArcPart parts = 3;
+ //
+ Author owner = 4;
+ //
+ BKStat stat = 5;
+ //
+ int64 last_part = 6;
+ //
+ int64 progress = 7;
+ //
+ int32 playable = 8;
+ //
+ string message = 9;
+ //
+ map player_info = 10;
+ //
+ PlayItem associated_item = 11;
+ //
+ int64 last_play_time = 12;
+ //
+ string history_tag = 13;
+ //
+ bilibili.app.interface.v1.DeviceType device_type = 14;
+ //
+ FavFolder ugc_season_info = 15;
+}
+
+//
+message EventReq {
+ //
+ int32 event_type = 1;
+ //
+ PlayItem item = 2;
+}
+
+//
+message EventResp {
+
+}
+
+//
+message EventTracking {
+ //
+ string operator = 1;
+ //
+ string batch = 2;
+ //
+ string track_id = 3;
+ //
+ string entity_type = 4;
+ //
+ string entity_id = 5;
+ //
+ string track_json = 6;
+}
+
+//
+message FavFolder {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+ //
+ FavFolderAuthor owner = 3;
+ //
+ string name = 4;
+ //
+ string cover = 5;
+ //
+ string desc = 6;
+ //
+ int32 count = 7;
+ //
+ int32 attr = 8;
+ //
+ int32 state = 9;
+ //
+ int32 favored = 10;
+ //
+ int64 ctime = 11;
+ //
+ int64 mtime = 12;
+ //
+ int32 stat_fav_cnt = 13;
+ //
+ int32 stat_share_cnt = 14;
+ //
+ int32 stat_like_cnt = 15;
+ //
+ int32 stat_Play_cnt = 16;
+ //
+ int32 stat_reply_cnt = 17;
+ //
+ int32 fav_state = 18;
+}
+
+//
+message FavFolderAction {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+ //
+ int32 action = 3;
+}
+
+//
+message FavFolderAuthor {
+ //
+ int64 mid = 1;
+ //
+ string name = 2;
+}
+
+//
+message FavFolderCreateReq {
+ //
+ string name = 1;
+ //
+ string desc = 2;
+ //
+ int32 public = 3;
+ //
+ int32 folder_type = 4;
+}
+
+//
+message FavFolderCreateResp {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+ //
+ string message = 3;
+}
+
+//
+message FavFolderDeleteReq {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+}
+
+//
+message FavFolderDeleteResp {
+ //
+ string message = 1;
+}
+
+//
+message FavFolderDetailReq {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+ //
+ int64 fav_mid = 3;
+ //
+ FavItem last_item = 4;
+ //
+ int32 page_size = 5;
+ //
+ bool need_folder_info = 6;
+}
+
+//
+message FavFolderDetailResp {
+ //
+ int32 total = 1;
+ //
+ bool reach_end = 2;
+ //
+ repeated FavItemDetail list = 3;
+ //
+ FavFolder folder_info = 4;
+}
+
+//
+message FavFolderListReq {
+ //
+ repeated int32 folder_types = 1;
+ //
+ PlayItem item = 2;
+}
+
+//
+message FavFolderListResp {
+ //
+ repeated FavFolder list = 1;
+}
+
+//
+message FavFolderMeta {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+}
+
+//
+message FavItem {
+ //
+ int32 item_type = 1;
+ //
+ int64 oid = 2;
+ //
+ int64 fid = 3;
+ //
+ int64 mid = 4;
+ //
+ int64 mtime = 5;
+ //
+ int64 ctime = 6;
+ //
+ EventTracking et = 7;
+}
+
+//
+message FavItemAddReq {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+ oneof item {
+ //
+ PlayItem play = 3;
+ //
+ FavItem fav = 4;
+ }
+}
+
+//
+message FavItemAddResp {
+ //
+ string message = 1;
+}
+
+//
+message FavItemAuthor {
+ //
+ int64 mid = 1;
+ //
+ string name = 2;
+}
+
+//
+message FavItemBatchReq {
+ //
+ repeated FavFolderAction actions = 1;
+ oneof item {
+ //
+ PlayItem play = 2;
+ //
+ FavItem fav = 3;
+ }
+}
+
+//
+message FavItemBatchResp {
+ //
+ string message = 1;
+}
+
+//
+message FavItemDelReq {
+ //
+ int64 fid = 1;
+ //
+ int32 folder_type = 2;
+ oneof item {
+ //
+ PlayItem play = 3;
+ //
+ FavItem fav = 4;
+ }
+}
+
+//
+message FavItemDelResp {
+ //
+ string message = 1;
+}
+
+//
+message FavItemDetail {
+ //
+ FavItem item = 1;
+ //
+ FavItemAuthor owner = 2;
+ //
+ FavItemStat stat = 3;
+ //
+ string cover = 4;
+ //
+ string name = 5;
+ //
+ int64 duration = 6;
+ //
+ int32 state = 7;
+ //
+ string message = 8;
+ //
+ int32 parts = 9;
+}
+
+//
+message FavItemStat {
+ //
+ int32 view = 1;
+ //
+ int32 reply = 2;
+}
+
+//
+message FavoredInAnyFoldersReq {
+ //
+ repeated int32 folder_types = 1;
+ //
+ PlayItem item = 2;
+}
+
+//
+message FavoredInAnyFoldersResp {
+ //
+ repeated FavFolderMeta folders = 1;
+ //
+ PlayItem item = 2;
+}
+
+//
+message FavTabShowReq {
+ //
+ int64 mid = 1;
+}
+
+//
+message FavTabShowResp {
+ //
+ bool show_menu = 1;
+}
+
+//
+message FollowRelation {
+ //
+ int32 status = 1;
+}
+
+//
+message FormatDescription {
+ //
+ int32 quality = 1;
+ //
+ string format = 2;
+ //
+ string description = 3;
+ //
+ string display_desc = 4;
+ //
+ string superscript = 5;
+}
+
+//
+enum ListOrder {
+ NO_ORDER = 0; //
+ ORDER_NORMAL = 1; //
+ ORDER_REVERSE = 2; //
+ ORDER_RANDOM = 3; //
+}
+
+//
+enum ListSortField {
+ NO_SORT = 0; //
+ SORT_CTIME = 1; //
+ SORT_VIEWCNT = 2; //
+ SORT_FAVCNT = 3; //
+}
+
+//
+message MainFavMusicMenuListReq {
+ //
+ int32 tab_type = 1;
+ //
+ string offset = 2;
+}
+
+//
+message MainFavMusicMenuListResp {
+ //
+ int32 tab_type = 1;
+ //
+ repeated MusicMenu menu_list = 2;
+ //
+ bool has_more = 3;
+ //
+ string offset = 4;
+}
+
+//
+message MainFavMusicSubTabListReq {
+
+}
+
+//
+message MainFavMusicSubTabListResp {
+ //
+ repeated MusicSubTab tabs = 1;
+ //
+ MainFavMusicMenuListResp default_tab_res = 2;
+ //
+ map first_page_res = 3;
+}
+
+//
+message MedialistItem {
+ //
+ PlayItem item = 1;
+ //
+ string title = 2;
+ //
+ string cover = 3;
+ //
+ int64 duration = 4;
+ //
+ int32 parts = 5;
+ //
+ int64 up_mid = 6;
+ //
+ string up_name = 7;
+ //
+ int32 state = 8;
+ //
+ string message = 9;
+ //
+ int64 stat_view = 10;
+ //
+ int64 stat_reply = 11;
+}
+
+//
+message MedialistReq {
+ //
+ int64 list_type = 1;
+ //
+ int64 biz_id = 2;
+ //
+ string offset = 3;
+}
+
+//
+message MedialistResp {
+ //
+ int64 total = 1;
+ //
+ bool has_more = 2;
+ //
+ string offset = 3;
+ //
+ repeated MedialistItem items = 4;
+ //
+ MedialistUpInfo up_info = 5;
+}
+
+//
+message MedialistUpInfo {
+ //
+ int64 mid = 1;
+ //
+ string avatar = 2;
+ //
+ int64 fans = 3;
+ //
+ string name = 4;
+}
+
+//
+message MenuDeleteReq {
+ //
+ int64 id = 1;
+}
+
+//
+message MenuDeleteResp {
+ //
+ string message = 1;
+}
+
+//
+message MenuEditReq {
+ //
+ int64 id = 1;
+ //
+ string title = 2;
+ //
+ string desc = 3;
+ //
+ int32 is_public = 4;
+}
+
+//
+message MenuEditResp {
+ //
+ string message = 1;
+}
+
+//
+message MenuSubscribeReq {
+ //
+ int32 action = 1;
+ //
+ int64 target_id = 2;
+}
+
+//
+message MenuSubscribeResp {
+ //
+ string message = 1;
+}
+
+//
+message MusicMenu {
+ //
+ int64 id = 1;
+ //
+ int32 menu_type = 2;
+ //
+ string title = 3;
+ //
+ string desc = 4;
+ //
+ string cover = 5;
+ //
+ MusicMenuAuthor owner = 6;
+ //
+ int32 state = 7;
+ //
+ int64 attr = 8;
+ //
+ MusicMenuStat stat = 9;
+ //
+ int64 total = 10;
+ //
+ int64 ctime = 11;
+ //
+ string uri = 12;
+}
+
+//
+message MusicMenuAuthor {
+ //
+ int64 mid = 1;
+ //
+ string name = 2;
+ //
+ string avatar = 3;
+}
+
+//
+message MusicMenuStat {
+ //
+ int64 play = 1;
+ //
+ int64 reply = 2;
+}
+
+//
+message MusicSubTab {
+ //
+ string name = 1;
+ //
+ int32 tab_type = 2;
+ //
+ int64 total = 3;
+}
+
+//
+message PageOption {
+ //
+ int32 page_size = 1;
+ //
+ int32 direction = 2;
+ //
+ PlayItem last_item = 3;
+}
+
+//
+message PickArchive {
+ //
+ PlayItem item = 1;
+ //
+ string title = 2;
+ //
+ PickArchiveAuthor owner = 3;
+ //
+ string cover = 4;
+ //
+ int64 duration = 5;
+ //
+ int32 parts = 6;
+ //
+ int32 stat_view = 7;
+ //
+ int32 stat_reply = 8;
+ //
+ int32 state = 9;
+ //
+ string message = 10;
+}
+
+//
+message PickArchiveAuthor {
+ //
+ int64 mid = 1;
+ //
+ string name = 2;
+}
+
+//
+message PickCard {
+ //
+ int64 pick_id = 1;
+ //
+ int64 card_id = 2;
+ //
+ string card_name = 3;
+ //
+ repeated CardModule modules = 4;
+}
+
+//
+message PickCardDetailReq {
+ //
+ int64 card_id = 1;
+ //
+ int64 pick_id = 2;
+}
+
+//
+message PickCardDetailResp {
+ //
+ int64 card_id = 1;
+ //
+ int64 pick_id = 2;
+ //
+ repeated CardModule modules = 3;
+}
+
+//
+message PickFeedReq {
+ //
+ int64 offset = 1;
+}
+
+//
+message PickFeedResp {
+ //
+ int64 offset = 1;
+ //
+ repeated PickCard cards = 2;
+}
+
+//
+message PkcmArchive {
+ //
+ PickArchive arc = 1;
+ //
+ string pick_reason = 2;
+}
+
+//
+message PkcmCenterButton {
+ //
+ string icon_head = 1;
+ //
+ string icon_tail = 2;
+ //
+ string title = 3;
+ //
+ string uri = 4;
+}
+
+//
+message PkcmHeader {
+ //
+ string title = 1;
+ //
+ string desc = 2;
+ //
+ string btn_icon = 3;
+ //
+ string btn_text = 4;
+ //
+ string btn_uri = 5;
+}
+
+//
+message PlayActionReportReq {
+ //
+ PlayItem item = 1;
+ //
+ string from_spmid = 2;
+}
+
+//
+message PlayDASH {
+ //
+ int32 duration = 1;
+ //
+ float min_buffer_time = 2;
+ //
+ repeated DashItem audio = 3;
+}
+
+//
+message PlayHistoryAddReq {
+ //
+ PlayItem item = 1;
+ //
+ int64 progress = 2;
+ //
+ int64 duration = 3;
+ //
+ int32 play_style = 4;
+}
+
+//
+message PlayHistoryDelReq {
+ //
+ repeated PlayItem items = 1;
+ //
+ bool truncate = 2;
+}
+
+//
+message PlayHistoryReq {
+ //
+ PageOption page_opt = 1;
+ //
+ int64 local_today_zero = 2;
+}
+
+//
+message PlayHistoryResp {
+ //
+ int32 total = 1;
+ //
+ bool reach_end = 2;
+ //
+ repeated DetailItem list = 3;
+}
+
+//
+message PlayInfo {
+ //
+ int32 qn = 1;
+ //
+ string format = 2;
+ //
+ int32 qn_type = 3;
+ oneof info {
+ //
+ PlayURL play_url = 4;
+ //
+ PlayDASH play_dash = 5;
+ }
+ int32 fnver = 6;
+ //
+ int32 fnval = 7;
+ //
+ repeated int32 formats = 8;
+ //
+ int32 video_codecid = 9;
+ //
+ int64 length = 10;
+ //
+ int32 code = 11;
+ //
+ string message = 12;
+ //
+ int64 expire_time = 13;
+ //
+ bilibili.app.playurl.v1.VolumeInfo volume = 14;
+}
+
+//
+message PlayItem {
+ //
+ int32 item_type = 1;
+ //
+ int64 oid = 3;
+ //
+ repeated int64 sub_id = 4;
+ //
+ EventTracking et = 5;
+}
+
+//
+message PlaylistAddReq {
+ //
+ repeated PlayItem items = 1;
+ oneof pos {
+ //
+ PlayItem after = 2;
+ //
+ bool head = 3;
+ //
+ bool tail = 4;
+ }
+}
+
+//
+message PlaylistDelReq {
+ //
+ repeated PlayItem items = 1;
+ //
+ bool truncate = 2;
+}
+
+//
+message PlaylistReq {
+ //
+ int32 from = 1;
+ //
+ int64 id = 2;
+ //
+ PlayItem anchor = 3;
+ //
+ PageOption page_opt = 4;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
+ //
+ int64 extra_id = 6;
+ //
+ SortOption sort_opt = 7;
+}
+
+//
+message PlaylistResp {
+ //
+ int32 total = 1;
+ //
+ bool reach_start = 2;
+ //
+ bool reach_end = 3;
+ //
+ repeated DetailItem list = 4;
+ //
+ PlayItem last_play = 5;
+ //
+ int64 last_progress = 6;
+}
+
+//
+enum PlaylistSource {
+ DEFAULT = 0; //
+ MEM_SPACE = 1; //
+ AUDIO_COLLECTION = 2; //
+ AUDIO_CARD = 3; //
+ USER_FAVOURITE = 4; //
+ UP_ARCHIVE = 5; //
+ AUDIO_CACHE = 6; //
+ PICK_CARD = 7; //
+ MEDIA_LIST = 8; //
+}
+
+//
+message PlayURL {
+ //
+ repeated ResponseUrl durl = 1;
+}
+
+//
+message PlayURLReq {
+ //
+ PlayItem item = 1;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 2;
+}
+
+//
+message PlayURLResp {
+ //
+ PlayItem item = 1;
+ //
+ int32 playable = 2;
+ //
+ string message = 3;
+ //
+ map playerInfo = 4;
+}
+
+//
+message RcmdPlaylistReq {
+ //
+ int32 from = 1;
+ //
+ int64 id = 2;
+ //
+ bool need_history = 3;
+ //
+ bool need_top_cards = 4;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
+}
+
+//
+message RcmdPlaylistResp {
+ //
+ repeated DetailItem list = 1;
+ //
+ int64 history_len = 2;
+ //
+ repeated TopCard top_cards = 3;
+}
+
+//
+message ResponseUrl {
+ //
+ int32 order = 1;
+ //
+ int64 length = 2;
+ //
+ int64 size = 3;
+ //
+ string ahead = 4;
+ //
+ string vhead = 5;
+ //
+ string url = 6;
+ //
+ repeated string backup_url = 7;
+ //
+ string md5 = 8;
+}
+
+//
+message SortOption {
+ //
+ int32 order = 1;
+ //
+ int32 sort_field = 2;
+}
+
+//
+message ThumbUpReq {
+ //
+ PlayItem item = 1;
+ //
+ int32 action = 2;
+}
+
+//
+message ThumbUpResp {
+ //
+ string message = 1;
+}
+
+//
+message TopCard {
+ //
+ string title = 1;
+ //
+ int32 play_style = 2;
+ //
+ int32 card_type = 3;
+ //
+ oneof card {
+ //
+ TpcdHistory listen_history = 4;
+ //
+ TpcdFavFolder fav_folder = 5;
+ //
+ TpcdUpRecall up_recall = 6;
+ //
+ TpcdPickToday pick_today = 7;
+ }
+ //
+ int64 pos = 8;
+ //
+ string title_icon = 9;
+}
+
+//
+enum TopCardType {
+ UNSPECIFIED = 0; //
+ LISTEN_HISTORY = 1; //
+ FAVORITE_FOLDER = 2; //
+ UP_RECALL = 3; //
+ PICK_TODAY = 4; //
+}
+
+//
+message TpcdFavFolder {
+ //
+ DetailItem item = 1;
+ //
+ string text = 2;
+ //
+ string pic = 3;
+ //
+ int64 fid = 4;
+ //
+ int32 folder_type = 5;
+}
+
+//
+message TpcdHistory {
+ //
+ DetailItem item = 1;
+ //
+ string text = 2;
+ //
+ string pic = 3;
+}
+
+//
+message TpcdPickToday {
+ //
+ DetailItem item = 1;
+ //
+ string text = 2;
+ //
+ string pic = 3;
+ //
+ int64 pick_id = 4;
+ //
+ int64 pick_card_id = 5;
+}
+
+//
+message TpcdUpRecall {
+ //
+ int64 up_mid = 1;
+ //
+ string text = 2;
+ //
+ string avatar = 3;
+ //
+ int64 medialist_type = 4;
+ //
+ int64 medialist_biz_id = 5;
+ //
+ DetailItem item = 6;
+}
+
+//
+message TripleLikeReq {
+ //
+ PlayItem item = 1;
+}
+
+//
+message TripleLikeResp {
+ //
+ string message = 1;
+ //
+ bool thumb_ok = 2;
+ //
+ bool coin_ok = 3;
+ //
+ bool fav_ok = 4;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/playeronline/v1/playeronline.proto b/bili-api/grpc/proto/bilibili/app/playeronline/v1/playeronline.proto
new file mode 100644
index 000000000..bb0457d85
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/playeronline/v1/playeronline.proto
@@ -0,0 +1,72 @@
+syntax = "proto3";
+
+package bilibili.app.playeronline.v1;
+
+option java_multiple_files = true;
+
+// 在线人数
+service PlayerOnline {
+ // 获取在线人数
+ rpc PlayerOnline (PlayerOnlineReq) returns (PlayerOnlineReply);
+ //
+ rpc PremiereInfo(PremiereInfoReq) returns (PremiereInfoReply);
+ //
+ rpc ReportWatch(ReportWatchReq) returns (NoReply);
+}
+
+// 空回复
+message NoReply {}
+
+// 获取在线人数-回复
+message PlayerOnlineReply {
+ //
+ string total_text = 1;
+ // 下次轮询间隔时间
+ int64 sec_next = 2;
+ // 是否底部显示
+ bool bottom_show = 3;
+ //
+ bool sdm_show = 4;
+ //
+ string sdm_text = 5;
+ //
+ int64 total_number = 6;
+ //
+ string total_number_text = 7;
+}
+
+// 获取在线人数-请求
+message PlayerOnlineReq {
+ // 稿件 avid
+ int64 aid = 1;
+ // 视频 cid
+ int64 cid = 2;
+ // 是否在播放中
+ bool play_open = 3;
+}
+
+//
+message PremiereInfoReply {
+ //
+ string premiere_over_text = 1;
+ //
+ int64 participant = 2;
+ //
+ int64 interaction = 3;
+}
+
+//
+message PremiereInfoReq {
+ //
+ int64 aid = 1;
+}
+
+//
+message ReportWatchReq {
+ //
+ int64 aid = 1;
+ //
+ string biz = 2;
+ //
+ string buvid = 3;
+}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/playerunite/pgcanymodel/PGCAnyModel.proto b/bili-api/grpc/proto/bilibili/app/playerunite/pgcanymodel/PGCAnyModel.proto
similarity index 100%
rename from bili-api-grpc/proto/bilibili/app/playerunite/pgcanymodel/PGCAnyModel.proto
rename to bili-api/grpc/proto/bilibili/app/playerunite/pgcanymodel/PGCAnyModel.proto
diff --git a/bili-api-grpc/proto/bilibili/app/playerunite/ugcanymodel/UGCAnyModel.proto b/bili-api/grpc/proto/bilibili/app/playerunite/ugcanymodel/UGCAnyModel.proto
similarity index 65%
rename from bili-api-grpc/proto/bilibili/app/playerunite/ugcanymodel/UGCAnyModel.proto
rename to bili-api/grpc/proto/bilibili/app/playerunite/ugcanymodel/UGCAnyModel.proto
index 78d46a58b..937bb3671 100644
--- a/bili-api-grpc/proto/bilibili/app/playerunite/ugcanymodel/UGCAnyModel.proto
+++ b/bili-api/grpc/proto/bilibili/app/playerunite/ugcanymodel/UGCAnyModel.proto
@@ -13,17 +13,17 @@ message ButtonStyle {
enum PlayLimitCode {
PLC_UNKNOWN = 0;
- PLC_NOTPAYED = 1;
+ PLC_NOTPAYED = 1;
}
message PlayLimit {
- PlayLimitCode code = 1;
- string message = 2;
- string sub_message = 3;
- ButtonStyle button = 4;
+ PlayLimitCode code = 1;
+ string message = 2;
+ string sub_message = 3;
+ ButtonStyle button = 4;
}
message UGCAnyModel {
- PlayLimit play_limit = 1;
+ PlayLimit play_limit = 1;
}
diff --git a/bili-api/grpc/proto/bilibili/app/playerunite/v1/playerunite.proto b/bili-api/grpc/proto/bilibili/app/playerunite/v1/playerunite.proto
new file mode 100644
index 000000000..c1633ef50
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/playerunite/v1/playerunite.proto
@@ -0,0 +1,51 @@
+syntax = "proto3";
+
+package bilibili.app.playerunite.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/playershared/playershared.proto";
+
+import "google/protobuf/any.proto";
+
+// 统一视频url
+service Player {
+ // 视频地址
+ rpc PlayViewUnite (PlayViewUniteReq) returns (PlayViewUniteReply);
+}
+
+//
+message PlayViewUniteReq {
+ // 请求资源VOD信息
+ bilibili.playershared.VideoVod vod = 1;
+ //
+ string spmid = 2;
+ //
+ string from_spmid = 3;
+ // 补充信息, 如ep_id等
+ map extra_content = 4;
+ //
+ string bvid = 5;
+}
+
+//
+message PlayViewUniteReply {
+ // 音视频流信息
+ bilibili.playershared.VodInfo vod_info = 1;
+ //
+ bilibili.playershared.PlayArcConf play_arc_conf = 2;
+ //
+ bilibili.playershared.PlayDeviceConf play_device_conf = 3;
+ //
+ bilibili.playershared.Event event = 4;
+ // 使用 pgcanymodel / ugcanymodel 进行proto any转换成对应业务码结构体
+ google.protobuf.Any supplement = 5;
+ //
+ bilibili.playershared.PlayArc play_arc = 6;
+ //
+ bilibili.playershared.QnTrialInfo qn_trial_info = 7;
+ //
+ bilibili.playershared.History history = 8;
+ //
+ bilibili.playershared.ViewInfo view_info = 9;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/playurl/v1/playurl.proto b/bili-api/grpc/proto/bilibili/app/playurl/v1/playurl.proto
new file mode 100644
index 000000000..ec94112ce
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/playurl/v1/playurl.proto
@@ -0,0 +1,673 @@
+syntax = "proto3";
+
+package bilibili.app.playurl.v1;
+
+option java_multiple_files = true;
+
+// 视频url
+service PlayURL {
+ // 视频地址
+ rpc PlayURL (PlayURLReq) returns (PlayURLReply);
+ // 投屏地址
+ rpc Project (ProjectReq) returns (ProjectReply);
+ // 播放页信息
+ rpc PlayView (PlayViewReq) returns (PlayViewReply);
+ // 编辑播放界面配置
+ rpc PlayConfEdit (PlayConfEditReq) returns (PlayConfEditReply);
+ // 获取播放界面配置
+ rpc PlayConf (PlayConfReq) returns (PlayConfReply);
+}
+
+//
+message AB {
+ //
+ Glance glance = 1;
+ //
+ int32 group = 2;
+}
+
+// 配置项
+message ArcConf {
+ // 是否支持
+ bool is_support = 1;
+ //
+ bool disabled = 2;
+ //
+ ExtraContent extra_content = 3;
+}
+
+// 业务类型
+enum Business {
+ UNKNOWN = 0; // 未知类型
+ STORY = 1; // story业务
+}
+
+// Chronos灰度管理
+message Chronos {
+ // 资源md5
+ string md5 = 1;
+ // 资源文件
+ string file = 2;
+}
+
+//
+message ButtonStyle {
+ //
+ string text = 1;
+ //
+ string text_color = 2;
+ //
+ string bg_color = 3;
+ //
+ string jump_link = 4;
+}
+
+//
+message CloudConf {
+ // 是否展示功能
+ bool show = 1;
+ // 设置类型
+ ConfType conf_type = 2;
+ //
+ FieldValue field_value = 3;
+ //
+ ConfValue conf_value = 4;
+}
+
+// 编码类型
+enum CodeType {
+ NOCODE = 0; // 默认
+ CODE264 = 1; // H.264
+ CODE265 = 2; // H.265
+ CODEAV1 = 3; // av1
+}
+
+// 设置类型
+enum ConfType {
+ NoType = 0; //
+ FLIPCONF = 1; // 镜像反转
+ CASTCONF = 2; // 视频投屏
+ FEEDBACK = 3; // 反馈
+ SUBTITLE = 4; // 字幕
+ PLAYBACKRATE = 5; // 播放速度
+ TIMEUP = 6; // 定时停止播放
+ PLAYBACKMODE = 7; // 播放方式
+ SCALEMODE = 8; // 画面尺寸
+ BACKGROUNDPLAY = 9; // 后台播放
+ LIKE = 10; // 顶
+ DISLIKE = 11; // 踩
+ COIN = 12; // 投币
+ ELEC = 13; // 充电
+ SHARE = 14; // 分享
+ SCREENSHOT = 15; // 截图
+ LOCKSCREEN = 16; // 锁屏
+ RECOMMEND = 17; // 推荐
+ PLAYBACKSPEED = 18; // 倍速
+ DEFINITION = 19; // 清晰度
+ SELECTIONS = 20; // 选集
+ NEXT = 21; // 下一集
+ EDITDM = 22; // 编辑弹幕
+ SMALLWINDOW = 23; // 小窗
+ SHAKE = 24; // 播放震动
+ OUTERDM = 25; // 外层面板弹幕设置
+ INNERDM = 26; // 三点内弹幕设置
+ PANORAMA = 27; // 全景
+ DOLBY = 28; // 杜比
+ COLORFILTER = 29; // 颜色滤镜
+}
+
+//
+message ConfValue {
+ oneof value {
+ //
+ bool switch_val = 1;
+ //
+ int64 selected_val = 2;
+ }
+}
+
+// dash条目
+message DashItem {
+ // 清晰度
+ uint32 id = 1;
+ // 主线流
+ string baseUrl = 2;
+ // 备用流
+ repeated string backup_url = 3;
+ // 带宽
+ uint32 bandwidth = 4;
+ // 编码id
+ uint32 codecid = 5;
+ // md5
+ string md5 = 6;
+ // 大小
+ uint64 size = 7;
+ // 帧率
+ string frame_rate = 8;
+ //
+ string widevine_pssh = 9;
+}
+
+// dash视频流
+message DashVideo {
+ // 主线流
+ string base_url = 1;
+ // 备用流
+ repeated string backup_url = 2;
+ // 带宽
+ uint32 bandwidth = 3;
+ // 编码id
+ uint32 codecid = 4;
+ // md5
+ string md5 = 5;
+ // 大小
+ uint64 size = 6;
+ // 伴音质量id
+ uint32 audioId = 7;
+ // 是否非全二压
+ bool no_rexcode = 8;
+ // 码率
+ string frame_rate = 9;
+ // 宽度
+ int32 width = 10;
+ // 高度
+ int32 height = 11;
+ //
+ string widevine_pssh = 12;
+}
+
+// 杜比伴音信息
+message DolbyItem {
+ enum Type {
+ NONE = 0; // NONE
+ COMMON = 1; // 普通杜比音效
+ ATMOS = 2; // 全景杜比音效
+ }
+ // 杜比类型
+ Type type = 1;
+ // 音频流
+ DashItem audio = 2;
+}
+
+// 事件
+message Event {
+ // 震动
+ Shake shake = 1;
+}
+
+//
+message ExtraContent {
+ //
+ string disabled_reason = 1;
+ //
+ int64 disabled_code = 2;
+}
+
+// 配置字段值
+message FieldValue {
+ oneof value {
+ // 开关
+ bool switch = 1;
+ }
+}
+
+// 清晰度描述
+message FormatDescription {
+ // 清晰度
+ int32 quality = 1;
+ // 清晰度格式
+ string format = 2;
+ // 清晰度描述
+ string description = 3;
+ // 新描述
+ string new_description = 4;
+ // 选中态的清晰度描述
+ string display_desc = 5;
+ // 选中态的清晰度描述的角标
+ string superscript = 6;
+}
+
+//
+message Glance {
+ //
+ bool can_watch = 1;
+ //
+ int64 times = 2;
+ //
+ int64 duration = 3;
+}
+
+//
+enum Group {
+ UnknownGroup = 0; //
+ A = 1; //
+ B = 2; //
+ C = 3; //
+}
+
+// 禁用功能配置
+message PlayAbilityConf {
+ CloudConf background_play_conf = 1; // 后台播放
+ CloudConf flip_conf = 2; // 镜像反转
+ CloudConf cast_conf = 3; // 投屏
+ CloudConf feedback_conf = 4; // 反馈
+ CloudConf subtitle_conf = 5; // 字幕
+ CloudConf playback_rate_conf = 6; // 播放速度
+ CloudConf time_up_conf = 7; // 定时停止
+ CloudConf playback_mode_conf = 8; // 播放方式
+ CloudConf scale_mode_conf = 9; // 画面尺寸
+ CloudConf like_conf = 10; // 赞
+ CloudConf dislike_conf = 11; // 踩
+ CloudConf coin_conf = 12; // 投币
+ CloudConf elec_conf = 13; // 充电
+ CloudConf share_conf = 14; // 分享
+ CloudConf screen_shot_conf = 15; // 截图
+ CloudConf lock_screen_conf = 16; // 锁定
+ CloudConf recommend_conf = 17; // 相关推荐
+ CloudConf playback_speed_conf = 18; // 播放速度
+ CloudConf definition_conf = 19; // 清晰度
+ CloudConf selections_conf = 20; // 选集
+ CloudConf next_conf = 21; // 下一集
+ CloudConf edit_dm_conf = 22; // 编辑弹幕
+ CloudConf small_window_conf = 23; // 小窗
+ CloudConf shake_conf = 24; // 震动
+ CloudConf outer_dm_conf = 25; // 外层面板弹幕设置
+ CloudConf innerDmDisable = 26; // 三点内弹幕设置
+ CloudConf inner_dm_conf = 27; // 一起看入口
+ CloudConf dolby_conf = 28; // 杜比音效
+ CloudConf color_filter_conf = 29; // 颜色滤镜
+}
+
+// 播放控件稿件配置
+message PlayArcConf {
+ ArcConf background_play_conf = 1; // 后台播放
+ ArcConf flip_conf = 2; // 镜像反转
+ ArcConf cast_conf = 3; // 投屏
+ ArcConf feedback_conf = 4; // 反馈
+ ArcConf subtitle_conf = 5; // 字幕
+ ArcConf playback_rate_conf = 6; // 播放速度
+ ArcConf time_up_conf = 7; // 定时停止
+ ArcConf playback_mode_conf = 8; // 播放方式
+ ArcConf scale_mode_conf = 9; // 画面尺寸
+ ArcConf like_conf = 10; // 赞
+ ArcConf dislike_conf = 11; // 踩
+ ArcConf coin_conf = 12; // 投币
+ ArcConf elec_conf = 13; // 充电
+ ArcConf share_conf = 14; // 分享
+ ArcConf screen_shot_conf = 15; // 截图
+ ArcConf lock_screen_conf = 16; // 锁定
+ ArcConf recommend_conf = 17; // 相关推荐
+ ArcConf playback_speed_conf = 18; // 播放速度
+ ArcConf definition_conf = 19; // 清晰度
+ ArcConf selections_conf = 20; // 选集
+ ArcConf next_conf = 21; // 下一集
+ ArcConf edit_dm_conf = 22; // 编辑弹幕
+ ArcConf small_window_conf = 23; // 小窗
+ ArcConf shake_conf = 24; // 震动
+ ArcConf outer_dm_conf = 25; // 外层面板弹幕设置
+ ArcConf inner_dm_conf = 26; // 三点内弹幕设置
+ ArcConf panorama_conf = 27; // 一起看入口
+ ArcConf dolby_conf = 28; // 杜比音效
+ ArcConf screen_recording_conf = 29; // 屏幕录制
+ ArcConf color_filter_conf = 30; // 颜色滤镜
+}
+
+// 编辑播放界面配置-响应
+message PlayConfEditReply {
+
+}
+
+// 编辑播放界面配置-请求
+message PlayConfEditReq {
+ // 播放界面配置
+ repeated PlayConfState play_conf = 1;
+}
+
+// 获取播放界面配置-响应
+message PlayConfReply {
+ //播放控件用户自定义配置
+ PlayAbilityConf play_conf = 1;
+}
+
+// 获取播放界面配置-请求
+message PlayConfReq {
+
+}
+
+// 播放界面配置
+message PlayConfState {
+ // 设置类型
+ ConfType conf_type = 1;
+ // 是否隐藏
+ bool show = 2;
+ // 配置字段值
+ FieldValue field_value = 3;
+ //
+ ConfValue conf_value = 4;
+}
+
+// 错误码
+enum PlayErr {
+ NoErr = 0; //
+ WithMultiDeviceLoginErr = 1; // 管控类型的错误码
+}
+
+//
+message PlayLimit {
+ //
+ PlayLimitCode code = 1;
+ //
+ string message = 2;
+ //
+ string sub_message = 3;
+ //
+ ButtonStyle button = 4;
+}
+
+//
+enum PlayLimitCode {
+ PLCUnkown = 0; //
+ PLCUgcNotPayed = 1; //
+}
+
+// 视频地址-回复
+message PlayURLReply {
+ // 清晰的
+ uint32 quality = 1;
+ // 格式
+ string format = 2;
+ // 总时长(单位为ms)
+ uint64 timelength = 3;
+ // 编码id
+ uint32 video_codecid = 4;
+ // 视频流版本
+ uint32 fnver = 5;
+ // 视频流格式
+ uint32 fnval = 6;
+ // 是否支持投影
+ bool video_project = 7;
+ // 分段视频流列表
+ repeated ResponseUrl durl = 8;
+ // dash数据
+ ResponseDash dash = 9;
+ // 是否非全二压
+ int32 no_rexcode = 10;
+ // 互动视频升级提示
+ UpgradeLimit upgrade_limit = 11;
+ // 清晰度描述列表
+ repeated FormatDescription support_formats = 12;
+ // 视频格式
+ VideoType type = 13;
+}
+
+// 视频地址-请求
+message PlayURLReq {
+ // 稿件avid
+ int64 aid = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 force_host = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string from_spmid = 10;
+}
+
+// 播放页信息-回复
+message PlayViewReply {
+ // 视频流信息
+ VideoInfo video_info = 1;
+ // 播放控件用户自定义配置
+ PlayAbilityConf play_conf = 2;
+ // 互动视频升级提示
+ UpgradeLimit upgrade_limit = 3;
+ // Chronos灰度管理
+ Chronos chronos = 4;
+ // 播放控件稿件配置
+ PlayArcConf play_arc = 5;
+ // 事件
+ Event event = 6;
+ //
+ AB ab = 7;
+ //
+ PlayLimit play_limit = 8;
+}
+
+// 播放页信息-请求
+message PlayViewReq {
+ // 稿件avid
+ int64 aid = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 force_host = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string from_spmid = 10;
+ // 青少年模式
+ int32 teenagers_mode = 11;
+ // 编码
+ CodeType prefer_codec_type = 12;
+ // 业务类型
+ Business business = 13;
+ //
+ int64 voice_balance = 14;
+}
+
+// 投屏地址-响应
+message ProjectReply {
+ PlayURLReply project = 1;
+}
+
+// 投屏地址-请求
+message ProjectReq {
+ // 稿件avid
+ int64 aid = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 force_host = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string from_spmid = 10;
+ // 使用协议
+ // 0:默认乐播 1:自建协议 2:云投屏 3:airplay
+ int32 protocol = 11;
+ // 投屏设备
+ // 0:默认其他 1:OTT设备
+ int32 device_type = 12;
+}
+
+// dash数据
+message ResponseDash {
+ // dash视频流
+ repeated DashItem video = 1;
+ // dash伴音流
+ repeated DashItem audio = 2;
+}
+
+// 分段流条目
+message ResponseUrl {
+ // 分段序号
+ uint32 order = 1;
+ // 分段时长
+ uint64 length = 2;
+ // 分段大小
+ uint64 size = 3;
+ // 主线流
+ string url = 4;
+ // 备用流
+ repeated string backup_url = 5;
+ // md5
+ string md5 = 6;
+}
+
+//分段视频流
+message SegmentVideo {
+ //分段视频流列表
+ repeated ResponseUrl segment = 1;
+}
+
+// 震动
+message Shake {
+ // 文件地址
+ string file = 1;
+}
+
+// 视频流信息
+message Stream {
+ // 元数据
+ StreamInfo stream_info = 1;
+ // 流数据
+ oneof content {
+ // dash流
+ DashVideo dash_video = 2;
+ // 分段流
+ SegmentVideo segment_video = 3;
+ }
+}
+
+// 流媒体元数据
+message StreamInfo {
+ // 清晰度
+ uint32 quality = 1;
+ // 格式
+ string format = 2;
+ // 格式描述
+ string description = 3;
+ // 错误码
+ PlayErr err_code = 4;
+ // 不满足条件信息
+ StreamLimit limit = 5;
+ // 是否需要vip
+ bool need_vip = 6;
+ // 是否需要登录
+ bool need_login = 7;
+ // 是否完整
+ bool intact = 8;
+ // 是否非全二压
+ bool no_rexcode = 9;
+ // 清晰度属性位
+ int64 attribute = 10;
+ // 新版格式描述
+ string new_description = 11;
+ // 格式文字
+ string display_desc = 12;
+ // 新版格式描述备注
+ string superscript = 13;
+}
+
+// 清晰度不满足条件信息
+message StreamLimit {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 提示信息
+ string msg = 3;
+}
+
+// 互动视频升级按钮信息
+message UpgradeButton {
+ // 标题
+ string title = 1;
+ // 链接
+ string link = 2;
+}
+
+// 互动视频升级提示
+message UpgradeLimit {
+ // 错误码
+ int32 code = 1;
+ // 错误信息
+ string message = 2;
+ // 图片url
+ string image = 3;
+ // 按钮信息
+ UpgradeButton button = 4;
+}
+
+// 视频url信息
+message VideoInfo {
+ // 视频清晰度
+ uint32 quality = 1;
+ // 视频格式
+ string format = 2;
+ // 视频时长
+ uint64 timelength = 3;
+ // 视频编码id
+ uint32 video_codecid = 4;
+ // 视频流
+ repeated Stream stream_list = 5;
+ // 伴音流
+ repeated DashItem dash_audio = 6;
+ // 杜比伴音流
+ DolbyItem dolby = 7;
+ //
+ VolumeInfo volume = 8;
+}
+
+// 视频类型
+enum VideoType {
+ Unknown_VALUE = 0; //
+ FLV_VALUE = 1; // flv格式
+ DASH_VALUE = 2; // dash格式
+ MP4_VALUE = 3; // mp4格式
+}
+
+//
+message VolumeInfo {
+ //
+ double measured_i = 1;
+ //
+ double measured_lra = 2;
+ //
+ double measured_tp = 3;
+ //
+ double measured_threshold = 4;
+ //
+ double target_offset = 5;
+ //
+ double target_i = 6;
+ //
+ double target_tp = 7;
+}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/resource/privacy/v1/api.proto b/bili-api/grpc/proto/bilibili/app/resource/privacy/v1/api.proto
similarity index 54%
rename from bili-api-grpc/proto/bilibili/app/resource/privacy/v1/api.proto
rename to bili-api/grpc/proto/bilibili/app/resource/privacy/v1/api.proto
index 2987db554..a19785c2c 100644
--- a/bili-api-grpc/proto/bilibili/app/resource/privacy/v1/api.proto
+++ b/bili-api/grpc/proto/bilibili/app/resource/privacy/v1/api.proto
@@ -24,40 +24,40 @@ message NoReply{
// 隐私设置
message PrivacyConfigItem {
- // 隐私开关类型
- PrivacyConfigType privacy_config_type = 1;
- //
- string title = 2;
- // 隐私开关状态
- PrivacyConfigState state = 3;
- //
- string sub_title = 4;
- //
- string sub_title_uri = 5;
+ // 隐私开关类型
+ PrivacyConfigType privacy_config_type = 1;
+ //
+ string title = 2;
+ // 隐私开关状态
+ PrivacyConfigState state = 3;
+ //
+ string sub_title = 4;
+ //
+ string sub_title_uri = 5;
}
// 获取隐私设置-响应
message PrivacyConfigReply {
- // 隐私设置
- PrivacyConfigItem privacy_config_item = 1;
+ // 隐私设置
+ PrivacyConfigItem privacy_config_item = 1;
}
// 隐私开关状态
enum PrivacyConfigState {
- close = 0; // 关闭
- open = 1; // 打开
+ close = 0; // 关闭
+ open = 1; // 打开
}
// 隐私开关类型
enum PrivacyConfigType {
- none = 0; //
- dynamic_city = 1; // 动态同城
+ none = 0; //
+ dynamic_city = 1; // 动态同城
}
// 修改隐私设置-请求
message SetPrivacyConfigRequest {
- // 隐私开关类型
- PrivacyConfigType privacy_config_type = 1;
- // 隐私开关状态
- PrivacyConfigState state = 2;
+ // 隐私开关类型
+ PrivacyConfigType privacy_config_type = 1;
+ // 隐私开关状态
+ PrivacyConfigState state = 2;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/resource/v1/module.proto b/bili-api/grpc/proto/bilibili/app/resource/v1/module.proto
new file mode 100644
index 000000000..d7dbb2161
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/resource/v1/module.proto
@@ -0,0 +1,130 @@
+syntax = "proto3";
+
+package bilibili.app.resource.v1;
+
+option java_multiple_files = true;
+
+//
+service Module {
+ //
+ rpc List(ListReq) returns (ListReply);
+}
+
+//
+enum CompressType {
+ Unzip = 0; // unzip
+ Original = 1; // 不操作
+}
+
+//
+enum EnvType {
+ Unknown = 0; //
+ Release = 1; //
+ Test = 2; //
+}
+
+//
+enum IncrementType {
+ Total = 0; // 全量包
+ Incremental = 1; // 增量包
+}
+
+//
+enum LevelType {
+ Undefined = 0; //
+ High = 1; // 高 需立即下载
+ Middle = 2; // 中 可以延迟下载
+ Low = 3; // 低 仅在业务方使用到时由业务方手动进行下载
+}
+
+message ListReply {
+ //
+ string env = 1;
+ //
+ repeated PoolReply pools = 2;
+ //
+ int64 list_version = 3;
+}
+
+//
+message ListReq {
+ //
+ string pool_name = 1;
+ //
+ string module_name = 2;
+ //
+ repeated VersionListReq version_list = 3;
+ //
+ EnvType env = 4;
+ //
+ int32 sys_ver = 5;
+ //
+ int32 scale = 6;
+ //
+ int32 arch = 7;
+ //
+ int64 list_version = 8;
+}
+
+//
+message ModuleReply {
+ //
+ string name = 1;
+ //
+ int64 version = 2;
+ //
+ string url = 3;
+ //
+ string md5 = 4;
+ //
+ string total_md5 = 5;
+ //
+ IncrementType increment = 6;
+ //
+ bool is_wifi = 7;
+ //
+ LevelType level = 8;
+ //
+ string filename = 9;
+ //
+ string file_type = 10;
+ //
+ int64 file_size = 11;
+ //
+ CompressType compress = 12;
+ //
+ int64 publish_time = 13;
+ // 上报使用
+ int64 pool_id = 14;
+ //
+ int64 module_id = 15;
+ //
+ int64 version_id = 16;
+ //
+ int64 file_id = 17;
+ //
+ bool zip_check = 18;
+}
+
+message PoolReply {
+ //
+ string name = 1;
+ //
+ repeated ModuleReply modules = 2;
+}
+
+//
+message VersionListReq {
+ //
+ string pool_name = 1;
+ //
+ repeated VersionReq versions = 2;
+}
+
+//
+message VersionReq {
+ //
+ string module_name = 1;
+ //
+ int64 version = 2;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/search/v2/search.proto b/bili-api/grpc/proto/bilibili/app/search/v2/search.proto
new file mode 100644
index 000000000..c4d43e937
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/search/v2/search.proto
@@ -0,0 +1,112 @@
+syntax = "proto3";
+
+package bilibili.app.search.v2;
+
+option java_multiple_files = true;
+
+import "bilibili/broadcast/message/main/search.proto";
+
+service Search {
+ //
+ rpc CancelChatTask (CancelChatTaskReq) returns (CancelChatTaskReply);
+ //
+ rpc GetChatResult (GetChatResultReq) returns (bilibili.broadcast.message.main.ChatResult);
+ //
+ rpc SearchEgg (SearchEggReq) returns (SearchEggReply);
+ //
+ rpc SubmitChatTask (SubmitChatTaskReq) returns (SubmitChatTaskReply);
+}
+
+//
+message CancelChatTaskReq {
+ //
+ string session_id = 1;
+ //
+ string from_source = 2;
+}
+
+//
+message CancelChatTaskReply {
+ //
+ int32 code = 1;
+}
+
+//
+message GetChatResultReq {
+ //
+ string query = 1;
+ //
+ string session_id = 2;
+ //
+ string from_source = 3;
+}
+
+//
+message SearchEggInfo {
+ //
+ int32 egg_type = 1;
+ //
+ int64 id = 2;
+ //
+ int32 is_commercial = 3;
+ //
+ string mask_color = 4;
+ //
+ int64 mask_transparency = 5;
+ //
+ string md5 = 6;
+ //
+ int32 re_type = 7;
+ //
+ string re_url = 8;
+ //
+ string re_value = 9;
+ //
+ int32 show_count = 10;
+ //
+ int64 size = 11;
+ //
+ int64 source = 12;
+ //
+ string url = 13;
+}
+
+//
+message SearchEggInfos {
+ //
+ repeated SearchEggInfo egg_info = 1;
+}
+
+//
+message SearchEggReply {
+ //
+ int32 code = 1;
+ //
+ string seid = 2;
+ //
+ SearchEggInfos result = 3;
+}
+
+//
+message SearchEggReq {
+
+}
+
+//
+message SubmitChatTaskReply {
+ //
+ int32 code = 1;
+ //
+ string session_id = 2;
+}
+
+//
+message SubmitChatTaskReq {
+ //
+ string query = 1;
+ //
+ string track_id = 2;
+ //
+ string from_source = 3;
+}
+
diff --git a/bili-api-grpc/proto/bilibili/app/show/gateway/v1/service.proto b/bili-api/grpc/proto/bilibili/app/show/gateway/v1/service.proto
similarity index 72%
rename from bili-api-grpc/proto/bilibili/app/show/gateway/v1/service.proto
rename to bili-api/grpc/proto/bilibili/app/show/gateway/v1/service.proto
index 85afffd02..4a42baefb 100644
--- a/bili-api-grpc/proto/bilibili/app/show/gateway/v1/service.proto
+++ b/bili-api/grpc/proto/bilibili/app/show/gateway/v1/service.proto
@@ -14,14 +14,14 @@ service AppShow {
// 获取Native页进度数据-请求
message GetActProgressReq {
- // Native页id
- int64 pageID = 1;
- // 用户mid
- int64 mid = 2;
+ // Native页id
+ int64 pageID = 1;
+ // 用户mid
+ int64 mid = 2;
}
// 获取Native页进度数据-响应
message GetActProgressReply {
- // 进度数据
- bilibili.broadcast.message.main.NativePageEvent event = 1;
+ // 进度数据
+ bilibili.broadcast.message.main.NativePageEvent event = 1;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/show/mixture/v1/mixture.proto b/bili-api/grpc/proto/bilibili/app/show/mixture/v1/mixture.proto
new file mode 100644
index 000000000..616aff8f0
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/show/mixture/v1/mixture.proto
@@ -0,0 +1,55 @@
+syntax = "proto3";
+
+package bilibili.app.show.mixture.v1;
+
+option java_multiple_files = true;
+
+//
+service Mixture {
+ //
+ rpc Widget(WidgetReq) returns (WidgetReply);
+}
+
+//
+message RcmdReason {
+ //
+ string content = 1;
+ //
+ uint32 corner_mark = 2;
+}
+
+//
+message WidgetItem {
+ //
+ string cover = 1;
+ //
+ string view = 2;
+ //
+ RcmdReason rcmd_reason = 3;
+ //
+ string title = 4;
+ //
+ string name = 5;
+ //
+ string uri = 6;
+ //
+ string goto = 7;
+ //
+ int64 id = 8;
+ //
+ int32 view_icon = 9;
+}
+
+//
+message WidgetReply {
+ //
+ repeated WidgetItem item = 1;
+}
+
+//
+message WidgetReq {
+ //
+ string from_spmid = 1;
+ //
+ uint32 page_no = 2;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/show/popular/v1/popular.proto b/bili-api/grpc/proto/bilibili/app/show/popular/v1/popular.proto
new file mode 100644
index 000000000..16b42535c
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/show/popular/v1/popular.proto
@@ -0,0 +1,118 @@
+syntax = "proto3";
+
+package bilibili.app.show.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/card/v1/card.proto";
+import "bilibili/app/archive/middleware/v1/preload.proto";
+
+// 热门
+service Popular {
+ // 热门列表
+ rpc Index (PopularResultReq) returns (PopularReply);
+}
+
+// 气泡信息
+message Bubble {
+ // 文案
+ string bubble_content = 1;
+ // 版本
+ int32 version = 2;
+ // 起始时间
+ int64 stime = 3;
+}
+
+// 配置信息
+message Config {
+ // 标题
+ string item_title = 1;
+ // 底部文案
+ string bottom_text = 2;
+ // 底部图片url
+ string bottom_text_cover = 3;
+ // 底部跳转页url
+ string bottom_text_url = 4;
+ // 顶部按钮信息列表
+ repeated EntranceShow top_items = 5;
+ // 头图url
+ string head_image = 6;
+ // 当前页按钮信息
+ repeated EntranceShow page_items = 7;
+ //
+ int32 hit = 8;
+}
+
+// 按钮信息
+message EntranceShow {
+ // 按钮图标url
+ string icon = 1;
+ // 按钮名
+ string title = 2;
+ // 入口模块id
+ string module_id = 3;
+ // 跳转uri
+ string uri = 4;
+ // 气泡信息
+ Bubble bubble = 5;
+ // 入口id
+ int64 entrance_id = 6;
+ // 头图url
+ string top_photo = 7;
+ // 入口类型
+ int32 entrance_type = 8;
+}
+
+// 热门列表-响应
+message PopularReply {
+ // 卡片列表
+ repeated bilibili.app.card.v1.Card items = 1;
+ // 配置信息
+ Config config = 2;
+ // 版本
+ string ver = 3;
+}
+
+// 热门列表-请求
+message PopularResultReq {
+ // 排位索引id,为上此请求末尾项的idx
+ int64 idx = 1;
+ // 登录标识
+ // 1:未登陆用户第一页 2:登陆用户第一页
+ int32 login_event = 2;
+ // 清晰度(旧版)
+ int32 qn = 3;
+ // 视频流版本(旧版)
+ int32 fnver = 4;
+ // 视频流功能(旧版)
+ int32 fnval = 5;
+ // 是否强制使用域名(旧版)
+ int32 force_host = 6;
+ // 是否4K(旧版)
+ int32 fourk = 7;
+ // 当前页面spm
+ string spmid = 8;
+ // 上此请求末尾项的param
+ string last_param = 9;
+ // 上此请求的ver
+ string ver = 10;
+ // 分品类热门的入口ID
+ int64 entrance_id = 11;
+ // 热门定位id集合
+ string location_ids = 12;
+ // 0:tag页 1:中间页
+ int32 source_id = 13;
+ // 数据埋点上报
+ // 0:代表手动刷新 1:代表自动刷新
+ int32 flush = 14;
+ // 秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 15;
+}
+
+
+
+
+
+
+
+
diff --git a/bili-api/grpc/proto/bilibili/app/show/rank/v1/rank.proto b/bili-api/grpc/proto/bilibili/app/show/rank/v1/rank.proto
new file mode 100644
index 000000000..ed6012aea
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/show/rank/v1/rank.proto
@@ -0,0 +1,122 @@
+syntax = "proto3";
+
+package bilibili.app.show.v1;
+
+option java_multiple_files = true;
+
+// 排行榜
+service Rank {
+ // 全站排行榜
+ rpc RankAll (RankAllResultReq) returns (RankListReply);
+ // 分区排行榜
+ rpc RankRegion (RankRegionResultReq) returns (RankListReply);
+}
+
+// 排行榜列表项
+message Item {
+ // 标题
+ string title = 1;
+ // 封面url
+ string cover = 2;
+ // 参数(稿件avid)
+ string param = 3;
+ // 跳转uri
+ string uri = 4;
+ // 重定向url
+ string redirect_url = 5;
+ // 跳转类型
+ // av:视频稿件
+ string goto = 6;
+ // 播放数
+ int32 play = 7;
+ // 弹幕数
+ int32 danmaku = 8;
+ // UP主mid
+ int64 mid = 9;
+ // UP主昵称
+ string name = 10;
+ // UP主头像url
+ string face = 11;
+ // 评论数
+ int32 reply = 12;
+ // 收藏数
+ int32 favourite = 13;
+ // 发布时间
+ int64 pub_date = 14;
+ // 分区tid
+ int32 rid = 15;
+ // 子分区名
+ string rname = 16;
+ // 视频总时长
+ int64 duration = 17;
+ // 点赞数
+ int32 like = 18;
+ // 1P cid
+ int64 cid = 19;
+ // 综合评分
+ int64 pts = 20;
+ // 合作视频文案
+ string cooperation = 21;
+ // 属性位
+ // 0:未关注 1:已关注
+ int32 attribute = 22;
+ // UP主粉丝数
+ int64 follower = 23;
+ // UP主认证信息
+ OfficialVerify official_verify = 24;
+ // 同一UP收起子项列表
+ repeated Item children = 25;
+ // 关系信息
+ Relation relation = 26;
+}
+
+// 认证信息
+message OfficialVerify {
+ // 认证类型
+ // -1:无认证 0:个人认证 1:机构认证
+ int32 type = 1;
+ // 认证描述
+ string desc = 2;
+}
+
+// 全站排行榜-请求
+message RankAllResultReq {
+ // 必须为"all"
+ string order = 1;
+ // 页码
+ // 默认1页
+ int32 pn = 2;
+ // 每页项数
+ // 默认100项,最大100
+ int32 ps = 3;
+}
+
+// 排行榜信息-响应
+message RankListReply {
+ // 排行榜列表
+ repeated Item items = 1;
+}
+
+// 分区排行榜-请求
+message RankRegionResultReq {
+ // 一级分区tid(二级分区不可用)
+ // 0:全站
+ int32 rid = 1;
+ // 页码
+ // 默认1页
+ int32 pn = 2;
+ // 每页项数
+ // 默认100项,最大100
+ int32 ps = 3;
+}
+
+// 关系信息
+message Relation {
+ // 关系状态id
+ // 1:未关注 2:已关注 3:被关注 4:互相关注
+ int32 status = 1;
+ // 是否关注
+ int32 is_follow = 2;
+ // 是否粉丝
+ int32 is_followed = 3;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/show/region/v1/region.proto b/bili-api/grpc/proto/bilibili/app/show/region/v1/region.proto
new file mode 100644
index 000000000..4024e570b
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/show/region/v1/region.proto
@@ -0,0 +1,57 @@
+syntax = "proto3";
+
+package bilibili.app.show.region.v1;
+
+option java_multiple_files = true;
+
+//
+service Region {
+ //
+ rpc Region (RegionReq) returns (RegionReply);
+}
+
+//
+message RegionConfig {
+ //
+ string scenes_name = 1;
+ //
+ string scenes_type = 2;
+}
+
+//
+message RegionInfo {
+ //
+ int32 tid = 1;
+ //
+ int32 reid = 2;
+ //
+ string name = 3;
+ //
+ string logo = 4;
+ //
+ string goto = 5;
+ //
+ string param = 6;
+ //
+ string uri = 7;
+ //
+ int32 type = 8;
+ //
+ int32 is_bangumi = 9;
+ //
+ repeated RegionInfo children = 10;
+ //
+ repeated RegionConfig config = 11;
+}
+
+//
+message RegionReply {
+ //
+ repeated RegionInfo regions = 1;
+}
+
+//
+message RegionReq {
+ //
+ string lang = 1;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/space/v1/space.proto b/bili-api/grpc/proto/bilibili/app/space/v1/space.proto
new file mode 100644
index 000000000..c8c1a65a7
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/space/v1/space.proto
@@ -0,0 +1,109 @@
+syntax = "proto3";
+
+package bilibili.app.space.v1;
+
+option java_multiple_files = true;
+
+//
+service Space {
+ //
+ rpc Archive (ArchiveReq) returns (ArchiveReply);
+}
+
+//-响应
+message ArchiveReply {
+ //
+ repeated BiliSpaceVideo item = 1;
+ //
+ int32 count = 2;
+ //
+ EpisodicButton episodic_button = 3;
+ //
+ repeated OrderConfig order = 4;
+}
+
+//-请求
+message ArchiveReq {
+ //
+ int64 vmid = 1;
+ //
+ int32 pn = 2;
+ //
+ int32 ps = 3;
+ //
+ string order = 4;
+}
+
+//
+message Badge {
+ //
+ string text = 1;
+ //
+ string text_color = 2;
+ //
+ string text_color_night = 3;
+ //
+ string bg_color = 4;
+ //
+ string bg_color_night = 5;
+ //
+ string border_color = 6;
+ //
+ string border_color_night = 7;
+ //
+ int32 bg_style = 8;
+}
+
+//
+message BiliSpaceVideo {
+ //
+ string title = 1;
+ //
+ string tname = 2;
+ //
+ int64 duration = 3;
+ //
+ string cover = 4;
+ //
+ string uri = 5;
+ //
+ string param = 6;
+ //
+ string danmaku = 7;
+ //
+ int32 play = 8;
+ //
+ int64 ctime = 9;
+ //
+ bool state = 10;
+ //
+ bool is_popular = 11;
+ //
+ repeated Badge badges = 12;
+ //
+ string cover_right = 13;
+ //
+ string bvid = 14;
+ //
+ bool is_steins = 15;
+ //
+ bool is_ugcpay = 16;
+ //
+ bool is_cooperation = 17;
+}
+
+//
+message EpisodicButton {
+ //
+ string text = 1;
+ //
+ string uri = 2;
+}
+
+//
+message OrderConfig {
+ //
+ string title = 1;
+ //
+ string value = 2;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/splash/v1/splash.proto b/bili-api/grpc/proto/bilibili/app/splash/v1/splash.proto
new file mode 100644
index 000000000..4d9449264
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/splash/v1/splash.proto
@@ -0,0 +1,133 @@
+syntax = "proto3";
+
+package bilibili.app.splash.v1;
+
+option java_multiple_files = true;
+
+import "google/protobuf/any.proto";
+
+//
+service Splash {
+ //
+ rpc List (SplashReq) returns (SplashReply);
+}
+
+//
+message ShowStrategy {
+ //
+ int32 id = 1;
+ //
+ int64 stime = 2;
+ //
+ int64 etime = 3;
+}
+
+//
+message SplashItem {
+ //
+ int32 id = 1;
+ //
+ int32 type = 2;
+ //
+ int32 card_type = 3;
+ //
+ int32 duration = 4;
+ //
+ int64 begin_time = 5;
+ //
+ int64 end_time = 6;
+ //
+ string thumb = 7;
+ //
+ string hash = 8;
+ //
+ string logo_url = 9;
+ //
+ string logo_hash = 10;
+ //
+ string video_url = 11;
+ //
+ string video_hash = 12;
+ //
+ int32 video_width = 13;
+ //
+ int32 video_height = 14;
+ //
+ string schema = 15;
+ //
+ string schema_title = 16;
+ //
+ string schema_package_name = 17;
+ //
+ repeated string schema_callup_whiteList = 18;
+ //
+ int32 skip = 19;
+ //
+ string uri = 20;
+ //
+ string uri_title = 21;
+ //
+ int32 source = 22;
+ //
+ int32 cm_mark = 23;
+ //
+ string ad_cb = 24;
+ //
+ int64 resource_id = 25;
+ //
+ string request_id = 26;
+ //
+ string client_ip = 27;
+ //
+ bool is_ad = 28;
+ //
+ bool is_ad_loc = 29;
+ //
+ google.protobuf.Any extra = 30;
+ //
+ int64 card_index = 31;
+ //
+ int64 server_type = 32;
+ //
+ int64 index = 33;
+ //
+ string click_url = 34;
+ //
+ string show_url = 35;
+ //
+ int32 time_target = 36;
+ //
+ int32 encryption = 37;
+ //
+ bool enable_pre_download = 38;
+ //
+ bool enable_background_download = 39;
+}
+
+//-响应
+message SplashReply {
+ //
+ int32 max_time = 1;
+ //
+ int32 min_interval = 2;
+ //
+ int32 pull_interval = 3;
+ //
+ repeated SplashItem list = 4;
+ //
+ repeated ShowStrategy show = 5;
+}
+
+//-请求
+message SplashReq {
+ //
+ int32 width = 1;
+ //
+ int32 height = 2;
+ //
+ string birth = 3;
+ //
+ string ad_extra = 4;
+ //
+ string network = 5;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/topic/v1/topic.proto b/bili-api/grpc/proto/bilibili/app/topic/v1/topic.proto
new file mode 100644
index 000000000..4d90f6fb6
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/topic/v1/topic.proto
@@ -0,0 +1,582 @@
+syntax = "proto3";
+
+package bilibili.app.topic.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/dynamic/v2/dynamic.proto";
+import "bilibili/app/card/v1/common.proto";
+import "bilibili/app/archive/middleware/v1/preload.proto";
+
+//
+service Topic {
+ //
+ rpc TopicDetailsAll(TopicDetailsAllReq) returns (TopicDetailsAllReply);
+ //
+ rpc TopicDetailsFold(TopicDetailsFoldReq) returns (TopicDetailsFoldReply);
+ //
+ rpc TopicSetDetails(TopicSetDetailsReq) returns (TopicSetDetailsReply);
+}
+
+//
+message ButtonMeta {
+ //
+ string text = 1;
+ //
+ string icon = 2;
+}
+
+//
+message DetailsTopInfo {
+ //
+ TopicInfo topic_info = 1;
+ //
+ User user = 2;
+ //
+ string stats_desc = 3;
+ //
+ bool has_create_jurisdiction = 4;
+ //
+ OperationContent operation_content = 5;
+ //
+ string head_img_url = 6;
+ //
+ string head_img_backcolor = 7;
+ //
+ int32 word_color = 8;
+ //
+ int32 mission_page_show_type = 9;
+ //
+ string mission_url = 10;
+ //
+ string mission_text = 11;
+ //
+ TopicSet topic_set = 12;
+}
+
+//
+message FoldCardItem {
+ //
+ int32 is_show_fold = 1;
+ //
+ int64 fold_count = 2;
+ //
+ string card_show_desc = 3;
+ //
+ string fold_desc = 4;
+}
+
+//
+message FunctionalCard {
+ //
+ repeated TopicCapsule capsules = 1;
+ //
+ TrafficCard traffic_card = 2;
+ //
+ GameCard game_card = 3;
+}
+
+//
+message GameCard {
+ //
+ int64 game_id = 1;
+ //
+ string game_icon = 2;
+ //
+ string game_name = 3;
+ //
+ string score = 4;
+ //
+ string game_tags = 5;
+ //
+ string notice = 6;
+ //
+ string game_link = 7;
+}
+
+//
+message InlineProgressBar {
+ //
+ string icon_drag = 1;
+ //
+ string icon_drag_hash = 2;
+ //
+ string icon_stop = 3;
+ //
+ string icon_stop_hash = 4;
+}
+
+//
+message LargeCoverInline {
+ //
+ bilibili.app.card.v1.Base base = 1;
+ //
+ string cover_left_text1 = 2;
+ //
+ int32 cover_left_icon1 = 3;
+ //
+ string cover_left_text2 = 4;
+ //
+ int32 cover_left_icon2 = 5;
+ //
+ RightTopLiveBadge right_top_live_badge = 6;
+ //
+ string extra_uri = 7;
+ //
+ InlineProgressBar inline_progress_bar = 8;
+ //
+ TopicThreePoint topic_three_point = 9;
+ //
+ string cover_left_desc = 10;
+ //
+ bool hide_danmu_switch = 11;
+ //
+ bool disable_danmu = 12;
+ //
+ int32 can_play = 13;
+ //
+ string duration_text = 14;
+ //
+ RelationData relation_data = 15;
+}
+
+//
+message LiveBadgeResource {
+ //
+ string text = 1;
+ //
+ string animation_url = 2;
+ //
+ string animation_url_hash = 3;
+ //
+ string background_color_light = 4;
+ //
+ string background_color_night = 5;
+ //
+ int64 alpha_light = 6;
+ //
+ int64 alpha_night = 7;
+ //
+ string font_color = 8;
+}
+
+//
+message OperationCard {
+ oneof card {
+ //
+ LargeCoverInline large_cover_inline = 1;
+ }
+}
+
+//
+message OperationContent {
+ //
+ OperationCard operation_card = 1;
+}
+
+//
+message PubLayer {
+ //
+ int32 show_type = 1;
+ //
+ string jump_link = 2;
+ //
+ ButtonMeta button_meta = 3;
+ //
+ bool close_pub_layer_entry = 4;
+}
+
+//
+message RelationData {
+ //
+ bool is_fav = 1;
+ //
+ bool is_coin = 2;
+ //
+ bool is_follow = 3;
+ //
+ bool is_like = 4;
+ //
+ int64 like_count = 5;
+}
+
+//
+message RightTopLiveBadge {
+ //
+ int64 live_status = 1;
+ //
+ LiveBadgeResource in_live = 2;
+ //
+ string live_stats_desc = 3;
+}
+
+//
+message SortContent {
+ //
+ int64 sort_by = 1;
+ //
+ string sort_name = 2;
+}
+
+//
+message ThreePointItem {
+ //
+ string title = 1;
+ //
+ string jump_url = 2;
+}
+
+//
+message TimeLineEvents {
+ //
+ int64 event_id = 1;
+ //
+ string title = 2;
+ //
+ string time_desc = 3;
+ //
+ string jump_link = 4;
+}
+
+//
+message TimeLineResource {
+ //
+ int64 time_line_id = 1;
+ //
+ string time_line_title = 2;
+ //
+ repeated TimeLineEvents time_line_events = 3;
+ //
+ bool has_more = 4;
+}
+
+//
+message TopicActivities {
+ //
+ repeated TopicActivity activity = 1;
+ //
+ string act_list_title = 2;
+}
+
+//
+message TopicActivity {
+ //
+ int64 activity_id = 1;
+ //
+ string activity_name = 2;
+ //
+ string jump_url = 3;
+ //
+ string icon_url = 4;
+}
+
+//
+message TopicCapsule {
+ //
+ string name = 1;
+ //
+ string jump_url = 2;
+ //
+ string icon_url = 3;
+}
+
+//
+message TopicCardItem {
+ //
+ int32 type = 1;
+ //
+ bilibili.app.dynamic.v2.DynamicItem dynamic_item = 2;
+ //
+ FoldCardItem ford_card_item = 3;
+ //
+ VideoSmallCardItem video_small_card_item = 4;
+}
+
+//
+message TopicCardList {
+ //
+ repeated TopicCardItem topic_card_items = 1;
+ //
+ string offset = 2;
+ //
+ bool has_more = 3;
+ //
+ TopicSortByConf topic_sort_by_conf = 4;
+}
+
+//
+enum TopicCardType {
+ ILLEGAL_TYPE = 0; //
+ DYNAMIC = 1; //
+ FOLD = 2; //
+ VIDEO_SMALL_CARD = 3; //
+}
+
+//
+message TopicDetailsAllReply {
+ //
+ DetailsTopInfo details_top_info = 1;
+ //
+ TopicActivities topic_activities = 2;
+ //
+ TopicCardList topic_card_list = 3;
+ //
+ FunctionalCard functional_card = 4;
+ //
+ PubLayer pub_layer = 5;
+ //
+ TimeLineResource time_line_resource = 6;
+ //
+ TopicServerConfig topic_server_config = 7;
+}
+
+//
+message TopicDetailsAllReq {
+ //
+ int64 topic_id = 1;
+ //
+ int64 sort_by = 2;
+ //
+ string offset = 3;
+ //
+ int32 page_size = 4;
+ //
+ int32 local_time = 5;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
+ //
+ int32 need_refresh = 7;
+ //
+ string source = 8;
+ //
+ int32 topic_details_ext_mode = 9;
+}
+
+//
+enum TopicDetailsExtMode {
+ MODE_ILLEGAL_TYPE = 0; //
+ STORY = 1; //
+}
+
+//
+message TopicDetailsFoldReply {
+ //
+ TopicCardList topic_card_list = 1;
+ //
+ int64 fold_count = 2;
+}
+
+//
+message TopicDetailsFoldReq {
+ //
+ int64 topic_id = 1;
+ //
+ string offset = 2;
+ //
+ int32 page_size = 3;
+ //
+ int32 local_time = 4;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 5;
+ //
+ int64 from_sort_by = 6;
+}
+
+//
+message TopicInfo {
+ //
+ int64 id = 1;
+ //
+ string name = 2;
+ //
+ int64 uid = 3;
+ //
+ int64 view = 4;
+ //
+ int64 discuss = 5;
+ //
+ int64 fav = 6;
+ //
+ int64 dynamics = 7;
+ //
+ int32 state = 8;
+ //
+ string jump_url = 9;
+ //
+ string backcolor = 10;
+ //
+ bool is_fav = 11;
+ //
+ string description = 12;
+ //
+ int32 create_source = 13;
+ //
+ string share_pic = 14;
+ //
+ int64 share = 15;
+ //
+ int64 like = 16;
+ //
+ string share_url = 17;
+ //
+ bool is_like = 18;
+ //
+ int32 type = 19;
+ //
+ string stats_desc = 20;
+ //
+ string fixed_topic_icon = 21;
+}
+
+//
+message TopicServerConfig {
+ //
+ int64 pub_events_increase_threshold = 1;
+ //
+ int64 pub_events_hidden_timeout_threshold = 2;
+ //
+ int64 vert_online_refresh_time = 3;
+}
+
+//
+message TopicSet {
+ //
+ int64 set_id = 1;
+ //
+ string set_name = 2;
+ //
+ string jump_url = 3;
+ //
+ string desc = 4;
+}
+
+//
+message TopicSetDetailsReply {
+ //
+ TopicSetHeadInfo topic_set_head_info = 1;
+ //
+ repeated TopicInfo topic_info = 2;
+ //
+ bool has_more = 3;
+ //
+ string offset = 4;
+ //
+ TopicSetSortCfg sort_cfg = 5;
+}
+
+//
+message TopicSetDetailsReq {
+ //
+ int64 set_id = 1;
+ //
+ int64 sort_by = 2;
+ //
+ string offset = 3;
+ //
+ int32 page_size = 4;
+}
+
+message TopicSetHeadInfo {
+ //
+ TopicSet topic_set = 1;
+ //
+ string topic_cnt_text = 2;
+ //
+ string head_img_url = 3;
+ //
+ string mission_url = 4;
+ //
+ string mission_text = 5;
+ //
+ string icon_url = 6;
+ //
+ bool is_fav = 7;
+ //
+ bool is_first_time = 8;
+}
+
+//
+message TopicSetSortCfg {
+ //
+ int64 default_sort_by = 1;
+ //
+ repeated SortContent all_sort_by = 2;
+}
+
+//
+message TopicSortByConf {
+ //
+ int64 default_sort_by = 1;
+ //
+ repeated SortContent all_sort_by = 2;
+ //
+ int64 show_sort_by = 3;
+}
+
+//
+message TopicThreePoint {
+ //
+ repeated ThreePointItem dyn_three_point_items = 1;
+}
+
+//
+message TrafficCard {
+ //
+ string name = 1;
+ //
+ string jump_url = 2;
+ //
+ string icon_url = 3;
+ //
+ string base_pic = 4;
+ //
+ string benefit_point = 5;
+ //
+ string card_desc = 6;
+ //
+ string jump_title = 7;
+}
+
+//
+message User {
+ //
+ int64 uid = 1;
+ //
+ string face = 2;
+ //
+ string name = 3;
+ //
+ string name_desc = 4;
+}
+
+//
+message VideoCardBase {
+ //
+ string cover = 1;
+ //
+ string title = 2;
+ //
+ string up_name = 3;
+ //
+ int64 play = 4;
+ //
+ string jump_link = 5;
+ //
+ int64 aid = 6;
+}
+
+//
+message VideoSmallCardItem {
+ //
+ VideoCardBase video_card_base = 1;
+ //
+ string cover_left_badge_text = 2;
+ //
+ int64 card_stat_icon1 = 3;
+ //
+ string card_stat_text1 = 4;
+ //
+ int64 card_stat_icon2 = 5;
+ //
+ string card_stat_text2 = 6;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/view/v1/view.proto b/bili-api/grpc/proto/bilibili/app/view/v1/view.proto
new file mode 100644
index 000000000..3b5146852
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/view/v1/view.proto
@@ -0,0 +1,2668 @@
+syntax = "proto3";
+
+package bilibili.app.view.v1;
+
+option java_multiple_files = true;
+
+import "google/protobuf/any.proto";
+import "bilibili/app/archive/middleware/v1/preload.proto";
+import "bilibili/app/archive/v1/archive.proto";
+import "bilibili/pagination/pagination.proto";
+import "bilibili/app/viewunite/common.proto";
+
+service View {
+ // 视频页详情页
+ rpc View (ViewReq) returns (ViewReply);
+ //
+ rpc ViewTag(ViewTagReq) returns (ViewTagReply);
+ //
+ rpc ViewMaterial(ViewMaterialReq) returns (ViewMaterialReply);
+ // 视频播放过程中的数据
+ rpc ViewProgress (ViewProgressReq) returns (ViewProgressReply);
+ // 短视频下载
+ rpc ShortFormVideoDownload (ShortFormVideoDownloadReq) returns (ShortFormVideoDownloadReply);
+ // 点击播放器卡片事件
+ rpc ClickPlayerCard (ClickPlayerCardReq) returns (NoReply);
+ // 点击大型活动页预约
+ rpc ClickActivitySeason (ClickActivitySeasonReq) returns (NoReply);
+ // 合集详情页
+ rpc Season (SeasonReq) returns (SeasonReply);
+ // 播放器卡片曝光
+ rpc ExposePlayerCard (ExposePlayerCardReq) returns (NoReply);
+ // 点击签订契约
+ rpc AddContract (AddContractReq) returns (NoReply);
+ // 资源包
+ rpc ChronosPkg(ChronosPkgReq) returns (Chronos);
+ //
+ rpc CacheView(CacheViewReq) returns (CacheViewReply);
+ //
+ rpc ContinuousPlay(ContinuousPlayReq) returns (ContinuousPlayReply);
+ // 播放页推荐IFS
+ rpc RelatesFeed(RelatesFeedReq) returns (RelatesFeedReply);
+ //
+ rpc PremiereArchive(PremiereArchiveReq) returns (PremiereArchiveReply);
+ //
+ rpc Reserve(ReserveReq) returns (ReserveReply);
+ //
+ rpc PlayerRelates(PlayerRelatesReq) returns (PlayerRelatesReply);
+ //
+ rpc SeasonActivityRecord(SeasonActivityRecordReq) returns (SeasonActivityRecordReply);
+ //
+ rpc SeasonWidgetExpose(SeasonWidgetExposeReq) returns (SeasonWidgetExposeReply);
+ //
+ rpc GetArcsPlayer(GetArcsPlayerReq) returns (GetArcsPlayerReply);
+}
+
+// 活动页资源包
+message ActivityResource {
+ // mod资源池名称
+ string mod_pool_name = 1;
+ // mod资源名称
+ string mod_resource_name = 2;
+ // 背景色
+ string bg_color = 3;
+ // 选中背景色
+ string selected_bg_color = 4;
+ // 文字颜色
+ string text_color = 5;
+ // 浅字色
+ string light_text_color = 6;
+ // 深字色
+ string dark_text_color = 7;
+ // 分割线色
+ string divider_color = 8;
+}
+
+// 大型活动合集
+message ActivitySeason {
+ // 稿件信息
+ bilibili.app.archive.v1.Arc arc = 1;
+ // 分P信息
+ repeated ViewPage pages = 2;
+ //("OnwerExt"为源码中拼写错误)
+ OnwerExt owner_ext = 3;
+ // 稿件用户操作状态
+ ReqUser req_user = 4;
+ // 充电排行
+ ElecRank elec_rank = 5;
+ // 历史观看进度
+ History history = 6;
+ // 稿件bvid
+ string bvid = 7;
+ // 获得荣誉信息
+ Honor honor = 8;
+ // 联合投稿成员列表
+ repeated Staff staff = 9;
+ // UGC视频合集信息
+ UgcSeason ugc_season = 10;
+ // 播放页定制tab
+ Tab tab = 11;
+ // 排行榜
+ Rank rank = 12;
+ // 预约模块
+ Order order = 13;
+ // 是否支持点踩
+ bool support_dislike = 14;
+ // 相关推荐(运营配置+AI推荐)
+ OperationRelate operation_relate = 15;
+ // 活动页资源包
+ ActivityResource activity_resource = 16;
+ // 短链接
+ string short_link = 17;
+ // 标签
+ Label label = 18;
+ // 不感兴趣原因
+ Dislike dislike = 19;
+ // 播放图标动画配置档
+ PlayerIcon player_icon = 20;
+ // 分享副标题(已观看xxx次)
+ string share_subtitle = 21;
+ // 广告配置
+ CMConfig cm_config = 22;
+ // 免流面板定制
+ TFPanelCustomized tf_panel_customized = 23;
+ // 争议信息
+ string argue_msg = 24;
+ // 错误码
+ // DEFAULT:正常 CODE404:视频被UP主删除
+ ECode ecode = 25;
+ // 404页信息
+ CustomConfig custom_config = 26;
+ // 评论样式
+ string badge_url = 27;
+ // 稿件简介v2
+ repeated DescV2 desc_v2 = 28;
+ //
+ Config config = 29;
+ //
+ Online online = 30;
+ //
+ ArcExtra arc_extra = 31;
+ //
+ ReplyStyle reply_preface = 32;
+}
+
+// 点击签订契约-请求
+message AddContractReq {
+ // 稿件avid
+ int64 aid = 1;
+ // UP主mid
+ int64 up_mid = 2;
+ // 当前页面spm
+ string spmid = 3;
+}
+
+//
+message AdInfo {
+ //
+ int64 creative_id = 1;
+ //
+ int64 creative_type = 2;
+ //
+ CreativeContent creative_content = 3;
+ //
+ string ad_cb = 4;
+ //
+ int32 card_type = 5;
+ //
+ bytes extra = 6;
+}
+
+//
+message ArcExtra {
+ //
+ string arc_pub_location = 1;
+}
+
+//
+message ArcsPlayer {
+ //
+ int64 aid = 1;
+ //
+ map player_info = 2;
+}
+
+//
+message Asset {
+ //
+ int32 paid = 1;
+ //
+ int64 price = 2;
+ //
+ AssetMsg msg = 3;
+ //
+ AssetMsg preview_msg = 4;
+}
+
+//
+message AssetMsg {
+ //
+ string desc1 = 1;
+ //
+ string desc2 = 2;
+}
+
+// 关注按钮卡片
+message Attention {
+ // 开始时间
+ int32 start_time = 1;
+ // 结束时间
+ int32 end_time = 2;
+ // 位置x坐标
+ double pos_x = 3;
+ // 位置y坐标
+ double pos_y = 4;
+}
+
+// 音频稿件信息
+message Audio {
+ // 音频标题
+ string title = 1;
+ // 音频封面url
+ string cover_url = 2;
+ // 音频auid
+ int64 song_id = 3;
+ // 音频播放量
+ int64 play_count = 4;
+ // 音频评论数
+ int64 reply_count = 5;
+ // 音频作者UID
+ int64 upper_id = 6;
+ // 进入按钮文案
+ string entrance = 7;
+ //
+ int64 song_attr = 8;
+}
+
+//
+message BadgeStyle {
+ //
+ string text = 1;
+ //
+ string text_color = 2;
+ //
+ string text_color_night = 3;
+ //
+ string bg_color = 4;
+ //
+ string bg_color_night = 5;
+ //
+ string border_color = 6;
+ //
+ string border_color_night = 7;
+ //
+ int32 bg_style = 8;
+}
+
+// 视频引用的bgm音频
+message Bgm {
+ // 音频auid
+ int64 sid = 1;
+ // 音频作者mid
+ int64 mid = 2;
+ // 音频标题
+ string title = 3;
+ // 音频作者昵称
+ string author = 4;
+ // bgm页面url
+ string jumpUrl = 5;
+ // 音频封面url
+ string cover = 6;
+}
+
+// 收藏合集参数
+message BizFavSeasonParam {
+ // 合集id
+ int64 season_id = 1;
+}
+
+//
+message BizFollowVideoParam {
+ //
+ int64 season_id = 1;
+}
+
+//
+message BizJumpLinkParam {
+ // 链接
+ string url = 1;
+}
+
+// 预约活动参数
+message BizReserveActivityParam {
+ // 活动id
+ int64 activity_id = 1;
+ // 场景
+ string from = 2;
+ // 类型
+ string type = 3;
+ // 资源id
+ int64 oid = 4;
+ //
+ int64 reserve_id = 5;
+}
+
+//
+message BizReserveGameParam {
+ // 游戏id
+ int64 game_id = 1;
+}
+
+// 业务类型
+enum BizType {
+ BizTypeNone = 0; //
+ BizTypeFollowVideo = 1; // 追番追剧
+ BizTypeReserveActivity = 2; // 预约活动
+ BizTypeJumpLink = 3; // 跳转链接
+ BizTypeFavSeason = 4; // 收藏合集
+ BizTypeReserveGame = 5; // 预约游戏
+}
+
+//
+message Button {
+ // 按钮文案
+ string title = 1;
+ // 跳转uri
+ string uri = 2;
+ //
+ string icon = 3;
+}
+
+//
+message ButtonStyle {
+ //
+ string text = 1;
+ //
+ string text_color = 2;
+ //
+ string text_color_night = 3;
+ //
+ string bg_color = 4;
+ //
+ string bg_color_night = 5;
+ //
+ string jump_link = 6;
+}
+
+//
+message BuzzwordConfig {
+ //
+ string name = 1;
+ //
+ string schema = 2;
+ //
+ int32 source = 3;
+ //
+ int64 start = 4;
+ //
+ int64 end = 5;
+ //
+ bool follow_control = 6;
+ //
+ int64 id = 7;
+ //
+ int64 buzzword_id = 8;
+ //
+ int32 schema_type = 9;
+ //
+ string picture = 10;
+}
+
+//
+message CacheViewReply {
+ //
+ bilibili.app.archive.v1.Arc arc = 1;
+ //
+ repeated ViewPage pages = 2;
+ //
+ OnwerExt owner_ext = 3;
+ //
+ ReqUser req_user = 4;
+ //
+ Season season = 5;
+ //
+ ElecRank elec_rank = 6;
+ //
+ History history = 7;
+ //
+ Dislike dislike = 8;
+ //
+ PlayerIcon player_icon = 9;
+ //
+ string bvid = 10;
+ //
+ string short_link = 11;
+ //
+ string share_subtitle = 12;
+ //
+ TFPanelCustomized tf_panel_customized = 13;
+ //
+ Online online = 14;
+}
+
+//
+message CacheViewReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ string from = 3;
+ //
+ string trackid = 4;
+ //
+ string ad_extra = 5;
+ //
+ string spmid = 6;
+ //
+ string from_spmid = 7;
+}
+
+//
+enum Category {
+ CategoryUnknown = 0; //
+ CategorySeason = 1; //
+}
+
+// Chronos灰度管理
+message Chronos {
+ // 资源包md5
+ string md5 = 1;
+ // 资源包
+ string file = 2;
+ //
+ string sign = 3;
+}
+
+//
+message ChronosPkgReq {
+ //
+ string service_key = 1;
+ //
+ string engine_version = 2;
+ //
+ string message_protocol = 3;
+}
+
+// 点击大型活动页预约-请求
+message ClickActivitySeasonReq {
+ // 预约类型
+ BizType order_type = 1;
+ // 当前页面spm
+ string spmid = 2;
+ // 业务参数
+ oneof order_param {
+ // 预约活动参数
+ BizReserveActivityParam reserve = 3;
+ // 收藏合集参数
+ BizFavSeasonParam fav_season = 4;
+ }
+ // 操作
+ // 0:操作 1:取消操作
+ int64 action = 5;
+}
+
+// 点击播放器卡片-响应
+message ClickPlayerCardReply {
+ //
+ string message = 1;
+}
+
+// 点击播放器卡片-请求
+message ClickPlayerCardReq {
+ // 卡片id
+ int64 id = 1;
+ // 稿件avid
+ int64 aid = 2;
+ // 视频cid
+ int64 cid = 3;
+ //操作
+ //0:操作 1:取消操作
+ int64 action = 4;
+ // 当前页面spm
+ string spmid = 5;
+}
+
+// 广告
+message CM {
+ // 广告数据(需解包)
+ google.protobuf.Any source_content = 1;
+}
+
+// 广告配置
+message CMConfig {
+ // 广告配置数据(需要二次解包)
+ google.protobuf.Any ads_control = 1;
+}
+
+//
+message CmIpad {
+ //
+ CM cm = 1;
+ //
+ bilibili.app.archive.v1.Author author = 2;
+ //
+ bilibili.app.archive.v1.Stat stat = 3;
+ //
+ int64 duration = 4;
+ //
+ int64 aid = 5;
+}
+
+//
+message CoinCustom {
+ //
+ string toast = 1;
+}
+
+// 互动弹幕条目信息
+message CommandDm {
+ // 弹幕id
+ int64 id = 1;
+ // 对象视频cid
+ int64 oid = 2;
+ // 发送者mid
+ int64 mid = 3;
+ // 互动弹幕指令
+ string command = 4;
+ // 互动弹幕正文
+ string content = 5;
+ // 出现时间
+ int32 progress = 6;
+ // 创建时间
+ string ctime = 7;
+ // 发布时间
+ string mtime = 8;
+ // 扩展json数据
+ string extra = 9;
+ // 弹幕id str类型
+ string id_str = 10;
+}
+
+//
+message Config {
+ // 下方推荐项标题
+ string relates_title = 1;
+ //
+ int32 relates_style = 2;
+ //
+ int32 relate_gif_exp = 3;
+ //
+ int32 end_page_half = 4;
+ //
+ int32 end_page_full = 5;
+ // 退出是否自动小窗
+ bool auto_swindow = 6;
+ //
+ bool popup_info = 7;
+ //
+ string abtest_small_window = 8;
+ //
+ int32 rec_three_point_style = 9;
+ //
+ bool is_absolute_time = 10;
+ //
+ bool new_swindow = 11;
+ //
+ bool relates_biserial = 12;
+ //
+ ListenerConfig listener_conf = 13;
+ //
+ string relates_feed_style = 14;
+ //
+ bool relates_feed_popup = 15;
+ //
+ bool relates_has_next = 16;
+ //
+ int32 local_play = 17;
+ //
+ bool play_story = 18;
+ //
+ bool arc_play_story = 19;
+ //
+ string story_icon = 20;
+ //
+ bool landscape_story = 21;
+ //
+ bool arc_landscape_story = 22;
+ //
+ string landscape_icon = 23;
+ //
+ bool show_listen_button = 24;
+}
+
+//
+message ContinuousPlayReply {
+ //
+ repeated Relate relates = 1;
+}
+
+//
+message ContinuousPlayReq {
+ //
+ int64 aid = 1;
+ //
+ string from = 2;
+ //
+ string trackid = 3;
+ //
+ string spmid = 4;
+ //
+ string from_spmid = 5;
+ //
+ int32 autoplay = 6;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 7;
+ //
+ int64 device_type = 8;
+ //
+ string session_id = 9;
+ //
+ int64 display_id = 10;
+}
+
+// 契约卡
+message ContractCard {
+ // 需要触发的播放进度百分比
+ float display_progress = 1;
+ // 触发位置的前后误差(单位ms)
+ int64 display_accuracy = 2;
+ // 展示持续时间(单位ms)
+ int64 display_duration = 3;
+ // 弹出模式
+ // 0: 原有模式 1: 半屏弹出 2: 全屏、半屏均弹出
+ int32 show_mode = 4;
+ // 提示页面
+ // 0: 原有页面 1: 6.23版本新页面
+ int32 page_type = 5;
+ // UP主信息
+ UpperInfos upper = 6;
+ //
+ int32 is_follow_display = 7;
+ //
+ ContractText text = 8;
+ //
+ int64 follow_display_end_duration = 9;
+ //
+ int32 is_play_display = 10;
+ //
+ int32 is_interact_display = 11;
+ //
+ bool play_display_switch = 12;
+}
+
+//
+message ContractText {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ string inline_title = 3;
+}
+
+//
+message CreativeContent {
+ //
+ string title = 1;
+ //
+ string description = 2;
+ //
+ string button_title = 3;
+ //
+ int64 video_id = 4;
+ //
+ string username = 5;
+ //
+ string image_url = 6;
+ //
+ string image_md5 = 7;
+ //
+ string log_url = 8;
+ //
+ string log_md5 = 9;
+ //
+ string url = 10;
+ //
+ string click_url = 11;
+ //
+ string show_url = 12;
+}
+
+// 404页信息
+message CustomConfig {
+ // 重定向页面url
+ string redirect_url = 1;
+}
+
+// 枚举-文本类型
+enum DescType {
+ DescTypeUnknown = 0; // 占位
+ DescTypeText = 1; // 文本
+ DescTypeAt = 2; // @
+}
+
+// 特殊稿件简介
+message DescV2 {
+ // 文本内容
+ string text = 1;
+ // 文本类型
+ DescType type = 2;
+ // 点击跳转链接
+ string uri = 3;
+ // 资源ID
+ int64 rid = 4;
+}
+
+// 不喜欢原因
+message Dislike {
+ // 标题
+ string title = 1;
+ //
+ string subtitle = 2;
+ // 原因项列表
+ repeated DislikeReasons reasons = 3;
+}
+
+// 不喜欢原因项
+message DislikeReasons {
+ // 类型
+ // 1:全部类型 3:TAG 4:UP主
+ int64 id = 1;
+ // 相关UP主mid
+ int64 mid = 2;
+ // 相关分区tid
+ int32 rid = 3;
+ // 相关TAG id
+ int64 tag_id = 4;
+ // 相关名称
+ string name = 5;
+}
+
+// 分P弹幕信息
+message DM {
+ // 分P是否关闭弹幕
+ // 0:正常 1:关闭
+ bool closed = 1;
+ //
+ bool real_name = 2;
+ // 分P弹幕总数
+ int64 count = 3;
+}
+
+// 错误代码
+enum ECode {
+ DEFAULT = 0; // 正常
+ CODE404 = 1; // 稿件被UP主删除
+}
+
+// 充电排行信息
+message ElecRank {
+ // 充电排行列表
+ repeated ElecRankItem list = 1;
+ // 充电用户数
+ int64 count = 2;
+ //
+ string text = 3;
+}
+
+// 充电用户信息
+message ElecRankItem {
+ // 用户头像url
+ string avatar = 1;
+ // 用户昵称
+ string nickname = 2;
+ // 充电留言
+ string message = 3;
+ // 用户mid
+ int64 mid = 4;
+}
+
+// 视频合集单话信息
+message Episode {
+ // 合集单话id
+ int64 id = 1;
+ // 稿件avid
+ int64 aid = 2;
+ // 视频1P cid
+ int64 cid = 3;
+ // 稿件标题
+ string title = 4;
+ // 稿件封面url
+ string cover = 5;
+ // 投稿时间显示文案
+ string coverRightText = 6;
+ // 视频分P信息
+ bilibili.app.archive.v1.Page page = 7;
+ // 视频状态数
+ bilibili.app.archive.v1.Stat stat = 8;
+ // 稿件bvid
+ string bvid = 9;
+ // 稿件UP主信息
+ bilibili.app.archive.v1.Author author = 10;
+ //
+ string author_desc = 11;
+ //
+ BadgeStyle badge_style = 12;
+ //
+ bool need_pay = 13;
+ //
+ bool episode_pay = 14;
+ //
+ bool free_watch = 15;
+ //
+ string first_frame = 16;
+ //
+ ArchiveStat stat_v2 = 17;
+ //
+ repeated bilibili.app.archive.v1.Page pages = 18;
+}
+
+//
+message ArchiveStat {
+ //
+ bilibili.app.viewunite.common.StatInfo view_vt = 11;
+}
+
+// 播放器卡片曝光-请求
+message ExposePlayerCardReq {
+ // 卡片类型
+ PlayerCardType card_type = 1;
+ // 稿件avid
+ int64 aid = 2;
+ // 视频cid
+ int64 cid = 3;
+ // 当前页面spm
+ string spmid = 4;
+}
+
+//
+message FeedViewItem {
+ //
+ ViewReply view = 1;
+ //
+ string goto = 2;
+ //
+ string uri = 3;
+ //
+ string track_id = 4;
+}
+
+//
+message FeedViewReply {
+ //
+ repeated FeedViewItem list = 1;
+ //
+ bool has_next = 2;
+}
+
+//
+message FeedViewReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ string from = 3;
+ //
+ string spmid = 4;
+ //
+ string from_spmid = 5;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
+ //
+ int64 display_id = 7;
+ //
+ string session_id = 8;
+ //
+ string page_version = 9;
+ //
+ string from_track_id = 10;
+}
+
+//
+message GetArcsPlayerReply {
+ //
+ repeated ArcsPlayer arcs_player = 1;
+}
+
+//
+message GetArcsPlayerReq {
+ //
+ repeated PlayAv play_avs = 1;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 2;
+}
+
+//
+message GoodsInfo {
+ //
+ string goods_id = 1;
+ //
+ int32 category = 2;
+ //
+ int64 goods_price = 3;
+ //
+ PayState pay_state = 4;
+ //
+ string goods_name = 5;
+ //
+ string price_fmt = 6;
+}
+
+// 稿件观看进度
+message History {
+ // 播放进度分P cid
+ int64 cid = 1;
+ // 播放进度时间
+ // 0:未观看 -1:已看完 正整数:播放时间进度
+ int64 progress = 2;
+}
+
+// 稿件获得荣誉信息
+message Honor {
+ // 荣誉栏图标url
+ string icon = 1;
+ // 荣誉栏图标url 夜间模式
+ string icon_night = 2;
+ // 荣誉文案
+ string text = 3;
+ // 荣誉副文案
+ string text_extra = 4;
+ // 标题颜色
+ string text_color = 5;
+ // 标题颜色 夜间模式
+ string text_color_night = 6;
+ // 背景颜色
+ string bg_color = 7;
+ // 背景颜色 夜间模式
+ string bg_color_night = 8;
+ // 跳转uri
+ string url = 9;
+ // 跳转角标文案
+ string url_text = 10;
+}
+
+//
+message IconData {
+ //
+ string meta_json = 1;
+ //
+ string sprits_img = 2;
+}
+
+//
+message Interaction {
+ //
+ Node history_node = 1;
+ //
+ int64 graph_version = 2;
+ //
+ string msg = 3;
+ //
+ string evaluation = 4;
+ //
+ int64 mark = 5;
+}
+
+//
+message Label {
+ //
+ int32 type = 1;
+ //
+ string uri = 2;
+ //
+ string icon = 3;
+ //
+ string icon_night = 4;
+ //
+ int64 icon_width = 5;
+ //
+ int64 icon_height = 6;
+ //
+ string lottie = 7;
+ //
+ string lottie_night = 8;
+}
+
+//
+message LikeAnimation {
+ //
+ string like_icon = 1;
+ //
+ string liked_icon = 2;
+ //
+ string like_animation = 3;
+}
+
+//
+message LikeCustom {
+ //
+ bool like_switch = 1;
+ //
+ int64 full_to_half_progress = 2;
+ //
+ int64 non_full_progress = 3;
+ //
+ int64 update_count = 4;
+}
+
+//
+message ListenerConfig {
+ //
+ int64 jump_style = 1;
+ //
+ ListenerGuideBar guide_bar = 2;
+}
+
+//
+message ListenerGuideBar {
+ //
+ int64 show_strategy = 1;
+ //
+ string icon = 2;
+ //
+ string text = 3;
+ //
+ string btn_text = 4;
+ //
+ int64 show_time = 5;
+ //
+ int64 background_time = 6;
+}
+
+// 直播信息
+message Live {
+ // 主播UID
+ int64 mid = 1;
+ // 直播间id
+ int64 roomid = 2;
+ // 直播间url
+ string uri = 3;
+ //
+ string endpage_uri = 4;
+}
+
+// 直播预约信息
+message LiveOrderInfo {
+ // 预约id
+ int64 sid = 1;
+ // 预约条文案
+ string text = 2;
+ // 直播开始时间
+ int64 live_plan_start_time = 3;
+ // 是否预约
+ bool is_follow = 4;
+}
+
+//
+message MaterialLeft {
+ //
+ string icon = 1;
+ //
+ string text = 2;
+ //
+ string url = 3;
+ //
+ string left_type = 4;
+ //
+ string param = 5;
+ //
+ string operational_type = 6;
+ //
+ string static_icon = 7;
+}
+
+//
+message MaterialRes {
+ //
+ int64 id = 1;
+ //
+ string icon = 2;
+ //
+ string url = 3;
+ //
+ MaterialSource type = 4;
+ //
+ string name = 5;
+ //
+ string bg_color = 6;
+ //
+ string bg_pic = 7;
+ //
+ int32 jump_type = 8;
+}
+
+//
+enum MaterialSource {
+ Default = 0; //
+ BiJian = 1; // 必剪
+}
+
+//
+message Node {
+ //
+ int64 node_id = 1;
+ //
+ string title = 2;
+ //
+ int64 cid = 3;
+}
+
+// 空回复
+message NoReply {}
+
+//
+message Notice {
+ //
+ string title = 1;
+ //
+ string desc = 2;
+}
+
+// 认证信息
+message OfficialVerify {
+ // 认证类型
+ // 0:个人认证 1:官方认证
+ int32 type = 1;
+ //认证名称
+ string desc = 2;
+}
+
+//
+message Online {
+ //
+ bool online_show = 1;
+ //
+ string player_online_logo = 2;
+}
+
+// UP主扩展信息 ("OnwerExt"为源码中拼写错误)
+message OnwerExt {
+ // 认证信息
+ OfficialVerify official_verify = 1;
+ // 直播信息
+ Live live = 2;
+ // 会员信息
+ Vip vip = 3;
+ //
+ repeated int64 assists = 4;
+ // 粉丝数
+ int64 fans = 5;
+ // 总投稿数
+ string arc_count = 6;
+}
+
+// 老运营卡片
+message OperationCard {
+ // 开始时间(单位为秒)
+ int32 start_time = 1;
+ // 结束时间(单位为秒)
+ int32 end_time = 2;
+ // 图标
+ string icon = 3;
+ // 标题
+ string title = 4;
+ // 按钮文案
+ string button_text = 5;
+ // 跳转链接
+ string url = 6;
+ // 内容描述
+ string content = 7;
+}
+
+// 内嵌操作按钮卡片
+message OperationCardNew {
+ // 卡片id
+ int64 id = 1;
+ // 开始时间
+ int32 from = 2;
+ // 结束时间
+ int32 to = 3;
+ // 用户操作态
+ // true已操作 false未操作
+ bool status = 4;
+ // 卡片类型
+ OperationCardType card_type = 5;
+ // 卡片渲染
+ oneof render {
+ // 标准卡
+ StandardCard standard = 6;
+ // 老运营卡片(原B剪跳转卡)
+ OperationCard skip = 7;
+ }
+ //
+ BizType biz_type = 8;
+ //
+ oneof param {
+ // 追番追剧参数
+ BizFollowVideoParam follow = 9;
+ // 预约活动参数
+ BizReserveActivityParam reserve = 10;
+ // 跳转参数
+ BizJumpLinkParam jump = 11;
+ // 预约游戏参数
+ BizReserveGameParam game = 12;
+ }
+}
+
+// 卡片样式
+enum OperationCardType {
+ CardTypeNone = 0; //
+ CardTypeStandard = 1; // 标准卡
+ CardTypeSkip = 2; // 原跳转卡
+}
+
+//
+message OperationCardV2 {
+ //
+ int64 id = 1;
+ //
+ int32 from = 2;
+ //
+ int32 to = 3;
+ //
+ bool status = 4;
+ //
+ int32 biz_type = 5;
+ //
+ OperationCardV2Content content = 6;
+ //
+ oneof param {
+ //
+ BizFollowVideoParam BizFollowVideoParam = 7;
+ //
+ BizReserveActivityParam BizReserveActivityParam = 8;
+ //
+ BizJumpLinkParam BizJumpLinkParam = 9;
+ //
+ BizReserveGameParam BizReserveGameParam = 10;
+ }
+}
+
+//
+message OperationCardV2Content {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ string icon = 3;
+ //
+ string button_title = 4;
+ //
+ string button_selected_title = 5;
+ //
+ bool show_selected = 6;
+}
+
+// 相关推荐(运营配置+AI推荐)
+message OperationRelate {
+ // 模块标题
+ string title = 1;
+ // 相关推荐模块内容
+ repeated RelateItem relate_item = 2;
+ // AI相关推荐
+ repeated Relate ai_relate_item = 3;
+}
+
+// 预约模块
+message Order {
+ // 用户操作态
+ bool status = 1;
+ // 模块标题
+ string title = 2;
+ // 按钮文字 未操作
+ string button_title = 3;
+ // 按钮文字 已操作
+ string button_selected_title = 4;
+ // 合集播放数
+ int64 season_stat_view = 5;
+ // 合集弹幕数
+ int64 season_stat_danmaku = 6;
+ // 预约类型(点击时透传,直播开始前预约活动,直播开始后收藏合集)
+ BizType order_type = 7;
+ // 预约业务参数
+ oneof order_param {
+ // 预约活动参数
+ BizReserveActivityParam reserve = 8;
+ // 收藏合集参数
+ BizFavSeasonParam fav_season = 9;
+ }
+ // 合集简介
+ string intro = 10;
+}
+
+// 游戏礼包信息
+message PackInfo {
+ // 礼包标题
+ string title = 1;
+ // 礼包页uri
+ string uri = 2;
+}
+
+//
+enum PayState {
+ PayStateUnknown = 0; //
+ PayStateActive = 1; //
+}
+
+//
+message PlayAv {
+ //
+ int64 aid = 1;
+ //
+ int64 cid = 2;
+}
+
+// 卡片类型
+enum PlayerCardType {
+ PlayerCardTypeNone_VALUE = 0; //
+ PlayerCardTypeAttention_VALUE = 1; // 关注卡
+ PlayerCardTypeOperation_VALUE = 2; // 运营卡
+ PlayerCardTypeContract_VALUE = 3; // 契约卡
+}
+
+// 进度条动画配置
+message PlayerIcon {
+ // 拖动动画配置档url
+ string url1 = 1;
+ // 拖动动画配置档hash
+ string hash1 = 2;
+ // 松手动画配置档url
+ string url2 = 3;
+ // 松手动画配置档hash
+ string hash2 = 4;
+ //
+ string drag_left_png = 5;
+ //
+ string middle_png = 6;
+ //
+ string drag_right_png = 7;
+ //
+ IconData drag_data = 8;
+ //
+ IconData nodrag_data = 9;
+}
+
+//
+message PlayerRelatesReply {
+ //
+ repeated Relate list = 1;
+}
+
+//
+message PlayerRelatesReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ string from = 3;
+ //
+ string spmid = 4;
+ //
+ string from_spmid = 5;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
+ //
+ string session_id = 7;
+ //
+ string from_track_id = 8;
+}
+
+//
+message PointMaterial {
+ //
+ string url = 1;
+ //
+ int32 material_source = 2;
+}
+
+//
+message PowerIconStyle {
+ //
+ string icon_url = 1;
+ //
+ string icon_night_url = 2;
+ //
+ int64 icon_width = 3;
+ //
+ int64 icon_height = 4;
+}
+
+//
+message Premiere {
+ //
+ PremiereState premiere_state = 1;
+ //
+ int64 start_time = 2;
+ //
+ int64 service_time = 3;
+ //
+ int64 room_id = 4;
+}
+
+//
+message PremiereArchiveReply {
+ //
+ Premiere premiere = 1;
+ //
+ bool risk_status = 2;
+ //
+ string risk_reason = 3;
+}
+
+//
+message PremiereArchiveReq {
+ //
+ int64 aid = 1;
+}
+
+//
+message PremiereReserve {
+ //
+ int64 reserve_id = 1;
+ //
+ int64 count = 2;
+ //
+ bool is_follow = 3;
+}
+
+//
+message PremiereResource {
+ //
+ Premiere premiere = 1;
+ //
+ PremiereReserve reserve = 2;
+ //
+ PremiereText text = 3;
+}
+
+//
+enum PremiereState {
+ premiere_none = 0; //
+ premiere_before = 1; //
+ premiere_in = 2; //
+ premiere_after = 3; //
+}
+
+//
+message PremiereText {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ string online_text = 3;
+ //
+ string online_icon = 4;
+ //
+ string online_icon_dark = 5;
+ //
+ string intro_title = 6;
+ //
+ string intro_icon = 7;
+ //
+ string guidance_pulldown = 8;
+ //
+ string guidance_entry = 9;
+ //
+ string intro_icon_night = 10;
+}
+
+//
+message PullClientAction {
+ //
+ string type = 1;
+ //
+ bool pull_action = 2;
+ //
+ string params = 3;
+}
+
+// 排行榜
+message Rank {
+ // 排行榜icon
+ string icon = 1;
+ // 排行榜icon 夜间模式
+ string icon_night = 2;
+ // 排行榜文案
+ string text = 3;
+}
+
+//
+message RankInfo {
+ //
+ string icon_url_night = 1;
+ //
+ string icon_url_day = 2;
+ //
+ string bkg_night_color = 3;
+ //
+ string bkg_day_color = 4;
+ //
+ string font_night_color = 5;
+ //
+ string font_day_color = 6;
+ //
+ string rank_content = 7;
+ //
+ string rank_link = 8;
+}
+
+// 推荐理由样式
+message ReasonStyle {
+ //
+ string text = 1;
+ // 日间模式文字
+ string text_color = 2;
+ //
+ string bg_color = 3;
+ //
+ string border_color = 4;
+ // 夜间模式文字
+ string text_color_night = 5;
+ //
+ string bg_color_night = 6;
+ //
+ string border_color_night = 7;
+ // 1:填充 2:描边 3:填充 + 描边 4:背景不填充 + 背景不描边
+ int32 bg_style = 8;
+ //
+ int32 selected = 9;
+}
+
+//
+message RecDislike {
+ //
+ string title = 1;
+ //
+ string sub_title = 2;
+ //
+ string closed_sub_title = 3;
+ //
+ string paste_text = 4;
+ //
+ string closed_paste_text = 5;
+ //
+ repeated DislikeReasons dislike_reason = 6;
+ //
+ string toast = 7;
+ //
+ string closed_toast = 8;
+}
+
+//
+message RecThreePoint {
+ //
+ RecDislike dislike = 1;
+ //
+ RecDislike feedback = 2;
+ //
+ bool watch_later = 3;
+}
+
+//
+message RefreshPage {
+ //
+ int32 refreshable = 1;
+ //
+ int32 refresh_icon = 2;
+ //
+ string refresh_text = 3;
+ //
+ float refresh_show = 4;
+}
+
+// 相关推荐项
+message Relate {
+ //
+ int64 aid = 1;
+ // 封面url
+ string pic = 2;
+ // 标题
+ string title = 3;
+ // UP主信息
+ bilibili.app.archive.v1.Author author = 4;
+ // 稿件状态数
+ bilibili.app.archive.v1.Stat stat = 5;
+ // 时长
+ int64 duration = 6;
+ // 跳转类型
+ // special:pgc视频 av:稿件视频 cm:广告 game:游戏
+ string goto = 7;
+ // 参数(如av号等)
+ string param = 8;
+ // 跳转uri
+ string uri = 9;
+ //
+ string jump_url = 10;
+ // 评分
+ double rating = 11;
+ //
+ string reserve = 12;
+ // 来源标识
+ // operation:管理员添加
+ string from = 13;
+ // 备注
+ string desc = 14;
+ //
+ string rcmd_reason = 15;
+ // 标志文字
+ string badge = 16;
+ // 1P cid
+ int64 cid = 17;
+ //
+ int32 season_type = 18;
+ //
+ int32 rating_count = 19;
+ // 标签文案
+ string tag_name = 20;
+ // 游戏礼包信息
+ PackInfo pack_info = 21;
+ //
+ Notice notice = 22;
+ // 按钮信息
+ Button button = 23;
+ // spm追踪id
+ string trackid = 24;
+ // 游戏卡片新样式
+ int32 new_card = 25;
+ // 推荐理由样式
+ ReasonStyle rcmd_reason_style = 26;
+ //
+ string cover_gif = 27;
+ // 广告
+ CM cm = 28;
+ // 游戏卡字段
+ // 0:下载 1:预约(跳过详情) 2:预约 3:测试 4:测试+预约 5:跳过详情页
+ int64 reserve_status = 29;
+ //
+ string rcmd_reason_extra = 30;
+ //
+ RecThreePoint rec_three_point = 31;
+ //
+ string unique_id = 32;
+ //
+ int64 material_id = 33;
+ //
+ int64 from_source_type = 34;
+ //
+ string from_source_id = 35;
+ //
+ bilibili.app.archive.v1.Dimension dimension = 36;
+ //
+ string cover = 37;
+ //
+ ReasonStyle badge_style = 38;
+ //
+ PowerIconStyle power_icon_style = 39;
+ //
+ string reserve_status_text = 40;
+ //
+ string dislike_report_data = 41;
+ //
+ RankInfo rank_info_game = 42;
+ //
+ string first_frame = 43;
+}
+
+// 相关推荐内容
+message RelateItem {
+ // 跳链
+ string url = 1;
+ // 封面
+ string cover = 2;
+}
+
+// 播放页推荐IFS-响应
+message RelatesFeedReply {
+ //
+ repeated Relate list = 1;
+ //
+ bool has_next = 2;
+ //
+ bilibili.pagination.PaginationReply pagination = 3;
+}
+
+// 播放页推荐IFS-请求
+message RelatesFeedReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ string from = 3;
+ //
+ string spmid = 4;
+ //
+ string from_spmid = 5;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
+ //
+ int64 relates_page = 7;
+ //
+ string session_id = 8;
+ //
+ int32 autoplay = 9;
+ //
+ string from_track_id = 10;
+ //
+ string biz_extra = 11;
+ //
+ int64 device_type = 12;
+ //
+ string ad_extra = 13;
+ //
+ bilibili.pagination.Pagination pagination = 14;
+ //
+ int32 refresh_num = 15;
+}
+
+//
+message RelateTab {
+ //
+ string id = 1;
+ //
+ string title = 2;
+}
+
+//
+message ReplyStyle {
+ //
+ string badge_url = 1;
+ //
+ string badge_text = 2;
+ //
+ int64 badge_type = 3;
+}
+
+// 用户操作状态
+message ReqUser {
+ // 用户是否关注UP
+ int32 attention = 1;
+ // UP是否关注用户
+ int32 guest_attention = 2;
+ // 是否收藏
+ int32 favorite = 3;
+ // 是否点赞
+ int32 like = 4;
+ // 是否点踩
+ int32 dislike = 5;
+ // 是否投币
+ int32 coin = 6;
+ // 关注等级
+ int32 attention_level = 7;
+ // 是否收藏合集
+ int32 fav_season = 8;
+ //
+ Button elec_plus_btn = 9;
+}
+
+//
+message ReserveReply {
+ //
+ int64 reserve_id = 1;
+}
+
+//
+message ReserveReq {
+ //
+ int64 reserve_id = 1;
+ //
+ int64 reserve_action = 2;
+ //
+ int64 up_id = 3;
+}
+
+//
+message Restriction {
+ //
+ bool is_teenagers = 1;
+ //
+ bool is_lessons = 2;
+ //
+ bool is_review = 3;
+ //
+ bool disable_rcmd = 4;
+}
+
+// 剧集信息
+message Season {
+ //
+ string allow_download = 1;
+ // 剧集ssid
+ int64 season_id = 2;
+ // 是否重定向跳转
+ int32 is_jump = 3;
+ // 剧集标题
+ string title = 4;
+ // 剧集封面url
+ string cover = 5;
+ // 剧集是否完结
+ int32 is_finish = 6;
+ // 最新一话epid
+ int64 newest_ep_id = 7;
+ // 最新一话标题
+ string newest_ep_index = 8;
+ // 总集数
+ int64 total_count = 9;
+ // 更新星期日
+ int32 weekday = 10;
+ // 用户追番标志
+ UserSeason user_season = 11;
+ //
+ SeasonPlayer player = 12;
+ // 单集页面url
+ string ogv_playurl = 13;
+}
+
+//
+message SeasonActivityRecordReply {
+ //
+ UgcSeasonActivity activity = 1;
+}
+
+//
+message SeasonActivityRecordReq {
+ //
+ int64 season_id = 1;
+ //
+ int64 activity_id = 2;
+ //
+ int32 action = 3;
+ //
+ int64 aid = 4;
+ //
+ int64 cid = 5;
+ //
+ int64 scene = 6;
+ //
+ string spmid = 7;
+}
+
+//
+message SeasonPlayer {
+ //
+ int64 aid = 1;
+ //
+ string vid = 2;
+ //
+ int64 cid = 3;
+ //
+ string from = 4;
+}
+
+// 合集详情页-响应
+message SeasonReply {
+ // 合集信息
+ UgcSeason season = 1;
+}
+
+// 合集详情页-请求
+message SeasonReq {
+ // 合集id
+ int64 season_id = 1;
+}
+
+//
+message SeasonShow {
+ //
+ string button_text = 1;
+ //
+ string join_text = 2;
+ //
+ string rule_text = 3;
+ //
+ string checkin_text = 4;
+ //
+ string checkin_prompt = 5;
+}
+
+//
+enum SeasonType {
+ Unknown = 0; //
+ Base = 1; //
+ Good = 2; //
+}
+
+//
+message SeasonWidgetExposeReply {
+ //
+ int64 season_id = 1;
+ //
+ int64 activity_id = 2;
+}
+
+//
+message SeasonWidgetExposeReq {
+ //
+ int64 mid = 1;
+ //
+ int32 type = 2;
+ //
+ int64 season_id = 3;
+ //
+ int64 activity_id = 4;
+ //
+ int64 aid = 5;
+ //
+ int64 cid = 6;
+ //
+ int64 scene = 7;
+}
+
+// 视频合集小节信息
+message Section {
+ // 小节id
+ int64 id = 1;
+ // 小节标题
+ string title = 2;
+ // 小节类型
+ // 0:其他 1:正片
+ int64 type = 3;
+ // 单话列表
+ repeated Episode episodes = 4;
+}
+
+// 短视频下载-响应
+message ShortFormVideoDownloadReply {
+ // 是否有下载分享按钮
+ bool has_download_url = 1;
+ // 下载url
+ string download_url = 2;
+ // 文件md5
+ string md5 = 3;
+ // 文件大小(单位为Byte)
+ int64 size = 4;
+ //
+ string backup_download_url = 5;
+}
+
+// 短视频下载-请求
+message ShortFormVideoDownloadReq {
+ // 稿件avid
+ int64 aid = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 用户mid
+ int64 mid = 3;
+ // 设备buvid
+ string buvid = 4;
+ // 移动端包类型
+ string mobi_app = 5;
+ // 移动端版本号
+ int64 build = 6;
+ // 运行设备
+ string device = 7;
+ // 平台
+ string platform = 8;
+ // 当前页面spm
+ string spmid = 9;
+ //
+ Restriction restriction = 10;
+ //
+ string tf_isp = 11;
+}
+
+//
+message SpecialCell {
+ //
+ string icon = 1;
+ //
+ string icon_night = 2;
+ //
+ string text = 3;
+ //
+ string text_color = 4;
+ //
+ string text_color_night = 5;
+ //
+ string jump_url = 6;
+ //
+ string cell_type = 7;
+ //
+ string cell_bgcolor = 8;
+ //
+ string cell_bgcolor_night = 9;
+ //
+ string param = 10;
+ //
+ string page_title = 11;
+ //
+ string jump_type = 12;
+ //
+ string end_icon = 13;
+ //
+ string end_icon_night = 14;
+ //
+ int64 notes_count = 15;
+}
+
+// 合作成员信息
+message Staff {
+ // 成员mid
+ int64 mid = 1;
+ // 成员角色
+ string title = 2;
+ // 成员头像url
+ string face = 3;
+ // 成员昵称
+ string name = 4;
+ // 成员官方信息
+ OfficialVerify official_verify = 5;
+ // 成员会员信息
+ Vip vip = 6;
+ // 是否关注该成员
+ int32 attention = 7;
+ //
+ int32 label_style = 8;
+}
+
+// 标准卡
+message StandardCard {
+ // 卡片文案
+ string title = 1;
+ // 按钮文字 未操作
+ string button_title = 2;
+ // 按钮文字 已操作
+ string button_selected_title = 3;
+ // 已操作态是否显示
+ bool show_selected = 4;
+}
+
+// 免流子面板定制化配置
+message subTFPanel {
+ // 右侧按钮素材
+ string right_btn_img = 1;
+ // 右侧按钮文案
+ string right_btn_text = 2;
+ // 右侧按钮字体颜色
+ string right_btn_text_color = 3;
+ // 右侧按钮跳转链接
+ string right_btn_link = 4;
+ // 中心主文案内容
+ string main_label = 5;
+ // 运营商
+ string operator = 6;
+}
+
+// TAB
+message Tab {
+ // 背景图片
+ string background = 1;
+ // 跳转类型
+ TabOtype otype = 2;
+ // 类型id
+ int64 oid = 3;
+ // 跳转url
+ string uri = 4;
+ // 样式
+ TabStyle style = 5;
+ // 文字
+ string text = 6;
+ // 未选中态字色
+ string text_color = 7;
+ // 选中态字色
+ string text_color_selected = 8;
+ // 图片
+ string pic = 9;
+ // 后台配置自增
+ int64 id = 10;
+ //
+ google.protobuf.Any ad_tab_info = 11;
+}
+
+// TAB跳转类型
+enum TabOtype {
+ UnknownOtype = 0; // 未知类型
+ URL = 1; // url链接
+ TopicNA = 2; // native话题活动
+ CmURI = 3; // 广告url
+}
+
+// TAB样式
+enum TabStyle {
+ UnknownStyle = 0; // 未知样式
+ Text = 1; // 文字样式
+ Pic = 2; // 图片样式
+}
+
+// TAG信息
+message Tag {
+ // TAD id
+ int64 id = 1;
+ // TAG名
+ string name = 2;
+ //
+ int64 likes = 3;
+ //
+ int64 hates = 4;
+ //
+ int32 liked = 5;
+ //
+ int32 hated = 6;
+ // TAG页面uri
+ string uri = 7;
+ // TAG类型
+ // common:普通 new:话题 act:活动
+ string tag_type = 8;
+}
+
+// 免流面板定制
+message TFPanelCustomized {
+ // 右侧按钮素材
+ string right_btn_img = 1;
+ // 右侧按钮文案
+ string right_btn_text = 2;
+ // 右侧按钮字体颜色
+ string right_btn_text_color = 3;
+ // 右侧按钮跳转链接
+ string right_btn_link = 4;
+ // 中心主文案内容
+ string main_label = 5;
+ // 运营商(cm ct cu)
+ string operator = 6;
+ // 子面板定制化配置
+ map sub_panel = 7;
+}
+
+// TAG图标信息
+message TIcon {
+ // TAG图标url
+ string icon = 1;
+}
+
+// UGC视频合集信息
+message UgcSeason {
+ // 合集id
+ int64 id = 1;
+ // 合集标题
+ string title = 2;
+ // 合集封面url
+ string cover = 3;
+ // 合集简介
+ string intro = 4;
+ // 小节列表
+ repeated Section sections = 5;
+ // 合集状态数
+ UgcSeasonStat stat = 6;
+ // 标签字色
+ string label_text = 7;
+ // 标签背景色
+ string label_text_color = 8;
+ // 标签夜间字色
+ string label_bg_color = 9;
+ // 标签夜间背景色
+ string label_text_night_color = 10;
+ // 右侧描述文案
+ string label_bg_night_color = 11;
+ // 按钮文案
+ string descRight = 12;
+ // 分集总数
+ int64 ep_count = 13;
+ // 合集类型
+ SeasonType season_type = 14;
+ //
+ bool show_continual_button = 15;
+ //
+ int64 ep_num = 16;
+ //
+ bool season_pay = 17;
+ //
+ GoodsInfo goods_info = 18;
+ //
+ ButtonStyle pay_button = 19;
+ //
+ string label_text_new = 20;
+ //
+ UgcSeasonActivity activity = 21;
+ //
+ repeated string season_ability = 22;
+}
+
+//
+message UgcSeasonActivity {
+ //
+ int32 type = 1;
+ //
+ int64 oid = 2;
+ //
+ int64 activity_id = 3;
+ //
+ string title = 4;
+ //
+ string intro = 5;
+ //
+ int32 day_count = 6;
+ //
+ int32 user_count = 7;
+ //
+ int64 join_deadline = 8;
+ //
+ int64 activity_deadline = 9;
+ //
+ int32 checkin_view_time = 10;
+ //
+ bool new_activity = 11;
+ //
+ UserActivity user_activity = 12;
+ //
+ SeasonShow season_show = 13;
+}
+
+// ugc视频合集状态数
+message UgcSeasonStat {
+ // 合集id
+ int64 season_id = 1;
+ // 观看数
+ int32 view = 2;
+ // 弹幕数
+ int32 danmaku = 3;
+ // 评论数
+ int32 reply = 4;
+ // 收藏数
+ int32 fav = 5;
+ // 投币数
+ int32 coin = 6;
+ // 分享数
+ int32 share = 7;
+ // 当前排名
+ int32 now_rank = 8;
+ // 历史最高排名
+ int32 his_rank = 9;
+ // 总计点赞
+ int32 like = 10;
+}
+
+//
+message UpAct {
+ //
+ int64 sid = 1;
+ //
+ int64 mid = 2;
+ //
+ string title = 3;
+ //
+ string statement = 4;
+ //
+ string image = 5;
+ //
+ string url = 6;
+ //
+ string button = 7;
+}
+
+//
+message UpLikeImg {
+ //
+ string pre_img = 1;
+ //
+ string suc_img = 2;
+ //
+ string content = 3;
+ //
+ int64 type = 4;
+}
+
+// UP主信息
+message UpperInfos {
+ // 粉丝数
+ int64 fans_count = 1;
+ // 近半年投稿数
+ int64 arc_count_last_half_year = 2;
+ // 成为UP主时间
+ int64 first_up_dates = 3;
+ // 总播放量
+ int64 total_play_count = 4;
+}
+
+//
+message UserActivity {
+ //
+ int32 user_state = 1;
+ //
+ int64 last_checkin_date = 2;
+ //
+ int32 checkin_today = 3;
+ //
+ int32 user_day_count = 4;
+ //
+ int32 user_view_time = 5;
+ //
+ string portrait = 6;
+}
+
+// 用户装扮信息
+message UserGarb {
+ // 点赞动画url
+ string url_image_ani_cut = 1;
+ //
+ string like_toast = 2;
+}
+
+// 用户追番标志
+message UserSeason {
+ // 关注状态
+ // 0:未关注 1:已关注
+ string attention = 1;
+}
+
+// 视频引导信息
+message VideoGuide {
+ // 关注按钮卡片
+ repeated Attention attention = 1;
+ // 互动弹幕
+ repeated CommandDm commandDms = 2;
+ // 运营卡片
+ repeated OperationCard operation_card = 3;
+ // 运营卡片新版
+ repeated OperationCardNew operation_card_new = 4;
+ // 契约卡
+ ContractCard contract_card = 5;
+ //
+ repeated OperationCardV2 cards_second = 6;
+}
+
+//
+message VideoPoint {
+ //
+ int32 type = 1;
+ //
+ int64 from = 2;
+ //
+ int64 to = 3;
+ //
+ string content = 4;
+ //
+ string cover = 5;
+ //
+ string logo_url = 6;
+}
+
+//
+message VideoShot {
+ //
+ string pv_data = 1;
+ //
+ int32 img_x_len = 2;
+ //
+ int32 img_y_len = 3;
+ //
+ int32 img_x_size = 4;
+ //
+ int32 img_y_size = 5;
+ //
+ repeated string image = 6;
+}
+
+//
+message ViewMaterial {
+ //
+ int64 oid = 1;
+ //
+ int64 mid = 2;
+ //
+ string title = 3;
+ //
+ string author = 4;
+ //
+ string jump_url = 5;
+}
+
+//
+message ViewMaterialReply {
+ //
+ repeated MaterialRes material_res = 1;
+ //
+ MaterialLeft material_left = 2;
+}
+
+//
+message ViewMaterialReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ int64 cid = 3;
+}
+
+// 分P信息
+message ViewPage {
+ // 分P基本信息
+ bilibili.app.archive.v1.Page page = 1;
+ // 分P对应的音频稿件
+ Audio audio = 2;
+ // 分P弹幕信息
+ DM dm = 3;
+ // 下载文案
+ string download_title = 4;
+ // 分P完整标题(视频标题+分P标题)
+ string download_subtitle = 5;
+}
+
+// 稿件播放中数据-回复
+message ViewProgressReply {
+ // 视频引导信息
+ VideoGuide video_guide = 1;
+ // Chronos灰度管理
+ Chronos chronos = 2;
+ // 视频快照
+ VideoShot arc_shot = 3;
+ //
+ repeated VideoPoint points = 4;
+ //
+ PointMaterial point_material = 5;
+ //
+ bool point_permanent = 6;
+ // 名词解释列表
+ repeated BuzzwordConfig buzzword_periods = 7;
+}
+
+// 稿件播放中数据-请求
+message ViewProgressReq {
+ // 稿件avid
+ int64 aid = 1;
+ // 视频cid
+ int64 cid = 2;
+ // UP主mid
+ int64 up_mid = 3;
+ //
+ string engine_version = 4;
+ //
+ string message_protocol = 5;
+ //
+ string service_key = 6;
+}
+
+// 视频页信息-响应
+message ViewReply {
+ // 稿件信息
+ bilibili.app.archive.v1.Arc arc = 1;
+ // 分P信息
+ repeated ViewPage pages = 2;
+ // UP主扩展信息 ("OnwerExt"为源码中拼写错误)
+ OnwerExt owner_ext = 3;
+ // 稿件用户操作状态
+ ReqUser req_user = 4;
+ // 稿件TAG
+ repeated Tag tag = 5;
+ // TAG对应的图标
+ map t_icon = 6;
+ // 稿件映射的PGC剧集信息
+ Season season = 7;
+ // 充电排行
+ ElecRank elec_rank = 8;
+ // 历史观看进度
+ History history = 9;
+ // 视频相关推荐列表
+ repeated Relate relates = 10;
+ // 不感兴趣原因
+ Dislike dislike = 11;
+ // 播放图标动画配置档
+ PlayerIcon player_icon = 12;
+ //
+ string vip_active = 13;
+ // 稿件bvid
+ string bvid = 14;
+ // 获得荣誉信息
+ Honor honor = 15;
+ // 相关推荐顶部tab
+ repeated RelateTab relate_tab = 16;
+ // 参与的活动页面url
+ string activity_url = 17;
+ // 稿件引用bgm列表
+ repeated Bgm bgm = 18;
+ // 联合投稿成员列表
+ repeated Staff staff = 19;
+ // 争议信息
+ string argue_msg = 20;
+ // 短链接
+ string short_link = 21;
+ // 播放实验
+ // 1:相关推荐自动播放
+ int32 play_param = 22;
+ // 标签
+ Label label = 23;
+ // UGC视频合集信息
+ UgcSeason ugc_season = 24;
+ // 配置信息
+ Config config = 25;
+ // 分享副标题(已观看xxx次)
+ string share_subtitle = 26;
+ // 互动视频信息
+ Interaction interaction = 27;
+ // 错误码
+ // DEFAULT:正常 CODE404:视频被UP主删除
+ ECode ecode = 28;
+ // 404页信息
+ CustomConfig custom_config = 29;
+ // 广告
+ repeated CM cms = 30;
+ // 广告配置
+ CMConfig cm_config = 31;
+ // 播放页定制tab
+ Tab tab = 32;
+ // 排行榜
+ Rank rank = 33;
+ // 免流面板定制
+ TFPanelCustomized tf_panel_customized = 34;
+ // UP主发起活动
+ UpAct up_act = 35;
+ // 用户装扮
+ UserGarb user_garb = 36;
+ // 大型活动合集
+ ActivitySeason activity_season = 37;
+ // 评论样式
+ string badge_url = 38;
+ // 直播预约信息
+ LiveOrderInfo live_order_info = 39;
+ // 稿件简介v2
+ repeated DescV2 desc_v2 = 40;
+ //
+ CmIpad cm_ipad = 41;
+ //
+ repeated ViewMaterial sticker = 42;
+ //
+ UpLikeImg up_like_img = 43;
+ //
+ LikeCustom like_custom = 44;
+ //
+ repeated Tag desc_tag = 45;
+ //
+ SpecialCell special_cell = 46;
+ //
+ Online online = 47;
+ //
+ google.protobuf.Any cm_under_player = 48;
+ //
+ repeated ViewMaterial video_source = 49;
+ //
+ repeated SpecialCell special_cell_new = 50;
+ //
+ PremiereResource premiere = 51;
+ //
+ bool refresh_special_cell = 52;
+ //
+ MaterialLeft material_left = 53;
+ //
+ int64 notes_count = 54;
+ //
+ PullClientAction pull_action = 55;
+ //
+ ArcExtra arc_extra = 56;
+ //
+ bilibili.pagination.PaginationReply pagination = 57;
+ //
+ LikeAnimation like_animation = 58;
+ //
+ ReplyStyle reply_preface = 59;
+ //
+ RefreshPage refresh_page = 60;
+ //
+ CoinCustom coin_custom = 61;
+}
+
+// 视频页详情页-请求
+message ViewReq {
+ // 稿件avid(av/bv任选其一)
+ int64 aid = 1;
+ // 稿件bvid(av/bv任选其一)
+ string bvid = 2;
+ // 来源
+ string from = 3;
+ // AI trackid
+ string trackid = 4;
+ // 广告扩展数据
+ string ad_extra = 5;
+ // 清晰度(旧版)
+ int32 qn = 6;
+ // 流版本(旧版)
+ int32 fnver = 7;
+ // 流类型(旧版)
+ int32 fnval = 8;
+ // 是否强制使用域名(旧版)
+ int32 force_host = 9;
+ // 是否允许4K(旧版)
+ int32 fourk = 10;
+ // 当前页面spm
+ string spmid = 11;
+ // 上一页面spm
+ string from_spmid = 12;
+ //
+ int32 autoplay = 13;
+ // 视频秒开参数
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 14;
+ //
+ string page_version = 15;
+ //
+ string biz_extra = 16;
+ //
+ int64 device_type = 17;
+ //
+ int64 relates_page = 18;
+ //
+ string session_id = 19;
+ //
+ int32 in_feed_play = 20;
+ //
+ string play_mode = 21;
+ //
+ bilibili.pagination.Pagination pagination = 22;
+ //
+ int32 refresh = 23;
+ //
+ int32 refresh_num = 24;
+}
+
+//
+message ViewTagReply {
+ //
+ repeated SpecialCell special_cell_new = 1;
+ //
+ MaterialLeft material_left = 2;
+}
+
+//
+message ViewTagReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ int64 cid = 3;
+ //
+ string spmid = 4;
+}
+
+// 会员信息
+message Vip {
+ //会员类型
+ int32 type = 1;
+ //到期时间
+ int64 due_date = 2;
+ //
+ string due_remark = 3;
+ //
+ int32 access_status = 4;
+ //会员状态
+ int32 vip_status = 5;
+ //
+ string vip_status_warn = 6;
+ //
+ int32 theme_type = 7;
+ //
+ VipLabel label = 8;
+}
+
+// 会员类型标签
+message VipLabel {
+ //
+ string path = 1;
+ //
+ string text = 2;
+ //
+ string label_theme = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/app/viewunite/common.proto b/bili-api/grpc/proto/bilibili/app/viewunite/common.proto
new file mode 100644
index 000000000..4af085d65
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/viewunite/common.proto
@@ -0,0 +1,2011 @@
+syntax = "proto3";
+
+package bilibili.app.viewunite.common;
+
+option java_multiple_files = true;
+
+import "bilibili/dagw/component/avatar/v1/avatar.proto";
+import "bilibili/pagination/pagination.proto";
+import "google/protobuf/any.proto";
+
+//
+message Activity {
+ //
+ int32 id = 1;
+ //
+ string title = 2;
+ //
+ string link = 3;
+ //
+ string cover = 4;
+ //
+ int32 type = 5;
+ //
+ string ab = 6;
+ //
+ string show_name = 7;
+ //
+ string picurl = 8;
+ //
+ string picurl_selected = 9;
+ //
+ string h5_link = 10;
+ //
+ string jump_mode = 11;
+ //
+ repeated Item items = 12;
+}
+
+//
+message ActivityEntrance {
+ //
+ string activity_cover = 1;
+ //
+ string activity_title = 2;
+ //
+ string word_tag = 3;
+ //
+ string activity_subtitle = 4;
+ //
+ string activity_link = 5;
+ //
+ int32 activity_type = 6;
+ //
+ int32 reserve_id = 7;
+ //
+ int32 status = 8;
+ //
+ repeated User upper_list = 9;
+ //
+ map report = 10;
+}
+
+//
+message ActivityEntranceModule {
+ //
+ repeated ActivityEntrance activity_entrance = 1;
+}
+
+//
+message ActivityReserve {
+ //
+ string title = 1;
+ //
+ StatInfo vt = 2;
+ //
+ StatInfo danmaku = 3;
+ //
+ ReserveButton button = 4;
+}
+
+//
+message ActivityResource {
+ //
+ string mod_pool_name = 1;
+ //
+ string mod_resource_name = 2;
+}
+
+//
+message ActivityTab {
+ //
+ int32 id = 1;
+ //
+ string title = 2;
+ //
+ int32 type = 3;
+ //
+ string show_name = 4;
+ //
+ string picurl = 5;
+ //
+ string picurl_selected = 6;
+ //
+ string h5_link = 7;
+ //
+ string link = 8;
+ //
+ int32 link_type = 9;
+ //
+ int64 biz_key = 10;
+ //
+ string desc = 11;
+ //
+ string act_ext = 12;
+ //
+ map report = 13;
+}
+
+//
+message AggEpCard {
+ //
+ string title = 1;
+ //
+ string cover = 2;
+ //
+ string icon = 3;
+ //
+ int32 num = 4;
+ //
+ string jump_url = 5;
+}
+
+//
+message AggEps {
+ //
+ repeated AggEpCard agg_ep_cards = 1;
+ //
+ int32 place_index = 2;
+}
+
+//
+message AttentionRecommend {}
+
+//
+enum AttentionRelationStatus {
+ //
+ ARS_NONE = 0;
+ //
+ ARS_N0RELATION = 1;
+ //
+ ARS_FOLLOWHIM = 2;
+ //
+ ARS_FOLLOWME = 3;
+ //
+ ARS_BUDDY = 4;
+ //
+ ARS_SPECIAL = 5;
+ //
+ ARS_CANCELBLOCK = 6;
+}
+
+//
+message Audio {
+ //
+ map audio_info = 1;
+}
+
+//
+message AudioInfo {
+ //
+ string title = 1;
+ //
+ string cover_url = 2;
+ //
+ int64 song_id = 3;
+ //
+ int64 play_count = 4;
+ //
+ int64 reply_count = 5;
+ //
+ int64 upper_id = 6;
+ //
+ string entrance = 7;
+ //
+ int64 song_attr = 8;
+}
+
+//
+message BadgeInfo {
+ //
+ string text = 1;
+ //
+ string text_color = 2;
+ //
+ string text_color_night = 3;
+ //
+ string bg_color = 4;
+ //
+ string bg_color_night = 5;
+ //
+ string border_color = 6;
+ //
+ string border_color_night = 7;
+ //
+ int32 bg_style = 8;
+ //
+ string img = 9;
+ //
+ int32 type = 10;
+}
+
+//
+message Banner {
+ //
+ string title = 1;
+ //
+ repeated RelateItem relate_item = 2;
+}
+
+//
+message BizFavParam {
+ //
+ int64 season_id = 1;
+}
+
+//
+message BizReserveActivityParam {
+ //
+ int64 activity_id = 1;
+ //
+ string from = 2;
+ //
+ string type = 3;
+ //
+ int64 oid = 4;
+ //
+ int64 reserve_id = 5;
+}
+
+//
+message Button {
+ //
+ string title = 1;
+ //
+ string left_strikethrough_text = 2;
+ //
+ string type = 3;
+ //
+ string link = 4;
+ //
+ BadgeInfo badge_info = 5;
+ //
+ string sub_title = 6;
+}
+
+//
+message CardBasicInfo {
+ //
+ string title = 1;
+ //
+ string desc = 2;
+ //
+ string cover = 3;
+ //
+ string uri = 4;
+ //
+ string track_id = 5;
+ //
+ string unique_id = 6;
+ //
+ int64 from_source_type = 7;
+ //
+ string from_source_id = 8;
+ //
+ int64 material_id = 9;
+ //
+ string cover_gif = 10;
+ //
+ Owner author = 11;
+ //
+ int64 id = 12;
+ //
+ string from = 13;
+ //
+ string from_spmid_suffix = 14;
+ //
+ string report_flow_data = 15;
+}
+
+//
+message CardStyle {
+ //
+ int32 id = 1;
+ //
+ string name = 2;
+}
+
+//
+message Celebrity {
+ //
+ int32 id = 1;
+ //
+ string name = 2;
+ //
+ string role = 3;
+ //
+ string avatar = 4;
+ //
+ string short_desc = 5;
+ //
+ string desc = 6;
+ //
+ string character_avatar = 7;
+ //
+ string link = 8;
+ //
+ int64 mid = 9;
+ //
+ int32 is_follow = 10;
+ //
+ string occupation_name = 11;
+ //
+ int32 occupation_type = 12;
+ //
+ int32 relate_attr = 13;
+ //
+ string small_avatar = 14;
+ //
+ map report = 15;
+}
+
+//
+message CharacterGroup {
+ //
+ string title = 1;
+ //
+ repeated Celebrity characters = 2;
+}
+
+//
+message Characters {
+ //
+ repeated CharacterGroup groups = 1;
+}
+
+//
+message CoinExtend {
+ //
+ string coin_app_zip_icon = 1;
+ //
+ string coin_app_icon_1 = 2;
+ //
+ string coin_app_icon_2 = 3;
+ //
+ string coin_app_icon_3 = 4;
+ //
+ string coin_app_icon_4 = 5;
+}
+
+//
+message CombinationEp {
+ //
+ int32 id = 1;
+ //
+ int32 section_id = 2;
+ //
+ string title = 3;
+ //
+ int32 can_ord_desc = 4;
+ //
+ string more = 5;
+ //
+ repeated int32 episode_ids = 6;
+ //
+ repeated ViewEpisode episodes = 7;
+ //
+ string split_text = 8;
+ //
+ Style module_style = 9;
+ //
+ repeated SerialSeason serial_season = 10;
+ //
+ SectionData section_data = 11;
+}
+
+//
+message Covenanter {}
+
+//
+message DeliveryData {
+ //
+ string title = 1;
+ //
+ Style module_style = 2;
+ //
+ string more = 3;
+ //
+ oneof data {
+ //
+ Activity activity = 4;
+ //
+ Characters characters = 5;
+ //
+ TheatreHotTopic theatre_hot_topic = 6;
+ //
+ AggEps agg_eps = 7;
+ }
+ //
+ int32 id = 8;
+ //
+ map report = 9;
+}
+
+//
+message Desc {
+ //
+ string info = 1;
+ //
+ string title = 2;
+}
+
+enum DescType {
+ //
+ DescTypeUnknown = 0;
+ //
+ DescTypeText = 1;
+ //
+ DescTypeAt = 2;
+}
+
+//
+message DescV2 {
+ //
+ string text = 1;
+ //
+ int32 type = 2;
+ //
+ string uri = 3;
+ //
+ int64 rid = 4;
+}
+
+//
+message Dimension {
+ //
+ int64 width = 1;
+ //
+ int64 height = 2;
+ //
+ int64 rotate = 3;
+}
+
+//
+message DislikeReasons {
+ //
+ int64 id = 1;
+ //
+ int64 mid = 2;
+ //
+ int32 rid = 3;
+ //
+ int64 tag_id = 4;
+ //
+ string name = 5;
+}
+
+//
+message FollowLayer {
+ //
+ Staff staff = 1;
+ //
+ Desc desc = 2;
+ //
+ map report = 3;
+}
+
+//
+message Headline {
+ //
+ Label label = 1;
+ //
+ string content = 2;
+}
+
+//
+message HistoryNode {
+ //
+ int64 node_id = 1;
+ //
+ string title = 2;
+ //
+ int64 cid = 3;
+}
+
+// 荣誉 Banner
+message Honor {
+ //
+ string icon = 1;
+ //
+ string icon_night = 2;
+ //
+ string text = 3;
+ //
+ string text_extra = 4;
+ //
+ string text_color = 5;
+ //
+ string text_color_night = 6;
+ //
+ string bg_color = 7;
+ //
+ string bg_color_night = 8;
+ //
+ string url = 9;
+ //
+ string url_text = 10;
+ //
+ HonorType type = 11;
+ //
+ HonorJumpType honor_jump_type = 12;
+ //
+ map report = 13;
+}
+
+// 荣誉 Banner 跳转类型
+enum HonorJumpType {
+ //
+ HONOR_JUMP_TYPE_UNKNOWN = 0;
+ //
+ HONOR_OPEN_URL = 1;
+ //
+ HONOR_HALF_SCREEN = 2;
+}
+
+// 荣誉类型
+enum HonorType {
+ //
+ HONOR_NONE = 0;
+ //
+ PLAYLET = 1;
+ // 视频存在争议
+ ARGUE = 2;
+ //
+ NOTICE = 3;
+ //
+ GUIDANCE = 4;
+ // 哔哩哔哩榜
+ HONOR_BILI_RANK = 5;
+ // 周榜
+ HONOR_WEEKLY_RANK = 6;
+ // 日榜
+ HONOR_DAILY_RANK = 7;
+ //
+ HONOR_CHANNEL = 8;
+ // 音乐榜?
+ HONOR_MUSIC = 9;
+ //
+ HONOR_REPLY = 10;
+}
+
+//
+message IconFont {
+ //
+ string name = 1;
+ //
+ string text = 2;
+}
+
+//
+message Interaction {
+ //
+ int64 ep_id = 1;
+ //
+ HistoryNode history_node = 2;
+ //
+ int64 graph_version = 3;
+ //
+ string msg = 4;
+ //
+ bool is_interaction = 5;
+}
+
+//
+message Item {
+ //
+ string link = 1;
+ //
+ string cover = 2;
+}
+
+//
+message KingPos {
+ //
+ bool disable = 1;
+ //
+ string icon = 2;
+ //
+ KingPositionType type = 3;
+ //
+ string disable_toast = 4;
+ //
+ string checked_post = 5;
+ //
+ oneof extend {
+ //
+ LikeExtend like = 6;
+ //
+ CoinExtend coin = 7;
+ }
+}
+
+//
+message KingPosition {
+ //
+ repeated KingPos king_pos = 1;
+ //
+ repeated KingPos extenf = 2;
+}
+
+//
+enum KingPositionType {
+ //
+ KING_POS_UNSPECIFIED = 0;
+ //
+ LIKE = 1;
+ //
+ DISLIKE = 2;
+ //
+ COIN = 3;
+ //
+ FAV = 4;
+ //
+ SHARE = 5;
+ //
+ CACHE = 6;
+ //
+ DANMAKU = 7;
+}
+
+//
+message Label {
+ //
+ int32 type = 1;
+ //
+ string uri = 2;
+ //
+ string icon = 3;
+ //
+ string icon_night = 4;
+ //
+ int64 icon_width = 5;
+ //
+ int64 icon_height = 6;
+ //
+ string lottie = 7;
+ //
+ string lottie_night = 8;
+}
+
+//
+message LikeComment {
+ //
+ string reply = 1;
+ //
+ string title = 2;
+}
+
+//
+message LikeExtend {
+ //
+ UpLikeImg triple_like = 1;
+ //
+ string like_animation = 2;
+ //
+ PlayerAnimation player_animation = 3;
+ //
+ ActivityResource resource = 4;
+}
+
+//
+message Live {
+ //
+ int64 mid = 1;
+ //
+ int64 room_id = 2;
+ //
+ string uri = 3;
+ //
+ string endpage_uri = 4;
+}
+
+// 直播预约信息
+message LiveOrder {
+ //
+ int64 sid = 1;
+ //
+ string text = 2;
+ //
+ int64 live_plan_start_time = 3;
+ //
+ bool is_follow = 4;
+ //
+ int64 follow_count = 5;
+}
+
+//
+message Mine {
+ //
+ double amount = 1;
+ //
+ int32 rank = 2;
+ //
+ string msg = 3;
+}
+
+//
+message Module {
+ //
+ ModuleType type = 1;
+ //
+ oneof data {
+ //
+ OgvIntroduction ogv_introduction = 2;
+ //
+ UgcIntroduction ugc_introduction = 3;
+ //
+ KingPosition king_position = 4;
+ //
+ Headline head_line = 5;
+ //
+ OgvTitle ogv_title = 6;
+ //
+ Honor honor = 7;
+ //
+ UserList list = 8;
+ //
+ Staffs staffs = 9;
+ //
+ ActivityReserve activity_reserve = 10;
+ //
+ LiveOrder live_order = 11;
+ //
+ SectionData section_data = 12;
+ //
+ DeliveryData delivery_data = 13;
+ //
+ FollowLayer follow_layer = 14;
+ //
+ OgvSeasons ogv_seasons = 15;
+ //
+ UgcSeasons ugc_season = 16;
+ //
+ OgvLiveReserve ogv_live_reserve = 17;
+ //
+ CombinationEp combination_ep = 18;
+ //
+ Sponsor sponsor = 19;
+ //
+ ActivityEntranceModule activity_entrance_module = 20;
+ //
+ SerialSeason serial_season = 21;
+ //
+ Relates relates = 22;
+ //
+ Banner banner = 23;
+ //
+ Audio audio = 24;
+ //
+ LikeComment like_comment = 25;
+ //
+ AttentionRecommend attention_recommend = 26;
+ //
+ Covenanter covenanter = 27;
+ }
+}
+
+enum ModuleType {
+ //
+ UNKNOWN = 0;
+ //
+ OGV_INTRODUCTION = 1;
+ //
+ OGV_TITLE = 2;
+ //
+ UGC_HEADLINE = 3;
+ //
+ UGC_INTRODUCTION = 4;
+ //
+ KING_POSITION = 5;
+ //
+ MASTER_USER_LIST = 6;
+ //
+ STAFFS = 7;
+ //
+ HONOR = 8;
+ //
+ OWNER = 9;
+ //
+ PAGE = 10;
+ //
+ ACTIVITY_RESERVE = 11;
+ //
+ LIVE_ORDER = 12;
+ //
+ POSITIVE = 13;
+ //
+ SECTION = 14;
+ //
+ RELATE = 15;
+ //
+ PUGV = 16;
+ //
+ COLLECTION_CARD = 17;
+ //
+ ACTIVITY = 18;
+ //
+ CHARACTER = 19;
+ //
+ FOLLOW_LAYER = 20;
+ //
+ OGV_SEASONS = 21;
+ //
+ UGC_SEASON = 22;
+ //
+ OGV_LIVE_RESERVE = 23;
+ //
+ COMBINATION_EPISODE = 24;
+ //
+ SPONSOR = 25;
+ //
+ ACTIVITY_ENTRANCE = 26;
+ //
+ THEATRE_HOT_TOPIC = 27;
+ //
+ RELATED_RECOMMEND = 28;
+ //
+ PAY_BAR = 29;
+ //
+ BANNER = 30;
+ //
+ AUDIO = 31;
+ //
+ AGG_CARD = 32;
+ //
+ SINGLE_EP = 33;
+ //
+ LIKE_COMMENT = 34;
+ //
+ ATTENTION_RECOMMEND = 35;
+ //
+ COVENANTER = 36;
+}
+
+//
+message MultiViewEp {
+ //
+ int64 ep_id = 1;
+}
+
+//
+message NewEp {
+ //
+ int32 id = 1;
+ //
+ string title = 2;
+ //
+ string desc = 3;
+ //
+ int32 is_new = 4;
+ //
+ string more = 5;
+ //
+ string cover = 6;
+ //
+ string index_show = 7;
+}
+
+//
+enum OccupationType {
+ //
+ STAFF = 0;
+ //
+ CAST = 1;
+}
+
+//
+message OfficialVerify {
+ //
+ int32 type = 1;
+ //
+ string desc = 2;
+}
+
+//
+message OgvIntroduction {
+ //
+ string followers = 1;
+ //
+ string score = 2;
+ //
+ StatInfo play_data = 3;
+}
+
+//
+message OgvLiveReserve {
+ //
+ int64 reserve_id = 1;
+ //
+ string title = 2;
+ //
+ string icon = 3;
+ //
+ string night_icon = 4;
+ //
+ string click_button = 5;
+ //
+ string link = 6;
+ //
+ int32 follow_video_is_reserve_live = 7;
+ //
+ string bg_color = 8;
+ //
+ string night_bg_color = 9;
+ //
+ string text_color = 10;
+ //
+ string night_text_color = 11;
+ //
+ string bt_bg_color = 12;
+ //
+ string bt_frame_color = 13;
+ //
+ string night_bt_bg_color = 14;
+ //
+ string night_bt_frame_color = 15;
+ //
+ int32 active_type = 16;
+ //
+ int32 reserve_status = 17;
+ //
+ string bt_text_color = 18;
+ //
+ string night_bt_text_color = 19;
+ //
+ map report = 20;
+}
+
+//
+message OgvSeasons {
+ //
+ string title = 1;
+ //
+ repeated SerialSeason serial_season = 2;
+ //
+ SerialSeasonCoverStyle style = 3;
+}
+
+//
+message OgvTitle {
+ //
+ string title = 1;
+ //
+ BadgeInfo badge_info = 2;
+ //
+ int32 is_show_btn_animation = 3;
+ //
+ int32 follow_video_is_reserve_live = 4;
+ //
+ int64 reserve_id = 5;
+ //
+ TitleDeliveryButton title_delivery_button = 6;
+}
+
+//
+message Owner {
+ bilibili.dagw.component.avatar.v1.AvatarItem avatar = 1;
+ //
+ string url = 2;
+ //
+ string title = 3;
+ //
+ string fans = 4;
+ //
+ string arc_count = 5;
+ //
+ int32 attention = 6;
+ //
+ int32 attention_relation = 7;
+ //
+ string pub_location = 8;
+ //
+ Vip vip = 9;
+ //
+ string title_url = 10;
+ //
+ string face = 11;
+ //
+ int64 mid = 12;
+ //
+ OfficialVerify official_verify = 13;
+ //
+ Live live = 14;
+ //
+ int64 fans_num = 15;
+ //
+ repeated int64 assists = 16;
+}
+
+//
+message Page {
+ //
+ int64 cid = 1;
+ //
+ string part = 2;
+ //
+ int64 duration = 3;
+ //
+ string desc = 4;
+ //
+ Dimension dimension = 5;
+ //
+ string dl_title = 6;
+ //
+ string dl_subtitle = 7;
+}
+
+//
+message Pendant {
+ //
+ int32 pid = 1;
+ //
+ string name = 2;
+ //
+ string image = 3;
+}
+
+//
+message PlayerAnimation {
+ //
+ string player_icon = 1;
+ //
+ string player_triple_icon = 2;
+}
+
+//
+message PointActivity {
+ //
+ string tip = 1;
+ //
+ string content = 2;
+ //
+ string link = 3;
+}
+
+//
+message PowerIconStyle {
+ //
+ string icon_url = 1;
+ //
+ string icon_night_url = 2;
+ //
+ int64 icon_width = 3;
+ //
+ int64 icon_height = 4;
+}
+
+//
+message Rank {
+ //
+ string icon = 1;
+ //
+ string icon_night = 2;
+ //
+ string text = 3;
+}
+
+//
+message RankInfo {
+ //
+ string icon_url_night = 1;
+ //
+ string icon_url_day = 2;
+ //
+ string bkg_night_color = 3;
+ //
+ string bkg_day_color = 4;
+ //
+ string font_night_color = 5;
+ //
+ string font_day_color = 6;
+ //
+ string rank_content = 7;
+ //
+ string rank_link = 8;
+}
+
+//
+message Rating {
+ //
+ string score = 1;
+ //
+ int32 count = 2;
+}
+
+// 视频详情下方推荐卡子类型: 普通视频
+message RelateAVCard {
+ //
+ int64 duration = 1;
+ //
+ int64 cid = 2;
+ //
+ Dimension dimension = 3;
+ //
+ Stat stat = 4;
+ //
+ string jump_url = 5;
+ //
+ bool show_up_name = 6;
+ //
+ BadgeInfo rcmd_reason = 7;
+}
+
+// 视频详情下方推荐卡子类型: 番剧(小卡?)
+message RelateBangumiAvCard {
+ //
+ BadgeInfo badge = 1;
+ //
+ Stat stat = 2;
+ //
+ Rating rating = 3;
+}
+
+// 视频详情下方推荐卡子类型: 番剧(大卡?)
+message RelateBangumiCard {
+ //
+ int32 season_id = 1;
+ //
+ int32 season_type = 2;
+ //
+ NewEp new_ep = 3;
+ //
+ Stat stat = 4;
+ //
+ Rating rating = 5;
+ //
+ string rcmd_reason = 6;
+ //
+ BadgeInfo badge_info = 7;
+ //
+ string goto_type = 8;
+ //
+ map report = 9;
+}
+
+// 视频详情下方推荐卡子类型: 番剧集?
+message RelateBangumiResourceCard {
+ //
+ int32 type = 1;
+ //
+ string scover = 2;
+ //
+ int32 re_type = 3;
+ //
+ string re_value = 4;
+ //
+ string corner = 5;
+ //
+ int32 card = 6;
+ //
+ string siz = 7;
+ //
+ int32 position = 8;
+ //
+ string rcmd_reason = 9;
+ //
+ string label = 10;
+ //
+ map report = 11;
+ //
+ string goto_type = 12;
+}
+
+// 视频详情下方推荐卡子类型: UGC 番剧?
+message RelateBangumiUgcCard {
+ //
+ BadgeInfo badge = 1;
+ //
+ Stat stat = 2;
+ //
+ Rating rating = 3;
+}
+
+// 视频详情下方推荐卡
+message RelateCard {
+ //
+ RelateCardType relate_card_type = 1;
+ //
+ oneof card {
+ //
+ RelateAVCard av = 2;
+ //
+ RelateBangumiCard bangumi = 3;
+ //
+ RelateBangumiResourceCard resource = 4;
+ //
+ RelateGameCard game = 5;
+ //
+ RelateCMCard cm = 6;
+ //
+ RelateLiveCard live = 7;
+ //
+ RelateBangumiAvCard bangumi_av = 8;
+ //
+ RelatedAICard ai_card = 9;
+ //
+ RelateBangumiUgcCard bangumi_ugc = 13;
+ //
+ RelateSpecial special = 14;
+ }
+ //
+ RelateThreePoint three_point = 10;
+ //
+ google.protobuf.Any cm_stock = 11;
+ //
+ CardBasicInfo basic_info = 12;
+}
+
+// 视频详情下方推荐卡子类型
+enum RelateCardType {
+ //
+ CARD_TYPE_UNKNOWN = 0;
+ //
+ AV = 1;
+ //
+ BANGUMI = 2;
+ //
+ RESOURCE = 3;
+ //
+ GAME = 4;
+ //
+ CM = 5;
+ //
+ LIVE = 6;
+ //
+ AI_RECOMMEND = 7;
+ //
+ BANGUMI_AV = 8;
+ //
+ BANGUMI_UGC = 9;
+ //
+ SPECIAL = 10;
+}
+
+// 视频详情下方推荐卡子类型: 广告推广
+message RelateCMCard {
+ //
+ int64 aid = 1;
+ //
+ google.protobuf.Any source_content = 2;
+ //
+ int64 duration = 3;
+ //
+ Stat stat = 4;
+}
+
+// 视频详情下方推荐配置
+message RelateConfig {
+ //
+ int64 valid_show_m = 1;
+ //
+ int64 valid_show_n = 2;
+ //
+ bilibili.pagination.Pagination pagination = 3;
+ //
+ bool can_load_more = 4;
+}
+
+// 视频详情下方推荐卡子类型: AI 推荐?
+message RelatedAICard {
+ //
+ int64 aid = 1;
+ //
+ int64 duration = 2;
+ //
+ Staff up_info = 3;
+ //
+ Stat stat = 4;
+ //
+ map report = 5;
+ //
+ string goto_type = 6;
+}
+
+// 视频详情下方推荐卡子类型: 点击不喜欢后占位卡片
+message RelateDislike {
+ //
+ string title = 1;
+ //
+ string sub_title = 2;
+ //
+ string closed_sub_title = 3;
+ //
+ string paste_text = 4;
+ //
+ string closed_paste_text = 5;
+ //
+ repeated DislikeReasons dislike_reason = 6;
+ //
+ string toast = 7;
+ //
+ string closed_toast = 8;
+}
+
+// 视频详情下方推荐卡子类型: 游戏推广
+message RelateGameCard {
+ //
+ int64 reserve_status = 1;
+ //
+ string reserve_status_text = 2;
+ //
+ string reserve = 3;
+ //
+ float rating = 4;
+ //
+ string tag_name = 5;
+ //
+ RankInfo rank_info = 6;
+ //
+ Button pack_info = 7;
+ //
+ Button notice = 8;
+ //
+ PowerIconStyle power_icon_style = 9;
+ //
+ string game_rcmd_reason = 10;
+ //
+ WikiInfo wiki_info = 11;
+ //
+ BadgeInfo badge = 12;
+}
+
+//
+message RelateItem {
+ //
+ string url = 1;
+ //
+ string cover = 2;
+ //
+ bool use_default_browser = 3;
+}
+
+// 视频详情下方推荐卡子类型: 直播
+message RelateLiveCard {
+ //
+ int64 icon_type = 1;
+ //
+ string area_name = 2;
+ //
+ int64 watched_show = 3;
+ //
+ int64 live_status = 4;
+}
+
+// 视频下方推荐区
+message Relates {
+ //
+ repeated RelateCard cards = 1;
+ //
+ RelateConfig config = 2;
+}
+
+// 视频详情下方推荐卡子类型: 其他特殊
+message RelateSpecial {
+ //
+ BadgeInfo badge = 1;
+ //
+ BadgeInfo rcmd_reason = 2;
+}
+
+// 视频详情下方推荐卡右上角三点的内容
+message RelateThreePoint {
+ //
+ RelateDislike dislike = 1;
+ //
+ RelateDislike feedback = 2;
+ //
+ bool watch_later = 3;
+ //
+ string dislike_report_data = 4;
+}
+
+//
+enum ReserveBizType {
+ //
+ BizTypeNone = 0;
+ //
+ BizTypeReserveActivity = 1;
+ //
+ BizTypeFavSeason = 2;
+}
+
+//
+message ReserveButton {
+ //
+ bool status = 1;
+ //
+ string text = 3;
+ //
+ string selected_text = 4;
+ //
+ ReserveBizType order_type = 7;
+ //
+ oneof order_param {
+ //
+ BizReserveActivityParam reserve = 8;
+ //
+ BizFavParam fav = 9;
+ }
+}
+
+//
+message Rights {
+ //
+ int32 allow_download = 1;
+ //
+ int32 allow_review = 2;
+ //
+ int32 can_watch = 3;
+ //
+ string resource = 4;
+ //
+ int32 allow_dm = 5;
+ //
+ int32 allow_demand = 6;
+ // 区域限制
+ int32 area_limit = 7;
+}
+
+//
+message SeasonHead {
+ //
+ string title = 1;
+ //
+ string intro = 2;
+ //
+ StatInfo vt = 3;
+ //
+ StatInfo danmaku = 4;
+}
+
+//
+message SeasonShow {
+ //
+ string button_text = 1;
+ //
+ string join_text = 2;
+ //
+ string rule_text = 3;
+ //
+ string checkin_text = 4;
+ //
+ string checkin_prompt = 5;
+}
+
+enum SeasonType {
+ //
+ Unknown = 0;
+ //
+ Base = 1;
+ //
+ Good = 2;
+}
+
+//
+message SectionData {
+ //
+ int32 id = 1;
+ //
+ int32 section_id = 2;
+ //
+ string title = 3;
+ //
+ int32 can_ord_desc = 4;
+ //
+ string more = 5;
+ //
+ repeated int32 episode_ids = 6;
+ //
+ repeated ViewEpisode episodes = 7;
+ //
+ string split_text = 8;
+ //
+ Style module_style = 9;
+ //
+ string more_bottom_desc = 10;
+ //
+ repeated SerialSeason seasons = 11;
+ //
+ Button more_left = 12;
+ //
+ int32 type = 13;
+ //
+ map report = 14;
+}
+
+//
+message SerialSeason {
+ //
+ int32 season_id = 1;
+ //
+ string title = 2;
+ //
+ string season_title = 3;
+ //
+ int32 is_new = 4;
+ //
+ string cover = 5;
+ //
+ string badge = 6;
+ //
+ int32 badge_type = 7;
+ //
+ BadgeInfo badge_info = 8;
+ //
+ string link = 9;
+ //
+ string resource = 10;
+ //
+ NewEp new_ep = 11;
+}
+
+enum SerialSeasonCoverStyle {
+ //
+ TITLE = 0;
+ //
+ PICTURE = 1;
+}
+
+//
+message SkipRange {
+ //
+ int32 start = 1;
+ //
+ int32 end = 2;
+}
+
+//
+message Sponsor {
+ //
+ int64 total = 1;
+ //
+ int64 week = 2;
+ //
+ repeated SponsorRank rank_list = 3;
+ //
+ Mine mine = 4;
+ //
+ PointActivity point_activity = 5;
+ //
+ repeated Pendant pendants = 6;
+ //
+ repeated Threshold threshold = 7;
+}
+
+//
+message SponsorRank {
+ //
+ int64 uid = 1;
+ //
+ string msg = 2;
+ //
+ string uname = 3;
+ //
+ string face = 4;
+ //
+ Vip vip = 5;
+}
+
+//
+message Staff {
+ //
+ int64 mid = 1;
+ //
+ int32 attention = 2;
+ //
+ string title = 3;
+ //
+ string name = 4;
+ //
+ string face = 5;
+ //
+ OfficialVerify official = 6;
+ //
+ Vip vip = 7;
+ //
+ int32 label_style = 8;
+ //
+ string fans = 9;
+}
+
+//
+message Staffs {
+ //
+ repeated Staff staff = 1;
+ //
+ string title = 2;
+}
+
+//
+message Stat {
+ // 视频观看时长
+ StatInfo vt = 1;
+ // 弹幕
+ StatInfo danmaku = 2;
+ // 回复数
+ int64 reply = 3;
+ // 收藏数
+ int64 fav = 4;
+ // 硬币数
+ int64 coin = 5;
+ // 分享数
+ int64 share = 6;
+ // 点赞数
+ int64 like = 7;
+ // 关注数
+ int64 follow = 8;
+}
+
+//
+message StatInfo {
+ //
+ int64 value = 1;
+ //
+ string text = 2;
+ //
+ string pure_text = 3;
+ //
+ string icon = 4;
+}
+
+//
+message Style {
+ //
+ int32 line = 1;
+ //
+ int32 hidden = 2;
+ //
+ repeated string show_pages = 3;
+}
+
+//
+message Tag {
+ //
+ int64 tag_id = 1;
+ //
+ string name = 2;
+ //
+ string uri = 3;
+ //
+ string tag_type = 4;
+}
+
+//
+message TheatreHotTopic {
+ //
+ int64 theatre_id = 1;
+ //
+ int64 theatre_set_id = 2;
+ //
+ string theatre_title = 3;
+ //
+ string background_image_url = 4;
+ //
+ string theatre_url = 5;
+ //
+ int64 hot_topic_id = 6;
+ // Original one is hottopicsetid, here renamed
+ int64 hot_topic_set_id = 7;
+ // Original one is hottopictitle, here renamed
+ string hot_topic_title = 8;
+ //
+ string hot_topic_url = 9;
+ //
+ int32 is_subscribe = 10;
+ //
+ map report = 11;
+}
+
+//
+message Threshold {
+ //
+ int32 bp = 1;
+ //
+ int32 days = 2;
+ //
+ string days_text = 3;
+}
+
+//
+message TitleDeliveryButton {
+ //
+ string icon = 1;
+ //
+ string title = 2;
+ //
+ string link = 3;
+ //
+ map report = 4;
+}
+
+//
+message UgcEpisode {
+ //
+ int64 id = 1;
+ //
+ int64 aid = 2;
+ //
+ int64 cid = 3;
+ //
+ string title = 4;
+ //
+ string cover = 5;
+ //
+ string cover_right_text = 6;
+ //
+ Page page = 7;
+ //
+ StatInfo vt = 8;
+ //
+ StatInfo danmaku = 9;
+}
+
+//
+message UgcIntroduction {
+ //
+ repeated Tag tags = 1;
+ //
+ Rating rating = 2;
+ //
+ Rank rank = 3;
+ //
+ repeated ViewMaterial bgm = 4;
+ //
+ repeated ViewMaterial sticker = 5;
+ //
+ repeated ViewMaterial video_source = 6;
+ //
+ int64 pubdate = 7;
+ //
+ repeated DescV2 desc = 8;
+}
+
+//
+message UgcSeasonActivity {
+ //
+ int32 type = 1;
+ //
+ int64 oid = 2;
+ //
+ int64 activity_id = 3;
+ //
+ string title = 4;
+ //
+ string intro = 5;
+ //
+ int32 day_count = 6;
+ //
+ int32 user_count = 7;
+ //
+ int64 join_deadline = 8;
+ //
+ int64 activity_deadline = 9;
+ //
+ int32 checkin_view_time = 10;
+ //
+ bool new_activity = 11;
+ //
+ UserActivity user_activity = 12;
+ //
+ SeasonShow season_show = 13;
+}
+
+//
+message UgcSeasons {
+ //
+ int64 id = 1;
+ //
+ string title = 2;
+ //
+ string cover = 3;
+ //
+ string supernatant_title = 4;
+ //
+ repeated UgcSection section = 5;
+ //
+ string union_title = 6;
+ //
+ SeasonHead head = 7;
+ //
+ int64 ep_count = 8;
+ //
+ int32 season_type = 9;
+ //
+ UgcSeasonActivity activity = 10;
+ //
+ repeated string season_ability = 11;
+ //
+ string season_title = 12;
+}
+
+//
+message UgcSection {
+ //
+ int64 id = 1;
+ //
+ string title = 2;
+ //
+ int64 type = 3;
+ //
+ repeated UgcEpisode episodes = 4;
+}
+
+//
+message UpLikeImg {
+ //
+ string pre_img = 1;
+ //
+ string suc_img = 2;
+ //
+ string content = 3;
+ //
+ int64 type = 4;
+}
+
+//
+message User {
+ //
+ int64 mid = 1;
+ //
+ string name = 2;
+ //
+ string face = 3;
+ //
+ int64 follower = 4;
+}
+
+//
+message UserActivity {
+ //
+ int32 user_state = 1;
+ //
+ int64 last_checkin_date = 2;
+ //
+ int32 checkin_today = 3;
+ //
+ int32 user_day_count = 4;
+ //
+ int32 user_view_time = 5;
+ //
+ string portrait = 6;
+}
+
+//
+message UserList {
+ //
+ repeated User list = 1;
+ //
+ string title = 2;
+}
+
+//
+message UserStatus {
+ //
+ int32 show = 1;
+ //
+ int32 follow = 2;
+}
+
+//
+message ViewEpisode {
+ //
+ int64 ep_id = 1;
+ //
+ string badge = 2;
+ //
+ int32 badge_type = 3;
+ //
+ BadgeInfo badge_info = 4;
+ //
+ int32 duration = 5;
+ //
+ int32 status = 6;
+ //
+ string cover = 7;
+ //
+ int64 aid = 8;
+ //
+ string title = 9;
+ //
+ string movie_title = 10;
+ //
+ string subtitle = 11;
+ //
+ string long_title = 12;
+ //
+ string toast_title = 13;
+ //
+ int64 cid = 14;
+ //
+ string from = 15;
+ //
+ string share_url = 16;
+ //
+ string share_copy = 17;
+ //
+ string short_link = 18;
+ //
+ string vid = 19;
+ //
+ string release_date = 20;
+ //
+ Dimension dimension = 21;
+ //
+ Rights rights = 22;
+ //
+ Interaction interaction = 23;
+ //
+ string bvid = 24;
+ //
+ int32 archive_attr = 25;
+ //
+ string link = 26;
+ //
+ string link_type = 27;
+ //
+ string bmid = 28;
+ //
+ int64 pub_time = 29;
+ //
+ int32 pv = 30;
+ //
+ int32 ep_index = 31;
+ //
+ int32 section_index = 32;
+ //
+ repeated Staff up_infos = 33;
+ //
+ Staff up_info = 34;
+ //
+ string dialog_type = 35;
+ //
+ string toast_type = 36;
+ //
+ repeated MultiViewEp multi_view_eps = 37;
+ //
+ bool is_sub_view = 38;
+ //
+ bool is_view_hide = 39;
+ //
+ string jump_link = 40;
+ //
+ Stat stat_for_unity = 41;
+ //
+ map report = 42;
+}
+
+//
+message ViewMaterial {
+ //
+ int64 oid = 1;
+ //
+ int64 mid = 2;
+ //
+ string title = 3;
+ //
+ string author = 4;
+ //
+ string jump_url = 5;
+}
+
+//
+message Vip {
+ //
+ int32 type = 1;
+ //
+ int32 vip_status = 2;
+ //
+ int32 theme_type = 3;
+ //
+ VipLabel label = 4;
+ //
+ int32 is_vip = 5;
+}
+
+//
+message VipLabel {
+ //
+ string path = 1;
+ //
+ string text = 2;
+ //
+ string label_theme = 3;
+}
+
+//
+message WikiInfo {
+ //
+ string wiki_label = 1;
+ //
+ string wiki_url = 2;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/viewunite/pgcanymodel.proto b/bili-api/grpc/proto/bilibili/app/viewunite/pgcanymodel.proto
new file mode 100644
index 000000000..234ad68af
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/viewunite/pgcanymodel.proto
@@ -0,0 +1,247 @@
+syntax = "proto3";
+
+package bilibili.app.viewunite.pgcanymodel;
+
+option java_multiple_files = true;
+
+import "bilibili/app/viewunite/common.proto";
+
+//
+message Earphone {
+ //
+ string product_model = 1;
+ //
+ string like_toast_text = 2;
+ //
+ string switch_toast_text = 3;
+ //
+ string like_toast_voice = 4;
+}
+
+//
+message EarphoneConf {
+ //
+ repeated Earphone sp_phones = 1;
+}
+
+//
+message MultiViewInfo {
+ //
+ bool is_multi_view_season = 1;
+ //
+ string changing_dance = 2;
+}
+
+//
+message OgvData {
+ //
+ int32 media_id = 1;
+ //
+ int64 season_id = 2;
+ //
+ int32 season_type = 3;
+ //
+ int32 show_season_type = 4;
+ //
+ Rights rights = 5;
+ //
+ UserStatus user_status = 6;
+ //
+ int64 aid = 7;
+ //
+ Stat stat = 8;
+ //
+ int32 mode = 9;
+ //
+ Publish publish = 10;
+ //
+ PlayStrategy play_strategy = 11;
+ //
+ MultiViewInfo multi_view_info = 12;
+ //
+ OgvSwitch ogv_switch = 13;
+ //
+ int32 total_ep = 14;
+ //
+ bilibili.app.viewunite.common.NewEp new_ep = 15;
+ //
+ Reserve reserve = 16;
+ //
+ int32 status = 17;
+ //
+ repeated PlayFloatLayerActivity activity_float_layer = 18;
+ //
+ EarphoneConf earphone_conf = 19;
+ //
+ string cover = 20;
+ //
+ string square_cover = 21;
+ //
+ string share_url = 22;
+ //
+ string short_link = 23;
+ //
+ string title = 24;
+ //
+ string horizontal_cover169 = 25;
+ //
+ string horizontal_cover1610 = 26;
+ //
+ int32 has_can_play_ep = 27;
+}
+
+//
+message OgvSwitch {
+ //
+ int32 reduce_short_title_spacing = 1;
+ //
+ int32 merge_position_section_for_cinema = 2;
+ //
+ int32 merge_preview_section = 3;
+ //
+ int32 enable_show_vt_info = 4;
+}
+
+// 播放器浮层广告(?)
+message PlayFloatLayerActivity {
+ //
+ int32 id = 1;
+ //
+ string title = 2;
+ //
+ int32 type = 3;
+ //
+ int32 ad_badge_type = 4;
+ //
+ string link = 5;
+ //
+ string pic_url = 6;
+ //
+ string pic_anima_url = 7;
+ //
+ bilibili.app.viewunite.common.BadgeInfo badge = 8;
+ //
+ int64 show_rate_time = 9;
+}
+
+//
+message PlayStrategy {
+ //
+ repeated string strategies = 1;
+ //
+ int32 recommend_show_strategy = 2;
+ //
+ string auto_play_toast = 3;
+}
+
+//
+message Publish {
+ //
+ string pub_time = 1;
+ //
+ string pub_time_show = 2;
+ //
+ int32 is_started = 3;
+ //
+ int32 is_finish = 4;
+ //
+ int32 weekday = 5;
+ //
+ string release_date_show = 6;
+ //
+ string time_length_show = 7;
+ //
+ int32 unknow_pub_date = 8;
+ //
+ string update_info_desc = 9;
+}
+
+//
+message Reserve {
+ //
+ repeated bilibili.app.viewunite.common.ViewEpisode episodes = 1;
+ //
+ string tip = 2;
+}
+
+// 权限相关信息
+message Rights {
+ //
+ int32 allow_download = 1;
+ //
+ int32 allow_review = 2;
+ //
+ int32 can_watch = 3;
+ //
+ int32 is_cover_show = 4;
+ //
+ string copyright = 5;
+ //
+ string copyright_name = 6;
+ //
+ int32 allow_bp = 7;
+ //
+ int32 area_limit = 8;
+ //
+ int32 is_preview = 9;
+ //
+ int32 ban_area_show = 10;
+ //
+ int32 watch_platform = 11;
+ //
+ int32 allow_bp_rank = 12;
+ //
+ string resource = 13;
+ //
+ int32 forbid_pre = 14;
+ //
+ int32 only_vip_download = 15;
+ //
+ int32 new_allow_download = 16;
+}
+
+//
+message Stat {
+ //
+ string followers = 1;
+ //
+ bilibili.app.viewunite.common.StatInfo play_data = 2;
+}
+
+//
+message UserStatus {
+ //
+ int32 show = 1;
+ //
+ int32 follow = 2;
+ //
+ int32 follow_status = 3;
+ //
+ int32 pay = 4;
+ //
+ int32 sponsor = 5;
+ //
+ int32 vip = 6;
+ // vip 是否被冻结
+ int32 vip_frozen = 7;
+ //
+ WatchProgress watch_progress = 8;
+}
+
+//
+message ViewPgcAny {
+ //
+ OgvData ogv_data = 1;
+ //
+ map all_up_info = 2;
+}
+
+//
+message WatchProgress {
+ //
+ int64 last_ep_id = 1;
+ //
+ string last_ep_index = 2;
+ //
+ int64 last_time = 3;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/viewunite/ugcanymodel.proto b/bili-api/grpc/proto/bilibili/app/viewunite/ugcanymodel.proto
new file mode 100644
index 000000000..692b1821f
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/viewunite/ugcanymodel.proto
@@ -0,0 +1,136 @@
+syntax = "proto3";
+
+package bilibili.app.viewunite.ugcanymodel;
+
+option java_multiple_files = true;
+
+import "bilibili/app/viewunite/common.proto";
+
+//
+message Dislike {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ repeated DislikeReason reasons = 3;
+}
+
+//
+message DislikeReason {
+ //
+ int64 id = 1;
+ //
+ int64 mid = 2;
+ //
+ int32 rid = 3;
+ //
+ int64 tag_id = 4;
+ //
+ string name = 5;
+}
+
+//
+message ElecRank {
+ //
+ repeated ElecRankItem list = 1;
+ //
+ int64 count = 2;
+ //
+ string text = 3;
+}
+
+//
+message ElecRankItem {
+ //
+ string avatar = 1;
+ //
+ string nickname = 2;
+ //
+ string message = 3;
+ //
+ int64 mid = 4;
+}
+
+//
+message Premiere {
+ //
+ PremiereState premiere_state = 1;
+ //
+ int64 start_time = 2;
+ //
+ int64 service_time = 3;
+ //
+ int64 room_id = 4;
+}
+
+//
+message PremiereReserve {
+ //
+ int64 reserve_id = 1;
+ //
+ int64 count = 2;
+ //
+ bool is_follow = 3;
+}
+
+//
+message PremiereResource {
+ //
+ Premiere premiere = 1;
+ //
+ PremiereReserve reserve = 2;
+ //
+ PremiereText text = 3;
+}
+
+enum PremiereState {
+ //
+ premiere_none = 0;
+ //
+ premiere_before = 1;
+ //
+ premiere_in = 2;
+ //
+ premiere_after = 3;
+}
+
+//
+message PremiereText {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ string online_text = 3;
+ //
+ string online_icon = 4;
+ //
+ string online_icon_dark = 5;
+ //
+ string intro_title = 6;
+ //
+ string intro_icon = 7;
+ //
+ string guidance_pulldown = 8;
+ //
+ string guidance_entry = 9;
+ //
+ string intro_icon_night = 10;
+}
+
+//
+message ViewUgcAny {
+ //
+ PremiereResource premiere = 1;
+ //
+ Dislike dislike = 2;
+ //
+ string short_link = 3;
+ //
+ string share_subtitle = 4;
+ //
+ repeated bilibili.app.viewunite.common.Page pages = 5;
+ //
+ ElecRank elec_rank = 6;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/app/viewunite/v1/viewunite.proto b/bili-api/grpc/proto/bilibili/app/viewunite/v1/viewunite.proto
new file mode 100644
index 000000000..18ba49dc5
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/app/viewunite/v1/viewunite.proto
@@ -0,0 +1,837 @@
+syntax = "proto3";
+
+package bilibili.app.viewunite.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/archive/middleware/v1/preload.proto";
+import "bilibili/app/viewunite/common.proto";
+import "bilibili/pagination/pagination.proto";
+import "google/protobuf/any.proto";
+
+// 统一视频信息接口 (7.41.0+)
+service View {
+ //
+ rpc ArcRefresh(ArcRefreshReq) returns (ArcRefreshReply);
+ // 视频详情页下方推荐
+ rpc RelatesFeed(RelatesFeedReq) returns (RelatesFeedReply);
+ //
+ rpc View(ViewReq) returns (ViewReply);
+ //
+ rpc ViewProgress(ViewProgressReq) returns (ViewProgressReply);
+}
+
+//
+message ActivityResource {
+ //
+ string dark_text_color = 1;
+ //
+ string divider_color = 2;
+ //
+ string bg_color = 3;
+ //
+ string selected_bg_color = 4;
+ //
+ string text_color = 5;
+ //
+ string light_text_color = 6;
+}
+
+// 业务信息
+message Arc {
+ //
+ int64 aid = 1;
+ //
+ int64 cid = 2;
+ //
+ int64 duration = 3;
+ //
+ bilibili.app.viewunite.common.Stat stat = 4;
+ //
+ string bvid = 5;
+ //
+ int32 copyright = 6;
+ //
+ Rights right = 7;
+ //
+ string cover = 8;
+ //
+ int64 type_id = 9;
+ //
+ string title = 10;
+}
+
+//
+message ArcRefreshReply {
+ //
+ bilibili.app.viewunite.common.Stat stat = 1;
+ //
+ SimpleReqUser req_user = 2;
+ //
+ SimpleArc arc = 3;
+ //
+ Online online = 4;
+ //
+ LikeConfig like_config = 5;
+}
+
+//
+message ArcRefreshReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+}
+
+//
+message AttentionCard {
+ //
+ repeated ShowTime show_time = 1;
+}
+
+//
+message BizFollowVideoParam {
+ //
+ int64 season_id = 1;
+}
+
+//
+message BizJumpLinkParam {
+ //
+ string url = 1;
+}
+
+//
+message BizReserveActivityParam {
+ //
+ int64 activity_id = 1;
+ //
+ string from = 2;
+ //
+ string type = 3;
+ //
+ int64 oid = 4;
+ //
+ int64 reserve_id = 5;
+}
+
+//
+message BizReserveGameParam {
+ //
+ int64 game_id = 1;
+}
+
+enum BizType {
+ //
+ BizTypeNone = 0;
+ //
+ BizTypeFollowVideo = 1;
+ //
+ BizTypeReserveActivity = 2;
+ //
+ BizTypeJumpLink = 3;
+ //
+ BizTypeFavSeason = 4;
+ //
+ BizTypeReserveGame = 5;
+}
+
+//
+message Button {
+ //
+ string title = 1;
+ //
+ string uri = 2;
+ //
+ string icon = 3;
+ //
+ JumpShowType jump_show_type = 4;
+}
+
+//
+message ChargingPlus {
+ //
+ bool pass = 1;
+ //
+ repeated PlayToast play_toast = 2;
+}
+
+//
+message Chronos {
+ //
+ string md5 = 1;
+ //
+ string file = 2;
+ //
+ string sign = 3;
+}
+
+//
+message ChronosParam {
+ //
+ string engine_version = 1;
+ //
+ string message_protocol = 2;
+ //
+ string service_key = 3;
+}
+
+// 推广信息
+message CM {
+ //
+ google.protobuf.Any cm_under_player = 1;
+ //
+ google.protobuf.Any ads_control = 2;
+ //
+ repeated google.protobuf.Any source_content = 3;
+}
+
+//
+message CommandDm {
+ //
+ int64 id = 1;
+ //
+ int64 oid = 2;
+ //
+ int64 mid = 3;
+ //
+ string command = 4;
+ //
+ string content = 5;
+ //
+ int32 progress = 6;
+ //
+ string ctime = 7;
+ //
+ string mtime = 8;
+ //
+ string extra = 9;
+ //
+ string idstr = 10;
+}
+
+// 播放器配置
+message Config {
+ //
+ Online online = 1;
+ //
+ PlayerIcon player_icon = 2;
+ //
+ StoryEntrance story_entrance = 3;
+}
+
+// 视频播放时弹出的卡片
+message ContractCard {
+ // 在第几秒弹出
+ float display_progress = 1;
+ //
+ int64 display_accuracy = 2;
+ // 弹出后停留的时间
+ int64 display_duration = 3;
+ // 展示方式, 暂未知对应关系
+ int32 show_mode = 4;
+ // 页面类型, 暂未知对应关系
+ int32 page_type = 5;
+ //
+ UpperInfos upper = 6;
+ //
+ int32 is_follow_display = 7;
+ // 卡片的文字说明信息
+ ContractText text = 8;
+ //
+ int64 follow_display_end_duration = 9;
+ //
+ int32 is_play_display = 10;
+ //
+ int32 is_interact_display = 11;
+}
+
+// 视频播放时弹出的卡片的文字说明信息
+message ContractText {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ string inline_title = 3;
+}
+
+//
+message Control {
+ //
+ bool limit = 1;
+}
+
+//
+message DmResource {
+ //
+ repeated CommandDm command_dms = 1;
+ //
+ AttentionCard attention = 2;
+ //
+ repeated OperationCard cards = 3;
+}
+
+enum ECode {
+ //
+ CODE_DEFAULT = 0;
+ //
+ CODE_404 = 1;
+ // 青少年限制
+ CODE_TEENAGER = 78301;
+}
+
+//
+message ECodeConfig {
+ //
+ string redirect_url = 1;
+}
+
+//
+message IconData {
+ //
+ string meta_json = 1;
+ //
+ string sprits_img = 2;
+}
+
+// 视频介绍 Tab
+message IntroductionTab {
+ //
+ string title = 1;
+ //
+ repeated bilibili.app.viewunite.common.Module modules = 2;
+}
+
+enum JumpShowType {
+ //
+ JST_DEFAULT = 0;
+ //
+ JST_FULLSCREEN = 1;
+ //
+ JST_HALFSCREEN = 2;
+}
+
+//
+message LikeConfig {
+ bilibili.app.viewunite.common.UpLikeImg triple_like = 1;
+ //
+ string like_animation = 2;
+}
+
+// 素材详情
+message Material {
+ //
+ string icon = 1;
+ //
+ string text = 2;
+ //
+ string url = 3;
+ //
+ MaterialBizType type = 4;
+ //
+ string param = 5;
+ //
+ string static_icon = 6;
+ //
+ string bg_color = 7;
+ //
+ string bg_pic = 8;
+ //
+ int32 jump_type = 9;
+ //
+ PageType page_type = 10;
+ //
+ bool need_login = 11;
+}
+
+// 素材类型
+enum MaterialBizType {
+ //
+ NONE = 0;
+ //
+ ACTIVITY = 1;
+ //
+ BGM = 2;
+ //
+ EFFECT = 3;
+ //
+ SHOOT_SAME = 4;
+ //
+ SHOOT_TOGETHER = 5;
+ //
+ ACTIVITY_ICON = 6;
+ //
+ NEW_BGM = 7;
+}
+
+// 素材来源
+enum MaterialSource {
+ //
+ DEFAULT = 0;
+ // 必剪素材
+ BIJIAN = 1;
+}
+
+//
+message Online {
+ //
+ bool online_show = 1;
+}
+
+//
+message OperationCard {
+ //
+ int64 id = 1;
+ //
+ int32 from = 2;
+ //
+ int32 to = 3;
+ //
+ bool status = 4;
+ //
+ BizType biz_type = 5;
+ //
+ OperationCardContent content = 6;
+ //
+ oneof param {
+ //
+ BizFollowVideoParam follow = 7;
+ //
+ BizReserveActivityParam reserve = 8;
+ //
+ BizJumpLinkParam jump = 9;
+ //
+ BizReserveGameParam game = 10;
+ }
+}
+
+//
+message OperationCardContent {
+ //
+ string title = 1;
+ //
+ string subtitle = 2;
+ //
+ string icon = 3;
+ //
+ string button_title = 4;
+ //
+ string button_selected_title = 5;
+ //
+ bool show_selected = 6;
+}
+
+//
+enum PageCategory {
+ //
+ COMMON_PAGE = 0;
+ //
+ ACTIVITY_PAGE = 1;
+}
+
+//
+message PageControl {
+ Control toast_show = 1;
+ Control material_show = 2;
+ Control up_show = 3;
+}
+
+// 页面类型
+enum PageType {
+ // H5页面(Webview)
+ H5 = 0;
+ // 原生页面(native)
+ NA = 1;
+}
+
+//
+message PlayerIcon {
+ //
+ string url1 = 1;
+ //
+ string hash1 = 2;
+ //
+ string url2 = 3;
+ //
+ string hash2 = 4;
+ //
+ string drag_left_png = 5;
+ //
+ string middle_png = 6;
+ //
+ string drag_right_png = 7;
+ //
+ IconData drag_data = 8;
+ //
+ IconData nodrag_data = 9;
+}
+
+//
+message PlayToast {
+ //
+ PlayToastEnum business = 1;
+ //
+ string icon_url = 2;
+ //
+ string text = 3;
+}
+
+enum PlayToastEnum {
+ //
+ PLAYTOAST_UNKNOWN = 0;
+ //
+ PLAYTOAST_CHARGINGPLUS = 1;
+}
+
+//
+message PointMaterial {
+ //
+ string url = 1;
+ //
+ MaterialSource material_source = 2;
+}
+
+//
+message Relate {
+ //
+ int64 device_type = 1;
+ //
+ bilibili.pagination.Pagination pagination = 2;
+}
+
+// 视频详情页下方推荐 Reply
+message RelatesFeedReply {
+ //
+ repeated bilibili.app.viewunite.common.RelateCard relates = 1;
+ //
+ bilibili.pagination.Pagination pagination = 2;
+}
+
+// 视频详情页下方推荐 Req
+message RelatesFeedReq {
+ //
+ int64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ string from = 3;
+ //
+ string spmid = 4;
+ //
+ string from_spmid = 5;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 6;
+ //
+ bilibili.pagination.Pagination pagination = 7;
+ //
+ string session_id = 8;
+ //
+ int64 auto_play = 9;
+ //
+ string from_track_id = 10;
+}
+
+//
+message ReplyStyle {
+ //
+ string badge_url = 1;
+ //
+ string badge_text = 2;
+ //
+ int64 badge_type = 3;
+}
+
+//
+message ReplyTab {
+ //
+ ReplyStyle reply_style = 1;
+ //
+ string title = 2;
+ //
+ TabControl control = 3;
+}
+
+//
+message ReqUser {
+ //
+ int32 favorite = 1;
+ //
+ int32 like = 2;
+ //
+ int32 coin = 3;
+ //
+ int32 fav_season = 4;
+ //
+ int32 follow = 5;
+ //
+ int32 dislike = 6;
+ // 头像旁充电按钮
+ Button elec_plus_btn = 7;
+ //
+ ChargingPlus charging_plus = 8;
+}
+
+//
+message Rights {
+ //
+ bool only_vip_download = 1;
+ //
+ bool no_reprint = 2;
+ //
+ bool download = 3;
+}
+
+//
+message ShowTime {
+ //
+ int32 start_time = 1;
+ //
+ int32 end_time = 2;
+ //
+ double pos_x = 3;
+ //
+ double pos_y = 4;
+}
+
+//
+message SimpleArc {
+ //
+ int32 copyright = 1;
+}
+
+//
+message SimpleReqUser {
+ //
+ int32 favorite = 1;
+ //
+ int32 like = 2;
+ //
+ int32 coin = 3;
+}
+
+//
+message StoryEntrance {
+ //
+ bool arc_play_story = 1;
+ //
+ string story_icon = 2;
+ //
+ bool arc_landscape_story = 3;
+ //
+ string landscape_icon = 4;
+ //
+ bool play_story = 5;
+}
+
+//
+message Tab {
+ //
+ repeated TabModule tab_module = 1;
+ //
+ string tab_bg = 2;
+ //
+ TabControl danmaku_entrance = 3;
+}
+
+// 评论区/弹幕 Tab 控制
+message TabControl {
+ //
+ bool limit = 1;
+ //
+ bool disable = 2;
+ //
+ string disable_click_tip = 3;
+}
+
+//
+message TabModule {
+ //
+ TabType tab_type = 1;
+ //
+ oneof tab {
+ //
+ IntroductionTab introduction = 2;
+ //
+ ReplyTab reply = 3;
+ //
+ bilibili.app.viewunite.common.ActivityTab activity_tab = 4;
+ }
+}
+
+enum TabType {
+ //
+ TAB_NONE = 0;
+ // 详情 Tab
+ TAB_INTRODUCTION = 1;
+ // 评论区 Tab
+ TAB_REPLY = 2;
+ // OGV 活动信息 Tab
+ TAB_OGV_ACTIVITY = 3;
+}
+
+//
+enum UnionType {
+ //
+ UGC = 0;
+ //
+ OGV = 1;
+}
+
+// UP主信息(可是Upper这个... 程序员英文不过关吧? )
+message UpperInfos {
+ // 粉丝数
+ uint64 fans_count = 1;
+ // 过去半年内的稿件数
+ uint64 arc_count_last_half_year = 2;
+ //
+ int64 first_up_dates = 3;
+ // UP稿件总播放数
+ uint64 total_play_count = 4;
+}
+
+//
+message VideoGuide {
+ //
+ repeated Material material = 1;
+ //
+ VideoViewPoint video_point = 2;
+ //
+ ContractCard contract_card = 3;
+}
+
+//
+message VideoPoint {
+ //
+ int32 type = 1;
+ //
+ int64 from = 2;
+ //
+ int64 to = 3;
+ //
+ string content = 4;
+ //
+ string cover = 5;
+ //
+ string logo_url = 6;
+}
+
+//
+message VideoShot {
+ //
+ string pv_data = 1;
+ //
+ int32 img_x_len = 2;
+ //
+ int32 imd_x_size = 3;
+ //
+ int32 img_y_len = 4;
+ //
+ int32 img_y_size = 5;
+ //
+ repeated string image = 6;
+}
+
+//
+message VideoViewPoint {
+ //
+ repeated VideoPoint points = 1;
+ //
+ PointMaterial point_material = 2;
+ //
+ bool point_permanent = 3;
+}
+
+//
+message ViewBase {
+ //
+ UnionType union_type = 1;
+ //
+ PageType page_type = 2;
+ //
+ PageControl control = 3;
+ //
+ ActivityResource activity_resource = 4;
+ //
+ Config config = 5;
+}
+
+//
+message ViewProgressReply {
+ //
+ VideoGuide video_guide = 1;
+ //
+ Chronos chronos = 2;
+ //
+ VideoShot arc_shot = 3;
+ //
+ DmResource dm = 4;
+}
+
+//
+message ViewProgressReq {
+ //
+ uint64 aid = 1;
+ //
+ uint64 cid = 2;
+ //
+ uint64 up_mid = 3;
+ //
+ ChronosParam chronos_param = 4;
+ //
+ UnionType type = 5;
+}
+
+//
+message ViewReply {
+ //
+ ViewBase view_base = 1;
+ //
+ Arc arc = 2;
+ //
+ ReqUser req_user = 3;
+ //
+ bilibili.app.viewunite.common.Owner owner = 4;
+ //
+ Tab tab = 5;
+ //
+ google.protobuf.Any supplement = 6;
+ //
+ CM cm = 7;
+ //
+ ECode ecode = 8;
+ //
+ ECodeConfig ecode_config = 9;
+ //
+ map report = 10;
+}
+
+//
+message ViewReq {
+ //
+ uint64 aid = 1;
+ //
+ string bvid = 2;
+ //
+ string from = 3;
+ //
+ string spmid = 4;
+ //
+ string from_spmid = 5;
+ //
+ string session_id = 6;
+ //
+ bilibili.app.archive.middleware.v1.PlayerArgs player_args = 7;
+ //
+ string track_id = 8;
+ //
+ map extra_content = 9;
+ //
+ string play_mode = 10;
+ //
+ Relate relate = 11;
+ //
+ string biz_extra = 12;
+ //
+ string ad_extra = 13;
+}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/app/wall/v1/wall.proto b/bili-api/grpc/proto/bilibili/app/wall/v1/wall.proto
similarity index 50%
rename from bili-api-grpc/proto/bilibili/app/wall/v1/wall.proto
rename to bili-api/grpc/proto/bilibili/app/wall/v1/wall.proto
index 7f93081bc..4741efd96 100644
--- a/bili-api-grpc/proto/bilibili/app/wall/v1/wall.proto
+++ b/bili-api/grpc/proto/bilibili/app/wall/v1/wall.proto
@@ -13,16 +13,16 @@ service Wall {
// 免流规则信息
message RuleInfo {
// 是否支持免流
- bool tf = 1;
- // 操作模式
- // break:无 replace:替换 proxy:代理
- string m = 2;
- // 操作参数
- string a = 3;
- // 匹配目标正则
- string p = 4;
- //
- repeated string a_backup = 5;
+ bool tf = 1;
+ // 操作模式
+ // break:无 replace:替换 proxy:代理
+ string m = 2;
+ // 操作参数
+ string a = 3;
+ // 匹配目标正则
+ string p = 4;
+ //
+ repeated string a_backup = 5;
}
// 获取免流规则信息-请求
@@ -30,17 +30,17 @@ message RuleRequest {}
// 免流规则信息组
message RulesInfo {
- // 免流规则信息
- repeated RuleInfo rulesInfo = 1;
+ // 免流规则信息
+ repeated RuleInfo rulesInfo = 1;
}
// 获取免流规则信息-响应
message RulesReply {
- // 各ISP的免流规则信息组
- // ISP如: cu ct cm
- map rulesInfo = 1;
- //
- string hash_value = 2;
+ // 各ISP的免流规则信息组
+ // ISP如: cu ct cm
+ map rulesInfo = 1;
+ //
+ string hash_value = 2;
}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/editor/notify.proto b/bili-api/grpc/proto/bilibili/broadcast/message/editor/notify.proto
new file mode 100644
index 000000000..efa1c0000
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/editor/notify.proto
@@ -0,0 +1,32 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.editor;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+
+//
+service OperationNotify {
+ //
+ rpc OperationNotify(google.protobuf.Empty) returns (stream Notify);
+}
+
+message Notify {
+ // 消息唯一标示
+ int64 msg_id = 1;
+ // 消息类型
+ int32 msg_type = 2;
+ // 接收方uid
+ int64 receiver_uid = 3;
+ //接收方类型
+ int32 receiver_type = 4;
+ // 故事的版本
+ int64 story_version = 5;
+ // 操作结果的hash值
+ int64 op_hash = 6;
+ // 操作产生用户的uid
+ int64 op_sender = 7;
+ // patch内容
+ string op_content = 8;
+}
\ No newline at end of file
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/esports/notify.proto b/bili-api/grpc/proto/bilibili/broadcast/message/esports/notify.proto
similarity index 100%
rename from bili-api-grpc/proto/bilibili/broadcast/message/esports/notify.proto
rename to bili-api/grpc/proto/bilibili/broadcast/message/esports/notify.proto
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/fission/notify.proto b/bili-api/grpc/proto/bilibili/broadcast/message/fission/notify.proto
similarity index 76%
rename from bili-api-grpc/proto/bilibili/broadcast/message/fission/notify.proto
rename to bili-api/grpc/proto/bilibili/broadcast/message/fission/notify.proto
index ee0dc2f9d..38944efe4 100644
--- a/bili-api-grpc/proto/bilibili/broadcast/message/fission/notify.proto
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/fission/notify.proto
@@ -13,8 +13,8 @@ service Fission {
}
message GameNotifyReply {
- // 类型字段
- uint32 type = 1;
- // 数据字段
- string data = 2;
+ // 类型字段
+ uint32 type = 1;
+ // 数据字段
+ string data = 2;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/im/notify.proto b/bili-api/grpc/proto/bilibili/broadcast/message/im/notify.proto
new file mode 100644
index 000000000..2da24ac91
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/im/notify.proto
@@ -0,0 +1,101 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.im;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+
+//
+service Notify {
+ //
+ rpc WatchNotify(google.protobuf.Empty) returns (stream NotifyRsp);
+}
+
+//
+enum PLType {
+ //
+ EN_PAYLOAD_NORMAL = 0;
+ //
+ EN_PAYLOAD_BASE64 = 1;
+}
+
+//
+enum CmdId {
+ // 非法cmd
+ EN_CMD_ID_INVALID = 0;
+ // 服务端主动发起
+ EN_CMD_ID_MSG_NOTIFY = 1;
+ //
+ EN_CMD_ID_KICK_OUT = 2;
+}
+
+//
+message NotifyRsp {
+ //
+ uint64 uid = 1;
+ // 命令id
+ uint64 cmd = 2;
+ //
+ bytes payload = 3;
+ //
+ PLType payload_type = 4;
+}
+
+//
+message Msg {
+ // 发送方uid
+ uint64 sender_uid = 1;
+ // 接收方类型
+ int32 receiver_type = 2;
+ // 接收方id
+ uint64 receiver_id = 3;
+ // 客户端的序列id 用于服务端去重
+ uint64 cli_msg_id = 4;
+ // 消息类型
+ int32 msg_type = 5;
+ // 消息内容
+ string content = 6;
+ // 服务端的序列号
+ uint64 msg_seqno = 7;
+ // 消息发送时间(服务端时间)
+ uint64 timestamp = 8;
+ // at用户列表
+ repeated uint64 at_uids = 9;
+ // 多人消息
+ repeated uint64 recver_ids = 10;
+ // 消息唯一标示
+ uint64 msg_key = 11;
+ // 消息状态
+ uint32 msg_status = 12;
+ // 是否为系统撤销
+ bool sys_cancel = 13;
+ // 是否是多聊消息 目前群通知管理员的部分通知属于该类消息
+ uint32 is_multi_chat = 14;
+ // 表示撤回的消息的session_seqno 用以后续的比较 实现未读数的正确显示
+ uint64 withdraw_seqno = 15;
+ // 通知码
+ string notify_code = 16;
+ // 消息来源
+ uint32 msg_source = 17;
+}
+
+//
+message NotifyInfo {
+ //
+ uint32 msg_type = 1;
+ //
+ uint64 talker_id = 2;
+ //
+ uint32 session_type = 3;
+}
+
+//
+message ReqServerNotify {
+ // 最新序列号
+ uint64 lastest_seqno = 1;
+ // 即时消息 该类消息主要用于系统通知 当客户端sync msg时 不会sync到此类消息
+ Msg instant_msg = 2;
+ //
+ NotifyInfo notify_info = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/main/dm.proto b/bili-api/grpc/proto/bilibili/broadcast/message/main/dm.proto
new file mode 100644
index 000000000..84da18b3f
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/main/dm.proto
@@ -0,0 +1,65 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.main;
+
+option java_multiple_files = true;
+
+// 实时弹幕事件
+message DanmukuEvent {
+ // 弹幕列表
+ repeated DanmakuElem elems = 1;
+}
+
+// 弹幕条目
+message DanmakuElem {
+ // 弹幕dmid
+ int64 id = 1;
+ // 弹幕出现位置(单位为ms)
+ int32 progress = 2;
+ // 弹幕类型
+ int32 mode = 3;
+ // 弹幕字号
+ int32 fontsize = 4;
+ // 弹幕颜色
+ uint32 color = 5;
+ // 发送着mid hash
+ string mid_hash = 6;
+ // 弹幕正文
+ string content = 7;
+ // 发送时间
+ int64 ctime = 8;
+ // 弹幕动作
+ string action = 9;
+ // 弹幕池
+ int32 pool = 10;
+ // 弹幕id str
+ string id_str = 11;
+}
+
+// 互动弹幕
+message CommandDm {
+ // 弹幕id
+ int64 id = 1;
+ // 对象视频cid
+ int64 oid = 2;
+ // 发送者mid
+ int64 mid = 3;
+ //
+ int32 type = 4;
+ // 互动弹幕指令
+ string command = 5;
+ // 互动弹幕正文
+ string content = 6;
+ // 弹幕状态
+ int32 state = 7;
+ // 出现时间
+ int32 progress = 8;
+ // 创建时间
+ string ctime = 9;
+ // 发布时间
+ string mtime = 10;
+ // 扩展json数据
+ string extra = 11;
+ // 弹幕id str类型
+ string idStr = 12;
+}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/main/native.proto b/bili-api/grpc/proto/bilibili/broadcast/message/main/native.proto
new file mode 100644
index 000000000..b738d4a0d
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/main/native.proto
@@ -0,0 +1,38 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.main;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+
+//
+service NativePage {
+ //
+ rpc WatchNotify(google.protobuf.Empty) returns (stream NativePageEvent);
+}
+
+//
+message NativePageEvent {
+ // Native页ID
+ int64 PageID = 1;
+ //
+ repeated EventItem Items = 2;
+}
+
+//
+message EventItem {
+ // 组件标识
+ int64 ItemID = 1;
+ // 组件类型
+ string Type = 2;
+ // 进度条数值
+ int64 Num = 3;
+ // 进度条展示数值
+ string DisplayNum = 4;
+ // h5的组件标识
+ string WebKey = 5;
+ // 活动统计维度
+ // 0:用户维度 1:规则维度
+ int64 dimension = 6;
+}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/main/resource.proto b/bili-api/grpc/proto/bilibili/broadcast/message/main/resource.proto
new file mode 100644
index 000000000..d270cf5dd
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/main/resource.proto
@@ -0,0 +1,63 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.main;
+
+import "google/protobuf/empty.proto";
+
+option java_multiple_files = true;
+
+//
+service Resource {
+ //
+ rpc TopActivity(google.protobuf.Empty) returns (stream TopActivityReply);
+}
+
+//
+message TopActivityReply {
+ // 当前生效的资源
+ TopOnline online = 1;
+ // 对online内容进行hash和上次结果一样则不重新加载
+ string hash = 2;
+}
+
+// 当前生效的资源
+message TopOnline {
+ // 活动类型
+ // 1:七日活动 2:后台配置
+ int32 type = 1;
+ // 图标
+ string icon = 2;
+ // 跳转链接
+ string uri = 3;
+ // 资源状态标识(后台配置)
+ string unique_id = 4;
+ // 动画资源
+ Animate animate = 5;
+ // 红点
+ RedDot red_dot = 6;
+ // 活动名称
+ string name = 7;
+ // 轮询间隔 单位秒
+ int64 interval = 8;
+}
+
+// 动画资源
+message Animate {
+ // 动效结束展示icon
+ string icon = 1;
+ // 7日活动动画
+ string json = 2;
+ // s10活动svg动画
+ string svg = 3;
+ // 循环次数(默认0不返回 表示无限循环)
+ int32 loop = 4;
+}
+
+// 红点
+message RedDot {
+ // 红点类型
+ // 1:纯红点 2:数字红点
+ int32 type = 1;
+ // 如果是数字红点 显示的数字
+ int32 number = 2;
+}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/main/search.proto b/bili-api/grpc/proto/bilibili/broadcast/message/main/search.proto
new file mode 100644
index 000000000..c5c84f8ea
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/main/search.proto
@@ -0,0 +1,31 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.main;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+import "bilibili/app/dynamic/v2/dynamic.proto";
+
+service Search {
+ rpc ChatResultPush (google.protobuf.Empty) returns (stream ChatResult);
+}
+
+//
+message Bubble {
+ repeated bilibili.app.dynamic.v2.Paragraph paragraphs = 1;
+}
+
+//
+message ChatResult {
+ //
+ int32 code = 1;
+ //
+ string session_id = 2;
+ //
+ repeated Bubble bubble = 3;
+ //
+ string rewrite_word = 4;
+ //
+ string title = 5;
+}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/note/sync.proto b/bili-api/grpc/proto/bilibili/broadcast/message/note/sync.proto
similarity index 100%
rename from bili-api-grpc/proto/bilibili/broadcast/message/note/sync.proto
rename to bili-api/grpc/proto/bilibili/broadcast/message/note/sync.proto
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/ogv/freya.proto b/bili-api/grpc/proto/bilibili/broadcast/message/ogv/freya.proto
new file mode 100644
index 000000000..0837cf351
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/ogv/freya.proto
@@ -0,0 +1,230 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.ogv;
+
+option java_multiple_files = true;
+
+// 播放状态
+enum PlayStatus {
+ // 暂停
+ Pause = 0;
+ // 播放
+ Play = 1;
+ // 终止
+ End = 2;
+}
+
+// 房间类型
+enum RoomType {
+ // 私密
+ Private = 0;
+ // 公开
+ Open = 1;
+}
+
+// 信息通知发送领域
+enum MessageDomain {
+ // 默认
+ DefaultDomain = 0;
+ // 房间用户
+ RoomMid = 1;
+ // 系统通知
+ SystemInfo = 2;
+}
+
+// 通知信息类型
+enum MessageType {
+ // 默认
+ DefaultType = 0;
+ // 房间用户
+ ChatMessage = 1;
+ // 系统通知
+ SystemMessage = 2;
+}
+
+// 触发通知类型
+enum TriggerType {
+ // 默认
+ DefaultTrigger = 0;
+ // 关注、取消关注
+ Relation = 1;
+}
+
+// 房间人员变更事件
+message RoomMemberChangeEvent {
+ // 房间id
+ int64 room_id = 1;
+ // 房主id
+ int64 owner_id = 2;
+ // 房间成员列表
+ repeated UserInfoProto members = 3;
+ // 提示信息
+ MessageProto message = 4;
+}
+
+// 播放进度同步事件
+message ProgressSyncEvent {
+ // 房间id
+ int64 room_id = 1;
+ // 播放中的season_id
+ int64 season_id = 2;
+ // 播放中的episode_id
+ int64 episode_id = 3;
+ // 播放状态
+ PlayStatus status = 4;
+ // 房主播放进度
+ int64 progress = 5;
+ // 提示信息
+ MessageProto message = 6;
+}
+
+// 房间状态更新
+message RoomUpdateEvent {
+ // 房间id
+ int64 room_id = 1;
+ // 房间变更状态
+ RoomType type = 2;
+ // 提示信息
+ MessageProto message = 3;
+}
+
+// 房间销毁通知
+message RoomDestroyEvent {
+ // 房间id
+ int64 room_id = 1;
+ // 提示信息
+ MessageProto message = 4;
+}
+
+// 房间触发通知
+message RoomTriggerEvent {
+ // 操作人
+ int64 mid = 1;
+ // 提示信息
+ MessageProto message = 2;
+ // 触发类型
+ TriggerType trigger = 3;
+}
+
+//用户信息
+message UserInfoProto {
+ // 用户id
+ int64 mid = 1;
+ // 用户头像url
+ string face = 2;
+ // 昵称
+ string nickname = 3;
+ // 等级
+ int32 level = 4;
+ // 签名
+ string sign = 5;
+ // 大会员信息
+ VipProto vip = 6;
+ // 身份认证信息
+ OfficialProto official = 7;
+ // 挂件信息
+ PendantProto pendant = 8;
+ // 设备buvid
+ string buvid = 9;
+}
+
+//通知信息
+message MessageProto {
+ // 可带占位符匹配的消息体 ep "还没有其他小伙伴,[去邀请>]"
+ string content = 1;
+ // 消息体类型
+ // 0:json格式的文本消息 1:支持全文本可点(破冰)
+ int32 content_type = 2;
+}
+
+//大会员信息
+message VipProto {
+ int32 type = 1;
+ int32 status = 2;
+ int64 due_date = 3;
+ int32 vip_pay_type = 4;
+ int32 theme_type = 5;
+ // 大会员角标
+ // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
+ int32 avatar_subscript = 6;
+ // 昵称色值,可能为空,色值示例:#FFFB9E60
+ string nickname_color = 7;
+}
+
+//认证信息
+message OfficialProto {
+ int32 role = 1;
+ string title = 2;
+ string desc = 3;
+ int32 type = 4;
+}
+
+//挂件信息
+message PendantProto {
+ int32 pid = 1;
+ string name = 2;
+ string image = 3;
+ int64 expire = 4;
+ string image_enhance = 5;
+}
+
+// 通用信息通知
+message MessageEvent {
+ // 房间id
+ int64 room_id = 1;
+ // 消息id
+ int64 msg_id = 2;
+ // 消息发送服务端时间 时间戳 单位秒
+ int64 ts = 3;
+ // 信息通知发送主体id
+ int64 oid = 4;
+ // 信息通知发送领域
+ MessageDomain domain = 5;
+ // 通知信息类型
+ MessageType type = 6;
+ // 提示信息
+ MessageProto message = 7;
+ // 消息发送用户信息
+ UserInfoProto user = 8;
+ // 消息id str类型
+ string msg_id2 = 9;
+}
+
+// 聊天信息清除通知
+message RemoveChatEvent {
+ // 房间id
+ int64 room_id = 1;
+ // 撤回的聊天信息id
+ int64 msg_id = 2;
+ // 提示信息
+ MessageProto message = 3;
+}
+
+// "一起看"房间事件
+message FreyaEventBody {
+ // 房间id
+ int64 room_id = 1;
+ // 接收事件消息的白名单用户
+ repeated int64 white_mid = 2;
+ // 不处理信息的黑名单用户 优先级低于白名单 当白名单有数据时 忽略黑名单
+ repeated int64 ignore_mid = 3;
+ //命令类型
+ oneof event {
+ // 房间人员变更事件
+ RoomMemberChangeEvent member_change = 4;
+ // 播放进度同步事件
+ ProgressSyncEvent progress = 5;
+ // 房间状态更新
+ RoomUpdateEvent room_update = 6;
+ // 通用信息通知
+ MessageEvent message = 7;
+ // 聊天信息清除通知
+ RemoveChatEvent remove_chat = 8;
+ // 房间销毁通知
+ RoomDestroyEvent room_destroy = 9;
+ // 房间触发通知
+ RoomTriggerEvent room_trigger = 10;
+ }
+ // 消息序列号
+ int64 sequence_id = 100;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/ogv/live.proto b/bili-api/grpc/proto/bilibili/broadcast/message/ogv/live.proto
new file mode 100644
index 000000000..69299ec4c
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/ogv/live.proto
@@ -0,0 +1,46 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.ogv;
+
+option java_multiple_files = true;
+
+// 开播事件
+message LiveStartEvent {}
+
+// 直播中止事件
+message LiveEndEvent {}
+
+// 在线人数事件
+message LiveOnlineEvent {
+ //在线人数
+ int64 online = 1;
+}
+
+// 变更通知
+message LiveUpdateEvent {
+ // 直播后状态
+ // 1:下线 2:转点播
+ int32 after_premiere_type = 1;
+ // 直播开始绝对时间 单位ms
+ int64 start_time = 2;
+ // id
+ string id = 3;
+ // 服务端播放进度,未打散,负数表示距离开播时间,正数表示已开播时间,单位:毫秒
+ // 用户实际播放进度:progress - delay_time
+ int64 progress = 4;
+}
+
+// 直播间事件
+message CMDBody {
+ //命令类型
+ oneof event {
+ // 开播事件
+ LiveStartEvent start = 1;
+ // 直播中止事件
+ LiveEndEvent emergency = 2;
+ // 在线人数事件
+ LiveOnlineEvent online = 3;
+ // 变更通知
+ LiveUpdateEvent update = 4;
+ }
+}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/message/ticket/activitygame.proto b/bili-api/grpc/proto/bilibili/broadcast/message/ticket/activitygame.proto
similarity index 71%
rename from bili-api-grpc/proto/bilibili/broadcast/message/ticket/activitygame.proto
rename to bili-api/grpc/proto/bilibili/broadcast/message/ticket/activitygame.proto
index 8a0ca8b00..e25a18908 100644
--- a/bili-api-grpc/proto/bilibili/broadcast/message/ticket/activitygame.proto
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/ticket/activitygame.proto
@@ -16,8 +16,8 @@ enum RoomStatus {
// 推送选项
message RoomEvent {
- // RoomStatus 类型
- RoomStatus room_status = 1;
- //
- string room_message = 2;
+ // RoomStatus 类型
+ RoomStatus room_status = 1;
+ //
+ string room_message = 2;
}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/message/tv/proj.proto b/bili-api/grpc/proto/bilibili/broadcast/message/tv/proj.proto
new file mode 100644
index 000000000..519118366
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/message/tv/proj.proto
@@ -0,0 +1,79 @@
+syntax = "proto3";
+
+package bilibili.broadcast.message.tv;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+
+//
+service Tv {
+ // 投屏
+ rpc Proj(google.protobuf.Empty) returns (stream ProjReply);
+ // 直播状态
+ rpc LiveStatus(google.protobuf.Empty) returns (stream LiveStatusNotify);
+ // 赛事比分通知
+ rpc Esports(google.protobuf.Empty) returns (stream EsportsNotify);
+ // 直播插卡
+ rpc Publicity(google.protobuf.Empty) returns (stream PublicityNotify);
+ // 直转点
+ rpc LiveSkip(google.protobuf.Empty) returns (stream LiveSkipNotify);
+}
+
+// 投屏
+message ProjReply {
+ // 投屏命令
+ // 1:起播 2:快进 3:快退 4:seek播放进度 5:暂停 6:暂停恢复
+ int64 cmd_type = 1;
+ // 用户id
+ int64 mid = 2;
+ // 稿件id
+ int64 aid = 3;
+ // 视频id
+ int64 cid = 4;
+ // 视频类型
+ // 0:ugc 1:pgc 2:pugv
+ int64 video_type = 5;
+ // 单集id,pgc和pugv需要传
+ int64 ep_id = 6;
+ // 剧集id
+ int64 season_id = 7;
+ // seek 的位置,cmd位seek时有值,单位秒
+ int64 seek_ts = 8;
+ // 其他指令对应内容
+ string extra = 9;
+}
+
+// 直播状态
+message LiveStatusNotify {
+ // 直播状态
+ // 1:开播 2:关播 3:截流 4:截流恢复
+ int64 status = 1;
+ // 文案
+ string msg = 2;
+ // 直播房间号
+ int64 cid = 3;
+}
+
+//
+message EsportsNotify {
+ // 直播房间号
+ int64 cid = 1;
+}
+
+// 直播插卡
+message PublicityNotify {
+ // 插卡id
+ int64 publicity_id = 1;
+ // 直播房间号
+ int64 room_id = 2;
+ // 直播间状态
+ // 0:未开播 1:直播中 2:轮播中
+ int64 status = 3;
+}
+
+// 直转点
+message LiveSkipNotify {
+ // 直播id
+ int64 live_id = 1;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/broadcast/v1/broadcast.proto b/bili-api/grpc/proto/bilibili/broadcast/v1/broadcast.proto
new file mode 100644
index 000000000..383b9ea59
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/v1/broadcast.proto
@@ -0,0 +1,113 @@
+syntax = "proto3";
+
+package bilibili.broadcast.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/rpc/status.proto";
+import "google/protobuf/any.proto";
+import "google/protobuf/empty.proto";
+
+// broadcast操作,对应每个target_path
+service Broadcast {
+ // 用户鉴权
+ rpc Auth(AuthReq) returns (AuthResp);
+ // 心跳保活:成功心跳为4分45秒,重试心跳为30s,三次收不到进行重连(不超过5分45)
+ rpc Heartbeat(HeartbeatReq) returns (HeartbeatResp);
+ // 订阅target_path
+ rpc Subscribe(TargetPath) returns (google.protobuf.Empty);
+ // 取消订阅target_path
+ rpc Unsubscribe(TargetPath) returns (google.protobuf.Empty);
+ // 消息回执
+ rpc MessageAck(MessageAckReq) returns (google.protobuf.Empty);
+}
+
+// broadcast连接隧道
+service BroadcastTunnel {
+ // 创建双向stream连接隧道
+ rpc CreateTunnel(stream BroadcastFrame) returns (stream BroadcastFrame);
+}
+
+//
+enum Action {
+ UNKNOWN = 0; //
+ UPDATE = 1; //
+ DELETE = 2; //
+}
+
+// 鉴权请求,通过authorization验证绑定用户mid
+message AuthReq {
+ // 冷启动id,算法uuid,重新起启会变
+ string guid = 1;
+ // 连接id,算法uuid,重连会变
+ string conn_id = 2;
+ // 最后收到的消息id,用于过虑重连后获取未读的消息
+ int64 last_msg_id = 3;
+}
+
+// 鉴权返回
+message AuthResp {
+
+}
+
+// target_path:
+// "/" Service-Name "/" {method name} 参考 gRPC Request Path
+message BroadcastFrame {
+ // 请求消息信息
+ FrameOption options = 1;
+ // 业务target_path
+ string target_path = 2;
+ // 业务pb内容
+ google.protobuf.Any body = 3;
+}
+
+// message_id:
+// client: 本次连接唯一的消息id,可用于回执
+// server: 唯一消息id,可用于上报或者回执
+// sequence:
+// client: 客户端应该每次请求时frame seq++,会返回对应的对称req/resp
+// server: 服务端下行消息,只会返回默认值:0
+message FrameOption {
+ // 消息id
+ int64 message_id = 1;
+ // frame序号
+ int64 sequence = 2;
+ // 是否进行消息回执(发出MessageAckReq)
+ // downstream 上只有服务端设置为true,客户端响应
+ // upstream 上只有客户端设置为true,服务端响应
+ // 响应帧禁止设置is_ack,协议上禁止循环
+ // 通常只有业务帧才可能设置is_ack, 因为协议栈(例如心跳、鉴权)另有响应约定
+ bool is_ack = 3;
+ // 业务状态码
+ bilibili.rpc.Status status = 4;
+ // 业务ack来源, 仅downstream时候由服务端填写.
+ string ack_origin = 5;
+ //
+ int64 timestamp = 6;
+}
+
+// 心跳请求
+message HeartbeatReq{
+
+}
+
+// 心跳返回
+message HeartbeatResp{
+
+}
+
+// 消息回执
+message MessageAckReq {
+ // 消息id
+ int64 ack_id = 1;
+ // ack来源,由业务指定用于埋点跟踪
+ string ack_origin = 2;
+ // 消息对应的target_path,方便业务区分和监控统计
+ string target_path = 3;
+}
+
+// target_path
+message TargetPath {
+ // 需要订阅的target_paths
+ repeated string target_paths = 1;
+}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/v1/laser.proto b/bili-api/grpc/proto/bilibili/broadcast/v1/laser.proto
similarity index 80%
rename from bili-api-grpc/proto/bilibili/broadcast/v1/laser.proto
rename to bili-api/grpc/proto/bilibili/broadcast/v1/laser.proto
index 5937a68cf..a7cfed7c2 100644
--- a/bili-api-grpc/proto/bilibili/broadcast/v1/laser.proto
+++ b/bili-api/grpc/proto/bilibili/broadcast/v1/laser.proto
@@ -14,8 +14,8 @@ service Laser {
// 服务端下发日志上报事件
message LaserLogUploadResp {
- // 任务id
- int64 taskid = 1;
- // 下发时间
- string date = 2;
+ // 任务id
+ int64 taskid = 1;
+ // 下发时间
+ string date = 2;
}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/v1/mod.proto b/bili-api/grpc/proto/bilibili/broadcast/v1/mod.proto
similarity index 58%
rename from bili-api-grpc/proto/bilibili/broadcast/v1/mod.proto
rename to bili-api/grpc/proto/bilibili/broadcast/v1/mod.proto
index c91989855..4a6389571 100644
--- a/bili-api-grpc/proto/bilibili/broadcast/v1/mod.proto
+++ b/bili-api/grpc/proto/bilibili/broadcast/v1/mod.proto
@@ -14,16 +14,16 @@ service ModManager {
//
message ModResourceResp {
- //
- int32 atcion = 1;
- //
- string app_key = 2;
- //
- string pool_name = 3;
- //
- string module_name = 4;
- //
- int64 module_version = 5;
- //
- int64 list_version = 6;
+ //
+ int32 atcion = 1;
+ //
+ string app_key = 2;
+ //
+ string pool_name = 3;
+ //
+ string module_name = 4;
+ //
+ int64 module_version = 5;
+ //
+ int64 list_version = 6;
}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/v1/push.proto b/bili-api/grpc/proto/bilibili/broadcast/v1/push.proto
new file mode 100644
index 000000000..6de4f4a0c
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/v1/push.proto
@@ -0,0 +1,132 @@
+syntax = "proto3";
+
+package bilibili.broadcast.v1;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+
+// Push
+service Push {
+ rpc WatchMessage(google.protobuf.Empty) returns (stream PushMessageResp);
+}
+
+//
+enum LinkType {
+ LINK_TYPE_UNKNOWN = 0; // 未知
+ LINK_TYPE_BANGUMI = 1; // 番剧
+ LINK_TYPE_VIDEO = 2; // 视频
+ LINK_TYPE_LIVE = 3; // 直播
+}
+
+//
+message PageBlackList {
+ //
+ string id = 1;
+}
+
+//
+message PageView {
+ //
+ string id = 1;
+}
+
+//
+message PushMessageResp {
+ // 业务类型
+ enum Biz {
+ // 未知
+ BIZ_UNKNOWN = 0;
+ // 视频
+ BIZ_VIDEO = 1;
+ // 直播
+ BIZ_LIVE = 2;
+ // 活动
+ BIZ_ACTIVITY = 3;
+ }
+ // 消息类型
+ enum Type {
+ // 未知
+ TYPE_UNKNOWN = 0;
+ // 默认
+ TYPE_DEFAULT = 1;
+ // 热门
+ TYPE_HOT = 2;
+ // 实时
+ TYPE_REALTIME = 3;
+ // 推荐
+ TYPE_RECOMMEND = 4;
+ }
+ // 展示未知
+ enum Position {
+ // 未知
+ POS_UNKNOWN = 0;
+ // 顶部
+ POS_TOP = 1;
+ }
+ // Deprecated: 推送任务id,使用string
+ int64 old_taskid = 1;
+ // 业务
+ // 1:是视频 2:是直播 3:是活动
+ Biz biz = 2;
+ // 类型
+ // 1:是默认 2:是热门 3:是实时 4:是推荐
+ Type type = 3;
+ // 主标题
+ string title = 4;
+ // 副标题
+ string summary = 5;
+ // 图片地址
+ string img = 6;
+ // 跳转地址
+ string link = 7;
+ // 展示位置,1是顶部
+ Position position = 8;
+ // 展示时长(单位:秒),默认3秒
+ int32 duration = 9;
+ // 失效时间
+ int64 expire = 10;
+ // 推送任务id
+ string taskid = 11;
+ // 应用内推送黑名单
+ // UGC: ugc-video-detail
+ // PGC: pgc-video-detail
+ // 一起看: pgc-video-detail-theater
+ // 直播: live-room-detail
+ // Story: ugc-video-detail-vertical
+ // 播单黑名单 playlist-video-detail
+ repeated PageBlackList page_blackList = 12;
+ // 预留pvid
+ repeated PageView page_view = 13;
+ // 跳转资源
+ TargetResource target_resource = 14;
+ //
+ int32 image_frame = 15;
+ //
+ int32 image_marker = 16;
+ //
+ int32 image_position = 17;
+ //
+ int64 job = 18;
+}
+
+//
+message TargetResource {
+ //直播: roomid
+ //UGC: avid
+ //PGC: seasonid
+ //Story: avid
+ //举个例子
+ //Type: LINK_TYPE_BANGUMI (番剧)
+ //Resource: {"seasonid":"123"}
+ //
+ //Type: LINK_TYPE_VIDEO (视频)
+ //Resource: {"avid":"123"}
+ //
+ //Type: LINK_TYPE_LIVE (直播)
+ //Resource: {"roomid":"123"}
+ //
+ LinkType Type = 1;
+ //
+ map Resource = 2;
+}
diff --git a/bili-api/grpc/proto/bilibili/broadcast/v1/room.proto b/bili-api/grpc/proto/bilibili/broadcast/v1/room.proto
new file mode 100644
index 000000000..66fd96ceb
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/broadcast/v1/room.proto
@@ -0,0 +1,80 @@
+syntax = "proto3";
+
+package bilibili.broadcast.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/rpc/status.proto";
+import "google/protobuf/any.proto";
+
+//
+service BroadcastRoom {
+ //
+ rpc Enter(stream RoomReq) returns (stream RoomResp);
+}
+
+//
+message RoomErrorEvent {
+ //
+ bilibili.rpc.Status status = 1;
+}
+
+//
+message RoomJoinEvent {
+
+}
+
+//
+message RoomLeaveEvent {
+
+}
+
+//
+message RoomMessageEvent {
+ //
+ string target_path = 1;
+ //
+ google.protobuf.Any body = 2;
+}
+
+//
+message RoomOnlineEvent {
+ //
+ int32 online = 1;
+ //
+ int32 all_online = 2;
+}
+
+//
+message RoomReq {
+ // {type}://{room_id}
+ string id = 1;
+ oneof event {
+ //
+ RoomJoinEvent join = 2;
+ //
+ RoomLeaveEvent leave = 3;
+ //
+ RoomOnlineEvent online = 4;
+ //
+ RoomMessageEvent msg = 5;
+ }
+}
+
+//
+message RoomResp {
+ // {type}://{room_id}
+ string id = 1;
+ oneof event {
+ //
+ RoomJoinEvent join = 2;
+ //
+ RoomLeaveEvent leave = 3;
+ //
+ RoomOnlineEvent online = 4;
+ //
+ RoomMessageEvent msg = 5;
+ //
+ RoomErrorEvent err = 6;
+ }
+}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/v1/test.proto b/bili-api/grpc/proto/bilibili/broadcast/v1/test.proto
similarity index 56%
rename from bili-api-grpc/proto/bilibili/broadcast/v1/test.proto
rename to bili-api/grpc/proto/bilibili/broadcast/v1/test.proto
index 1a11c5926..9e6bc5cbf 100644
--- a/bili-api-grpc/proto/bilibili/broadcast/v1/test.proto
+++ b/bili-api/grpc/proto/bilibili/broadcast/v1/test.proto
@@ -13,36 +13,36 @@ import "google/protobuf/empty.proto";
// Test
service Test {
// 监听上报事件
- rpc WatchTestEvent(google.protobuf.Empty) returns (stream TestResp);
+ rpc WatchTestEvent(google.protobuf.Empty) returns (stream TestResp);
}
//
service Test2 {
- //
- rpc Test(AddParams) returns (google.protobuf.Empty);
+ //
+ rpc Test(AddParams) returns (google.protobuf.Empty);
}
//
message AddParams {
- //
- int32 a = 1;
- //
- int32 b = 2;
+ //
+ int32 a = 1;
+ //
+ int32 b = 2;
}
//
message AddResult {
- //
- int32 r = 1;
+ //
+ int32 r = 1;
}
message TestResp {
- // 任务id
- int64 taskid = 1;
- // 时间戳
- int64 timestamp = 2;
- // 消息
- string message = 3;
- // 扩展
- google.protobuf.Any extra = 4;
+ // 任务id
+ int64 taskid = 1;
+ // 时间戳
+ int64 timestamp = 2;
+ // 消息
+ string message = 3;
+ // 扩展
+ google.protobuf.Any extra = 4;
}
diff --git a/bili-api-grpc/proto/bilibili/broadcast/v2/laser.proto b/bili-api/grpc/proto/bilibili/broadcast/v2/laser.proto
similarity index 69%
rename from bili-api-grpc/proto/bilibili/broadcast/v2/laser.proto
rename to bili-api/grpc/proto/bilibili/broadcast/v2/laser.proto
index 6f8e6fcad..3b676a212 100644
--- a/bili-api-grpc/proto/bilibili/broadcast/v2/laser.proto
+++ b/bili-api/grpc/proto/bilibili/broadcast/v2/laser.proto
@@ -14,10 +14,10 @@ service Laser {
// 服务端下发Laser事件
message LaserEventResp {
- // 任务id
- int64 taskid = 1;
- // 指令名
- string action = 2;
- // 指令参数json字符串
- string params = 3;
+ // 任务id
+ int64 taskid = 1;
+ // 指令名
+ string action = 2;
+ // 指令参数json字符串
+ string params = 3;
}
diff --git a/bili-api/grpc/proto/bilibili/cheese/gateway/player/v1/playurl.proto b/bili-api/grpc/proto/bilibili/cheese/gateway/player/v1/playurl.proto
new file mode 100644
index 000000000..19ff4031d
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/cheese/gateway/player/v1/playurl.proto
@@ -0,0 +1,123 @@
+syntax = "proto3";
+
+package bilibili.cheese.gateway.player.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/playurl/v1/playurl.proto";
+
+// 课程视频url
+service PlayURL {
+ // 播放页信息
+ rpc PlayView (PlayViewReq) returns (PlayViewReply);
+ // 投屏地址
+ rpc Project (ProjectReq) returns (ProjectReply);
+}
+
+// 播放页信息-请求
+message PlayViewReq {
+ // 课程epid(与番剧不互通)
+ int64 ep_id = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 force_host = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string from_spmid = 10;
+ // 青少年模式
+ int32 teenagers_mode = 11;
+ // 视频编码
+ bilibili.app.playurl.v1.CodeType prefer_codec_type = 12;
+ // 是否强制请求预览视频
+ bool is_preview = 13;
+}
+
+// 投屏地址-请求
+message ProjectReq {
+ // 课程epid(与番剧不互通)
+ int64 ep_id = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 force_host = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string from_spmid = 10;
+ // 投屏协议
+ // 0:默认乐播 1:自建协议 2:云投屏
+ int32 protocol = 11;
+ // 投屏设备
+ // 0:默认其他 1:OTT设备
+ int32 device_type = 12;
+ // 是否flv格式
+ bool flv_proj = 13;
+}
+
+// 播放页信息-响应
+message PlayViewReply {
+ // 视频url信息
+ bilibili.app.playurl.v1.VideoInfo video_info = 1;
+ // 禁用功能配置
+ PlayAbilityConf play_conf = 2;
+}
+
+// 禁用功能配置
+message PlayAbilityConf {
+ bool background_play_disable = 1; // 后台播放
+ bool flip_disable = 2; // 镜像反转
+ bool cast_disable = 3; // 支持投屏
+ bool feedback_disable = 4; // 反馈
+ bool subtitle_disable = 5; // 字幕
+ bool playback_rate_disable = 6; // 播放速度
+ bool time_up_disable = 7; // 定时停止播放
+ bool playback_mode_disable = 8; // 播放方式
+ bool scale_mode_disable = 9; // 画面尺寸
+ bool like_disable = 10; // 顶
+ bool dislike_disable = 11; // 踩
+ bool coin_disable = 12; // 投币
+ bool elec_disable = 13; // 充电
+ bool share_disable = 14; // 分享
+ bool screen_shot_disable = 15; // 截图
+ bool lock_screen_disable = 16; // 锁屏
+ bool recommend_disable = 17; // 相关推荐
+ bool playback_speed_disable = 18; // 倍速
+ bool definition_disable = 19; // 清晰度
+ bool selections_disable = 20; // 选集
+ bool next_disable = 21; // 下一集
+ bool edit_dm_disable = 22; // 编辑弹幕
+ bool outer_dm_disable = 25; // 外层面板弹幕设置
+ bool inner_dm_disable = 26; // 三点内弹幕设置
+ bool small_window_disable = 27; // 画中画
+}
+
+// 投屏地址-响应
+message ProjectReply {
+ bilibili.app.playurl.v1.PlayURLReply project = 1;
+}
diff --git a/bili-api/grpc/proto/bilibili/community/service/dm/v1/dm.proto b/bili-api/grpc/proto/bilibili/community/service/dm/v1/dm.proto
new file mode 100644
index 000000000..d58c0ef37
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/community/service/dm/v1/dm.proto
@@ -0,0 +1,892 @@
+syntax = "proto3";
+
+package bilibili.community.service.dm.v1;
+
+option java_multiple_files = true;
+
+//弹幕
+service DM {
+ // 获取分段弹幕
+ rpc DmSegMobile (DmSegMobileReq) returns (DmSegMobileReply);
+ // 客户端弹幕元数据 字幕、分段、防挡蒙版等
+ rpc DmView(DmViewReq) returns (DmViewReply);
+ // 修改弹幕配置
+ rpc DmPlayerConfig (DmPlayerConfigReq) returns (Response);
+ // ott弹幕列表
+ rpc DmSegOtt(DmSegOttReq) returns(DmSegOttReply);
+ // SDK弹幕列表
+ rpc DmSegSDK(DmSegSDKReq) returns(DmSegSDKReply);
+ //
+ rpc DmExpoReport(DmExpoReportReq) returns (DmExpoReportRes);
+}
+
+//
+message Avatar {
+ //
+ string id = 1;
+ //
+ string url = 2;
+ //
+ AvatarType avatar_type = 3;
+}
+
+//
+enum AvatarType {
+ AvatarTypeNone = 0; //
+ AvatarTypeNFT = 1; //
+}
+
+//
+message Bubble {
+ //
+ string text = 1;
+ //
+ string url = 2;
+}
+
+//
+enum BubbleType {
+ BubbleTypeNone = 0; //
+ BubbleTypeClickButton = 1; //
+ BubbleTypeDmSettingPanel = 2; //
+}
+
+//
+message BubbleV2 {
+ //
+ string text = 1;
+ //
+ string url = 2;
+ //
+ BubbleType bubble_type = 3;
+ //
+ bool exposure_once = 4;
+ //
+ ExposureType exposure_type = 5;
+}
+
+//
+message Button {
+ //
+ string text = 1;
+ //
+ int32 action = 2;
+}
+
+//
+message BuzzwordConfig {
+ //
+ repeated BuzzwordShowConfig keywords = 1;
+}
+
+//
+message BuzzwordShowConfig {
+ //
+ string name = 1;
+ //
+ string schema = 2;
+ //
+ int32 source = 3;
+ //
+ int64 id = 4;
+ //
+ int64 buzzword_id = 5;
+ //
+ int32 schema_type = 6;
+}
+
+//
+message CheckBox {
+ //
+ string text = 1;
+ //
+ CheckboxType type = 2;
+ //
+ bool default_value = 3;
+ //
+ bool show = 4;
+}
+
+//
+enum CheckboxType {
+ CheckboxTypeNone = 0; //
+ CheckboxTypeEncourage = 1; //
+ CheckboxTypeColorDM = 2; //
+}
+
+//
+message CheckBoxV2 {
+ //
+ string text = 1;
+ //
+ int32 type = 2;
+ //
+ bool default_value = 3;
+}
+
+//
+message ClickButton {
+ //
+ repeated string portrait_text = 1;
+ //
+ repeated string landscape_text = 2;
+ //
+ repeated string portrait_text_focus = 3;
+ //
+ repeated string landscape_text_focus = 4;
+ //
+ RenderType render_type = 5;
+ //
+ bool show = 6;
+ //
+ Bubble bubble = 7;
+}
+
+//
+message ClickButtonV2 {
+ //
+ repeated string portrait_text = 1;
+ //
+ repeated string landscape_text = 2;
+ //
+ repeated string portrait_text_focus = 3;
+ //
+ repeated string landscape_text_focus = 4;
+ //
+ int32 render_type = 5;
+ //
+ bool text_input_post = 6;
+ //
+ bool exposure_once = 7;
+ //
+ int32 exposure_type = 8;
+}
+
+// 互动弹幕条目信息
+message CommandDm {
+ // 弹幕id
+ int64 id = 1;
+ // 对象视频cid
+ int64 oid = 2;
+ // 发送者mid
+ string mid = 3;
+ // 互动弹幕指令
+ string command = 4;
+ // 互动弹幕正文
+ string content = 5;
+ // 出现时间
+ int32 progress = 6;
+ // 创建时间
+ string ctime = 7;
+ // 发布时间
+ string mtime = 8;
+ // 扩展json数据
+ string extra = 9;
+ // 弹幕id str类型
+ string idStr = 10;
+}
+
+// 弹幕ai云屏蔽列表
+message DanmakuAIFlag {
+ // 弹幕ai云屏蔽条目
+ repeated DanmakuFlag dm_flags = 1;
+}
+
+// 弹幕条目
+message DanmakuElem {
+ // 弹幕dmid
+ int64 id = 1;
+ // 弹幕出现位置(单位ms)
+ int32 progress = 2;
+ // 弹幕类型 1 2 3:普通弹幕 4:底部弹幕 5:顶部弹幕 6:逆向弹幕 7:高级弹幕 8:代码弹幕 9:BAS弹幕(pool必须为2)
+ int32 mode = 3;
+ // 弹幕字号
+ int32 fontsize = 4;
+ // 弹幕颜色
+ uint32 color = 5;
+ // 发送者mid hash
+ string midHash = 6;
+ // 弹幕正文
+ string content = 7;
+ // 发送时间
+ int64 ctime = 8;
+ // 权重 用于屏蔽等级 区间:[1,10]
+ int32 weight = 9;
+ // 动作
+ string action = 10;
+ // 弹幕池 0:普通池 1:字幕池 2:特殊池(代码/BAS弹幕)
+ int32 pool = 11;
+ // 弹幕dmid str
+ string idStr = 12;
+ // 弹幕属性位(bin求AND)
+ // bit0:保护 bit1:直播 bit2:高赞
+ int32 attr = 13;
+ //
+ string animation = 22;
+ // 大会员专属颜色
+ DmColorfulType colorful = 24;
+}
+
+// 弹幕ai云屏蔽条目
+message DanmakuFlag {
+ // 弹幕dmid
+ int64 dmid = 1;
+ // 评分
+ uint32 flag = 2;
+}
+
+// 云屏蔽配置信息
+message DanmakuFlagConfig {
+ // 云屏蔽等级
+ int32 rec_flag = 1;
+ // 云屏蔽文案
+ string rec_text = 2;
+ // 云屏蔽开关
+ int32 rec_switch = 3;
+}
+
+// 弹幕默认配置
+message DanmuDefaultPlayerConfig {
+ bool player_danmaku_use_default_config = 1; // 是否使用推荐弹幕设置
+ bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
+ int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
+ bool player_danmaku_blocktop = 6; // 是否屏蔽顶端弹幕
+ bool player_danmaku_blockscroll = 7; // 是否屏蔽滚动弹幕
+ bool player_danmaku_blockbottom = 8; // 是否屏蔽底端弹幕
+ bool player_danmaku_blockcolorful = 9; // 是否屏蔽彩色弹幕
+ bool player_danmaku_blockrepeat = 10; // 是否屏蔽重复弹幕
+ bool player_danmaku_blockspecial = 11; // 是否屏蔽高级弹幕
+ float player_danmaku_opacity = 12; // 弹幕不透明度
+ float player_danmaku_scalingfactor = 13; // 弹幕缩放比例
+ float player_danmaku_domain = 14; // 弹幕显示区域
+ int32 player_danmaku_speed = 15; // 弹幕速度
+ bool inline_player_danmaku_switch = 16; // 是否开启弹幕
+ int32 player_danmaku_senior_mode_switch = 17; //
+ int32 player_danmaku_ai_recommended_level_v2 = 18; //
+ map player_danmaku_ai_recommended_level_v2_map = 19; //
+}
+
+// 弹幕配置
+message DanmuPlayerConfig {
+ bool player_danmaku_switch = 1; // 是否开启弹幕
+ bool player_danmaku_switch_save = 2; // 是否记录弹幕开关设置
+ bool player_danmaku_use_default_config = 3; // 是否使用推荐弹幕设置
+ bool player_danmaku_ai_recommended_switch = 4; // 是否开启智能云屏蔽
+ int32 player_danmaku_ai_recommended_level = 5; // 智能云屏蔽等级
+ bool player_danmaku_blocktop = 6; // 是否屏蔽顶端弹幕
+ bool player_danmaku_blockscroll = 7; // 是否屏蔽滚动弹幕
+ bool player_danmaku_blockbottom = 8; // 是否屏蔽底端弹幕
+ bool player_danmaku_blockcolorful = 9; // 是否屏蔽彩色弹幕
+ bool player_danmaku_blockrepeat = 10; // 是否屏蔽重复弹幕
+ bool player_danmaku_blockspecial = 11; // 是否屏蔽高级弹幕
+ float player_danmaku_opacity = 12; // 弹幕不透明度
+ float player_danmaku_scalingfactor = 13; // 弹幕缩放比例
+ float player_danmaku_domain = 14; // 弹幕显示区域
+ int32 player_danmaku_speed = 15; // 弹幕速度
+ bool player_danmaku_enableblocklist = 16; // 是否开启屏蔽列表
+ bool inline_player_danmaku_switch = 17; // 是否开启弹幕
+ int32 inline_player_danmaku_config = 18; //
+ int32 player_danmaku_ios_switch_save = 19; //
+ int32 player_danmaku_senior_mode_switch = 20; //
+ int32 player_danmaku_ai_recommended_level_v2 = 21; //
+ map player_danmaku_ai_recommended_level_v2_map = 22; //
+}
+
+//
+message DanmuPlayerConfigPanel {
+ //
+ string selection_text = 1;
+}
+
+// 弹幕显示区域自动配置
+message DanmuPlayerDynamicConfig {
+ // 时间
+ int32 progress = 1;
+ // 弹幕显示区域
+ float player_danmaku_domain = 14;
+}
+
+// 弹幕配置信息
+message DanmuPlayerViewConfig {
+ // 弹幕默认配置
+ DanmuDefaultPlayerConfig danmuku_default_player_config = 1;
+ // 弹幕用户配置
+ DanmuPlayerConfig danmuku_player_config = 2;
+ // 弹幕显示区域自动配置列表
+ repeated DanmuPlayerDynamicConfig danmuku_player_dynamic_config = 3;
+ //
+ DanmuPlayerConfigPanel danmuku_player_config_panel = 4;
+}
+
+// web端用户弹幕配置
+message DanmuWebPlayerConfig {
+ bool dm_switch = 1; // 是否开启弹幕
+ bool ai_switch = 2; // 是否开启智能云屏蔽
+ int32 ai_level = 3; // 智能云屏蔽等级
+ bool blocktop = 4; // 是否屏蔽顶端弹幕
+ bool blockscroll = 5; // 是否屏蔽滚动弹幕
+ bool blockbottom = 6; // 是否屏蔽底端弹幕
+ bool blockcolor = 7; // 是否屏蔽彩色弹幕
+ bool blockspecial = 8; // 是否屏蔽重复弹幕
+ bool preventshade = 9; //
+ bool dmask = 10; //
+ float opacity = 11; //
+ int32 dmarea = 12; //
+ float speedplus = 13; //
+ float fontsize = 14; // 弹幕字号
+ bool screensync = 15; //
+ bool speedsync = 16; //
+ string fontfamily = 17; //
+ bool bold = 18; // 是否使用加粗
+ int32 fontborder = 19; //
+ string draw_type = 20; // 弹幕渲染类型
+ int32 senior_mode_switch = 21; //
+ int32 ai_level_v2 = 22; //
+ map ai_level_v2_map = 23; //
+}
+
+// 弹幕属性位值
+enum DMAttrBit {
+ DMAttrBitProtect = 0; // 保护弹幕
+ DMAttrBitFromLive = 1; // 直播弹幕
+ DMAttrHighLike = 2; // 高赞弹幕
+}
+
+message DmColorful {
+ DmColorfulType type = 1; // 颜色类型
+ string src = 2; //
+}
+
+enum DmColorfulType {
+ NoneType = 0; // 无
+ VipGradualColor = 60001; // 渐变色
+}
+
+//
+message DmExpoReportReq {
+ //
+ string session_id = 1;
+ //
+ int64 oid = 2;
+ //
+ string spmid = 4;
+}
+
+//
+message DmExpoReportRes {}
+
+// 修改弹幕配置-请求
+message DmPlayerConfigReq {
+ int64 ts = 1; //
+ PlayerDanmakuSwitch switch = 2; // 是否开启弹幕
+ PlayerDanmakuSwitchSave switch_save = 3; // 是否记录弹幕开关设置
+ PlayerDanmakuUseDefaultConfig use_default_config = 4; // 是否使用推荐弹幕设置
+ PlayerDanmakuAiRecommendedSwitch ai_recommended_switch = 5; // 是否开启智能云屏蔽
+ PlayerDanmakuAiRecommendedLevel ai_recommended_level = 6; // 智能云屏蔽等级
+ PlayerDanmakuBlocktop blocktop = 7; // 是否屏蔽顶端弹幕
+ PlayerDanmakuBlockscroll blockscroll = 8; // 是否屏蔽滚动弹幕
+ PlayerDanmakuBlockbottom blockbottom = 9; // 是否屏蔽底端弹幕
+ PlayerDanmakuBlockcolorful blockcolorful = 10; // 是否屏蔽彩色弹幕
+ PlayerDanmakuBlockrepeat blockrepeat = 11; // 是否屏蔽重复弹幕
+ PlayerDanmakuBlockspecial blockspecial = 12; // 是否屏蔽高级弹幕
+ PlayerDanmakuOpacity opacity = 13; // 弹幕不透明度
+ PlayerDanmakuScalingfactor scalingfactor = 14; // 弹幕缩放比例
+ PlayerDanmakuDomain domain = 15; // 弹幕显示区域
+ PlayerDanmakuSpeed speed = 16; // 弹幕速度
+ PlayerDanmakuEnableblocklist enableblocklist = 17; // 是否开启屏蔽列表
+ InlinePlayerDanmakuSwitch inlinePlayerDanmakuSwitch = 18; // 是否开启弹幕
+ PlayerDanmakuSeniorModeSwitch senior_mode_switch = 19; //
+ PlayerDanmakuAiRecommendedLevelV2 ai_recommended_level_v2 = 20; //
+}
+
+//
+message DmSegConfig {
+ //
+ int64 page_size = 1;
+ //
+ int64 total = 2;
+}
+
+// 获取弹幕-响应
+message DmSegMobileReply {
+ // 弹幕列表
+ repeated DanmakuElem elems = 1;
+ // 是否已关闭弹幕
+ // 0:未关闭 1:已关闭
+ int32 state = 2;
+ // 弹幕云屏蔽ai评分值
+ DanmakuAIFlag ai_flag = 3;
+ repeated DmColorful colorfulSrc = 5;
+}
+
+// 获取弹幕-请求
+message DmSegMobileReq {
+ // 稿件avid/漫画epid
+ int64 pid = 1;
+ // 视频cid/漫画cid
+ int64 oid = 2;
+ // 弹幕类型
+ // 1:视频 2:漫画
+ int32 type = 3;
+ // 分段(6min)
+ int64 segment_index = 4;
+ // 是否青少年模式
+ int32 teenagers_mode = 5;
+ //
+ int64 ps = 6;
+ //
+ int64 pe = 7;
+ //
+ int32 pull_mode = 8;
+ //
+ int32 from_scene = 9;
+}
+
+// ott弹幕列表-响应
+message DmSegOttReply {
+ // 是否已关闭弹幕
+ // 0:未关闭 1:已关闭
+ bool closed = 1;
+ // 弹幕列表
+ repeated DanmakuElem elems = 2;
+}
+
+// ott弹幕列表-请求
+message DmSegOttReq {
+ // 稿件avid/漫画epid
+ int64 pid = 1;
+ // 视频cid/漫画cid
+ int64 oid = 2;
+ // 弹幕类型
+ // 1:视频 2:漫画
+ int32 type = 3;
+ // 分段(6min)
+ int64 segment_index = 4;
+}
+
+// 弹幕SDK-响应
+message DmSegSDKReply {
+ // 是否已关闭弹幕
+ // 0:未关闭 1:已关闭
+ bool closed = 1;
+ // 弹幕列表
+ repeated DanmakuElem elems = 2;
+}
+
+// 弹幕SDK-请求
+message DmSegSDKReq {
+ // 稿件avid/漫画epid
+ int64 pid = 1;
+ // 视频cid/漫画cid
+ int64 oid = 2;
+ // 弹幕类型
+ // 1:视频 2:漫画
+ int32 type = 3;
+ // 分段(6min)
+ int64 segment_index = 4;
+}
+
+// 客户端弹幕元数据-响应
+message DmViewReply {
+ // 是否已关闭弹幕
+ // 0:未关闭 1:已关闭
+ bool closed = 1;
+ // 智能防挡弹幕蒙版信息
+ VideoMask mask = 2;
+ // 视频字幕
+ VideoSubtitle subtitle = 3;
+ // 高级弹幕专包url(bfs)
+ repeated string special_dms = 4;
+ // 云屏蔽配置信息
+ DanmakuFlagConfig ai_flag = 5;
+ // 弹幕配置信息
+ DanmuPlayerViewConfig player_config = 6;
+ // 弹幕发送框样式
+ int32 send_box_style = 7;
+ // 是否允许
+ bool allow = 8;
+ // check box 是否展示
+ string check_box = 9;
+ // check box 展示文本
+ string check_box_show_msg = 10;
+ // 展示文案
+ string text_placeholder = 11;
+ // 弹幕输入框文案
+ string input_placeholder = 12;
+ // 用户举报弹幕 cid维度屏蔽的正则规则
+ repeated string report_filter_content = 13;
+ //
+ ExpoReport expo_report = 14;
+ //
+ BuzzwordConfig buzzword_config = 15;
+ //
+ repeated Expressions expressions = 16;
+ //
+ repeated PostPanel post_panel = 17;
+ //
+ repeated string activity_meta = 18;
+ //
+ repeated PostPanelV2 post_panel2 = 19;
+}
+
+// 客户端弹幕元数据-请求
+message DmViewReq {
+ // 稿件avid/漫画epid
+ int64 pid = 1;
+ // 视频cid/漫画cid
+ int64 oid = 2;
+ // 弹幕类型
+ // 1:视频 2:漫画
+ int32 type = 3;
+ // 页面spm
+ string spmid = 4;
+ // 是否冷启
+ int32 is_hard_boot = 5;
+}
+
+// web端弹幕元数据-响应
+// https://api.bilibili.com/x/v2/dm/web/view
+message DmWebViewReply {
+ // 是否已关闭弹幕
+ // 0:未关闭 1:已关闭
+ int32 state = 1;
+ //
+ string text = 2;
+ //
+ string text_side = 3;
+ // 分段弹幕配置
+ DmSegConfig dm_sge = 4;
+ // 云屏蔽配置信息
+ DanmakuFlagConfig flag = 5;
+ // 高级弹幕专包url(bfs)
+ repeated string special_dms = 6;
+ // check box 是否展示
+ bool check_box = 7;
+ // 弹幕数
+ int64 count = 8;
+ // 互动弹幕
+ repeated CommandDm commandDms = 9;
+ // 用户弹幕配置
+ DanmuWebPlayerConfig player_config = 10;
+ // 用户举报弹幕 cid维度屏蔽
+ repeated string report_filter_content = 11;
+ //
+ repeated Expressions expressions = 12;
+ //
+ repeated PostPanel post_panel = 13;
+ //
+ repeated string activity_meta = 14;
+}
+
+//
+message ExpoReport {
+ //
+ bool should_report_at_end = 1;
+}
+
+//
+enum ExposureType {
+ ExposureTypeNone = 0; //
+ ExposureTypeDMSend = 1; //
+}
+
+//
+message Expression {
+ //
+ repeated string keyword = 1;
+ //
+ string url = 2;
+ //
+ repeated Period period = 3;
+}
+
+//
+message Expressions {
+ //
+ repeated Expression data = 1;
+}
+
+// 是否开启弹幕
+message InlinePlayerDanmakuSwitch {
+ //
+ bool value = 1;
+}
+
+//
+message Label {
+ //
+ string title = 1;
+ //
+ repeated string content = 2;
+}
+
+//
+message LabelV2 {
+ //
+ string title = 1;
+ //
+ repeated string content = 2;
+ //
+ bool exposure_once = 3;
+ //
+ int32 exposure_type = 4;
+}
+
+//
+message Period {
+ //
+ int64 start = 1;
+ //
+ int64 end = 2;
+}
+
+message PlayerDanmakuAiRecommendedLevel {bool value = 1;} // 智能云屏蔽等级
+message PlayerDanmakuAiRecommendedLevelV2 {int32 value = 1;} //
+message PlayerDanmakuAiRecommendedSwitch {bool value = 1;} // 是否开启智能云屏蔽
+message PlayerDanmakuBlockbottom {bool value = 1;} // 是否屏蔽底端弹幕
+message PlayerDanmakuBlockcolorful {bool value = 1;} // 是否屏蔽彩色弹幕
+message PlayerDanmakuBlockrepeat {bool value = 1;} // 是否屏蔽重复弹幕
+message PlayerDanmakuBlockscroll {bool value = 1;} // 是否屏蔽滚动弹幕
+message PlayerDanmakuBlockspecial {bool value = 1;} // 是否屏蔽高级弹幕
+message PlayerDanmakuBlocktop {bool value = 1;} // 是否屏蔽顶端弹幕
+message PlayerDanmakuDomain {float value = 1;} // 弹幕显示区域
+message PlayerDanmakuEnableblocklist {bool value = 1;} // 是否开启屏蔽列表
+message PlayerDanmakuOpacity {float value = 1;} // 弹幕不透明度
+message PlayerDanmakuScalingfactor {float value = 1;} // 弹幕缩放比例
+message PlayerDanmakuSeniorModeSwitch {int32 value = 1;} //
+message PlayerDanmakuSpeed {int32 value = 1;} // 弹幕速度
+message PlayerDanmakuSwitch {bool value = 1; bool can_ignore = 2;} // 是否开启弹幕
+message PlayerDanmakuSwitchSave {bool value = 1;} // 是否记录弹幕开关设置
+message PlayerDanmakuUseDefaultConfig {bool value = 1;} // 是否使用推荐弹幕设置
+
+//
+message PostPanel {
+ //
+ int64 start = 1;
+ //
+ int64 end = 2;
+ //
+ int64 priority = 3;
+ //
+ int64 biz_id = 4;
+ //
+ PostPanelBizType biz_type = 5;
+ //
+ ClickButton click_button = 6;
+ //
+ TextInput text_input = 7;
+ //
+ CheckBox check_box = 8;
+ //
+ Toast toast = 9;
+}
+
+//
+enum PostPanelBizType {
+ PostPanelBizTypeNone = 0; //
+ PostPanelBizTypeEncourage = 1; //
+ PostPanelBizTypeColorDM = 2; //
+ PostPanelBizTypeNFTDM = 3; //
+ PostPanelBizTypeFragClose = 4; //
+ PostPanelBizTypeRecommend = 5; //
+}
+
+//
+message PostPanelV2 {
+ //
+ int64 start = 1;
+ //
+ int64 end = 2;
+ //
+ int32 biz_type = 3;
+ //
+ ClickButtonV2 click_button = 4;
+ //
+ TextInputV2 text_input = 5;
+ //
+ CheckBoxV2 check_box = 6;
+ //
+ ToastV2 toast = 7;
+ //
+ BubbleV2 bubble = 8;
+ //
+ LabelV2 label = 9;
+ //
+ int32 post_status = 10;
+}
+
+//
+enum PostStatus {
+ PostStatusNormal = 0; //
+ PostStatusClosed = 1; //
+}
+
+//
+enum RenderType {
+ RenderTypeNone = 0; //
+ RenderTypeSingle = 1; //
+ RenderTypeRotation = 2; //
+}
+
+// 修改弹幕配置-响应
+message Response {
+ //
+ int32 code = 1;
+ //
+ string message = 2;
+}
+
+//
+enum SubtitleAiStatus {
+ None = 0; //
+ Exposure = 1; //
+ Assist = 2; //
+}
+
+//
+enum SubtitleAiType {
+ Normal = 0; //
+ Translate = 1; //
+}
+
+// 单个字幕信息
+message SubtitleItem {
+ // 字幕id
+ int64 id = 1;
+ // 字幕id str
+ string id_str = 2;
+ // 字幕语言代码
+ string lan = 3;
+ // 字幕语言
+ string lan_doc = 4;
+ // 字幕文件url
+ string subtitle_url = 5;
+ // 字幕作者信息
+ UserInfo author = 6;
+ // 字幕类型
+ SubtitleType type = 7;
+ //
+ string lan_doc_brief = 8;
+ //
+ SubtitleAiType ai_type = 9;
+ //
+ SubtitleAiStatus ai_status = 10;
+}
+
+enum SubtitleType {
+ CC = 0; // CC字幕
+ AI = 1; // AI生成字幕
+}
+
+//
+message TextInput {
+ //
+ repeated string portrait_placeholder = 1;
+ //
+ repeated string landscape_placeholder = 2;
+ //
+ RenderType render_type = 3;
+ //
+ bool placeholder_post = 4;
+ //
+ bool show = 5;
+ //
+ repeated Avatar avatar = 6;
+ //
+ PostStatus post_status = 7;
+ //
+ Label label = 8;
+}
+
+//
+message TextInputV2 {
+ //
+ repeated string portrait_placeholder = 1;
+ //
+ repeated string landscape_placeholder = 2;
+ //
+ RenderType render_type = 3;
+ //
+ bool placeholder_post = 4;
+ //
+ repeated Avatar avatar = 5;
+ //
+ int32 text_input_limit = 6;
+}
+
+//
+message Toast {
+ //
+ string text = 1;
+ //
+ int32 duration = 2;
+ //
+ bool show = 3;
+ //
+ Button button = 4;
+}
+
+//
+message ToastButtonV2 {
+ //
+ string text = 1;
+ //
+ int32 action = 2;
+}
+
+//
+enum ToastFunctionType {
+ ToastFunctionTypeNone = 0; //
+ ToastFunctionTypePostPanel = 1; //
+}
+
+//
+message ToastV2 {
+ //
+ string text = 1;
+ //
+ int32 duration = 2;
+ //
+ ToastButtonV2 toast_button_v2 = 3;
+}
+
+// 字幕作者信息
+message UserInfo {
+ // 用户mid
+ int64 mid = 1;
+ // 用户昵称
+ string name = 2;
+ // 用户性别
+ string sex = 3;
+ // 用户头像url
+ string face = 4;
+ // 用户签名
+ string sign = 5;
+ // 用户等级
+ int32 rank = 6;
+}
+
+// 智能防挡弹幕蒙版信息
+message VideoMask {
+ // 视频cid
+ int64 cid = 1;
+ // 平台
+ // 0:web端 1:客户端
+ int32 plat = 2;
+ // 帧率
+ int32 fps = 3;
+ // 间隔时间
+ int64 time = 4;
+ // 蒙版url
+ string mask_url = 5;
+}
+
+// 视频字幕信息
+message VideoSubtitle {
+ // 视频原语言代码
+ string lan = 1;
+ // 视频原语言
+ string lanDoc = 2;
+ // 视频字幕列表
+ repeated SubtitleItem subtitles = 3;
+}
diff --git a/bili-api-grpc/proto/bilibili/community/service/govern/v1/govern.proto b/bili-api/grpc/proto/bilibili/community/service/govern/v1/govern.proto
similarity index 50%
rename from bili-api-grpc/proto/bilibili/community/service/govern/v1/govern.proto
rename to bili-api/grpc/proto/bilibili/community/service/govern/v1/govern.proto
index 8e2de6923..6e562f8a0 100644
--- a/bili-api-grpc/proto/bilibili/community/service/govern/v1/govern.proto
+++ b/bili-api/grpc/proto/bilibili/community/service/govern/v1/govern.proto
@@ -14,26 +14,26 @@ service Qoe {
//
message QoeReportReq {
- //
- int64 id = 1;
- //
- int64 scene = 2;
- //
- int32 type = 3;
- //
- bool cancel = 4;
- //
- string business_type = 5;
- //
- int64 oid = 6;
- //
- QoeScoreResult score_result = 7;
- //
- string business_data = 8;
+ //
+ int64 id = 1;
+ //
+ int64 scene = 2;
+ //
+ int32 type = 3;
+ //
+ bool cancel = 4;
+ //
+ string business_type = 5;
+ //
+ int64 oid = 6;
+ //
+ QoeScoreResult score_result = 7;
+ //
+ string business_data = 8;
}
//
message QoeScoreResult {
- //
- float score = 1;
+ //
+ float score = 1;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/dagw/component/avatar/common/common.proto b/bili-api/grpc/proto/bilibili/dagw/component/avatar/common/common.proto
new file mode 100644
index 000000000..64ce50895
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/dagw/component/avatar/common/common.proto
@@ -0,0 +1,110 @@
+syntax = "proto3";
+
+package bilibili.dagw.component.avatar.common;
+
+option java_multiple_files = true;
+
+//
+message BasicRenderSpec {
+ //
+ double opacity = 1;
+}
+
+//
+message ColorConfig {
+ //
+ bool is_dark_mode_aware = 1;
+ //
+ ColorSpec day = 2;
+ //
+ ColorSpec night = 3;
+}
+
+//
+message ColorSpec {
+ //
+ string argb = 1;
+}
+
+//
+message LayerGeneralSpec {
+ //
+ PositionSpec pos_spec = 1;
+ //
+ SizeSpec size_spec = 2;
+ //
+ BasicRenderSpec render_spec = 3;
+}
+
+//
+message MaskProperty {
+ //
+ LayerGeneralSpec general_spec = 1;
+ //
+ ResourceSource mask_src = 2;
+}
+
+//
+message NativeDrawRes {
+ //
+ int32 draw_type = 1;
+ //
+ int32 fill_mode = 2;
+ //
+ ColorConfig color_config = 3;
+ //
+ double edge_weight = 4;
+}
+
+//
+message PositionSpec {
+ //
+ int32 coordinate_pos = 1;
+ //
+ double axis_x = 2;
+ //
+ double axis_y = 3;
+}
+
+//
+message RemoteRes {
+ //
+ string url = 1;
+ //
+ string bfs_style = 2;
+}
+
+//
+message ResourceSource {
+ //
+ enum LocalRes {
+ LOCAL_RES_INVALID = 0;
+ LOCAL_RES_ICON_VIP = 1;
+ LOCAL_RES_ICON_SMALL_VIP = 2;
+ LOCAL_RES_ICON_PERSONAL_VERIFY = 3;
+ LOCAL_RES_ICON_ENTERPRISE_VERIFY = 4;
+ LOCAL_RES_ICON_NFT_MAINLAND = 5;
+ LOCAL_RES_DEFAULT_AVATAR = 6;
+ }
+ //
+ int32 src_type = 1;
+ //
+ int32 placeholder = 2;
+ //
+ oneof res {
+ //
+ RemoteRes remote = 3;
+ //
+ LocalRes local = 4;
+ //
+ NativeDrawRes draw = 5;
+ }
+}
+
+//
+message SizeSpec {
+ //
+ double width = 1;
+ //
+ double height = 2;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/dagw/component/avatar/v1/avatar.proto b/bili-api/grpc/proto/bilibili/dagw/component/avatar/v1/avatar.proto
new file mode 100644
index 000000000..319b45c81
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/dagw/component/avatar/v1/avatar.proto
@@ -0,0 +1,114 @@
+syntax = "proto3";
+
+package bilibili.dagw.component.avatar.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/dagw/component/avatar/common/common.proto";
+import "bilibili/dagw/component/avatar/v1/plugin.proto";
+
+//
+message AvatarItem {
+ //
+ bilibili.dagw.component.avatar.common.SizeSpec container_size = 1;
+ //
+ repeated LayerGroup layers = 2;
+ //
+ LayerGroup fallback_layers = 3;
+ //
+ int64 mid = 4;
+}
+
+//
+message BasicLayerResource {
+ //
+ int32 res_type = 1;
+ //
+ oneof payload {
+ //
+ ResImage res_image = 2;
+ //
+ ResAnimation res_animation = 3;
+ ///
+ ResNativeDraw res_native_draw = 4;
+ };
+}
+
+//
+message GeneralConfig {
+ //
+ map web_css_style = 1;
+}
+
+//
+message Layer {
+ //
+ string layer_id = 1;
+ //
+ bool visible = 2;
+ //
+ bilibili.dagw.component.avatar.common.LayerGeneralSpec general_spec = 3;
+ //
+ LayerConfig layer_config = 4;
+ //
+ BasicLayerResource resource = 5;
+}
+
+//
+message LayerConfig {
+ //
+ map tags = 1;
+ //
+ bool is_critical = 2;
+ //
+ bool allow_over_paint = 3;
+ //
+ bilibili.dagw.component.avatar.common.MaskProperty layer_mask = 4;
+}
+
+//
+message LayerGroup {
+ //
+ string group_id = 1;
+ //
+ repeated Layer layers = 2;
+ //
+ bilibili.dagw.component.avatar.common.MaskProperty group_mask = 3;
+ //
+ bool is_critical_group = 4;
+}
+
+//
+message LayerTagConfig {
+ //
+ int32 config_type = 1;
+ //
+ oneof config {
+ //
+ GeneralConfig general_config = 2;
+ //
+ bilibili.dagw.component.avatar.v1.plugin.GyroConfig gyro_config = 3;
+ //
+ bilibili.dagw.component.avatar.v1.plugin.CommentDoubleClickConfig comment_doubleClick_config = 4;
+ //
+ bilibili.dagw.component.avatar.v1.plugin.LiveAnimeConfig live_anime_config = 5;
+ };
+}
+
+//
+message ResAnimation {
+ //
+ bilibili.dagw.component.avatar.common.ResourceSource webp_src = 1;
+}
+
+//
+message ResImage {
+ //
+ bilibili.dagw.component.avatar.common.ResourceSource image_src = 1;
+}
+
+//
+message ResNativeDraw {
+ //
+ bilibili.dagw.component.avatar.common.ResourceSource draw_src = 1;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/dagw/component/avatar/v1/plugin.proto b/bili-api/grpc/proto/bilibili/dagw/component/avatar/v1/plugin.proto
new file mode 100644
index 000000000..ae66968d6
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/dagw/component/avatar/v1/plugin.proto
@@ -0,0 +1,95 @@
+syntax = "proto3";
+
+package bilibili.dagw.component.avatar.v1.plugin;
+
+option java_multiple_files = true;
+
+import "bilibili/dagw/component/avatar/common/common.proto";
+
+//
+message CommentDoubleClickConfig {
+ //
+ Interaction interaction = 1;
+ //
+ double animation_scale = 2;
+}
+
+//
+message GyroConfig {
+ //
+ NFTImageV2 gyroscope = 1;
+}
+
+//
+message GyroscopeContentV2 {
+ //
+ string file_url = 1;
+ //
+ float scale = 2;
+ //
+ repeated PhysicalOrientationV2 physical_orientation = 3;
+}
+
+//
+message GyroscopeEntityV2 {
+ //
+ string display_type = 1;
+ //
+ repeated GyroscopeContentV2 contents = 2;
+}
+
+//
+message Interaction {
+ //
+ string nft_id = 1;
+ //
+ bool enabled = 2;
+ //
+ string itype = 3;
+ //
+ string metadata_url = 4;
+}
+
+//
+message LiveAnimeConfig {
+ //
+ bool is_live = 1;
+}
+
+//
+message LiveAnimeItem {
+ //
+ bilibili.dagw.component.avatar.common.ColorConfig color = 1;
+ //
+ double start_ratio = 2;
+ //
+ double end_ratio = 3;
+ //
+ double start_stroke = 4;
+ //
+ double start_opacity = 5;
+ //
+ int64 phase = 6;
+}
+
+//
+message NFTImageV2 {
+ //
+ repeated GyroscopeEntityV2 gyroscope = 1;
+}
+
+//
+message PhysicalOrientationAnimation {
+ //
+ string type = 1;
+ //
+ string bezier = 3;
+}
+
+//
+message PhysicalOrientationV2 {
+ //
+ string type = 1;
+ //
+ repeated PhysicalOrientationAnimation animations = 3;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/dynamic/common/dynamic.proto b/bili-api/grpc/proto/bilibili/dynamic/common/dynamic.proto
new file mode 100644
index 000000000..cf308a673
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/dynamic/common/dynamic.proto
@@ -0,0 +1,877 @@
+syntax = "proto3";
+
+package bilibili.dynamic;
+
+option java_multiple_files = true;
+
+import "bilibili/app/dynamic/v2/dynamic.proto";
+
+// at分组信息
+message AtGroup {
+ // 分组类型
+ AtGroupType group_type = 1;
+ // 分组名称
+ string group_name = 2;
+ // items
+ repeated AtItem items = 3;
+}
+
+// at分组类型
+enum AtGroupType {
+ AT_GROUP_TYPE_DEFAULT = 0; // 默认
+ AT_GROUP_TYPE_RECENT = 1; // 最近联系
+ AT_GROUP_TYPE_FOLLOW = 2; // 我的关注(互相关注 > 单向关注)
+ AT_GROUP_TYPE_FANS = 3; // 我的粉丝
+ AT_GROUP_TYPE_OTHERS = 4; // 其他
+}
+
+// at返回单条信息
+message AtItem {
+ // mid
+ int64 uid = 1;
+ // 昵称
+ string name = 2;
+ // 头像
+ string face = 3;
+ // 粉丝数
+ int32 fans = 4;
+ // 认证信息
+ int32 official_verify_type = 5;
+}
+
+// at列表-请求
+message AtListReq {
+ // mid
+ int64 uid = 1;
+}
+
+// at列表-响应
+message AtListRsp {
+ // 分组信息
+ repeated AtGroup groups = 1;
+}
+
+// at搜索-请求
+message AtSearchReq {
+ // mid
+ int64 uid = 1;
+ // 关键字
+ string keyword = 2;
+}
+
+//
+enum AttachCardType {
+ ATTACH_CARD_NONE = 0; // 无
+ ATTACH_CARD_GOODS = 1; // 商品卡
+ ATTACH_CARD_VOTE = 2; // 投票卡
+ ATTACH_CARD_UGC = 3; // ugc视频卡
+ ATTACH_CARD_ACTIVITY = 4; // 帮推
+ ATTACH_CARD_OFFICIAL_ACTIVITY = 5; // 官方活动
+ ATTACH_CARD_TOPIC = 6; // 话题活动
+ ATTACH_CARD_OGV = 7; // OGV
+ ATTACH_CARD_AUTO_OGV = 8; // OGV自动出卡
+ ATTACH_CARD_GAME = 9; // 游戏
+ ATTACH_CARD_MANGA = 10; // 漫画
+ ATTACH_CARD_DECORATION = 11; // 装扮
+ ATTACH_CARD_MATCH = 12; // 赛事
+ ATTACH_CARD_PUGV = 13; // 课程
+ ATTACH_CARD_RESERVE = 14; // 预约
+ ATTACH_CARD_UP_TOPIC = 15; // up主话题活动
+}
+
+//
+message BottomBusiness {
+ // 业务方资源id
+ int64 rid = 1;
+ // 业务方类型,定义在BottomBizType中
+ int64 type = 2;
+}
+
+//
+enum ContentType {
+ CONTENT_TYPE_NONE = 0; // 占位
+ TEXT = 1; // 文本,简单内容,biz_id就是文本
+ AT = 2; // @用户,简单内容,biz_id是用户uid
+ LOTTERY = 3; // 抽奖,简单内容,biz_id是抽奖id
+ VOTE = 4; // 投票,简单内容,biz_id是投票id
+ TOPIC = 5; // 话题,简单内容,biz_id是话题id
+ GOODS = 6; // 商品文字链,复杂内容,定义在GoodsContent结构,biz_id为空
+ BV = 7; // bv,简单内容,biz_id是bvid,包括"BV1"等内容
+ AV = 8; // av,简单内容,biz_id是avid
+ EMOJI = 9; // 表情,简单内容,biz_id为空
+ USER = 10; // 外露用户,暂未使用
+ CV = 11; // 专栏,简单内容,biz_id是cvid
+ VC = 12; // 废弃业务,无用
+ WEB = 13; // 网址,简单内容,biz_id是网页链接
+ TAOBAO = 14; // 淘宝内容,暂时不用
+ MAIL = 15; // 邮箱,简单内容,biz_id是邮箱地址
+ OGV_SEASON = 16; // 番剧season,简单内容,biz_id是番剧的season_id
+ OGV_EP = 17; // 番剧ep,简单内容,biz_id是番剧的epid
+}
+
+//
+message CreateActivity {
+ //
+ int64 activity_id = 1;
+ //
+ int32 activity_state = 2;
+ //
+ int32 is_new_activity = 3;
+ //
+ int32 action = 4;
+}
+
+// 动态附带的附加大卡
+message CreateAttachCard {
+ // 商品大卡
+ CreateGoodsCard goods = 1;
+ // 通用附加大卡,目前仅限定Match,Game,Ugc,Pugv,Reserve,且同时只能有一个
+ CreateCommonAttachCard common_card = 2;
+}
+
+// 发布页预校验-响应
+message CreateCheckResp {
+ // 发布相关的配置项
+ PublishSetting setting = 1;
+ // 用户具有的发布权限
+ UpPermission permission = 2;
+ // 分享渠道信息
+ ShareChannel share_info = 3;
+ // 小黄条
+ PublishYellowBar yellow_bar = 4;
+ //
+ PlusRedDot plus_red_dot = 5;
+}
+
+// 创建动态时附带的通用附加卡详情
+message CreateCommonAttachCard {
+ // 通用附加卡的类型
+ AttachCardType type = 1;
+ // 通用附加卡的业务id
+ int64 biz_id = 2;
+ //
+ int32 reserve_source = 3;
+ //
+ int32 reserve_lottery = 4;
+}
+
+// 动态-描述文字模块
+message CreateContent {
+ // 描述信息(已按高亮拆分)
+ repeated CreateContentItem contents = 1;
+}
+
+// 文本描述
+message CreateContentItem {
+ // 原始文案
+ string raw_text = 1;
+ // 类型
+ ContentType type = 2;
+ // 简单内容,可能为文字,BVID,AVID,uid等;复杂内容需要单独定义结构体
+ string biz_id = 3;
+ // 商品内容
+ GoodsContent goods = 4;
+}
+
+//
+message CreateDynVideo {
+ // 投稿平台来源,具体写什么@产品
+ string relation_from = 1;
+ // 1 — 投稿入口 + 相册选择视频 2 — 投稿入口 + 拍摄 3 — 小视频入口 + 相册选择视频 4 — 小视频入口 + 拍摄
+ int32 biz_from = 3;
+ // 投稿类型: 2-转载、1-自制
+ int32 copyright = 4;
+ // 是否公开投稿 0允许公开,1不允许公开 默认 0公开
+ int32 no_public = 5;
+ // 是否允许转载字段 0允许,1不允许,默认为0 copyright = 1 自制的时候默认勾选上no_reprint=1
+ int32 no_reprint = 6;
+ // 转载的时候必须填写,非空字符串
+ string source = 7;
+ // 稿件封面必须填写,不能为空 封面不支持其他源站链接 请确保 cover 是 先经过上传接口
+ string cover = 8;
+ // 稿件标题
+ string title = 9;
+ // 稿件分区ID 必须是有效的二级分区ID
+ int64 tid = 10;
+ // 标签 多个标签请使用英文逗号连接
+ string tag = 11;
+ // 稿件描述
+ string desc = 12;
+ // 当前输入环境下有,就输入http://domain/x/app/archive/desc/format返回的desc_format值
+ // 如果返回null就输入默认为0, 表示当前环境(分区+投稿类型)不参与简介格式化
+ int64 desc_format_id = 13;
+ // 稿件是否开启充电面板,1为是, 0为否
+ int32 open_elec = 14;
+ // 定时发布的时间
+ int32 dtime = 15;
+ // 分P聚合字段
+ repeated DynVideoMultiP videos = 16;
+ // 水印信息
+ DynVideoWatermark watermark = 17;
+ // 新增加通过tag来参加活动
+ int64 mission_id = 18;
+ // 新增加可以添加动态内容
+ string dynamic = 19;
+ // 序列化后的extend_info扩展信息
+ string dynamic_extension = 20;
+ // 客户端控制字段
+ string dynamic_ctrl = 21;
+ // 动态来源
+ string dynamic_from = 22;
+ // 抽奖服务生成的ID
+ int64 lottery_id = 23;
+ //
+ DynVideoVote vote = 24;
+ // 精选评论开关, true为开
+ bool up_selection_reply = 25;
+ // up主关闭评论
+ bool up_close_reply = 26;
+ // up主关闭弹幕
+ bool up_close_danmu = 27;
+ // 稿件投稿来源
+ int64 up_from = 28;
+ //
+ int64 duration = 29;
+}
+
+// 创建动态视频的应答包(透传给客户端)
+message CreateDynVideoResult {
+ // 稿件id
+ int64 aid = 1;
+ // 说明信息
+ string message = 2;
+ // 推荐的活动信息
+ DynVideoSubmitActBanner submitact_banner = 3;
+ //
+ DynVideoPushIntro push_intro = 4;
+}
+
+// 创建动态时附带的商品大卡详情
+message CreateGoodsCard {
+ // 商品大卡中的商品id
+ repeated string item_id = 1;
+}
+
+// 发布页预校验场景
+enum CreateInitCheckScene {
+ CREATE_INIT_CHECK_SCENE_INVALID = 0; //
+ CREATE_INIT_CHECK_SCENE_NORMAL = 1; // 动态页面右上角点击进入发布页
+ CREATE_INIT_CHECK_SCENE_REPOST = 2; // 动态feed流转发、三点分享,动态详情页转发
+ CREATE_INIT_CHECK_SCENE_SHARE = 3; // 其他页面分享到动态
+ CREATE_INIT_CHECK_SCENE_RESERVE_SHARE = 4; //
+}
+
+// 动态创建时的特殊选项
+message CreateOption {
+ // 评论区展示UP自己精选的评论
+ int32 up_choose_comment = 1;
+ // 初始评论区是关闭状态
+ int32 close_comment = 2;
+ // 该动态不会被折叠
+ // 目前仅抽奖开奖动态不会被折叠
+ int32 fold_exclude = 3;
+ // 审核等级,仅服务端发布时有效
+ // 100:自动过审
+ // 非100:默认的内网审核
+ // 默认为0
+ int32 audit_level = 4;
+ // 根据转发内容同步生成一条源动态/资源的评论
+ // 仅转发和分享时有效
+ int32 sync_to_comment = 5;
+ //
+ VideoShareInfo video_share_info = 6;
+ //
+ CreateActivity activity = 7;
+}
+
+// 创建图文动态时的图片信息
+message CreatePic {
+ // 上传图片URL
+ string img_src = 1;
+ // 图片宽度
+ double img_width = 2;
+ // 图片高度
+ double img_height = 3;
+ // 图片大小,单位KB
+ double img_size = 4;
+ //
+ repeated CreatePicTag img_tags = 5;
+}
+
+//
+message CreatePicTag {
+ //
+ int64 item_id = 1;
+ //
+ int64 tid = 2;
+ //
+ int64 mid = 3;
+ //
+ string text = 4;
+ //
+ string text_string = 5;
+ //
+ int64 type = 6;
+ //
+ int64 source_type = 7;
+ //
+ string url = 8;
+ //
+ string schema_url = 9;
+ //
+ string jump_url = 10;
+ //
+ int64 orientation = 11;
+ //
+ int64 x = 12;
+ //
+ int64 y = 13;
+ //
+ string poi = 14;
+}
+
+// 创建动态-响应
+message CreateResp {
+ // 动态id
+ int64 dyn_id = 1;
+ // 动态id str
+ string dyn_id_str = 2;
+ // 动态的类型
+ int64 dyn_type = 3;
+ // 动态id
+ int64 dyn_rid = 4;
+ // 假卡
+ bilibili.app.dynamic.v2.DynamicItem fake_card = 5;
+ // 视频
+ CreateDynVideoResult video_result = 6;
+}
+
+// 发布类型(场景)
+enum CreateScene {
+ CREATE_SCENE_INVALID = 0; //
+ CREATE_SCENE_CREATE_WORD = 1; // 发布纯文字动态
+ CREATE_SCENE_CREATE_DRAW = 2; // 发布图文动态
+ CREATE_SCENE_CREATE_DYN_VIDEO = 3; // 发布动态视频
+ CREATE_SCENE_REPOST = 4; // 转发动态
+ CREATE_SCENE_SHARE_BIZ = 5; // 分享业务方资源
+ CREATE_SCENE_SHARE_PAGE = 6; // 分享网页(通用模板)
+ CREATE_SCENE_SHARE_PROGRAM = 7; // 分享小程序
+ CREATE_SCENE_REPLY_SYNC = 8; // 评论同步到动态
+ CREATE_SCENE_REPLY_CREATE_ACTIVITY = 9; // 评论同步到动态并且发起活动
+}
+
+// 动态附带的小卡
+message CreateTag {
+ // lbs小卡
+ ExtLbs lbs = 1;
+ // 游戏通过SDK发布的动态需要带上游戏小卡
+ BottomBusiness sdk_game = 2;
+ // 必剪发布的动态需要带上必剪小卡
+ BottomBusiness diversion = 3;
+}
+
+//
+message CreateTopic {
+ //
+ int64 id = 1;
+ //
+ string name = 2;
+}
+
+// 动态的标识
+message DynIdentity {
+ // 动态id
+ int64 dyn_id = 1;
+ // 动态反向id,通过(type+rid组合)也可以唯一标识一个动态,与dyn_id出现任意一个即可
+ DynRevsId revs_id = 2;
+}
+
+//
+message DynRevsId {
+ // 动态类型
+ int64 dyn_type = 1;
+ // 业务id
+ int64 rid = 2;
+}
+
+// 动态视频分P视频编辑环境上报信息
+message DynVideoEditor {
+ //
+ int64 cid = 1;
+ //
+ int32 upfrom = 2;
+ // 滤镜
+ string filters = 3;
+ // 字体
+ string fonts = 4;
+ // 字幕
+ string subtitles = 5;
+ // bgm
+ string bgms = 6;
+ // 3d拍摄贴纸
+ string stickers = 7;
+ // 2d投稿贴纸
+ string videoup_stickers = 8;
+ // 视频转场特效
+ string trans = 9;
+ // 编辑器的主题使用相关
+ string makeups = 10;
+ // 整容之外科手术
+ string surgerys = 11;
+ // 美摄特定的videofx
+ string videofxs = 12;
+ // 编辑器的主题使用相关
+ string themes = 13;
+ // 拍摄之稿件合拍
+ string cooperates = 14;
+ // 拍摄之音乐卡点视频
+ string rhythms = 15;
+ // mvp特效
+ string effects = 16;
+ // mvp背景
+ string backgrounds = 17;
+ // mvp视频
+ string videos = 18;
+ // mvp音效
+ string sounds = 19;
+ // mvp花字
+ string flowers = 20;
+ // mvp封面模板
+ string cover_templates = 21;
+ // tts
+ string tts = 22;
+ // openings
+ string openings = 23;
+ // 录音题词
+ bool record_text = 24;
+ // 虚拟形象上报
+ string vupers = 25;
+ //
+ string features = 26;
+ //
+ string bcut_features = 27;
+ //
+ int32 audio_record = 28;
+ //
+ int32 camera = 29;
+ //
+ int32 speed = 30;
+ //
+ int32 camera_rotate = 31;
+ //
+ int32 screen_record = 32;
+ //
+ int32 default_end = 33;
+ //
+ int32 duration = 34;
+ //
+ int32 pic_count = 35;
+ //
+ int32 video_count = 36;
+ //
+ int32 shot_duration = 37;
+ //
+ string shot_game = 38;
+ //
+ bool highlight = 39;
+ //
+ int32 highlight_cnt = 40;
+ //
+ int32 pip_count = 41;
+}
+
+//
+message DynVideoHotAct {
+ //
+ int64 act_id = 1;
+ //
+ int64 etime = 2;
+ //
+ int64 id = 3;
+ //
+ string pic = 4;
+ //
+ int64 stime = 5;
+ //
+ string title = 6;
+ //
+ string link = 7;
+}
+
+// 动态视频分P聚合字段
+message DynVideoMultiP {
+ // 分P标题
+ string title = 1;
+ // 分P的文件名
+ string filename = 2;
+ //
+ int64 cid = 3;
+ // 编辑环境上报信息
+ DynVideoEditor editor = 4;
+}
+
+//
+message DynVideoPushIntro {
+ //
+ int32 show = 1;
+ //
+ string text = 2;
+}
+
+//
+message DynVideoSubmitActBanner {
+ //
+ string hotact_text = 1;
+ //
+ string hotact_url = 2;
+ //
+ repeated DynVideoHotAct list = 3;
+}
+
+//
+message DynVideoVote {
+ //
+ int64 vote_id = 1;
+ //
+ string vote_title = 2;
+ //
+ int32 top_for_reply = 3;
+}
+
+// 动态视频水印信息
+message DynVideoWatermark {
+ // 水印状态
+ // 0-关闭 1-打开 2-预览
+ int32 state = 1;
+ // 类型
+ // 1-用户昵称类型 2-用户id类型 3-用户名在logo下面
+ int32 type = 2;
+ // 位置
+ // 1-左上 2-右上 3-左下 4-右下
+ int32 position = 3;
+}
+
+//
+message ExtLbs {
+ //
+ string address = 1;
+ //
+ int64 distance = 2;
+ //
+ int64 type = 3;
+ //
+ string poi = 4;
+ //
+ LbsLoc location = 5;
+ //
+ string show_title = 6;
+ //
+ string title = 7;
+ //
+ string show_distance = 8;
+}
+
+// 根据name取uid-请求
+message GetUidByNameReq {
+ // 查询昵称列表
+ repeated string names = 1;
+}
+
+// 根据name取uid-响应
+message GetUidByNameRsp {
+ // k:昵称 v:mid
+ map uids = 1;
+}
+
+// 发布时附带的商品卡的详细内容
+message GoodsContent {
+ // 商品类型
+ // 1淘宝、2会员购
+ int32 source_type = 1;
+ // 商品的id
+ int64 item_id = 2;
+ // 店铺的id,兼容老版本
+ int64 shop_id = 3;
+}
+
+// UP已经创建的活动列表
+message LaunchedActivity {
+ // 模块名称,示例:"已创建的活动"
+ string module_title = 1;
+ // 已创建的活动列表
+ repeated LaunchedActivityItem activities = 2;
+ // 展示更多按钮
+ // 已创建活动大于5个时下发
+ ShowMoreLaunchedActivity show_more = 3;
+}
+
+// UP已经创建的活动详情
+message LaunchedActivityItem {
+ // 活动id
+ int64 activity_id = 1;
+ // 活动名称
+ string activity_name = 2;
+ // 活动是否已上线
+ // 0未上线 1已上线
+ int32 activity_state = 3;
+}
+
+//
+message LbsLoc {
+ // 经度
+ double lat = 1;
+ // 纬度
+ double lng = 2;
+}
+
+//
+message MetaDataCtrl {
+ // 客户端平台
+ string platform = 1;
+ // 客户端build号
+ string build = 2;
+ // 客户端移动设备类型
+ string mobi_app = 3;
+ // 客户端buvid
+ string buvid = 4;
+ // 用户设备信息
+ string device = 5;
+ // 请求来源页面的spmid
+ string from_spmid = 6;
+ // 请求来源页面
+ string from = 7;
+ // 请求的trace_id
+ string trace_id = 8;
+ // 青少年模式
+ int32 teenager_mode = 9;
+ // 0:正常 1:冷启动
+ int32 cold_start = 10;
+ // 客户端版本号
+ string version = 11;
+ // 网络状态
+ // Unknown=0 WIFI=1 WWAN=2
+ int32 network = 12;
+ // 用户ip地址
+ string ip = 13;
+}
+
+//
+message PlusRedDot {
+ //
+ int64 plus_has_red_dot = 1;
+}
+
+// 小程序内容定义
+message Program {
+ // 标题
+ string title = 1;
+ // 描述文字
+ string desc = 2;
+ // 封面图
+ string cover = 3;
+ // 跳转链接
+ string target_url = 4;
+ // 小程序icon
+ string icon = 5;
+ // 小程序名称
+ string program_text = 6;
+ // 跳转链接文案,如:去看看
+ string jump_text = 7;
+}
+
+// 发布相关的设置项
+message PublishSetting {
+ // 提示转为专栏的最小字数,使用utf-16编码计算字符数
+ int32 min_words_to_article = 1;
+ // 提示转为专栏的最大字数,使用utf-16编码计算字符数
+ int32 max_words_to_article = 2;
+ // gif上传的最大值,单位:MB
+ int32 upload_size = 3;
+}
+
+// 发布页小黄条
+message PublishYellowBar {
+ // 展示文案
+ string text = 1;
+ // 跳转链接
+ string url = 2;
+ // 展示图标
+ string icon = 3;
+}
+
+//
+message RepostInitCheck {
+ //
+ DynIdentity repost_src = 1;
+ //
+ string share_id = 2;
+ //
+ int32 share_mode = 3;
+}
+
+//
+enum ReserveSource {
+ RESERVE_SOURCE_NEW = 0; //
+ RESERVE_SOURCE_ASSOCIATED = 1; //
+}
+
+// 分享渠道信息
+message ShareChannel {
+ // 业务类型,如动态是"dynamic"
+ string share_origin = 1;
+ // 业务资源id
+ string oid = 2;
+ // 辅助id, 非必返回字段
+ string sid = 3;
+ // 渠道列表
+ repeated ShareChannelItem share_channels = 4;
+}
+
+// 渠道
+message ShareChannelItem {
+ // 展示文案
+ string name = 1;
+ // 展示图标
+ string picture = 2;
+ // 渠道名称
+ string share_channel = 3;
+ // 预约卡分享图信息,仅分享有预约信息的动态时存在
+ ShareReserve reserve = 4;
+}
+
+//
+message ShareReserve {
+ // 标题
+ string title = 1;
+ // 描述(时间+类型)
+ string desc = 2;
+ // 二维码附带icon
+ string qr_code_icon = 3;
+ // 二维码附带文本
+ string qr_code_text = 4;
+ // 二维码链接
+ string qr_code_url = 5;
+ //
+ string name = 6;
+ //
+ string face = 7;
+ //
+ ShareReservePoster poster = 8;
+ //
+ ShareReserveLottery reserve_lottery = 9;
+}
+
+//
+message ShareReserveLottery {
+ //
+ string icon = 1;
+ //
+ string text = 2;
+}
+
+//
+message ShareReservePoster {
+ //
+ string url = 1;
+ //
+ double width = 2;
+ //
+ double height = 3;
+}
+
+//
+message ShareResult {
+ //
+ int64 share_enable = 1;
+ //
+ string toast = 2;
+}
+
+// UP已经创建的活动列表中的展示更多按钮详情
+message ShowMoreLaunchedActivity {
+ // 按钮的文案
+ string button_text = 1;
+ // 按钮的跳转链接
+ string jump_url = 2;
+}
+
+// 通用模板的网页元内容(sketch结构)定义
+message Sketch {
+ // 元内容标题,长度30限制
+ string title = 1;
+ // 描述文字(文本内容第二行),长度233限制
+ string desc_text = 2;
+ // 文本文字(文本内容第三行),仅限竖图通用卡片使用,长度233限制
+ string text = 3;
+ // 表示业务方的id表示,对于在业务方有唯一标示的必填
+ int64 biz_id = 4;
+ // 业务类型,与展示时的右上角标有关,需要业务方向动态申请
+ int64 biz_type = 5;
+ // 封面图片链接地址,域名需要符合白名单
+ string cover_url = 6;
+ // 跳转链接地址,域名需要符合白名单
+ string target_url = 7;
+}
+
+// 发布相关的权限内容
+message UpPermission {
+ // 通用权限列表
+ repeated UpPermissionItem items = 1;
+ // 已经创建的活动列表
+ LaunchedActivity launched_activity = 2;
+ //
+ ShareResult share_result = 3;
+}
+
+// 通用发布权限内容的详细定义
+message UpPermissionItem {
+ // 类型,enum UpPermissionType
+ int32 type = 1;
+ // UP是否有权限
+ // 1-有,2-限制(展示但不可点,仅预约使用)
+ int32 permission = 2;
+ // 按钮文案
+ string title = 3;
+ // 功能开关的副标题
+ string subtitle = 4;
+ // 按钮图标的url地址
+ string icon = 5;
+ // 跳转链接,permission=1时点击按钮跳到此链接
+ string jump_url = 6;
+ // 错误提示,permission=2时点击按钮会弹出此提示,目前仅预约使用
+ string toast = 7;
+ //
+ int64 has_red_dot = 8;
+}
+
+//
+enum UpPermissionType {
+ UP_PERMISSION_TYPE_NONE = 0; // 占位
+ UP_PERMISSION_TYPE_LOTTERY = 1; // 是否是抽奖的灰度用户,默认不是
+ UP_PERMISSION_TYPE_CLIP_PUBLISHED = 2; // 之前是否发过小视频,默认没发过
+ UP_PERMISSION_TYPE_UGC_ATTACH_CARD = 3; // 是否可以添加ugc附加卡,默认不可以
+ UP_PERMISSION_TYPE_GOODS_ATTACH_CARD = 4; // 是否有权限添加商品附加卡
+ UP_PERMISSION_TYPE_CHOOSE_COMMENT = 5; // 是否有权限自主精选评论白名单,默认没有
+ UP_PERMISSION_TYPE_CONTROL_COMMENT = 6; // 是否有权限关闭评论区,默认有
+ UP_PERMISSION_TYPE_CONTROL_DANMU = 7; // 是否有权限关闭弹幕(仅对动态视频生效),默认有
+ UP_PERMISSION_TYPE_VIDEO_RESERVE = 8; // 是否可以发起稿件预约
+ UP_PERMISSION_TYPE_LIVE_RESERVE = 9; // 是否可以发起直播预约
+}
+
+// 用户主动发布(app/web发布)时的meta信息
+message UserCreateMeta {
+ // 用户发布客户端的meta信息
+ MetaDataCtrl app_meta = 1;
+ // 用户发布时的位置信息(经纬度)
+ LbsLoc loc = 2;
+ // 1-发布页转发 2-立即转发
+ int32 repost_mode = 3;
+}
+
+//
+message VideoShareInfo {
+ //
+ int64 cid = 1;
+ //
+ int32 part = 2;
+}
diff --git a/bili-api/grpc/proto/bilibili/dynamic/gw/gateway.proto b/bili-api/grpc/proto/bilibili/dynamic/gw/gateway.proto
new file mode 100644
index 000000000..2cba44cbc
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/dynamic/gw/gateway.proto
@@ -0,0 +1,2754 @@
+syntax = "proto3";
+
+package bilibili.dynamic.gateway;
+
+option java_multiple_files = true;
+
+import "google/protobuf/any.proto";
+
+// 综合页请求广告所需字段,由客户端-网关透传
+message AdParam {
+ // 综合页请求广告所需字段,由客户端-网关透传
+ string ad_extra = 1;
+ // request_id
+ string request_id = 2;
+}
+
+//
+enum AddButtonBgStyle {
+ fill = 0; // 默认填充
+ stroke = 1; // 描边
+ gray = 2; // 置灰
+}
+
+// 按钮类型
+enum AddButtonType {
+ bt_none = 0; // 占位
+ bt_jump = 1; // 跳转
+ bt_button = 2; // 按钮
+}
+
+// 动态-附加卡-通用卡
+message AdditionCommon {
+ // 头部说明文案
+ string head_text = 1;
+ // 标题
+ string title = 2;
+ // 展示图
+ string image_url = 3;
+ // 描述文字1
+ string desc_text_1 = 4;
+ // 描述文字2
+ string desc_text_2 = 5;
+ // 点击跳转链接
+ string url = 6;
+ // 按钮
+ AdditionalButton button = 7;
+ // 头部icon
+ string head_icon = 8;
+ // style
+ ImageStyle style = 9;
+ // 动态本身的类型 type
+ string type = 10;
+ // 附加卡类型
+ string card_type = 11; // ogv manga
+}
+
+// 动态-附加卡-电竞卡
+message AdditionEsport {
+ // 电竞类型
+ EspaceStyle style = 1;
+ oneof item {
+ // moba类
+ AdditionEsportMoba addition_esport_moba = 2;
+ }
+ // 动态本身的类型 type
+ string type = 3;
+ // 附加卡类型
+ string card_type = 4; // ogv manga
+}
+
+// 动态-附加卡-电竞卡-moba类
+message AdditionEsportMoba {
+ // 头部说明文案
+ string head_text = 1;
+ // 标题
+ string title = 2;
+ // 战队列表
+ repeated MatchTeam match_team = 3;
+ // 比赛信息
+ AdditionEsportMobaStatus addition_esport_moba_status = 4;
+ // 卡片跳转
+ string uri = 5;
+ // 按钮
+ AdditionalButton button = 6;
+ // 副标题
+ string sub_title = 7;
+ // 动态本身的类型 type
+ string type = 10;
+ // 附加卡类型
+ string card_type = 11;
+}
+
+// 动态-附加卡-电竞卡-moba类-比赛信息
+message AdditionEsportMobaStatus {
+ // 文案类
+ repeated AdditionEsportMobaStatusDesc addition_esport_moba_status_desc = 1;
+ // 比赛状态文案
+ string title = 2;
+ // 比赛状态状态
+ int32 status = 3;
+ // 日间色值
+ string color = 4;
+ // 夜间色值
+ string night_color = 5;
+}
+
+// 动态-附加卡-电竞卡-moba类-比赛信息-文案类
+message AdditionEsportMobaStatusDesc {
+ // 文案
+ string title = 1;
+ // 日间色值
+ string color = 2;
+ // 夜间色值
+ string night_color = 3;
+}
+
+// 动态-附加卡-商品卡
+message AdditionGoods {
+ // 推荐文案
+ string rcmd_desc = 1;
+ // 商品信息
+ repeated GoodsItem goods_items = 2;
+ // 附加卡类型
+ string card_type = 3;
+ // 头部icon
+ string icon = 4;
+ // 商品附加卡整卡跳转
+ string uri = 5;
+ // 商品类型
+ // 1:淘宝 2:会员购,注:实际是获取的goods_items里面的第一个source_type
+ int32 source_type = 6;
+}
+
+// up主预约发布卡
+message AdditionUP {
+ // 标题
+ string title = 1;
+ // 高亮文本,描述文字1
+ HighlightText desc_text_1 = 2;
+ // 描述文字2
+ string desc_text_2 = 3;
+ // 点击跳转链接
+ string url = 4;
+ // 按钮
+ AdditionalButton button = 5;
+ // 附加卡类型
+ string card_type = 6;
+ // 预约人数(用于预约人数变化)
+ int64 reserve_total = 7;
+ // 活动皮肤
+ AdditionalActSkin act_skin = 8;
+}
+
+// 动态-附加卡-UGC视频附加卡
+message AdditionUgc {
+ // 说明文案
+ string head_text = 1;
+ // 稿件标题
+ string title = 2;
+ // 封面
+ string cover = 3;
+ // 描述文字1
+ string desc_text_1 = 4;
+ // 描述文字2
+ string desc_text_2 = 5;
+ // 接秒开
+ string uri = 6;
+ // 时长
+ string duration = 7;
+ // 标题支持换行-标题支持单行和双行,本期不支持填充up昵称,支持双行展示,字段默认为true
+ bool line_feed = 8;
+ // 附加卡类型
+ string card_type = 9;
+}
+
+// 动态-附加卡-投票
+message AdditionVote {
+ // 封面图
+ string image_url = 1;
+ // 标题
+ string title = 2;
+ // 展示项1
+ string text_1 = 3;
+ // button文案
+ string button_text = 4;
+ // 点击跳转链接
+ string url = 5;
+}
+
+// 动态模块-投票
+message AdditionVote2 {
+ // 投票类型
+ AdditionVoteType addition_vote_type = 1;
+ // 投票ID
+ int64 vote_id = 2;
+ // 标题
+ string title = 3;
+ // 已过期: xxx人参与· 投票已过期。button 展示去查看
+ // 未过期: xxx人参与· 剩xx天xx时xx分。button展示去投票
+ string label = 4;
+ // 剩余时间
+ int64 deadline = 5;
+ // 生效文案
+ string open_text = 6;
+ // 过期文案
+ string close_text = 7;
+ // 已投票
+ string voted_text = 8;
+ // 投票状态
+ AdditionVoteState state = 9;
+ // 投票信息
+ oneof item {
+ //
+ AdditionVoteWord addition_vote_word = 10;
+ //
+ AdditionVotePic addition_vote_pic = 11;
+ //
+ AdditionVoteDefaule addition_vote_defaule = 12;
+ }
+ // 业务类型
+ // 0:动态投票 1:话题h5组件
+ int32 biz_type = 13;
+ // 投票总人数
+ int64 total = 14;
+ // 附加卡类型
+ string card_type = 15;
+ // 异常提示
+ string tips = 16;
+ // 跳转地址
+ string uri = 17;
+ // 是否投票
+ bool is_voted = 18;
+ // 投票最多多选个数,单选为1
+ int32 choice_cnt = 19;
+ // 是否默认选中分享到动态
+ bool defaule_select_share = 20;
+}
+
+// 外露投票
+message AdditionVoteDefaule {
+ // 图片 多张
+ repeated string cover = 1;
+}
+
+// 外露图片类型
+message AdditionVotePic {
+ // 图片投票详情
+ repeated AdditionVotePicItem item = 1;
+}
+
+// 图片投票详情
+message AdditionVotePicItem {
+ // 选项索引,从1开始
+ int32 opt_idx = 1;
+ // 图片
+ string cover = 2;
+ // 选中状态
+ bool is_vote = 3;
+ // 人数
+ int32 total = 4;
+ // 占比
+ double persent = 5;
+ // 标题文案
+ string title = 6;
+ // 是否投票人数最多的选项
+ bool is_max_option = 7;
+}
+
+// 投票状态
+enum AdditionVoteState {
+ addition_vote_state_none = 0; //
+ addition_vote_state_open = 1; //
+ addition_vote_state_close = 2; //
+}
+
+// 投票类型
+enum AdditionVoteType {
+ addition_vote_type_none = 0; //
+ addition_vote_type_word = 1; //
+ addition_vote_type_pic = 2; //
+ addition_vote_type_default = 3; //
+}
+
+// 外露文字类型
+message AdditionVoteWord {
+ // 外露文字投票详情
+ repeated AdditionVoteWordItem item = 1;
+}
+
+// 外露文字投票详情
+message AdditionVoteWordItem {
+ // 选项索引,从1开始
+ int32 opt_idx = 1;
+ // 文案
+ string title = 2;
+ // 选中状态
+ bool is_vote = 3;
+ // 人数
+ int32 total = 4;
+ // 占比
+ double persent = 5;
+ // 是否投票人数最多的选项
+ bool is_max_option = 6;
+}
+
+// 活动皮肤
+message AdditionalActSkin {
+ // 动画SVGA资源
+ string svga = 1;
+ // 动画SVGA最后一帧图片资源
+ string last_image = 2;
+ // 动画播放次数
+ int64 play_times = 3;
+}
+
+// 动态-附加卡-按钮
+message AdditionalButton {
+ // 按钮类型
+ AddButtonType type = 1;
+ // jump-跳转样式
+ AdditionalButtonStyle jump_style = 2;
+ // jump-跳转链接
+ string jump_url = 3;
+ // button-未点样式
+ AdditionalButtonStyle uncheck = 4;
+ // button-已点样式
+ AdditionalButtonStyle check = 5;
+ // button-当前状态
+ AdditionalButtonStatus status = 6;
+ // 按钮点击样式
+ AdditionalButtonClickType click_type = 7;
+}
+
+// 附加卡按钮点击类型
+enum AdditionalButtonClickType {
+ click_none = 0; // 通用按钮
+ click_up = 1; // 预约卡按钮
+}
+
+message AdditionalButtonInteractive {
+ // 是否弹窗
+ string popups = 1;
+ // 弹窗确认文案
+ string confirm = 2;
+ // 弹窗取消文案
+ string cancel = 3;
+ //
+ string desc = 4;
+}
+
+//
+enum AdditionalButtonStatus {
+ none = 0; //
+ uncheck = 1; //
+ check = 2; //
+}
+
+// 动态-附加卡-按钮样式
+message AdditionalButtonStyle {
+ // icon
+ string icon = 1;
+ // 文案
+ string text = 2;
+ // 按钮点击交互
+ AdditionalButtonInteractive interactive = 3;
+ // 当前按钮填充样式
+ AddButtonBgStyle bg_style = 4;
+ // toast文案, 当disable=1时有效
+ string toast = 5;
+ // 当前按钮样式,
+ // 0:高亮 1:置灰(按钮不可点击)
+ DisableState disable = 6;
+}
+
+// 动态-附加卡-番剧卡
+message AdditionalPGC {
+ // 头部说明文案
+ string head_text = 1;
+ // 标题
+ string title = 2;
+ // 展示图
+ string image_url = 3;
+ // 描述文字1
+ string desc_text_1 = 4;
+ // 描述文字2
+ string desc_text_2 = 5;
+ // 点击跳转链接
+ string url = 6;
+ // 按钮
+ AdditionalButton button = 7;
+ // 头部icon
+ string head_icon = 8;
+ // style
+ ImageStyle style = 9;
+ // 动态本身的类型 type
+ string type = 10;
+}
+
+// 枚举-动态附加卡
+enum AdditionalType {
+ additional_none = 0; // 占位
+ additional_type_pgc = 1; // 附加卡-追番
+ additional_type_goods = 2; // 附加卡-商品
+ additional_type_vote = 3; // 附加卡投票
+ additional_type_common = 4; // 附加通用卡
+ additional_type_esport = 5; // 附加电竞卡
+ additional_type_up_rcmd = 6; // 附加UP主推荐卡
+ additional_type_ugc = 7; // 附加卡-ugc
+ additional_type_up_reservation = 8; // UP主预约卡
+}
+
+// 动态卡片列表
+message CardVideoDynList {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 更新的动态数
+ int64 update_num = 2;
+ // 历史偏移
+ string history_offset = 3;
+ // 更新基础信息
+ string update_baseline = 4;
+ // 是否还有更多数据
+ bool has_more = 5;
+}
+
+// 视频页-我的追番
+message CardVideoFollowList {
+ // 查看全部(跳转链接)
+ string view_all_link = 1;
+ // 追番列表
+ repeated FollowListItem list = 2;
+}
+
+// 视频页-最近访问
+message CardVideoUpList {
+ // 标题展示文案
+ string title = 1;
+ // up主列表
+ repeated UpListItem list = 2;
+ // 服务端生成的透传上报字段
+ string footprint = 3;
+ // 直播数
+ int32 show_live_num = 4;
+ // 跳转label
+ UpListMoreLabel more_label = 5;
+ // 标题开关(综合页)
+ int32 title_switch = 6;
+ // 是否展示右上角查看更多label
+ bool show_more_label = 7;
+ // 是否在快速消费页查看更多按钮
+ bool show_in_personal = 8;
+ // 是否展示右侧查看更多按钮
+ bool show_more_button = 9;
+}
+
+// 评论外露展示项
+message CmtShowItem {
+ // 用户mid
+ int64 uid = 1;
+ // 用户昵称
+ string uname = 2;
+ // 点击跳转链接
+ string uri = 3;
+ // 评论内容
+ string comment = 4;
+}
+
+// 装扮卡片-粉丝勋章信息
+message DecoCardFan {
+ // 是否是粉丝
+ int32 is_fan = 1;
+ // 数量
+ int32 number = 2;
+ // 数量 str
+ string number_str = 3;
+ // 颜色
+ string color = 4;
+}
+
+// 装扮卡片
+message DecorateCard {
+ // 装扮卡片id
+ int64 id = 1;
+ // 装扮卡片链接
+ string card_url = 2;
+ // 装扮卡片点击跳转链接
+ string jump_url = 3;
+ // 粉丝样式
+ DecoCardFan fan = 4;
+}
+
+// 文本类型
+enum DescType {
+ desc_type_none = 0; // 占位
+ desc_type_text = 1; // 文本
+ desc_type_aite = 2; // @
+ desc_type_lottery = 3; // 抽奖
+ desc_type_vote = 4; // 投票
+ desc_type_topic = 5; // 话题
+ desc_type_goods = 6; // 商品
+ desc_type_bv = 7; // bv
+ desc_type_av = 8; // av
+ desc_type_emoji = 9; // 表情
+ desc_type_user = 10; // 外露用户
+ desc_type_cv = 11; // 专栏
+ desc_type_vc = 12; // 小视频
+ desc_type_web = 13; // 网址
+ desc_type_taobao = 14; // 淘宝
+ desc_type_mail = 15; // 邮箱
+ desc_type_ogv_season = 16; // 番剧season
+ desc_type_ogv_ep = 17; // 番剧ep
+}
+
+// 文本描述
+message Description {
+ // 文本内容
+ string text = 1;
+ // 文本类型
+ DescType type = 2;
+ // 点击跳转链接
+ string uri = 3;
+ // emoji类型
+ EmojiType emoji_type = 4;
+ // 商品类型
+ string goods_type = 5;
+ // 前置Icon
+ string icon_url = 6;
+ // icon_name
+ string icon_name = 7;
+ // 资源ID
+ string rid = 8;
+ // 商品卡特殊字段
+ ModuleDescGoods goods = 9;
+ // 文本原始文案
+ string orig_text = 10;
+}
+
+// 尺寸信息
+message Dimension {
+ //
+ int64 height = 1;
+ //
+ int64 width = 2;
+ //
+ int64 rotate = 3;
+}
+
+//
+enum DisableState {
+ highlight = 0; // 高亮
+ gary = 1; // 置灰(按钮不可点击)
+}
+
+// 动态通用附加卡-follow/取消follow-响应
+message DynAdditionCommonFollowReply {
+ //
+ AdditionalButtonStatus status = 1;
+}
+
+// 动态通用附加卡-follow/取消follow-请求
+message DynAdditionCommonFollowReq {
+ //
+ AdditionalButtonStatus status = 1;
+ //
+ string dyn_id = 2;
+ //
+ string card_type = 3;
+}
+
+// 最近访问-个人feed流列表-返回
+message DynAllPersonalReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 偏移量
+ string offset = 2;
+ // 是否还有更多数据
+ bool has_more = 3;
+ // 已读进度
+ string read_offset = 4;
+ // 关注状态
+ Relation relation = 5;
+}
+
+// 最近访问-个人feed流列表-请求
+message DynAllPersonalReq {
+ // 被访问者的 UID
+ int64 host_uid = 1;
+ // 偏移量 第一页可传空
+ string offset = 2;
+ // 标明下拉几次
+ int32 page = 3;
+ // 是否是预加载 默认是1;客户端预加载。1:是预加载,不更新已读进度,不会影响小红点;0:非预加载,更新已读进度
+ int32 is_preload = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 6;
+ // 服务端生成的透传上报字段
+ string footprint = 7;
+ // 来源
+ string from = 8;
+ // 秒开用
+ PlayerArgs player_args = 9;
+}
+
+// 动态综合页-响应
+message DynAllReply {
+ // 卡片列表
+ DynamicList dynamic_list = 1;
+ // 顶部up list
+ CardVideoUpList up_list = 2;
+ // 话题广场
+ TopicList topic_list = 3;
+ // 无关注推荐
+ Unfollow unfollow = 4;
+}
+
+// 动态综合页-请求
+message DynAllReq {
+ // 透传 update_baseline
+ string update_baseline = 1;
+ // 透传 history_offset
+ string offset = 2;
+ // 向下翻页数
+ int32 page = 3;
+ // 刷新方式 1向上刷新 2向下翻页
+ Refresh refresh_type = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 综合页当前更新的最大值
+ string assist_baseline = 6;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 7;
+ // 推荐up主入参(new的时候传)
+ RcmdUPsParam rcmd_ups_param = 8;
+ // 广告参数
+ AdParam ad_param = 9;
+ // 是否冷启
+ int32 cold_start = 10;
+ // 来源
+ string from = 11;
+ // 秒开参数
+ PlayerArgs player_args = 12;
+}
+
+// 最近访问-标记已读-请求
+message DynAllUpdOffsetReq {
+ // 被访问者的UID
+ int64 host_uid = 1;
+ // 用户已读进度
+ string read_offset = 2;
+ // 服务端生成的透传上报字段
+ string footprint = 3;
+}
+
+// 动态详情页-响应
+message DynDetailReply {
+ // 动态详情
+ DynamicItem item = 1;
+}
+
+// 批量动态id获取动态详情-请求
+message DynDetailsReq {
+ // 动态id
+ string dynamic_ids = 1;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 2;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 3;
+ // 秒开参数
+ PlayerArgs player_args = 4;
+}
+
+// 动态小卡类型
+enum DynExtendType {
+ dyn_ext_type_none = 0; // 占位
+ dyn_ext_type_topic = 1; // 话题小卡
+ dyn_ext_type_lbs = 2; // lbs小卡
+ dyn_ext_type_hot = 3; // 热门小卡
+ dyn_ext_type_game = 4; // 游戏小卡
+ dyn_ext_type_common = 5; // 通用小卡
+ dyn_ext_type_biliCut = 6; // 必剪小卡
+ dyn_ext_type_ogv = 7; // ogv小卡
+ dyn_ext_type_auto_ogv = 8; // 自动附加ogv小卡
+}
+
+// 动态发布生成临时卡-响应
+message DynFakeCardReply {
+ // 动态卡片
+ DynamicItem item = 1;
+}
+
+// 动态发布生成临时卡-请求
+message DynFakeCardReq {
+ //卡片内容json string
+ string content = 1;
+}
+
+// 查看更多-列表-响应
+message DynMixUpListViewMoreReply {
+ //
+ repeated MixUpListItem items = 1;
+ //
+ string search_default_text = 2;
+ // 排序类型列表
+ repeated SortType sort_types = 3;
+ // 是否展示更多的排序策略
+ bool show_more_sort_types = 4;
+ // 默认排序策略
+ int32 default_sort_type = 5;
+}
+
+// 查看更多-请求
+message DynMixUpListViewMoreReq {
+ // 排序策略
+ // 1:推荐排序 2:最常访问 3:最近关注,其他值为默认排序
+ int32 sort_type = 1;
+}
+
+// 动态模块类型
+enum DynModuleType {
+ module_none = 0; // 占位
+ module_author = 1; // 发布人模块
+ module_dispute = 2; // 争议小黄条
+ module_desc = 3; // 描述文案
+ module_dynamic = 4; // 动态卡片
+ module_forward = 5; // 转发模块
+ module_likeUser = 6; // 点赞用户(废弃)
+ module_extend = 7; // 小卡模块
+ module_additional = 8; // 附加卡
+ module_stat = 9; // 计数信息
+ module_fold = 10; // 折叠
+ module_comment = 11; // 评论外露(废弃)
+ module_interaction = 12; // 外露交互模块(点赞、评论)
+ module_author_forward = 13; // 转发卡的发布人模块
+ module_ad = 14; // 广告卡模块
+ module_banner = 15; // 通栏模块
+ module_item_null = 16; // 获取物料失败模块
+ module_share_info = 17; // 分享组件
+ module_recommend = 18; // 相关推荐模块
+ module_stat_forward = 19; // 转发卡计数信息
+ module_top = 20; // 顶部模块
+ module_bottom = 21; // 底部模块
+}
+
+// 关注推荐up主换一换-响应
+message DynRcmdUpExchangeReply {
+ // 无关注推荐
+ Unfollow unfollow = 1;
+}
+
+// 关注推荐up主换一换-请求
+message DynRcmdUpExchangeReq {
+ // 登录用户id
+ int64 uid = 1;
+ // 上一次不感兴趣的ts,单位:秒;该字段透传给搜索
+ int64 dislikeTs = 2;
+ // 需要与服务端确认或参照客户端现有参数
+ string from = 3;
+}
+
+// 动态点赞-请求
+message DynThumbReq {
+ // 用户uid
+ int64 uid = 1;
+ // 动态id
+ string dyn_id = 2;
+ // 动态类型(透传extend中的dyn_type)
+ int64 dyn_type = 3;
+ // 业务方资源id
+ string rid = 4;
+ // 点赞类型
+ ThumbType type = 5;
+}
+
+//
+enum DynUriType {
+ dyn_uri_type_none = 0; //
+ dyn_uri_type_direct = 1; // 直接跳转对应uri
+ dyn_uri_type_suffix = 2; // 作为后缀拼接
+}
+
+// 最近访问-个人feed流列表-响应
+message DynVideoPersonalReply {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 偏移量
+ string offset = 2;
+ // 是否还有更多数据
+ bool has_more = 3;
+ // 已读进度
+ string read_offset = 4;
+ // 关注状态
+ Relation relation = 5;
+}
+
+// 最近访问-个人feed流列表-请求
+message DynVideoPersonalReq {
+ // 被访问者的 UID
+ int64 host_uid = 1;
+ // 偏移量 第一页可传空
+ string offset = 2;
+ // 标明下拉几次
+ int32 page = 3;
+ // 是否是预加载
+ int32 is_preload = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 6;
+ // 服务端生成的透传上报字段
+ string footprint = 7;
+ // 来源
+ string from = 8;
+ // 秒开参数
+ PlayerArgs player_args = 9;
+}
+
+// 动态视频页-响应
+message DynVideoReply {
+ // 卡片列表
+ CardVideoDynList dynamic_list = 1;
+ // 动态卡片
+ CardVideoUpList video_up_list = 2;
+ // 视频页-我的追番
+ CardVideoFollowList video_follow_list = 3;
+}
+
+// 动态视频页-请求
+message DynVideoReq {
+ // 透传 update_baseline
+ string update_baseline = 1;
+ // 透传 history_offset
+ string offset = 2;
+ // 向下翻页数
+ int32 page = 3;
+ // 刷新方式
+ // 1:向上刷新 2:向下翻页
+ Refresh refresh_type = 4;
+ // 秒开参数 新版本废弃,统一使用player_args
+ PlayurlParam playurl_param = 5;
+ // 综合页当前更新的最大值
+ string assist_baseline = 6;
+ // 客户端时区 兼容UTC-14和Etc/GMT+12,时区区间[-12,14] 东八区为8
+ int32 local_time = 7;
+ // 来源
+ string from = 8;
+ // 秒开参数
+ PlayerArgs player_args = 9;
+}
+
+// 最近访问-标记已读-请求
+message DynVideoUpdOffsetReq {
+ // 被访问者的UID
+ int64 host_uid = 1;
+ // 用户已读进度
+ string read_offset = 2;
+ // 服务端生成的透传上报字段
+ string footprint = 3;
+}
+
+// 投票操作-响应
+message DynVoteReply {
+ // 投票详情
+ AdditionVote2 item = 1;
+ // 投票操作返回状态
+ string toast = 2;
+}
+
+// 投票操作-请求
+message DynVoteReq {
+ // 投票ID
+ int64 vote_id = 1;
+ // 选项索引数组
+ repeated int64 votes = 2;
+ // 状态
+ VoteStatus status = 3;
+ // 动态ID
+ string dynamic_id = 4;
+ // 是否分享
+ bool share = 5;
+}
+
+// 动态卡片
+message DynamicItem {
+ // 动态卡片类型
+ DynamicType card_type = 1;
+ // 转发类型下,源卡片类型
+ DynamicType item_type = 2;
+ // 模块内容
+ repeated Module modules = 3;
+ // 操作相关字段
+ Extend extend = 4;
+ // 该卡片下面是否含有折叠卡
+ int32 has_fold = 5;
+}
+
+//动态卡片列表
+message DynamicList {
+ // 动态列表
+ repeated DynamicItem list = 1;
+ // 更新的动态数
+ int64 update_num = 2;
+ // 历史偏移
+ string history_offset = 3;
+ // 更新基础信息
+ string update_baseline = 4;
+ // 是否还有更多数据
+ bool has_more = 5;
+}
+
+// 枚举-动态类型
+enum DynamicType {
+ dyn_none = 0; // 占位
+ forward = 1; // 转发
+ av = 2; // 稿件: ugc、小视频、短视频、UGC转PGC
+ pgc = 3; // pgc:番剧、PGC番剧、PGC电影、PGC电视剧、PGC国创、PGC纪录片
+ courses = 4; // 付费更新批次
+ fold = 5; // 折叠
+ word = 6; // 纯文字
+ draw = 7; // 图文
+ article = 8; // 专栏 原仅phone端
+ music = 9; // 音频 原仅phone端
+ common_square = 10; // 通用卡 方形
+ common_vertical = 11; // 通用卡 竖形
+ live = 12; // 直播卡 只有转发态
+ medialist = 13; // 播单 原仅phone端 只有转发态
+ courses_season = 14; // 付费更新批次 只有转发态
+ ad = 15; // 广告卡
+ applet = 16; // 小程序卡
+ subscription = 17; // 订阅卡
+ live_rcmd = 18; // 直播推荐卡
+ banner = 19; // 通栏
+ ugc_season = 20; // 合集卡
+ subscription_new = 21; // 新订阅卡
+}
+
+// 表情包类型
+enum EmojiType {
+ emoji_none = 0; // 占位
+ emoji_old = 1; // emoji旧类型
+ emoji_new = 2; // emoji新类型
+ vip = 3; // 大会员表情
+}
+
+// 附加大卡-电竞卡样式
+enum EspaceStyle {
+ moba = 0; // moba类
+}
+
+// 动态-拓展小卡模块-通用小卡
+message ExtInfoCommon {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // poiType
+ int32 poi_type = 4;
+ // 类型
+ DynExtendType type = 5;
+ // 客户端埋点用
+ string sub_module = 6;
+ // 行动点文案
+ string action_text = 7;
+ // 行动点链接
+ string action_url = 8;
+ // 资源rid
+ int64 rid = 9;
+ // 轻浏览是否展示
+ bool is_show_light = 10;
+}
+
+// 动态-拓展小卡模块-游戏小卡
+message ExtInfoGame {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 动态-拓展小卡模块-热门小卡
+message ExtInfoHot {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 动态-拓展小卡模块-lbs小卡
+message ExtInfoLBS {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // poiType
+ int32 poi_type = 4;
+}
+
+// 动态-拓展小卡模块-ogv小卡
+message ExtInfoOGV {
+ // ogv小卡
+ repeated InfoOGV info_ogv = 1;
+}
+
+// 动态-拓展小卡模块-话题小卡
+message ExtInfoTopic {
+ // 标题-话题名
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+}
+
+// 扩展字段,用于动态部分操作使用
+message Extend {
+ // 动态id
+ string dyn_id_str = 1;
+ // 业务方id
+ string business_id = 2;
+ // 源动态id
+ string orig_dyn_id_str = 3;
+ // 转发卡:用户名
+ string orig_name = 4;
+ // 转发卡:图片url
+ string orig_img_url = 5;
+ // 转发卡:文字内容
+ repeated Description orig_desc = 6;
+ // 填充文字内容
+ repeated Description desc = 7;
+ // 被转发的源动态类型
+ DynamicType orig_dyn_type = 8;
+ // 分享到站外展示类型
+ string share_type = 9;
+ // 分享的场景
+ string share_scene = 10;
+ // 是否快速转发
+ bool is_fast_share = 11;
+ // r_type 分享和转发
+ int32 r_type = 12;
+ // 数据源的动态类型
+ int64 dyn_type = 13;
+ // 用户id
+ int64 uid = 14;
+ // 卡片跳转
+ string card_url = 15;
+ // 透传字段
+ google.protobuf.Any source_content = 16;
+ // 转发卡:用户头像
+ string orig_face = 17;
+ // 评论跳转
+ ExtendReply reply = 18;
+}
+
+// 评论扩展
+message ExtendReply {
+ // 基础跳转地址
+ string uri = 1;
+ // 参数部分
+ repeated ExtendReplyParam params = 2;
+}
+
+// 评论扩展参数部分
+message ExtendReplyParam {
+ // 参数名
+ string key = 1;
+ // 参数值
+ string value = 2;
+}
+
+// 折叠类型
+enum FoldType {
+ FoldTypeZore = 0; // 占位
+ FoldTypePublish = 1; // 用户发布折叠
+ FoldTypeFrequent = 2; // 转发超频折叠
+ FoldTypeUnite = 3; // 联合投稿折叠
+ FoldTypeLimit = 4; // 动态受限折叠
+}
+
+// 视频页-我的追番-番剧信息
+message FollowListItem {
+ // season_id
+ int64 season_id = 1;
+ // 标题
+ string title = 2;
+ // 封面图
+ string cover = 3;
+ // 跳转链接
+ string url = 4;
+ // new_ep
+ NewEP new_ep = 5;
+ // 子标题
+ string sub_title = 6;
+ // 卡片位次
+ int64 pos = 7;
+}
+
+//
+enum FollowType {
+ ft_not_follow = 0; //
+ ft_follow = 1; //
+}
+
+// 动态-附加卡-商品卡-商品
+message GoodsItem {
+ // 图片
+ string cover = 1;
+ // schemaPackageName(Android用)
+ string schema_package_name = 2;
+ // 商品类型
+ // 1:淘宝 2:会员购
+ int32 source_type = 3;
+ // 跳转链接
+ string jump_url = 4;
+ // 跳转文案
+ string jump_desc = 5;
+ // 标题
+ string title = 6;
+ // 摘要
+ string brief = 7;
+ // 价格
+ string price = 8;
+ // item_id
+ int64 item_id = 9;
+ // schema_url
+ string schema_url = 10;
+ // open_white_list
+ repeated string open_white_list = 11;
+ // use_web_v2
+ bool user_web_v2 = 12;
+ // ad mark
+ string ad_mark = 13;
+}
+
+// 高亮文本
+message HighlightText {
+ // 展示文本
+ string text = 1;
+ // 高亮类型
+ HighlightTextStyle text_style = 2;
+}
+
+// 文本高亮枚举
+enum HighlightTextStyle {
+ style_none = 0; // 默认
+ style_highlight = 1; // 高亮
+}
+
+// 枚举-附加卡样式
+enum ImageStyle {
+ add_style_vertical = 0; //
+ add_style_square = 1; //
+}
+
+// 动态-拓展小卡模块-ogv小卡-(one of 片单、榜单、分区)
+message InfoOGV {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 小图标
+ string icon = 3;
+ // 客户端埋点用
+ string sub_module = 4;
+}
+
+// 外露交互模块
+message InteractionItem {
+ // 外露模块类型
+ LocalIconType icon_type = 1;
+ // 外露模块文案
+ repeated Description desc = 2;
+ // 外露模块uri相关 根据type不同用法不同
+ string uri = 3;
+ // 动态id
+ string dynamic_id = 4;
+ // 评论mid
+ int64 comment_mid = 6;
+}
+
+// 点赞动画
+message LikeAnimation {
+ // 开始动画
+ string begin = 1;
+ // 过程动画
+ string proc = 2;
+ // 结束动画
+ string end = 3;
+ // id
+ int64 like_icon_id = 4;
+}
+
+// 点赞拓展信息
+message LikeInfo {
+ // 点赞动画
+ LikeAnimation animation = 1;
+ // 是否点赞
+ bool is_like = 2;
+}
+
+// 点赞用户
+message LikeUser {
+ // 用户mid
+ int64 uid = 1;
+ // 用户昵称
+ string uname = 2;
+ // 点击跳转链接
+ string uri = 3;
+}
+
+// 直播信息
+message LiveInfo {
+ // 是否在直播
+ // 0:未直播 1:正在直播 (废弃)
+ int32 is_living = 1;
+ // 跳转链接
+ string uri = 2;
+ // 直播状态
+ LiveState live_state = 3;
+}
+
+// 直播状态
+enum LiveState {
+ live_none = 0; // 未直播
+ live_live = 1; // 直播中
+ live_rotation = 2; // 轮播中
+}
+
+// 外露模块类型
+enum LocalIconType {
+ local_icon_comment = 0; //
+ local_icon_like = 1; //
+}
+
+// 动态-附加卡-电竞卡-战队
+message MatchTeam {
+ // 战队ID
+ int64 id = 1;
+ // 战队名
+ string name = 2;
+ // 战队图标
+ string cover = 3;
+ // 日间色值
+ string color = 4;
+ // 夜间色值
+ string night_color = 5;
+}
+
+// 动态列表渲染部分-详情模块-小程序/小游戏
+message MdlDynApplet {
+ // 小程序id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 主标题
+ string title = 4;
+ // 副标题
+ string sub_title = 5;
+ // 封面图
+ string cover = 6;
+ // 小程序icon
+ string icon = 7;
+ // 小程序标题
+ string label = 8;
+ // 按钮文案
+ string button_title = 9;
+}
+
+// 动态-详情模块-稿件
+message MdlDynArchive {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // avid
+ int64 avid = 7;
+ // cid
+ int64 cid = 8;
+ // 视频源类型
+ MediaType media_type = 9;
+ // 尺寸信息
+ Dimension dimension = 10;
+ // 角标,多个角标之前有间距
+ repeated VideoBadge badge = 11;
+ // 是否能够自动播放
+ bool can_play = 12;
+ // stype
+ VideoType stype = 13;
+ // 是否PGC
+ bool isPGC = 14;
+ // inline播放地址
+ string inlineURL = 15;
+ // PGC的epid
+ int64 EpisodeId = 16;
+ // 子类型
+ int32 SubType = 17;
+ // PGC的ssid
+ int64 PgcSeasonId = 18;
+ // 播放按钮
+ string play_icon = 19;
+ // 时长
+ int64 duration = 20;
+ // 跳转地址
+ string jump_url = 21;
+ // 番剧是否为预览视频
+ bool is_preview = 22;
+ // 新角标,多个角标之前没有间距
+ repeated VideoBadge badge_category = 23;
+ // 当前是否是pgc正片
+ bool is_feature = 24;
+ // 是否是预约召回
+ ReserveType reserve_type = 25;
+ // bvid
+ string bvid = 26;
+ // 播放数
+ int32 view = 27;
+}
+
+// 动态列表渲染部分-详情模块-专栏模块
+message MdlDynArticle {
+ // 专栏id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 标题
+ string title = 3;
+ // 文案部分
+ string desc = 4;
+ // 配图
+ repeated string covers = 5;
+ // 阅读量标签
+ string label = 6;
+ // 模板类型
+ int32 templateID = 7;
+}
+
+// 动态列表渲染部分-详情模块-通用
+message MdlDynCommon {
+ // 物料id
+ int64 oid = 1;
+ // 跳转地址
+ string uri = 2;
+ // 标题
+ string title = 3;
+ // 描述 漫画卡标题下第一行
+ string desc = 4;
+ // 封面
+ string cover = 5;
+ // 标签1 漫画卡标题下第二行
+ string label = 6;
+ // 所属业务类型
+ int32 bizType = 7;
+ // 镜像数据ID
+ int64 sketchID = 8;
+ // 卡片样式
+ MdlDynCommonType style = 9;
+ // 角标
+ repeated VideoBadge badge = 10;
+}
+
+//
+enum MdlDynCommonType {
+ mdl_dyn_common_none = 0; //
+ mdl_dyn_common_square = 1; //
+ mdl_dyn_common_vertica = 2; //
+}
+
+// 动态-详情模块-付费课程批次
+message MdlDynCourBatch {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 跳转地址
+ string uri = 3;
+ // 展示项 1(本集标题)
+ string text_1 = 4;
+ // 展示项 2(更新了多少个视频)
+ string text_2 = 5;
+ // 角标
+ VideoBadge badge = 6;
+ // 播放按钮
+ string play_icon = 7;
+}
+
+// 动态-详情模块-付费课程系列
+message MdlDynCourSeason {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 跳转地址
+ string uri = 3;
+ // 展示项 1(更新信息)
+ string text_1 = 4;
+ // 描述信息
+ string desc = 5;
+ // 角标
+ VideoBadge badge = 6;
+ // 播放按钮
+ string play_icon = 7;
+}
+
+// 动态列表渲染部分-详情模块-图文模块
+message MdlDynDraw {
+ // 图片
+ repeated MdlDynDrawItem items = 1;
+ // 跳转地址
+ string uri = 2;
+ // 图文ID
+ int64 id = 3;
+}
+
+// 动态列表渲染部分-详情模块-图文
+message MdlDynDrawItem {
+ // 图片链接
+ string src = 1;
+ // 图片宽度
+ int64 width = 2;
+ // 图片高度
+ int64 height = 3;
+ // 图片大小
+ float size = 4;
+ // 图片标签
+ repeated MdlDynDrawTag tags = 5;
+}
+
+// 动态列表渲染部分-详情模块-图文-标签
+message MdlDynDrawTag {
+ // 标签类型
+ MdlDynDrawTagType type = 1;
+ // 标签详情
+ MdlDynDrawTagItem item = 2;
+}
+
+// 动态列表部分-详情模块-图文-标签详情
+message MdlDynDrawTagItem {
+ // 跳转链接
+ string url = 1;
+ // 标签内容
+ string text = 2;
+ // 坐标-x
+ int64 x = 3;
+ // 坐标-y
+ int64 y = 4;
+ // 方向
+ int32 orientation = 5;
+ // 来源
+ // 0:未知 1:淘宝 2:自营
+ int32 source = 6;
+ // 商品id
+ int64 item_id = 7;
+ // 用户mid
+ int64 mid = 8;
+ // 话题id
+ int64 tid = 9;
+ // lbs信息
+ string poi = 10;
+ // 商品标签链接
+ string schema_url = 11;
+}
+
+// 图文标签类型
+enum MdlDynDrawTagType {
+ mdl_draw_tag_none = 0; // 占位
+ mdl_draw_tag_common = 1; // 普通标签
+ mdl_draw_tag_goods = 2; // 商品标签
+ mdl_draw_tag_user = 3; // 用户昵称
+ mdl_draw_tag_topic = 4; // 话题名称
+ mdl_draw_tag_lbs = 5; // lbs标签
+}
+
+// 动态列表渲染部分-详情模块-转发模块
+message MdlDynForward {
+ // 动态转发核心模块 套娃
+ DynamicItem item = 1;
+ // 透传类型
+ // 0:分享 1:转发
+ int32 rtype = 2;
+}
+
+// 动态列表渲染部分-详情模块-直播
+message MdlDynLive {
+ // 房间号
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 直播间标题
+ string title = 3;
+ // 直播间封面
+ string cover = 4;
+ // 标题1 例: 陪伴学习
+ string cover_label = 5;
+ // 标题2 例: 54.6万人气
+ string cover_label2 = 6;
+ // 直播状态
+ LiveState live_state = 7;
+ // 直播角标
+ VideoBadge badge = 8;
+ // 是否是预约召回
+ ReserveType reserve_type = 9;
+}
+
+// 动态列表渲染部分-详情模块-直播推荐
+message MdlDynLiveRcmd {
+ // 直播数据
+ string content = 1;
+ // 是否是预约召回
+ ReserveType reserve_type = 2;
+}
+
+// 动态列表渲染部分-详情模块-播单
+message MdlDynMedialist {
+ // 播单id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // 主标题
+ string title = 3;
+ // 副标题
+ string sub_title = 4;
+ // 封面图
+ string cover = 5;
+ // 封面类型
+ int32 cover_type = 6;
+ // 角标
+ VideoBadge badge = 7;
+}
+
+// 动态列表渲染部分-详情模块-音频模块
+message MdlDynMusic {
+ // 音频id
+ int64 id = 1;
+ // 跳转地址
+ string uri = 2;
+ // upId
+ int64 up_id = 3;
+ // 歌名
+ string title = 4;
+ // 专辑封面
+ string cover = 5;
+ // 展示项1
+ string label1 = 6;
+ // upper
+ string upper = 7;
+}
+
+// 动态-详情模块-pgc
+message MdlDynPGC {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // cid
+ int64 cid = 7;
+ // season_id
+ int64 season_id = 8;
+ // epid
+ int64 epid = 9;
+ // aid
+ int64 aid = 10;
+ // 视频源类型
+ MediaType media_type = 11;
+ // 番剧类型
+ VideoSubType sub_type = 12;
+ // 番剧是否为预览视频
+ bool is_preview = 13;
+ // 尺寸信息
+ Dimension dimension = 14;
+ // 角标,多个角标之前有间距
+ repeated VideoBadge badge = 15;
+ // 是否能够自动播放
+ bool can_play = 16;
+ // season
+ PGCSeason season = 17;
+ // 播放按钮
+ string play_icon = 18;
+ // 时长
+ int64 duration = 19;
+ // 跳转地址
+ string jump_url = 20;
+ // 新角标,多个角标之前没有间距
+ repeated VideoBadge badge_category = 21;
+ // 当前是否是pgc正片
+ bool is_feature = 22;
+}
+
+// 动态列表渲染部分-详情模块-订阅卡
+message MdlDynSubscription {
+ // 卡片物料id
+ int64 id = 1;
+ // 广告创意id
+ int64 ad_id = 2;
+ // 跳转地址
+ string uri = 3;
+ // 标题
+ string title = 4;
+ // 封面图
+ string cover = 5;
+ // 广告标题
+ string ad_title = 6;
+ // 角标
+ VideoBadge badge = 7;
+ // 小提示
+ string tips = 8;
+}
+
+// 动态新附加卡
+message MdlDynSubscriptionNew {
+ //样式类型
+ MdlDynSubscriptionNewStyle style = 1;
+ // 新订阅卡数据
+ oneof item {
+ //
+ MdlDynSubscription dyn_subscription = 2;
+ // 直播推荐
+ MdlDynLiveRcmd dyn_live_rcmd = 3;
+ }
+}
+
+//
+enum MdlDynSubscriptionNewStyle {
+ mdl_dyn_subscription_new_style_nont = 0; // 占位
+ mdl_dyn_subscription_new_style_live = 1; // 直播
+ mdl_dyn_subscription_new_style_draw = 2; // 图文
+}
+
+// 动态列表渲染部分-UGC合集
+message MdlDynUGCSeason {
+ // 标题
+ string title = 1;
+ // 封面图
+ string cover = 2;
+ // 秒开地址
+ string uri = 3;
+ // 视频封面展示项 1
+ string cover_left_text_1 = 4;
+ // 视频封面展示项 2
+ string cover_left_text_2 = 5;
+ // 封面视频展示项 3
+ string cover_left_text_3 = 6;
+ // 卡片物料id
+ int64 id = 7;
+ // inline播放地址
+ string inlineURL = 8;
+ // 是否能够自动播放
+ bool can_play = 9;
+ // 播放按钮
+ string play_icon = 10;
+ // avid
+ int64 avid = 11;
+ // cid
+ int64 cid = 12;
+ // 尺寸信息
+ Dimension dimension = 13;
+ // 时长
+ int64 duration = 14;
+ // 跳转地址
+ string jump_url = 15;
+}
+
+// 播放器类型
+enum MediaType {
+ MediaTypeNone = 0; // 本地
+ MediaTypeUGC = 1; // UGC
+ MediaTypePGC = 2; // PGC
+ MediaTypeLive = 3; // 直播
+ MediaTypeVCS = 4; // 小视频
+}
+
+// 查看更多-列表单条数据
+message MixUpListItem {
+ // 用户mid
+ int64 uid = 1;
+ // 特别关注
+ // 0:否 1:是
+ int32 special_attention = 2;
+ // 小红点状态
+ // 0:没有 1:有
+ int32 reddot_state = 3;
+ // 直播信息
+ MixUpListLiveItem live_info = 4;
+ // 昵称
+ string name = 5;
+ // 头像
+ string face = 6;
+ // 认证信息
+ OfficialVerify official = 7;
+ // 大会员信息
+ VipInfo vip = 8;
+ // 关注状态
+ Relation relation = 9;
+}
+
+message MixUpListLiveItem {
+ // 直播状态
+ // 0:未直播 1:直播中
+ bool status = 1;
+ // 房间号
+ int64 room_id = 2;
+ // 跳转地址
+ string uri = 3;
+}
+
+// 动态模块
+message Module {
+ // 类型
+ DynModuleType module_type = 1;
+ oneof module_item {
+ // 用户模块 1
+ ModuleAuthor module_author = 2;
+ // 争议黄条模块 2
+ ModuleDispute module_dispute = 3;
+ // 动态正文模块 3
+ ModuleDesc module_desc = 4;
+ // 动态卡模块 4
+ ModuleDynamic module_dynamic = 5;
+ // 点赞外露(废弃)
+ ModuleLikeUser module_likeUser = 6;
+ // 小卡模块 6
+ ModuleExtend module_extend = 7;
+ // 大卡模块 5
+ ModuleAdditional module_additional = 8;
+ // 计数模块 8
+ ModuleStat module_stat = 9;
+ // 折叠模块 9
+ ModuleFold module_fold = 10;
+ // 评论外露(废弃)
+ ModuleComment module_comment = 11;
+ // 外露交互模块(点赞、评论) 7
+ ModuleInteraction module_interaction = 12;
+ // 转发卡-原卡用户模块
+ ModuleAuthorForward module_author_forward = 13;
+ // 广告卡
+ ModuleAd module_ad = 14;
+ // 通栏
+ ModuleBanner module_banner = 15;
+ // 获取物料失败
+ ModuleItemNull module_item_null = 16;
+ // 分享组件
+ ModuleShareInfo module_share_info = 17;
+ // 相关推荐模块
+ ModuleRecommend module_recommend = 18;
+ // 顶部模块
+ ModuleTop module_top = 19;
+ // 底部模块
+ ModuleButtom module_buttom = 20;
+ // 转发卡计数模块
+ ModuleStat module_stat_forward = 21;
+ }
+}
+
+// 动态列表-用户模块-广告卡
+message ModuleAd {
+ // 广告透传信息
+ google.protobuf.Any source_content = 1;
+ // 用户模块
+ ModuleAuthor module_author = 2;
+}
+
+// 动态-附加卡模块
+message ModuleAdditional {
+ // 类型
+ AdditionalType type = 1;
+ oneof item {
+ // 废弃
+ AdditionalPGC pgc = 2;
+ //
+ AdditionGoods goods = 3;
+ // 废弃
+ AdditionVote vote = 4;
+ //
+ AdditionCommon common = 5;
+ //
+ AdditionEsport esport = 6;
+ // 投票
+ AdditionVote2 vote2 = 8;
+ //
+ AdditionUgc ugc = 9;
+ // up主预约发布卡
+ AdditionUP up = 10;
+ }
+ // 附加卡物料ID
+ int64 rid = 7;
+}
+
+// 动态-发布人模块
+message ModuleAuthor {
+ // 用户mid
+ int64 mid = 1;
+ // 时间标签
+ string ptime_label_text = 2;
+ // 用户详情
+ UserInfo author = 3;
+ // 装扮卡片
+ DecorateCard decorate_card = 4;
+ // 点击跳转链接
+ string uri = 5;
+ // 右侧操作区域 - 三点样式
+ repeated ThreePointItem tp_list = 6;
+ // 右侧操作区域样式枚举
+ ModuleAuthorBadgeType badge_type = 7;
+ // 右侧操作区域 - 按钮样式
+ ModuleAuthorBadgeButton badge_button = 8;
+ // 是否关注
+ // 1:关注 0:不关注 默认0,注:点赞列表使用,其他场景不使用该字段
+ int32 attend = 9;
+ // 关注状态
+ Relation relation = 10;
+ // 右侧操作区域 - 提权样式
+ Weight weight = 11;
+}
+
+// 动态列表渲染部分-用户模块-按钮
+message ModuleAuthorBadgeButton {
+ // 图标
+ string icon = 1;
+ // 文案
+ string title = 2;
+ // 状态
+ int32 state = 3;
+ // 物料ID
+ int64 id = 4;
+}
+
+// 右侧操作区域样式枚举
+enum ModuleAuthorBadgeType {
+ module_author_badge_type_none = 0; // 占位
+ module_author_badge_type_threePoint = 1; // 三点
+ module_author_badge_type_button = 2; // 按钮类型
+ module_author_badge_type_weight = 3; // 提权
+}
+
+// 动态列表-用户模块-转发模板
+message ModuleAuthorForward {
+ // 展示标题
+ repeated ModuleAuthorForwardTitle title = 1;
+ // 源卡片跳转链接
+ string url = 2;
+ // 用户uid
+ int64 uid = 3;
+ // 时间标签
+ string ptime_label_text = 4;
+ // 是否展示关注
+ bool show_follow = 5;
+ // 源up主头像
+ string face_url = 6;
+ // 双向关系
+ Relation relation = 7;
+ // 右侧操作区域 - 三点样式
+ repeated ThreePointItem tp_list = 8;
+}
+
+// 动态列表-用户模块-转发模板-title部分
+message ModuleAuthorForwardTitle {
+ // 文案
+ string text = 1;
+ // 跳转链接
+ string url = 2;
+}
+
+// 动态列表-通栏
+message ModuleBanner {
+ // 模块标题
+ string title = 1;
+ // 卡片类型
+ ModuleBannerType type = 2;
+ // 卡片
+ oneof item{
+ ModuleBannerUser user = 3;
+ }
+ // 不感兴趣文案
+ string dislike_text = 4;
+ // 不感兴趣图标
+ string dislike_icon = 5;
+}
+
+// 动态列表-通栏类型
+enum ModuleBannerType {
+ module_banner_type_none = 0; //
+ module_banner_type_user = 1; //
+}
+
+// 动态通栏-用户
+message ModuleBannerUser {
+ // 卡片列表
+ repeated ModuleBannerUserItem list = 1;
+}
+
+// 动态通栏-推荐用户卡
+message ModuleBannerUserItem {
+ // up主头像
+ string face = 1;
+ // up主昵称
+ string name = 2;
+ // up主uid
+ int64 uid = 3;
+ // 直播状态
+ LiveState live_state = 4;
+ // 认证信息
+ OfficialVerify official = 5;
+ // 大会员信息
+ VipInfo vip = 6;
+ // 标签信息
+ string label = 7;
+ // 按钮
+ AdditionalButton button = 8;
+ // 跳转地址
+ string uri = 9;
+}
+
+// 底部模块
+message ModuleButtom {
+ // 计数模块
+ ModuleStat module_stat = 1;
+}
+
+// 评论外露模块
+message ModuleComment {
+ // 评论外露展示项
+ repeated CmtShowItem cmtShowItem = 1;
+}
+
+// 动态-描述文字模块
+message ModuleDesc {
+ // 描述信息(已按高亮拆分)
+ repeated Description desc = 1;
+ // 点击跳转链接
+ string jump_uri = 2;
+ // 文本原本
+ string text = 3;
+}
+
+// 正文商品卡参数
+message ModuleDescGoods {
+ // 商品类型
+ // 1:淘宝 2:会员购
+ int32 source_type = 1;
+ // 跳转链接
+ string jump_url = 2;
+ // schema_url
+ string schema_url = 3;
+ // item_id
+ int64 item_id = 4;
+ // open_white_list
+ repeated string open_white_list = 5;
+ // use_web_v2
+ bool user_web_v2 = 6;
+ // ad mark
+ string ad_mark = 7;
+ // schemaPackageName(Android用)
+ string schema_package_name = 8;
+}
+
+// 动态-争议小黄条模块
+message ModuleDispute {
+ // 标题
+ string title = 1;
+ // 描述内容
+ string desc = 2;
+ // 跳转链接
+ string uri = 3;
+}
+
+// 动态-详情模块
+message ModuleDynamic {
+ // 类型
+ ModuleDynamicType type = 1;
+ oneof module_item {
+ //稿件
+ MdlDynArchive dyn_archive = 2;
+ //pgc
+ MdlDynPGC dyn_pgc = 3;
+ //付费课程-系列
+ MdlDynCourSeason dyn_cour_season = 4;
+ //付费课程-批次
+ MdlDynCourBatch dyn_cour_batch = 5;
+ //转发卡
+ MdlDynForward dyn_forward = 6;
+ //图文
+ MdlDynDraw dyn_draw = 7;
+ //专栏
+ MdlDynArticle dyn_article = 8;
+ //音频
+ MdlDynMusic dyn_music = 9;
+ //通用卡方
+ MdlDynCommon dyn_common = 10;
+ //直播卡
+ MdlDynLive dyn_common_live = 11;
+ //播单
+ MdlDynMedialist dyn_medialist = 12;
+ //小程序卡
+ MdlDynApplet dyn_applet = 13;
+ //订阅卡
+ MdlDynSubscription dyn_subscription = 14;
+ //直播推荐卡
+ MdlDynLiveRcmd dyn_live_rcmd = 15;
+ //UGC合集
+ MdlDynUGCSeason dyn_ugc_season = 16;
+ //订阅卡
+ MdlDynSubscriptionNew dyn_subscription_new = 17;
+ }
+}
+
+// 动态详情模块类型
+enum ModuleDynamicType {
+ mdl_dyn_archive = 0; // 稿件
+ mdl_dyn_pgc = 1; // pgc
+ mdl_dyn_cour_season = 2; // 付费课程-系列
+ mdl_dyn_cour_batch = 3; // 付费课程-批次
+ mdl_dyn_forward = 4; // 转发卡
+ mdl_dyn_draw = 5; // 图文
+ mdl_dyn_article = 6; // 专栏
+ mdl_dyn_music = 7; // 音频
+ mdl_dyn_common = 8; // 通用卡方
+ mdl_dyn_live = 9; // 直播卡
+ mdl_dyn_medialist = 10; // 播单
+ mdl_dyn_applet = 11; // 小程序卡
+ mdl_dyn_subscription = 12; // 订阅卡
+ mdl_dyn_live_rcmd = 13; // 直播推荐卡
+ mdl_dyn_ugc_season = 14; // UGC合集
+ mdl_dyn_subscription_new = 15; // 订阅卡
+}
+
+// 动态-小卡模块
+message ModuleExtend {
+ // 详情
+ repeated ModuleExtendItem extend = 1;
+ // 模块整体跳转uri
+ string uri = 2; // 废弃
+}
+
+// 动态-拓展小卡模块
+message ModuleExtendItem {
+ // 类型
+ DynExtendType type = 1;
+ // 卡片详情
+ oneof extend {
+ // 废弃
+ ExtInfoTopic ext_info_topic = 2;
+ // 废弃
+ ExtInfoLBS ext_info_lbs = 3;
+ // 废弃
+ ExtInfoHot ext_info_hot = 4;
+ // 废弃
+ ExtInfoGame ext_info_game = 5;
+ //
+ ExtInfoCommon ext_info_common = 6;
+ //
+ ExtInfoOGV ext_info_ogv = 7;
+ }
+}
+
+// 动态-折叠模块
+message ModuleFold {
+ // 折叠分类
+ FoldType fold_type = 1;
+ // 折叠文案
+ string text = 2;
+ // 被折叠的动态
+ string fold_ids = 3;
+ // 被折叠的用户信息
+ repeated UserInfo fold_users = 4;
+}
+
+// 外露交互模块
+message ModuleInteraction {
+ // 外露交互模块
+ repeated InteractionItem interaction_item = 1;
+}
+
+// 获取物料失败模块
+message ModuleItemNull {
+ // 图标
+ string icon = 1;
+ // 文案
+ string text = 2;
+}
+
+// 动态-点赞用户模块
+message ModuleLikeUser {
+ // 点赞用户
+ repeated LikeUser like_users = 1;
+ // 文案
+ string display_text = 2;
+}
+
+// 相关推荐模块
+message ModuleRecommend {
+ // 模块标题
+ string module_title = 1;
+ // 图片
+ string image = 2;
+ // 标签
+ string tag = 3;
+ // 标题
+ string title = 4;
+ // 跳转链接
+ string jump_url = 5;
+ // 序列化的广告信息
+ repeated google.protobuf.Any ad = 6;
+}
+
+// 分享模块
+message ModuleShareInfo {
+ // 展示标题
+ string title = 1;
+ // 分享组件列表
+ repeated ShareChannel share_channels = 2;
+ // share_origin
+ string share_origin = 3;
+ // 业务id
+ string oid = 4;
+ // sid
+ string sid = 5;
+}
+
+// 动态-计数模块
+message ModuleStat {
+ // 转发数
+ int64 repost = 1;
+ // 点赞数
+ int64 like = 2;
+ // 评论数
+ int64 reply = 3;
+ // 点赞拓展信息
+ LikeInfo like_info = 4;
+ // 禁评
+ bool no_comment = 5;
+ // 禁转
+ bool no_forward = 6;
+ // 点击评论跳转链接
+ string reply_url = 7;
+ // 禁评文案
+ string no_comment_text = 8;
+ // 禁转文案
+ string no_forward_text = 9;
+}
+
+// 顶部模块
+message ModuleTop {
+ // 三点模块
+ repeated ThreePointItem tp_list = 1;
+}
+
+// 认证名牌
+message Nameplate {
+ // nid
+ int64 nid = 1;
+ // 名称
+ string name = 2;
+ // 图片地址
+ string image = 3;
+ // 小图地址
+ string image_small = 4;
+ // 等级
+ string level = 5;
+ // 获取条件
+ string condition = 6;
+}
+
+// 最新ep
+message NewEP {
+ // 最新话epid
+ int32 id = 1;
+ // 更新至XX话
+ string index_show = 2;
+ // 更新剧集的封面
+ string cover = 3;
+}
+
+// 空响应
+message NoReply {
+
+}
+
+// 空请求
+message NoReq {
+
+}
+
+// 认证信息
+message OfficialVerify {
+ // 127:未认证 0:个人 1:机构
+ int32 type = 1;
+ // 认证描述
+ string desc = 2;
+ // 是否关注
+ int32 is_atten = 3;
+}
+
+// PGC单季信息
+message PGCSeason {
+ // 是否完结
+ int32 is_finish = 1;
+ // 标题
+ string title = 2;
+ // 类型
+ int32 type = 3;
+}
+
+//
+message PlayerArgs {
+ //
+ int64 qn = 1;
+ //
+ int64 fnver = 2;
+ //
+ int64 fnval = 3;
+ //
+ int64 force_host = 4;
+}
+
+// 秒开通用参数
+message PlayurlParam {
+ // 清晰度
+ int32 qn = 1;
+ // 流版本
+ int32 fnver = 2;
+ // 流类型
+ int32 fnval = 3;
+ // 是否强制使用域名
+ int32 force_host = 4;
+ // 是否4k
+ int32 fourk = 5;
+}
+
+// 推荐up主入参
+message RcmdUPsParam {
+ int64 dislike_ts = 1;
+}
+
+// 刷新方式
+enum Refresh {
+ refresh_new = 0; // 刷新列表
+ refresh_history = 1; // 请求历史
+}
+
+// 关注关系
+message Relation {
+ // 关注状态
+ RelationStatus status = 1;
+ // 关注
+ int32 is_follow = 2;
+ // 被关注
+ int32 is_followed = 3;
+ // 文案
+ string title = 4;
+}
+
+// 关注关系 枚举
+enum RelationStatus {
+ // 1-未关注 2-关注 3-被关注 4-互相关注 5-特别关注
+ relation_status_none = 0;
+ relation_status_nofollow = 1;
+ relation_status_follow = 2;
+ relation_status_followed = 3;
+ relation_status_mutual_concern = 4;
+ relation_status_special = 5;
+}
+
+//
+enum ReserveType {
+ reserve_none = 0; // 占位
+ reserve_recall = 1; // 预约召回
+}
+
+// 分享渠道组件
+message ShareChannel {
+ // 分享名称
+ string name = 1;
+ // 分享按钮图片
+ string image = 2;
+ // 分享渠道
+ string channel = 3;
+}
+
+// 排序类型
+message SortType {
+ // 排序策略
+ // 1:推荐排序 2:最常访问 3:最近关注
+ int32 sort_type = 1;
+ // 排序策略名称
+ string sort_type_name = 2;
+}
+
+// 三点-关注
+message ThreePointAttention {
+ // attention icon
+ string attention_icon = 1;
+ // 关注时显示的文案
+ string attention_text = 2;
+ // not attention icon
+ string not_attention_icon = 3;
+ // 未关注时显示的文案
+ string not_attention_text = 4;
+ // 当前关注状态
+ ThreePointAttentionStatus status = 5;
+}
+
+// 枚举-三点关注状态
+enum ThreePointAttentionStatus {
+ tp_not_attention = 0; //
+ tp_attention = 1; //
+}
+
+// 三点-自动播放 旧版不维护
+message ThreePointAutoPlay {
+ // open icon
+ string open_icon = 1;
+ // 开启时显示文案
+ string open_text = 2;
+ // close icon
+ string close_icon = 3;
+ // 关闭时显示文案
+ string close_text = 4;
+ // 开启时显示文案v2
+ string open_text_v2 = 5;
+ // 关闭时显示文案v2
+ string close_text_v2 = 6;
+ // 仅wifi/免流 icon
+ string only_icon = 7;
+ // 仅wifi/免流 文案
+ string only_text = 8;
+ // open icon v2
+ string open_icon_v2 = 9;
+ // close icon v2
+ string close_icon_v2 = 10;
+}
+
+// 三点-默认结构(使用此背景、举报、删除)
+message ThreePointDefault {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+ // 跳转链接
+ string uri = 3;
+ // id
+ string id = 4;
+}
+
+// 三点-不感兴趣
+message ThreePointDislike {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+}
+
+// 三点-收藏
+message ThreePointFavorite {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+ // 物料ID
+ int64 id = 3;
+ // 是否订阅
+ bool is_favourite = 4;
+ // 取消收藏图标
+ string cancel_icon = 5;
+ // 取消收藏文案
+ string cancel_title = 6;
+}
+
+// 三点Item
+message ThreePointItem {
+ //类型
+ ThreePointType type = 1;
+ oneof item {
+ // 默认结构
+ ThreePointDefault default = 2;
+ // 自动播放
+ ThreePointAutoPlay auto_player = 3;
+ // 分享
+ ThreePointShare share = 4;
+ // 关注
+ ThreePointAttention attention = 5;
+ // 稍后在看
+ ThreePointWait wait = 6;
+ // 不感兴趣
+ ThreePointDislike dislike = 7;
+ // 收藏
+ ThreePointFavorite favorite = 8;
+ }
+}
+
+// 三点-分享
+message ThreePointShare {
+ // icon
+ string icon = 1;
+ // 标题
+ string title = 2;
+ // 分享渠道
+ repeated ThreePointShareChannel channel = 3;
+ // 分享渠道名
+ string channel_name = 4;
+}
+
+// 三点-分享渠道
+message ThreePointShareChannel {
+ // icon
+ string icon = 1;
+ // 名称
+ string title = 2;
+}
+
+// 三点类型
+enum ThreePointType {
+ tp_none = 0; // 占位
+ background = 1; // 使用此背景
+ auto_play = 2; // 自动播放
+ share = 3; // 分享
+ wait = 4; // 稍后再播
+ attention = 5; // 关注
+ report = 6; // 举报
+ delete = 7; // 删除
+ dislike = 8; // 不感兴趣
+ favorite = 9; // 收藏
+}
+
+// 三点-稍后在看
+message ThreePointWait {
+ // addition icon
+ string addition_icon = 1;
+ // 已添加时的文案
+ string addition_text = 2;
+ // no addition icon
+ string no_addition_icon = 3;
+ // 未添加时的文案
+ string no_addition_text = 4;
+ // avid
+ int64 id = 5;
+}
+
+//
+enum ThumbType {
+ cancel = 0; //
+ thumb = 1; //
+}
+
+// 话题广场操作按钮
+message TopicButton {
+ // 按钮图标
+ string icon = 1;
+ // 按钮文案
+ string title = 2;
+ // 跳转
+ string jump_uri = 3;
+}
+
+// 综合页-话题广场
+message TopicList {
+ // 模块标题
+ string title = 1;
+ // 话题列表
+ repeated TopicListItem topic_list_item = 2;
+ // 发起活动
+ TopicButton act_button = 3;
+ // 查看更多
+ TopicButton more_button = 4;
+}
+
+// 综合页-话题广场-话题
+message TopicListItem {
+ // 前置图标
+ string icon = 1;
+ // 前置图标文案
+ string icon_title = 2;
+ // 话题id
+ int64 topic_id = 3;
+ // 话题名
+ string topic_name = 4;
+ // 跳转链接
+ string url = 5;
+ // 卡片位次
+ int64 pos = 6;
+}
+
+// 综合页-无关注列表
+message Unfollow {
+ // 标题展示文案
+ string title = 1;
+ // 无关注列表
+ repeated UnfollowUserItem list = 2;
+ // trackID
+ string TrackId = 3;
+}
+
+// 综合页-无关注列表
+message UnfollowUserItem {
+ // 是否有更新
+ bool has_update = 1;
+ // up主头像
+ string face = 2;
+ // up主昵称
+ string name = 3;
+ // up主uid
+ int64 uid = 4;
+ // 排序字段 从1开始
+ int32 pos = 5;
+ // 直播状态
+ LiveState live_state = 6;
+ // 认证信息
+ OfficialVerify official = 7;
+ // 大会员信息
+ VipInfo vip = 8;
+ // up介绍
+ string sign = 9;
+ // 标签信息
+ string label = 10;
+ // 按钮
+ AdditionalButton button = 11;
+}
+
+// 动态顶部up列表-up主信息
+message UpListItem {
+ // 是否有更新
+ bool has_update = 1;
+ // up主头像
+ string face = 2;
+ // up主昵称
+ string name = 3;
+ // up主uid
+ int64 uid = 4;
+ // 排序字段 从1开始
+ int64 pos = 5;
+ // 用户类型
+ UserItemType user_item_type = 6;
+ // 直播头像样式-日
+ UserItemStyle display_style_day = 7;
+ // 直播头像样式-夜
+ UserItemStyle display_style_night = 8;
+ // 直播埋点
+ int64 style_id = 9;
+ // 直播状态
+ LiveState live_state = 10;
+ // 分割线
+ bool separator = 11;
+ // 跳转
+ string uri = 12;
+ // UP主预约上报使用
+ bool is_recall = 13;
+}
+
+// 最常访问-查看更多
+message UpListMoreLabel {
+ // 文案
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+}
+
+// 用户信息
+message UserInfo {
+ // 用户mid
+ int64 mid = 1;
+ // 用户昵称
+ string name = 2;
+ // 用户头像
+ string face = 3;
+ // 认证信息
+ OfficialVerify official = 4;
+ // 大会员信息
+ VipInfo vip = 5;
+ // 直播信息
+ LiveInfo live = 6;
+ // 空间页跳转链接
+ string uri = 7;
+ // 挂件信息
+ UserPendant pendant = 8;
+ // 认证名牌
+ Nameplate nameplate = 9;
+}
+
+// 直播头像样式
+message UserItemStyle {
+ //
+ string rect_text = 1;
+ //
+ string rect_text_color = 2;
+ //
+ string rect_icon = 3;
+ //
+ string rect_bg_color = 4;
+ //
+ string outer_animation = 5;
+}
+
+// 用户类型
+enum UserItemType {
+ user_item_type_none = 0; //
+ user_item_type_live = 1; //
+ user_item_type_live_custom = 2; //
+ user_item_type_normal = 3; //
+ user_item_type_extend = 4; //
+}
+
+// 头像挂件信息
+message UserPendant {
+ // pid
+ int64 pid = 1;
+ // 名称
+ string name = 2;
+ // 图片链接
+ string image = 3;
+ // 有效期
+ int64 expire = 4;
+}
+
+// 角标信息
+message VideoBadge {
+ // 文案
+ string text = 1;
+ // 文案颜色-日间
+ string text_color = 2;
+ // 文案颜色-夜间
+ string text_color_night = 3;
+ // 背景颜色-日间
+ string bg_color = 4;
+ // 背景颜色-夜间
+ string bg_color_night = 5;
+ // 边框颜色-日间
+ string border_color = 6;
+ // 边框颜色-夜间
+ string border_color_night = 7;
+ // 样式
+ int32 bg_style = 8;
+ // 背景透明度-日间
+ int32 bg_alpha = 9;
+ // 背景透明度-夜间
+ int32 bg_alpha_night = 10;
+}
+
+// 番剧类型
+enum VideoSubType {
+ VideoSubTypeNone = 0; // 没有子类型
+ VideoSubTypeBangumi = 1; // 番剧
+ VideoSubTypeMovie = 2; // 电影
+ VideoSubTypeDocumentary = 3; // 纪录片
+ VideoSubTypeDomestic = 4; // 国创
+ VideoSubTypeTeleplay = 5; // 电视剧
+}
+
+// 视频类型
+enum VideoType {
+ video_type_general = 0; //普通视频
+ video_type_dynamic = 1; //动态视频
+ video_type_playback = 2; //直播回放视频
+}
+
+// 大会员信息
+message VipInfo {
+ // 大会员类型
+ int32 Type = 1;
+ // 大会员状态
+ int32 status = 2;
+ // 到期时间
+ int64 due_date = 3;
+ // 标签
+ VipLabel label = 4;
+ // 主题
+ int32 theme_type = 5;
+ // 大会员角标
+ // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
+ int32 avatar_subscript = 6;
+ // 昵称色值,可能为空,色值示例:#FFFB9E60
+ string nickname_color = 7;
+}
+
+// 大会员标签
+message VipLabel {
+ // 图片地址
+ string path = 1;
+ // 文本值
+ string text = 2;
+ // 对应颜色类型
+ string label_theme = 3;
+}
+
+// 状态
+enum VoteStatus {
+ normal = 0; // 正常
+ anonymous = 1; // 匿名
+}
+
+// 提权样式
+message Weight {
+ // 提权展示标题
+ string title = 1;
+ // 下拉框内容
+ repeated WeightItem items = 2;
+ // icon
+ string icon = 3;
+}
+
+// 热门默认跳转按钮
+message WeightButton {
+ string jump_url = 1;
+ // 展示文案
+ string title = 2;
+}
+
+// 提权不感兴趣
+message WeightDislike {
+ // 负反馈业务类型 作为客户端调用负反馈接口的参数
+ string feed_back_type = 1;
+ // 展示文案
+ string title = 2;
+}
+
+// 提权样式
+message WeightItem {
+ // 类型
+ WeightType type = 1;
+ oneof item {
+ // 热门默认跳转按钮
+ WeightButton button = 2;
+ // 提权不感兴趣
+ WeightDislike dislike = 3;
+ }
+}
+
+// 枚举-提权类型
+enum WeightType {
+ weight_none = 0; // 默认 占位
+ weight_dislike = 1; // 不感兴趣
+ weight_jump = 2; // 跳链
+}
diff --git a/bili-api/grpc/proto/bilibili/dynamic/interfaces/feed/v1/api.proto b/bili-api/grpc/proto/bilibili/dynamic/interfaces/feed/v1/api.proto
new file mode 100644
index 000000000..cae00e59e
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/dynamic/interfaces/feed/v1/api.proto
@@ -0,0 +1,237 @@
+syntax = "proto3";
+
+package bilibili.main.dynamic.feed.v1;
+
+option java_multiple_files = true;
+option java_package = "bilibili.main.dynamic.feed.v1";
+
+import "bilibili/dynamic/common/dynamic.proto";
+
+//
+service Feed {
+ // 发布页预校验
+ rpc CreateInitCheck(CreateInitCheckReq) returns (bilibili.dynamic.CreateCheckResp);
+ //
+ rpc SubmitCheck(SubmitCheckReq) returns (SubmitCheckRsp);
+ // 创建动态
+ rpc CreateDyn(CreateDynReq) returns (bilibili.dynamic.CreateResp);
+ // 根据name取uid
+ rpc GetUidByName(bilibili.dynamic.GetUidByNameReq) returns (bilibili.dynamic.GetUidByNameRsp);
+ // at用户推荐列表
+ rpc AtList(bilibili.dynamic.AtListReq) returns (bilibili.dynamic.AtListRsp);
+ // at用户搜索列表
+ rpc AtSearch(bilibili.dynamic.AtSearchReq) returns (bilibili.dynamic.AtListRsp);
+ //
+ rpc ReserveButtonClick(ReserveButtonClickReq) returns (ReserveButtonClickResp);
+ //
+ rpc CreatePlusButtonClick(CreatePlusButtonClickReq) returns (CreatePlusButtonClickRsp);
+ //
+ rpc HotSearch(HotSearchReq) returns (HotSearchRsp);
+ //
+ rpc Suggest(SuggestReq) returns (SuggestRsp);
+ //
+ rpc DynamicButtonClick(DynamicButtonClickReq) returns (DynamicButtonClickRsp);
+ //
+ rpc CreatePermissionButtonClick(CreatePermissionButtonClickReq) returns (CreatePermissionButtonClickRsp);
+ //
+ rpc CreatePageInfos(CreatePageInfosReq) returns (CreatePageInfosRsp);
+}
+
+// 创建动态-请求
+message CreateDynReq {
+ // 用户创建接口meta信息
+ bilibili.dynamic.UserCreateMeta meta = 1;
+ // 发布的内容
+ bilibili.dynamic.CreateContent content = 2;
+ // 发布类型
+ bilibili.dynamic.CreateScene scene = 3;
+ // 图片内容
+ repeated bilibili.dynamic.CreatePic pics = 4;
+ // 转发源
+ bilibili.dynamic.DynIdentity repost_src = 5;
+ // 动态视频
+ bilibili.dynamic.CreateDynVideo video = 6;
+ // 通用模板类型:2048方图 2049竖图 其他值无效
+ int64 sketch_type = 7;
+ // 通用模板的元内容(网页内容)
+ bilibili.dynamic.Sketch sketch = 8;
+ // 小程序的内容
+ bilibili.dynamic.Program program = 9;
+ // 动态附加小卡
+ bilibili.dynamic.CreateTag dyn_tag = 10;
+ // 动态附加大卡
+ bilibili.dynamic.CreateAttachCard attach_card = 11;
+ // 特殊的创建选项
+ bilibili.dynamic.CreateOption option = 12;
+ //
+ bilibili.dynamic.CreateTopic topic = 13;
+ //
+ string upload_id = 14;
+}
+
+//
+message CreateInitCheckReq {
+ //
+ int32 scene = 1;
+ //
+ bilibili.dynamic.MetaDataCtrl meta = 2;
+ //
+ bilibili.dynamic.RepostInitCheck repost = 3;
+}
+
+//
+message CreatePageInfosReq {
+ //
+ int64 topic_id = 1;
+}
+
+//
+message CreatePageInfosRsp {
+ //
+ CreatePageTopicInfo topic = 1;
+}
+
+//
+message CreatePageTopicInfo {
+ //
+ int64 topic_id = 1;
+ //
+ string topic_name = 2;
+}
+
+//
+message CreatePermissionButtonClickReq {
+ //
+ DynamicButtonClickBizType type = 1;
+}
+
+//
+message CreatePermissionButtonClickRsp {
+
+}
+
+//
+message CreatePlusButtonClickReq {
+
+}
+
+//
+message CreatePlusButtonClickRsp {
+
+}
+
+//
+enum DynamicButtonClickBizType {
+ DYNAMIC_BUTTON_CLICK_BIZ_TYPE_NONE = 0; //
+ DYNAMIC_BUTTON_CLICK_BIZ_TYPE_LIVE = 1; //
+ DYNAMIC_BUTTON_CLICK_BIZ_TYPE_DYN_UP = 2; //
+}
+
+//
+message DynamicButtonClickReq {
+
+}
+
+//
+message DynamicButtonClickRsp {
+
+}
+
+//
+message HotSearchReq {
+
+}
+
+//
+message HotSearchRsp {
+ //
+ message Item {
+ //
+ string words = 1;
+ }
+ //
+ repeated Item items = 1;
+ //
+ string version = 2;
+}
+
+//
+message ReserveButtonClickReq {
+ //
+ int64 uid = 1;
+ //
+ int64 reserve_id = 2;
+ //
+ int64 reserve_total = 3;
+ //
+ int32 cur_btn_status = 4;
+ //
+ string spmid = 5;
+ //
+ int64 dyn_id = 6;
+ //
+ int64 dyn_type = 7;
+}
+
+//
+message ReserveButtonClickResp {
+ //
+ ReserveButtonStatus final_btn_status = 1;
+ //
+ ReserveButtonMode btn_mode = 2;
+ //
+ int64 reserve_update = 3;
+ //
+ string desc_update = 4;
+ //
+ bool has_activity = 5;
+ //
+ string activity_url = 6;
+ //
+ string toast = 7;
+}
+
+//
+enum ReserveButtonMode {
+ RESERVE_BUTTON_MODE_NONE = 0; //
+ RESERVE_BUTTON_MODE_RESERVE = 1; //
+ RESERVE_BUTTON_MODE_UP_CANCEL = 2; //
+}
+
+//
+enum ReserveButtonStatus {
+ RESERVE_BUTTON_STATUS_NONE = 0; //
+ RESERVE_BUTTON_STATUS_UNCHECK = 1; //
+ RESERVE_BUTTON_STATUS_CHECK = 2; //
+}
+
+//
+message SubmitCheckReq {
+ //
+ bilibili.dynamic.CreateContent content = 1;
+ //
+ repeated bilibili.dynamic.CreatePic pics = 2;
+}
+
+//
+message SubmitCheckRsp {
+
+}
+
+//
+message SuggestReq {
+ //
+ string s = 1;
+ //
+ int32 type = 2;
+}
+
+//
+message SuggestRsp {
+ //
+ repeated string list = 1;
+ //
+ string track_id = 2;
+ //
+ string version = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/gaia/gw/gw_api.proto b/bili-api/grpc/proto/bilibili/gaia/gw/gw_api.proto
new file mode 100644
index 000000000..2c288f4ef
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/gaia/gw/gw_api.proto
@@ -0,0 +1,114 @@
+syntax = "proto3";
+
+package bilibili.gaia.gw;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+
+// 应用列表上报
+service Gaia {
+ // 应用列表上报
+ rpc ExUploadAppList(GaiaEncryptMsgReq) returns (UploadAppListReply);
+ // 拉取rsa公钥
+ rpc ExFetchPublicKey(google.protobuf.Empty) returns (FetchPublicKeyReply);
+}
+
+// 待加密的pb对象
+message DeviceAppList {
+ // 上报类型
+ // first_installation:首次安装上报 first_open:每日启动上报
+ string source = 1;
+ // 安装的系统程序列表
+ repeated string system_app_list = 2;
+ //安装的用户程序列表
+ repeated string user_app_list = 3;
+}
+
+// 加密方式
+enum EncryptType {
+ INVALID_ENCRYPT_TYPE = 0; // 非法值
+ CLIENT_AES = 1; // 同客户端人工约定AES加密私钥,存储在客户端
+ SERVER_RSA_AES = 2; // 客户端随机生成一个用于AES加密的私钥,并用服务端下发的RSA公钥来加密
+}
+
+//
+message FetchPublicKeyReply {
+ // 版本号
+ string version = 1;
+ // RSA公钥
+ string public_key = 2;
+ // 公钥过期时间
+ int64 deadline = 3;
+}
+
+//
+message GaiaDeviceBasicInfo {
+ //平台&应用信息
+ string platform = 1; //android/ios/web/h5;
+ string device = 2; //运行设备, 用于区分不同的app, 见客户端传入的对应参数。对于苹果系统,device有效值为phone, pad;安卓无法区分phone和pad,留空即可。
+ string mobi_app = 3; //包类型,用于区分不同的app, 见客户端传入的对应参数(mobi_app );对于web端请求,请传空
+ string origin = 4; //客户端appkey, 用以区分不同的客户端,对应客户端请求参数中的appkey,如果无法获取可传空“”
+ string app_id = 5; //app产品编号 //产品编号,由数据平台分配,粉=1,白=2,蓝=3,直播姬=4,HD=5,海外=6,OTT=7,漫画=8,TV野版=9,小视频=10,网易漫画=11,网易漫画lite=12,网易漫画HD=13,国际版=14
+
+ //应用的版本信息
+ string sdkver = 6; // SDK版本号 "sdkver": "2.6.6"
+ string app_version = 7; // app版本 "app_version":"5.36.0"
+ string app_version_code = 8; // app版本号 "app_version_code":"5360000"
+ string build = 9; // app版本号,见客户端传入的对应参数;对于web端请求,请传空
+
+ //渠道信息
+ string channel = 10; //渠道标识,见客户端传入的对应参数;对于web端请求,请传空;对应chid
+
+ //机器硬件信息
+ string brand = 11; //手机品牌,见客户端传入的对应参数;
+ string model = 12; //手机型号,见客户端传入的对应参数
+ string osver = 13; //系统版本,见客户端传入的对应参数
+ string user_agent = 14;
+
+ //设备标识信息
+ string buvid_local = 15; //本地设备唯一标识
+ string buvid = 16; //设备唯一标识
+
+ //登陆用户信息
+ string mid = 17; //最后一次登陆用户的mid,如果无登陆信息,传0即可
+
+ //本次启动信息
+ int64 fts = 18; // app首次启动时间 "fts":1530447775661
+ int32 first = 19; // 是否首次启动 是:0 否:1
+
+ //网络相关的信息
+ string network = 20; // 网络连接方式, WIFI/CELLULAR/OFFLINE/OTHERNET/ETHERNET "network":"WIFI", ESS_NETWORK_STATE、ACCESS_WIFI_STATE
+}
+
+// 应用列表上报-请求
+message GaiaEncryptMsgReq {
+ // 上报头部
+ GaiaMsgHeader header = 1;
+ // 加密数据
+ bytes encrypt_payload = 2;
+}
+
+// 风控通用消息头
+message GaiaMsgHeader {
+ //加密类型
+ EncryptType encode_type = 1;
+ //类型
+ PayloadType payload_type = 2;
+ //RAS加密后的aes_key
+ bytes encoded_aes_key = 3;
+ //当前时间戳(ms)
+ int64 ts = 4;
+}
+
+// 负载类型
+enum PayloadType {
+ INVALID_PAYLOAD = 0; //非法值
+ DEVICE_APP_LIST = 1; //设备app列表,对应DeviceAppList
+}
+
+// 应用列表上报-响应
+message UploadAppListReply {
+ // 上报响应id
+ string trace_id = 1;
+}
diff --git a/bili-api/grpc/proto/bilibili/im/interfaces/inner-interface/v1/api.proto b/bili-api/grpc/proto/bilibili/im/interfaces/inner-interface/v1/api.proto
new file mode 100644
index 000000000..dd841f955
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/im/interfaces/inner-interface/v1/api.proto
@@ -0,0 +1,37 @@
+syntax = "proto3";
+
+package bilibili.im.interface.inner.interface.v1;
+
+option java_multiple_files = true;
+option java_package = "bilibili.im.interfaces.inner.interface1.v1";
+
+//
+service InnerInterface {
+ //
+ rpc UpdateListInn(ReqOpBlacklist) returns(RspOpBlacklist);
+}
+
+//
+message BanUser {
+ // 用户mid
+ uint64 uid = 1;
+ // 封禁业务
+ int32 limit = 2;
+ // 封禁时间
+ int32 time = 3;
+ // 模式
+ // 1:add 2:remove
+ int32 mode = 4;
+}
+
+//
+message ReqOpBlacklist {
+ // 需要封禁/解封的用户信息
+ repeated BanUser ban_users = 1;
+}
+
+//
+message RspOpBlacklist {
+ //
+ repeated uint64 failed_users = 1;
+}
diff --git a/bili-api/grpc/proto/bilibili/im/interfaces/v1/im.proto b/bili-api/grpc/proto/bilibili/im/interfaces/v1/im.proto
new file mode 100644
index 000000000..8e0eec43e
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/im/interfaces/v1/im.proto
@@ -0,0 +1,573 @@
+syntax = "proto3";
+
+package bilibili.im.interface.v1;
+
+option java_multiple_files = true;
+option java_package = "bilibili.im.interface1.v1";
+
+import "bilibili/im/type/im.proto";
+
+// 私信
+service ImInterface {
+ // 发送消息
+ rpc SendMsg (ReqSendMsg) returns (RspSendMsg);
+ // 同步关系
+ rpc SyncRelation (ReqRelationSync) returns (RspRelationSync);
+ // 确认同步进度
+ rpc SyncAck (ReqSyncAck) returns (RspSyncAck);
+ // 同步版本拉取消息
+ rpc SyncFetchSessionMsgs (ReqSessionMsg) returns (RspSessionMsg);
+ // 拉取会话记录列表
+ rpc GetSessions (ReqGetSessions) returns (RspSessions);
+ // 拉取新消息
+ rpc NewSessions (ReqNewSessions) returns (RspSessions);
+ // 拉取已读消息
+ rpc AckSessions (ReqAckSessions) returns (RspSessions);
+ // 更新已读进度
+ rpc UpdateAck (ReqUpdateAck) returns (DummyRsp);
+ // 置顶聊天
+ rpc SetTop (ReqSetTop) returns (DummyRsp);
+ // 删除会话记录
+ rpc RemoveSession (ReqRemoveSession) returns (DummyRsp);
+ // 未读私信数
+ rpc SingleUnread (ReqSingleUnread) returns (RspSingleUnread);
+ // 我创建的应援团未读数
+ rpc MyGroupUnread (DummyReq) returns (RspMyGroupUnread);
+ // 未关注的人批量设置为已读
+ rpc UpdateUnflwRead (DummyReq) returns (DummyRsp);
+ // 应援团消息助手
+ rpc GroupAssisMsg (ReqGroupAssisMsg) returns (RspSessionMsg);
+ // 更新应援团小助手消息已拉取进度
+ rpc AckAssisMsg (ReqAckAssisMsg) returns (DummyRsp);
+ // 拉取会话详情
+ rpc SessionDetail (ReqSessionDetail) returns (bilibili.im.type.SessionInfo);
+ // 批量拉取会话详情
+ rpc BatchSessDetail (ReqSessionDetails) returns (RspSessionDetails);
+ // 批量删除会话
+ rpc BatchRmSessions (ReqBatRmSess) returns (DummyRsp);
+ // 拉取最近私信分享列表
+ rpc ShareList (ReqShareList) returns (RspShareList);
+ //
+ rpc SpecificSingleUnread (ReqSpecificSingleUnread) returns (RspSpecificSingleUnread);
+ //
+ rpc GetSpecificSessions (ReqGetSpecificSessions) returns (RspSessions);
+ //
+ rpc GetLiveInfo(ReqLiveInfo) returns (RspLiveInfo);
+ //
+ rpc GetTotalUnread(ReqTotalUnread) returns (RspTotalUnread);
+ //
+ rpc ShowClearUnreadUI(ReqShowClearUnreadUI) returns (RspShowClearUnreadUI);
+ //
+ rpc CloseClearUnreadUI(ReqCloseClearUnreadUI) returns (RspCloseClearUnreadUI);
+ //
+ rpc UpdateTotalUnread(ReqUpdateTotalUnread) returns (RspUpdateTotalUnread);
+}
+
+// 空请求
+message DummyReq {
+ //
+ uint32 idl = 1;
+}
+
+// 空响应
+message DummyRsp {
+ reserved 1;
+}
+
+// 表情资源信息
+message EmotionInfo {
+ // 表情
+ string text = 1;
+ // 表情url
+ string url = 2;
+ // 表情大小
+ // 0:未知 1:min 2:max
+ int32 size = 3;
+ // gif url
+ string gif_url = 4;
+}
+
+//
+enum ENUM_FOLD {
+ FOLD_NO = 0; //
+ FOLD_YES = 1; //
+ FOLD_UNKNOWN = 2; //
+}
+
+//
+enum ENUM_UNREAD_TYPE{
+ UNREAD_TYPE_ALL = 0; //
+ UNREAD_TYPE_FOLLOW = 1; //
+ UNREAD_TYPE_UNFOLLOW = 2; //
+ UNREAD_TYPE_DUSTBIN = 3; //
+}
+
+//
+message MsgDetail {
+ //
+ int64 msg_key = 1;
+ //
+ int64 seqno = 2;
+}
+
+//
+message MsgFeedUnreadRsp {
+ //
+ map unread = 1;
+}
+
+// 更新应援团小助手消息已拉取进度-请求
+message ReqAckAssisMsg {
+ //
+ uint64 ack_seqno = 1;
+}
+
+// 拉取已读消息-请求
+message ReqAckSessions {
+ //
+ uint64 begin_ts = 1;
+ //
+ uint32 end_ts = 2;
+ //
+ uint32 size = 3;
+}
+
+// 批量删除会话-请求
+message ReqBatRmSess {
+
+}
+
+//
+message ReqCloseClearUnreadUI {
+
+}
+
+//
+message ReqGetMsg {
+ //
+ int64 talker_id = 1;
+ //
+ int32 session_type = 2;
+ //
+ repeated MsgDetail msg_detail = 3;
+}
+
+// 拉取会话记录列表-请求
+message ReqGetSessions {
+ //
+ uint64 begin_ts = 1;
+ //
+ uint64 end_ts = 2;
+ //
+ uint32 size = 3;
+ //
+ uint32 session_type = 4;
+ //
+ uint32 unfollow_fold = 5;
+ //
+ uint32 group_fold = 6;
+ //
+ uint32 sort_rule = 7;
+ // 青少年模式
+ uint32 teenager_mode = 8;
+ // 课堂模式
+ uint32 lessons_mode = 9;
+}
+
+// -请求
+message ReqGetSpecificSessions {
+ // 具体会话详情
+ repeated SimpleSession talker_sessions = 1;
+}
+
+// 应援团消息助手-请求
+message ReqGroupAssisMsg {
+ //
+ uint64 client_seqno = 1;
+ //
+ uint32 size = 2;
+}
+
+//
+message ReqLiveInfo {
+ //
+ int64 uid = 1;
+ //
+ int64 talker_id = 2;
+}
+
+// 拉取新消息-请求
+message ReqNewSessions {
+ //
+ uint64 begin_ts = 1;
+ //
+ uint32 size = 2;
+ //
+ uint32 teenager_mode = 3;
+ // 课堂模式
+ uint32 lessons_mode = 4;
+}
+
+// 同步关系-请求
+message ReqRelationSync {
+ // 客户端当前seqno
+ uint64 client_relation_oplog_seqno = 1;
+}
+
+// 删除会话记录-请求
+message ReqRemoveSession {
+ //
+ uint64 talker_id = 1;
+ //
+ uint32 session_type = 2;
+}
+
+// 发送消息-请求
+message ReqSendMsg {
+ // 消息内容
+ bilibili.im.type.Msg msg = 1;
+ //
+ string cookie = 2;
+ //
+ string cookie2 = 3;
+ //
+ int32 error_code = 4;
+ //
+ string dev_id = 5;
+}
+
+// 拉取会话详情-请求
+message ReqSessionDetail {
+ //
+ uint64 talker_id = 1;
+ //
+ uint32 session_type = 2;
+ //
+ uint64 uid = 3;
+}
+
+// 批量拉取会话详情-请求
+message ReqSessionDetails {
+ // 会话详情请求列表
+ repeated ReqSessionDetail sess_ids = 1;
+}
+
+// 同步版本拉取消息-请求
+message ReqSessionMsg {
+ //
+ uint64 talker_id = 1;
+ //
+ int32 session_type = 2;
+ //
+ uint64 end_seqno = 3;
+ //
+ uint64 begin_seqno = 4;
+ //
+ int32 size = 5;
+ //
+ int32 order = 6;
+ //
+ string dev_id = 7;
+}
+
+// 置顶聊天-请求
+message ReqSetTop {
+ //
+ uint64 talker_id = 1;
+ //
+ uint32 session_type = 2;
+ //
+ // 0:置顶 1:取消置顶
+ uint32 op_type = 3;
+}
+
+// 拉取最近私信分享列表-请求
+message ReqShareList {
+ // 分页大小 最大20
+ int32 size = 1;
+}
+
+//
+message ReqShowClearUnreadUI {
+ //
+ int32 unread_type = 1;
+ //
+ int32 show_unfollow_list = 2;
+ //
+ int32 show_dustbin = 4;
+}
+
+// 未读私信数-请求
+message ReqSingleUnread {
+ //
+ int32 unread_type = 1;
+ //
+ int32 show_unfollow_list = 2;
+ //
+ int64 uid = 3;
+ //
+ int32 show_dustbin = 4;
+}
+
+// -请求
+message ReqSpecificSingleUnread {
+ // 具体会话详情
+ repeated SimpleSession talker_sessions = 1;
+}
+
+// 确认同步进度-请求
+message ReqSyncAck {
+ //
+ uint64 client_seqno = 1;
+}
+
+//
+message ReqTotalUnread {
+ //
+ int32 unread_type = 1;
+ //
+ int32 show_unfollow_list = 2;
+ //
+ int64 uid = 3;
+ //
+ int32 show_dustbin = 4;
+ //
+ int32 singleunread_on = 5;
+ //
+ int32 msgfeed_on = 6;
+ //
+ int32 sysup_on = 7;
+}
+
+// 更新已读进度-请求
+message ReqUpdateAck {
+ // 聊天对象uid,可以为用户id或者为群id
+ uint64 talker_id = 1;
+ // 会话类型
+ uint32 session_type = 2;
+ // 已读的最大seqno
+ uint64 ack_seqno = 3;
+}
+
+//
+message ReqUpdateIntercept {
+ //
+ int64 uid = 1;
+ //
+ int64 talker_id = 2;
+ //
+ int32 status = 3;
+}
+
+//
+message ReqUpdateTotalUnread {
+
+}
+
+//
+message RspCloseClearUnreadUI {
+
+}
+
+//
+message RspGetMsg {
+ //
+ repeated bilibili.im.type.Msg msg = 1;
+}
+
+//
+message RspLiveInfo {
+ //
+ int64 live_status = 1;
+ //
+ string jump_url = 2;
+}
+
+// 我创建的应援团未读数-响应
+message RspMyGroupUnread {
+ // 未读消息数
+ uint32 unread_count = 1;
+}
+
+// 同步关系-响应
+message RspRelationSync {
+ //
+ int32 full = 1;
+ // 增量日志
+ repeated bilibili.im.type.RelationLog relation_logs = 2;
+ // 全量列表
+ repeated bilibili.im.type.FriendRelation friend_list = 3;
+ // 服务器端最大的relation seqno
+ uint64 server_relation_oplog_seqno = 4;
+ // 全量列表
+ repeated bilibili.im.type.GroupRelation group_list = 5;
+}
+
+// 发送消息-响应
+message RspSendMsg {
+ //
+ uint64 msg_key = 1;
+ // 表情资源信息
+ repeated EmotionInfo e_infos = 2;
+ //
+ string msg_content = 3;
+ //
+ bilibili.im.type.KeyHitInfos key_hit_infos = 4;
+}
+
+// 批量拉取会话详情-响应
+message RspSessionDetails {
+ // 会话详情列表
+ repeated bilibili.im.type.SessionInfo sess_infos = 1;
+}
+
+// 同步版本拉取消息-响应
+message RspSessionMsg {
+ //
+ repeated bilibili.im.type.Msg messages = 1;
+ //
+ int32 has_more = 2;
+ //
+ uint64 min_seqno = 3;
+ //
+ uint64 max_seqno = 4;
+ // 表情资源信息
+ repeated EmotionInfo e_infos = 5;
+}
+
+// 拉取消息-响应
+message RspSessions {
+ //
+ repeated bilibili.im.type.SessionInfo session_list = 1;
+ //
+ uint32 has_more = 2;
+ // 标记反垃圾会话是否在清理中
+ bool anti_disturb_cleaning = 3;
+ // 当session_list为空时,会返回该字段用于判断通讯录是否为空,1表示空,0表示非空
+ int32 is_address_list_empty = 4;
+ //
+ map system_msg = 5;
+ //
+ bool show_level = 6;
+}
+
+// 拉取最近私信分享列表-响应
+message RspShareList {
+ // 最近会话列表
+ repeated ShareSessionInfo session_list = 1;
+ //
+ int32 IsAddressListEmpty = 2;
+}
+
+//
+message RspShowClearUnreadUI {
+ //
+ bool display = 1;
+ //
+ string text = 2;
+}
+
+// 未读私信数-响应
+message RspSingleUnread {
+ // 未关注用户私信数
+ uint64 unfollow_unread = 1;
+ // 已关注用户私信数
+ uint64 follow_unread = 2;
+ // 未关注人列表是否有新业务通知
+ uint32 unfollow_push_msg = 3;
+ //
+ int32 dustbin_push_msg = 4;
+ //
+ int64 dustbin_unread = 5;
+ //
+ int64 biz_msg_unfollow_unread = 6;
+ //
+ int64 biz_msg_follow_unread = 7;
+}
+
+// -响应
+message RspSpecificSingleUnread {
+ // key -> 用户uid, value ->未读数
+ map talkerUnreadCnt = 1;
+ // 总未读数
+ uint64 allUnreadCnt = 2;
+}
+
+// 确认同步进度-响应
+message RspSyncAck {
+
+}
+
+//
+message RspTotalUnread {
+ //
+ SessionSingleUnreadRsp session_single_unread = 1;
+ //
+ MsgFeedUnreadRsp msg_feed_unread = 2;
+ //
+ SysMsgInterfaceLastMsgRsp sys_msg_interface_last_msg = 3;
+ //
+ int32 total_unread = 4;
+}
+
+//
+message RspUpdateTotalUnread {
+
+}
+
+//
+enum SESSION_TYPE {
+ UNKNOWN = 0; //
+ UN_FOLD_SESSION = 1; //
+ UN_FOLLOW_SINGLE_SESSION = 2; //
+ MY_GROUP_SESSION = 3; //
+ ALL_SESSION = 4; //
+ DUSTBIN_SESSION = 5; //
+}
+
+//
+message SessionSingleUnreadRsp {
+ //
+ int64 unfollow_unread = 1;
+ //
+ int64 follow_unread = 2;
+ //
+ int32 unfollow_push_msg = 3;
+ //
+ int32 dustbin_push_msg = 4;
+ //
+ int64 dustbin_unread = 5;
+}
+
+// 会话信息,用于私信分享
+message ShareSessionInfo {
+ //
+ uint64 talker_id = 1;
+ //
+ string talker_uname = 2;
+ //
+ string talker_icon = 3;
+ // 认证信息
+ // -1: 无认证 0:个人认证 1:机构认证
+ int32 official_type = 4;
+}
+
+//
+message SimpleSession {
+ // 聊天对象uid,可以为用户id或者为群id
+ uint64 talker_id = 1;
+ // 会话类型
+ uint32 session_type = 2;
+}
+
+//
+message SysMsgInterfaceLastMsgRsp {
+ //
+ int32 unread = 1;
+ //
+ string title = 2;
+ //
+ string time = 3;
+ //
+ int64 id = 4;
+}
diff --git a/bili-api/grpc/proto/bilibili/im/type/im.proto b/bili-api/grpc/proto/bilibili/im/type/im.proto
new file mode 100644
index 000000000..007e4f182
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/im/type/im.proto
@@ -0,0 +1,380 @@
+syntax = "proto3";
+
+package bilibili.im.type;
+
+option java_multiple_files = true;
+
+//
+message AccountInfo {
+ //
+ string name = 1;
+ //
+ string pic_url = 2;
+}
+
+//
+enum CmdId {
+ EN_CMD_ID_INVALID = 0; //非法cmd
+
+ // msg_svr
+ EN_CMD_ID_SEND_MSG = 200001; // 发消息
+
+ // sync_msg_svr
+ EN_CMD_ID_SYNC_MSG = 500001; // 同步消息
+ EN_CMD_ID_SYNC_RELATION = 500002; // 同步相关链
+ EN_CMD_ID_SYNC_ACK = 500003; // 客户端同步消息完成后,向服务器确认同步进度
+ EN_CMD_ID_SYNC_FETCH_SESSION_MSGS = 500006; // 多端同步版本拉取消息
+
+ // session_svr
+ EN_CMD_ID_SESSION_SVR_GET_SESSIONS = 1000001; // 拉会话列表
+ EN_CMD_ID_SESSION_SVR_NEW_SESSIONS = 1000002; // 新消息到达时获取会话列表
+ EN_CMD_ID_SESSION_SVR_ACK_SESSIONS = 1000003; // 获取已读位置有更新的会话列表
+ EN_CMD_ID_SESSION_SVR_UPDATE_ACK = 1000004; // 更新已读进度
+ EN_CMD_ID_SESSION_SVR_SET_TOP = 1000005; // 置顶/取消置顶
+ EN_CMD_ID_SESSION_SVR_REMOVE_SESSION = 1000007; // 删除会话
+ EN_CMD_ID_SESSION_SVR_SINGLE_UNREAD = 1000008; // 单聊未读信息数
+ EN_CMD_ID_SESSION_SVR_MY_GROUP_UNREAD = 1000009; // 我创建的应援团未读数
+ EN_CMD_ID_SESSION_SVR_UPDATE_UNFLW_READ = 1000010; // 未关注的人批量设置为已读
+ EN_CMD_ID_SESSION_SVR_GROUP_ASSIS_MSG = 1000011; // 应援团消息助手
+ EN_CMD_ID_SESSION_SVR_ACK_ASSIS_MSG = 1000012; // 更新应援团小助手消息已拉取进度
+ EN_CMD_ID_SESSION_SVR_SESSION_DETAIL = 1000015; // 拉会话详情
+ EN_CMD_ID_SESSION_SVR_BATCH_SESS_DETAIL = 1000016; // 批量拉会话详情
+ EN_CMD_ID_SESSION_SVR_BATCH_RM_SESSIONS = 1000017; // 批量删除会话
+}
+
+//
+enum ENUM_BIZ_MSG_TYPE {
+ BIZ_MSG_TYPE_NORMAL = 0; //
+ BIZ_MSG_TYPE_CARD_VIDEO = 1; //
+}
+
+//
+message FriendRelation {
+ // 用户mid
+ uint64 uid = 1;
+ // 用户昵称
+ string user_name = 2;
+ // 头像url
+ string face = 3;
+ // vip类型
+ // 0:无 1:月度大会员 2:年度大会员
+ uint32 vip_level = 4;
+}
+
+//
+message GroupRelation {
+ //
+ uint64 group_id = 1;
+ //
+ uint64 owner_uid = 2;
+ //
+ uint32 group_type = 3;
+ //
+ uint32 group_level = 4;
+ //
+ string group_cover = 5;
+ //
+ string group_name = 6;
+ //
+ string group_notice = 7;
+ //
+ int32 status = 8;
+ //
+ int32 member_role = 9;
+ //
+ string fans_medal_name = 10;
+ //
+ uint64 room_id = 11;
+}
+
+// 关键词高亮文本
+message HighText {
+ //
+ string title = 1;
+ //
+ string url = 2;
+ // 表示高亮文本应该高亮第几个匹配的文本,ps:比如,“有疑问请联系客服,联系客服时,请说明具体的情况”,一共有2个匹配的文本,要高亮第一个匹配的,则index=1
+ uint32 index = 3;
+}
+
+//
+message ImgInfo {
+ //
+ string url = 1;
+ //
+ int32 width = 2;
+ //
+ int32 height = 3;
+ //
+ string imageType = 4;
+}
+
+// 关键词命中信息
+message KeyHitInfos {
+ //
+ string toast = 1;
+ //
+ uint32 rule_id = 2;
+ //
+ repeated HighText high_text = 3;
+ //
+}
+
+//
+message Medal {
+ //
+ int64 uid = 1;
+ //
+ int32 medal_id = 2;
+ //
+ int32 level = 3;
+ //
+ string medal_name = 4;
+ //
+ int32 score = 5;
+ //
+ int32 intimacy = 6;
+ //
+ int32 master_status = 7;
+ //
+ int32 is_receive = 8;
+ //
+ int64 medal_color_start = 9;
+ //
+ int64 medal_color_end = 10;
+ //
+ int64 medal_color_border = 11;
+ //
+ int64 medal_color_name = 12;
+ //
+ int64 medal_color_level = 13;
+ //
+ int64 guard_level = 14;
+}
+
+//
+message Msg {
+ // 发送方mid
+ uint64 sender_uid = 1;
+ // 接收方类型
+ RecverType receiver_type = 2;
+ // 接收方mid
+ uint64 receiver_id = 3;
+ // 客户端的序列id,用于服务端去重
+ uint64 cli_msg_id = 4;
+ // 消息类型
+ MsgType msg_type = 5;
+ // 消息内容
+ string content = 6;
+ // 服务端的序列号x
+ uint64 msg_seqno = 7;
+ // 消息发送时间(服务端时间)
+ uint64 timestamp = 8;
+ // @用户列表
+ repeated uint64 at_uids = 9;
+ // 多人消息
+ repeated uint64 recver_ids = 10;
+ // 消息唯一标示
+ uint64 msg_key = 11;
+ // 消息状态
+ uint32 msg_status = 12;
+ // 是否为系统撤销
+ bool sys_cancel = 13;
+ // 通知码
+ string notify_code = 14;
+ // 消息来源
+ MsgSource msg_source = 15;
+ // 如果msg.content有表情字符,则该参数需要置为1
+ int32 new_face_version = 16;
+ // 命中关键词信息
+ KeyHitInfos key_hit_infos = 17;
+}
+
+// 消息来源
+enum MsgSource {
+ EN_MSG_SOURCE_UNKONW = 0; //
+ EN_MSG_SOURCE_IOS = 1; //
+ EN_MSG_SOURCE_ANDRIOD = 2; //
+ EN_MSG_SOURCE_H5 = 3; //
+ EN_MSG_SOURCE_PC = 4; //
+ EN_MSG_SOURCE_BACKSTAGE = 5; //
+ EN_MSG_SOURCE_BIZ = 6; //
+ EN_MSG_SOURCE_WEB = 7; //
+ EN_MSG_SOURCE_AUTOREPLY_BY_FOLLOWED = 8; //
+ EN_MSG_SOURCE_AUTOREPLY_BY_RECEIVE_MSG = 9; //
+ EN_MSG_SOURCE_AUTOREPLY_BY_KEYWORDS = 10; //
+ EN_MSG_SOURCE_AUTOREPLY_BY_VOYAGE = 11; //
+ EN_MSG_SOURCE_VC_ATTACH_MSG = 12; //
+};
+
+// 消息类型
+enum MsgType {
+ // 基础消息类型
+ EN_INVALID_MSG_TYPE = 0; // 空空的~
+ EN_MSG_TYPE_TEXT = 1; // 文本消息
+ EN_MSG_TYPE_PIC = 2; // 图片消息
+ EN_MSG_TYPE_AUDIO = 3; // 语音消息
+ EN_MSG_TYPE_SHARE = 4; // 分享消息
+ EN_MSG_TYPE_DRAW_BACK = 5; // 撤回消息
+ EN_MSG_TYPE_CUSTOM_FACE = 6; // 自定义表情
+ EN_MSG_TYPE_SHARE_V2 = 7; // 分享v2消息
+ EN_MSG_TYPE_SYS_CANCEL = 8; // 系统撤销
+ EN_MSG_TYPE_MINI_PROGRAM = 9; // 小程序
+
+ // 扩展消息类型
+ EN_MSG_TYPE_NOTIFY_MSG = 10; // 业务通知
+ EN_MSG_TYPE_VIDEO_CARD = 11; // 视频卡片
+ EN_MSG_TYPE_ARTICLE_CARD = 12; // 专栏卡片
+ EN_MSG_TYPE_PICTURE_CARD = 13; // 图片卡
+ EN_MSG_TYPE_COMMON_SHARE_CARD = 14; // 异形卡
+ EN_MSG_TYPE_BIZ_MSG_TYPE = 50; //
+ EN_MSG_TYPE_MODIFY_MSG_TYPE = 51; //
+
+ // 功能类系统消息类型
+ EN_MSG_TYPE_GROUP_MEMBER_CHANGED = 101; // 群成员变更
+ EN_MSG_TYPE_GROUP_STATUS_CHANGED = 102; // 群状态变更
+ EN_MSG_TYPE_GROUP_DYNAMIC_CHANGED = 103; // 群动态变更
+ EN_MSG_TYPE_GROUP_LIST_CHANGED = 104; // 群列表变更
+ EM_MSG_TYPE_FRIEND_LIST_CHANGED = 105; // 好友列表变更
+ EN_MSG_TYPE_GROUP_DETAIL_CHANGED = 106; // 群详情发生变化
+ EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED = 107; // 群成员角色发生变化
+ EN_MSG_TYPE_NOTICE_WATCH_LIST = 108; //
+ EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED = 109; // 消息系统,收到新的reply
+ EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED = 110; //
+ EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED = 111; //
+ EN_MSG_TYPE_NOTIFY_NEW_UP_RECIEVED = 112; //
+ EN_MSG_TYPE_NOTIFY_NEW_REPLY_RECIEVED_V2 = 113; //
+ EN_MSG_TYPE_NOTIFY_NEW_AT_RECIEVED_V2 = 114; //
+ EN_MSG_TYPE_NOTIFY_NEW_PRAISE_RECIEVED_V2 = 115; //
+ EN_MSG_TYPE_GROUP_DETAIL_CHANGED_MULTI = 116; // 群详情发生变化,多端同步版本需要即时消息,无需落地
+ EN_MSG_TYPE_GROUP_MEMBER_ROLE_CHANGED_MULTI = 117; // 群成员角色发生变化,多端同步版本需要即时消息,无需落地
+ EN_MSG_TYPE_NOTIFY_ANTI_DISTURB = 118; //
+
+ // 系统通知栏消息类型
+ EN_MSG_TYPE_SYS_GROUP_DISSOLVED = 201; // 群解散
+ EN_MSG_TYPE_SYS_GROUP_JOINED = 202; // 入群
+ EN_MSG_TYPE_SYS_GROUP_MEMBER_EXITED = 203; // 成员主动退群
+ EN_MSG_TYPE_SYS_GROUP_ADMIN_FIRED = 204; // 房管被撤
+ EN_MSG_TYPE_SYS_GROUP_MEMBER_KICKED = 205; // 成员被T
+ EN_MSG_TYPE_SYS_GROUP_ADMIN_KICK_OFF = 206; // 管理T人
+ EN_MSG_TYPE_SYS_GROUP_ADMIN_DUTY = 207; // 管理上任
+ EN_MSG_TYPE_SYS_GROUP_AUTO_CREATED = 208; // 自动创建
+ EN_MSG_TYPE_SYS_FRIEND_APPLY = 210; // 好友申请
+ EN_MSG_TYPE_SYS_FRIEND_APPLY_ACK = 211; // 好友申请通过
+ EN_MSG_TYPE_SYS_GROUP_APPLY_FOR_JOINING = 212; // 用户加群申请
+ EN_MSG_TYPE_SYS_GROUP_ADMIN_ACCEPTED_USER_APPLY = 213; // 通知管理员,有其他管理员已经同意用户加群
+
+ // 聊天窗口通知消息类型
+ EN_MSG_TYPE_CHAT_MEMBER_JOINED = 301; // 入群
+ EN_MSG_TYPE_CHAT_MEMBER_EXITED = 302; // 退群
+ EN_MSG_TYPE_CHAT_GROUP_FREEZED = 303; // 冻结
+ EN_MSG_TYPE_CHAT_GROUP_DISSOLVED = 304; // 解散
+ EN_MSG_TYPE_CHAT_GROUP_CREATED = 305; // 开通应援团
+ EN_MSG_TYPE_CHAT_POPUP_SESSION = 306; // 弹出会话
+}
+
+// 接收方类型
+enum RecverType {
+ EN_NO_MEANING = 0; //
+ EN_RECVER_TYPE_PEER = 1; // 单人
+ EN_RECVER_TYPE_GROUP = 2; // 群
+ EN_RECVER_TYPE_PEERS = 3; // 多人
+}
+
+//
+message RelationLog {
+ // 操作类型
+ RelationLogType log_type = 1;
+ // 操作seqno
+ uint64 oplog_seqno = 2;
+ // 好友信息
+ FriendRelation friend_relation = 3;
+ // 群信息
+ GroupRelation group_relation = 4;
+}
+
+//
+enum RelationLogType {
+ EN_INVALID_LOG_TYPE = 0; //
+ EN_ADD_FRIEND = 1; // 添加好友
+ EN_REMOVE_FRIEND = 2; // 删除好友
+ EN_JOIN_GROUP = 3; // 加入群
+ EN_EXIT_GROUP = 4; // 退出群
+}
+
+//
+enum SESSION_TYPE {
+ INVALID_SESSION_TYPE = 0; //
+ UN_FOLD_SESSION = 1; //
+ UN_FOLLOW_SINGLE_SESSION = 2; //
+ MY_GROUP_SESSION = 3; //
+ ALL_SESSION = 4; //
+}
+
+// 会话详情
+message SessionInfo {
+ //
+ uint64 talker_id = 1;
+ //
+ uint32 session_type = 2;
+ //
+ uint64 at_seqno = 3;
+ //
+ uint64 top_ts = 4;
+ //
+ string group_name = 5;
+ //
+ string group_cover = 6;
+ //
+ uint32 is_follow = 7;
+ //
+ uint32 is_dnd = 8;
+ //
+ uint64 ack_seqno = 9;
+ //
+ uint64 ack_ts = 10;
+ //
+ uint64 session_ts = 11;
+ //
+ uint32 unread_count = 12;
+ //
+ Msg last_msg = 13;
+ //
+ uint32 group_type = 14;
+ //
+ uint32 can_fold = 15;
+ //
+ uint32 status = 16;
+ //
+ uint64 max_seqno = 17;
+ // 会话是否有业务通知
+ uint32 new_push_msg = 18;
+ // 接收方是否设置接受推送
+ uint32 setting = 19;
+ //
+ uint32 is_guardian = 20;
+ //
+ int32 is_intercept = 21;
+ //
+ int32 is_trust = 22;
+ //
+ int32 system_msg_type = 23;
+ //
+ AccountInfo account_info = 24;
+ //
+ int32 live_status = 25;
+ //
+ int32 biz_msg_unread_count = 26;
+ //
+ UserLabel user_label = 27;
+}
+
+//
+message UserLabel {
+ //
+ int32 label_type = 1;
+ //
+ Medal medal = 2;
+ //
+ int32 guardian_relation = 3;
+}
diff --git a/bili-api/grpc/proto/bilibili/live/app/room/v1/room.proto b/bili-api/grpc/proto/bilibili/live/app/room/v1/room.proto
new file mode 100644
index 000000000..e9d39d7b9
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/live/app/room/v1/room.proto
@@ -0,0 +1,54 @@
+syntax = "proto3";
+
+package bilibili.live.app.room.v1;
+
+option java_multiple_files = true;
+
+//
+message GetStudioListReq {
+ //
+ int64 room_id = 1;
+}
+
+//
+message GetStudioListResp {
+ //
+ message Pendants {
+ //
+ Pendant frame = 1;
+ //
+ Pendant badge = 2;
+ }
+ //
+ message Pendant {
+ //
+ string name = 1;
+ //
+ int64 position = 2;
+ //
+ string value = 3;
+ //
+ string desc = 4;
+ }
+ //
+ message StudioMaster {
+ //
+ int64 uid = 1;
+ //
+ int64 room_id = 2;
+ //
+ string uname = 3;
+ //
+ string face = 4;
+ //
+ Pendants pendants = 5;
+ //
+ string tag = 6;
+ //
+ int64 tag_type = 7;
+ }
+ //
+ int64 status = 1;
+ //
+ repeated StudioMaster master_list = 2;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/live/general/interfaces/v1/interfaces.proto b/bili-api/grpc/proto/bilibili/live/general/interfaces/v1/interfaces.proto
new file mode 100644
index 000000000..58e20a26e
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/live/general/interfaces/v1/interfaces.proto
@@ -0,0 +1,63 @@
+syntax = "proto3";
+
+package bilibili.live.general.interfaces.v1;
+
+option java_multiple_files = true;
+option java_package = "bilibili.live.general.interfaces.v1";
+
+//
+message GetOnlineRankReq {
+ //
+ int64 ruid = 1;
+ //
+ int64 room_id = 2;
+ //
+ int64 page = 3;
+ //
+ int64 page_size = 4;
+ //
+ string platform = 5;
+}
+
+//
+message GetOnlineRankResp {
+ //
+ message OnlineRankItem {
+ //
+ int64 uid = 1;
+ //
+ string uname = 2;
+ //
+ string face = 3;
+ //
+ int64 continue_watch = 4;
+ //
+ MedalInfo medal_info = 5;
+ //
+ int64 guard_level = 6;
+ }
+ //
+ OnlineRankItem item = 1;
+ //
+ int64 online_num = 2;
+}
+
+//
+message MedalInfo {
+ //
+ int64 guard_level = 1;
+ //
+ int64 medal_color_start = 2;
+ //
+ int64 medal_color_end = 3;
+ //
+ int64 medal_color_border = 4;
+ //
+ string medal_name = 5;
+ //
+ int64 level = 6;
+ //
+ int64 target_id = 7;
+ //
+ int64 is_light = 8;
+}
diff --git a/bili-api-grpc/proto/bilibili/main/common/arch/doll/v1/doll.proto b/bili-api/grpc/proto/bilibili/main/common/arch/doll/v1/doll.proto
similarity index 56%
rename from bili-api-grpc/proto/bilibili/main/common/arch/doll/v1/doll.proto
rename to bili-api/grpc/proto/bilibili/main/common/arch/doll/v1/doll.proto
index b8308c404..677c578ff 100644
--- a/bili-api-grpc/proto/bilibili/main/common/arch/doll/v1/doll.proto
+++ b/bili-api/grpc/proto/bilibili/main/common/arch/doll/v1/doll.proto
@@ -16,48 +16,48 @@ service Echo {
//
message ErrorRequest {
- //
- int32 error = 2;
- //
- int64 time = 1;
- //
- int64 delay = 3;
+ //
+ int32 error = 2;
+ //
+ int64 time = 1;
+ //
+ int64 delay = 3;
}
//
message ErrorResponse {
- //
- string host = 1;
- //
- int64 time = 3;
+ //
+ string host = 1;
+ //
+ int64 time = 3;
}
//
message PingRequest {
- //
- int64 time = 1;
+ //
+ int64 time = 1;
}
//
message PingResponse {
- //
- string host = 1;
- //
- int64 time = 3;
+ //
+ string host = 1;
+ //
+ int64 time = 3;
}
//
message SayRequest {
- //
- string content = 1;
+ //
+ string content = 1;
}
//
message SayResponse {
- //
- string host = 1;
- //
- string content = 2;
- //
- int64 time = 3;
+ //
+ string host = 1;
+ //
+ string content = 2;
+ //
+ int64 time = 3;
}
diff --git a/bili-api/grpc/proto/bilibili/main/community/reply/v1/reply.proto b/bili-api/grpc/proto/bilibili/main/community/reply/v1/reply.proto
new file mode 100644
index 000000000..ae61a553b
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/main/community/reply/v1/reply.proto
@@ -0,0 +1,1322 @@
+syntax = "proto3";
+
+package bilibili.main.community.reply.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/pagination/pagination.proto";
+import "google/protobuf/any.proto";
+
+// 评论区
+service Reply {
+ // 主评论列表接口
+ rpc MainList(MainListReq) returns (MainListReply);
+ // 二级评论明细接口
+ rpc DetailList(DetailListReq) returns (DetailListReply);
+ // 对话评论树接口
+ rpc DialogList(DialogListReq) returns (DialogListReply);
+ // 评论预览接口
+ rpc PreviewList(PreviewListReq) returns (PreviewListReply);
+ // 评论搜索item前置发布接口
+ rpc SearchItemPreHook(SearchItemPreHookReq) returns (SearchItemPreHookReply);
+ // 评论搜索插入项目接口
+ rpc SearchItem(SearchItemReq) returns (SearchItemReply);
+ // 评论at用户搜索接口
+ rpc AtSearch(AtSearchReq) returns (AtSearchReply);
+ // 查询单条评论接口
+ rpc ReplyInfo(ReplyInfoReq) returns (ReplyInfoReply);
+ // 用户回调上报接口
+ rpc UserCallback(UserCallbackReq) returns (UserCallbackReply);
+ // 评论分享材料接口
+ rpc ShareRepliesInfo(ShareRepliesInfoReq) returns (ShareRepliesInfoResp);
+ // 评论表情推荐列表接口
+ rpc SuggestEmotes(SuggestEmotesReq) returns (SuggestEmotesResp);
+}
+
+// 活动
+message Activity {
+ // 活动id
+ int64 activity_id = 1;
+ // 活动状态
+ // -1:待审 1:上线
+ int64 activity_state = 2;
+ // 参与活动的输入框文案
+ string activity_placeholder = 3;
+}
+
+// 文章项目
+message ArticleSearchItem {
+ // 标题
+ string title = 1;
+ // UP主昵称
+ string up_nickname = 2;
+ // 封面
+ repeated string covers = 3;
+}
+
+// 评论at用户搜索组
+message AtGroup {
+ // 组类型
+ int32 group_type = 1;
+ // 组标题
+ string group_name = 2;
+ // 评论at用户搜索列表
+ repeated AtItem items = 3;
+}
+
+// 评论at用户搜索条目
+message AtItem {
+ // 用户mid
+ int64 mid = 1;
+ // 用户名
+ string name = 2;
+ // 用户头像url
+ string face = 3;
+ // 用户是否关注
+ int32 fans = 4;
+ // 用户认证类型
+ int32 official_verify_type = 5;
+}
+
+// 评论at用户搜索-响应
+message AtSearchReply {
+ // 评论at用户搜索组
+ repeated AtGroup groups = 1;
+}
+
+// 评论at用户搜索-请求
+message AtSearchReq {
+ //
+ int64 mid = 1;
+ // 关键字
+ string keyword = 2;
+}
+
+// 广告
+message CM {
+ // 广告数据(需要解包)
+ google.protobuf.Any source_content = 1;
+}
+
+// 评论主体信息
+message Content {
+ // 评论文本
+ string message = 1;
+ // 需要渲染的用户转义
+ map menber = 2;
+ // 需要渲染的表情转义
+ map emote = 3;
+ // 需要高亮的话题转义
+ map topic = 4;
+ // 需要高亮的超链转义
+ map url = 5;
+ // 投票信息
+ Vote vote = 6;
+ // at到的用户mid列表
+ map at_name_to_mid = 7;
+ // 富文本
+ RichText rich_text = 8;
+ // 评论图片
+ repeated Picture pictures = 9;
+}
+
+// 图片信息
+message Picture {
+ // 图片URL
+ string img_src = 1;
+ // 图片宽度
+ double img_width = 2;
+ // 图片高度
+ double img_height = 3;
+ // 图片大小,单位KB
+ double img_size = 4;
+}
+
+// 页面游标回复
+message CursorReply {
+ // 下页数据
+ int64 next = 1;
+ // 上页数据
+ int64 prev = 2;
+ // 是否到顶
+ bool isBegin = 3;
+ // 是否到底
+ bool isEnd = 4;
+ // 排序方式
+ // 2:时间 3:热度
+ Mode mode = 5;
+ // 当前排序mode在切换按钮上的展示文案
+ string mode_text = 6;
+}
+
+// 页面游标请求
+message CursorReq {
+ // 下页数据
+ int64 next = 1;
+ // 上页数据
+ int64 prev = 2;
+ // 排序方式
+ Mode mode = 4;
+}
+
+// 二级评论明细-响应
+message DetailListReply {
+ // 页面游标
+ CursorReply cursor = 1;
+ // 评论区显示控制字段
+ SubjectControl subject_control = 2;
+ // 根评论信息(带二级评论)
+ ReplyInfo root = 3;
+ // 评论区的活动
+ Activity activity = 4;
+ //
+ LikeInfo likes = 5;
+ // 排序方式
+ Mode mode = 6;
+ // 当前排序mode在切换按钮上的展示文案
+ string mode_text = 7;
+ // 分页
+ bilibili.pagination.FeedPaginationReply pagination_reply = 8;
+ //
+ string session_id = 9;
+}
+
+// 二级评论明细-请求
+message DetailListReq {
+ // 目标评论区id
+ int64 oid = 1;
+ // 目标评论区业务type
+ int64 type = 2;
+ // 根评论rpid
+ int64 root = 3;
+ // 目标评论rpid
+ int64 rpid = 4;
+ // 页面游标
+ CursorReq cursor = 5;
+ // 来源标识
+ DetailListScene scene = 6;
+ // 排序方式
+ Mode mode = 7;
+ // 分页
+ bilibili.pagination.FeedPagination pagination = 8;
+}
+
+// 来源标识
+enum DetailListScene {
+ REPLY = 0; // 评论区展开
+ MSG_FEED = 1; // 回复消息推送
+ NOTIFY = 2; //
+}
+
+// 对话评论树-响应
+message DialogListReply {
+ // 页面游标
+ CursorReply cursor = 1;
+ // 评论区显示控制字段
+ SubjectControl subject_control = 2;
+ // 子评论列表
+ repeated ReplyInfo replies = 3;
+ // 评论区的活动
+ Activity activity = 4;
+}
+
+// 对话评论树-请求
+message DialogListReq {
+ // 目标评论区id
+ int64 oid = 1;
+ // 目标评论区业务type
+ int64 type = 2;
+ // 根评论rpid
+ int64 root = 3;
+ // 对话评论rpid
+ int64 rpid = 4;
+ // 页面游标
+ CursorReq cursor = 5;
+}
+
+// 特效
+message Effects {
+ //
+ string preloading = 1;
+}
+
+// 表情项
+message Emote {
+ // 表情大小
+ // 1:小 2:大
+ int64 size = 1;
+ // 表情url
+ string url = 2;
+ //
+ string jump_url = 3;
+ //
+ string jump_title = 4;
+ //
+ int64 id = 5;
+ //
+ int64 package_id = 6;
+ //
+ string gif_url = 7;
+ //
+ string text = 8;
+}
+
+// 商品项目
+message GoodsSearchItem {
+ // 商品id
+ int64 id = 1;
+ // 商品名
+ string name = 2;
+ // 价钱
+ string price = 3;
+ // 收入
+ string income = 4;
+ // 图片
+ string img = 5;
+ // 标签
+ string label = 6;
+}
+
+//
+message LikeInfo {
+ //
+ message Item {
+ //
+ Member member = 1;
+ }
+ //
+ repeated Item items = 1;
+ //
+ string title = 2;
+}
+
+// 抽奖
+message Lottery {
+ // 抽奖id
+ int64 lottery_id = 1;
+ // 抽奖状态
+ // 0:未开奖 1:开奖中 2:已开奖
+ int64 lottery_status = 2;
+ // 抽奖人mid
+ int64 lottery_mid = 3;
+ // 开奖时间
+ int64 lottery_time = 4;
+ //
+ int64 oid = 5;
+ //
+ int64 type = 6;
+ // 发送时间
+ int64 ctime = 7;
+ // 抽奖评论正文
+ Content content = 8;
+ // 用户信息
+ Member member = 9;
+ // 评论条目控制字段
+ ReplyControl reply_control = 10;
+}
+
+// 主评论列表-响应
+message MainListReply {
+ // 页面游标
+ CursorReply cursor = 1;
+ // 评论列表
+ repeated ReplyInfo replies = 2;
+ // 评论区显示控制字段
+ SubjectControl subject_control = 3;
+ // UP置顶评论
+ ReplyInfo up_top = 4;
+ // 管理员置顶评论
+ ReplyInfo admin_top = 5;
+ // 投票置顶评论
+ ReplyInfo vote_top = 6;
+ // 评论区提示
+ Notice notice = 7;
+ // 抽奖评论
+ Lottery lottery = 8;
+ // 活动
+ Activity activity = 9;
+ // 精选评论区筛选后台信息
+ UpSelection up_selection = 10;
+ // 广告
+ CM cm = 11;
+ // 特效
+ Effects effects = 12;
+ //
+ Operation operation = 13;
+ //
+ repeated ReplyInfo top_replies = 14;
+ //
+ QoeInfo qoe = 15;
+ //
+ map callbacks = 16;
+ //
+ OperationV2 operation_v2 = 17;
+ // 排序方式
+ Mode mode = 18;
+ // 当前排序mode在切换按钮上的展示文案
+ string mode_text = 19;
+ // 分页
+ bilibili.pagination.FeedPaginationReply pagination_reply = 20;
+ //
+ string session_id = 21;
+ //
+ string report_params = 22;
+ //
+ VoteCard vote_card = 23;
+}
+
+// 主评论列表-请求
+message MainListReq {
+ // 目标评论区id
+ int64 oid = 1;
+ // 目标评论区业务type
+ int64 type = 2;
+ // 页面游标
+ CursorReq cursor = 3;
+ // 扩展数据json
+ string extra = 4;
+ // 广告扩展
+ string ad_extra = 5;
+ // 目标评论rpid
+ int64 rpid = 6;
+ //
+ int64 seek_rpid = 7;
+ // 评论区筛选类型 取值可为: ["全部" "粉丝评论" "笔记长评"]
+ string filter_tag_name = 8;
+ // 排序方式
+ Mode mode = 9;
+ // 分页
+ bilibili.pagination.FeedPagination pagination = 10;
+}
+
+// 用户信息
+message Member {
+ // 地区类型
+ enum RegionType {
+ DEFAULT = 0; // 默认
+ MAINLAND = 1; // 大陆地区
+ GAT = 2; //
+ }
+ //
+ enum ShowStatus {
+ SHOWDEFAULT = 0; // 默认
+ ZOOMINMAINLAND = 1; //
+ RAW = 2; //
+ }
+ // NFT地区
+ message Region {
+ // 地区类型
+ RegionType type = 1;
+ // 角标url
+ string icon = 2;
+ //
+ ShowStatus show_status = 3;
+ }
+ // NFT信息
+ message NftInteraction {
+ //
+ string itype = 1;
+ //
+ string metadata_url = 2;
+ //
+ string nft_id = 3;
+ // NFT地区
+ Region region = 4;
+ }
+ /**********基础信息**********/
+ // 用户mid
+ int64 mid = 1;
+ // 昵称
+ string name = 2;
+ // 性别
+ string sex = 3;
+ // 头像url
+ string face = 4;
+ // 等级
+ int64 level = 5;
+ // 认证类型
+ int64 official_verify_type = 6;
+ /**********VIP相关**********/
+ // 会员类型
+ // 0:不是大会员 1:月度会员 2:年度大会员
+ int64 vip_type = 7;
+ // 会员状态
+ int64 vip_status = 8;
+ // 会员样式
+ int64 vip_theme_type = 9;
+ // 会员铭牌样式url
+ string vip_label_path = 10;
+ /**********装扮相关**********/
+ // 头像框url
+ string garb_pendant_image = 11;
+ // 装扮卡url
+ string garb_card_image = 12;
+ // 有关注按钮时的装扮卡url
+ string garb_card_image_with_focus = 13;
+ // 专属装扮页面url
+ string garb_card_jump_url = 14;
+ // 专属装扮id
+ string garb_card_number = 15;
+ // 专属装扮id显示颜色
+ string garb_card_fan_color = 16;
+ // 是否为专属装扮卡
+ bool garb_card_is_fan = 17;
+ /**********粉丝勋章相关**********/
+ // 粉丝勋章名
+ string fans_medal_name = 18;
+ // 粉丝勋章等级
+ int64 fans_medal_level = 19;
+ // 粉丝勋章显示颜色
+ int64 fans_medal_color = 20;
+ // 会员昵称颜色
+ string vip_nickname_color = 21;
+ // 会员角标
+ // 0:无角标 1:粉色大会员角标 2:绿色小会员角标
+ int32 vip_avatar_subscript = 22;
+ // 会员标签文
+ string vip_label_text = 23;
+ // 会员标颜色
+ string vip_label_theme = 24;
+ // 粉丝勋章底色
+ int64 fans_medal_color_end = 25;
+ // 粉丝勋章边框颜色
+ int64 fans_medal_color_border = 26;
+ // 粉丝勋章名颜色
+ int64 fans_medal_color_name = 27;
+ // 粉丝勋章等级颜色
+ int64 fans_medal_color_level = 28;
+ //
+ int64 fans_guard_level = 29;
+ //
+ int32 face_nft = 30;
+ // 是否NFT头像
+ int32 face_nft_new = 31;
+ // 是否为硬核会员
+ int32 is_senior_member = 32;
+ // NFT信息
+ NftInteraction nft_interaction = 33;
+ //
+ string fans_guard_icon = 34;
+ //
+ string fans_honor_icon = 35;
+}
+
+// 用户信息V2
+message MemberV2 {
+ // 基本信息
+ message Basic {
+ // 用户mid
+ int64 mid = 1;
+ // 昵称
+ string name = 2;
+ // 性别
+ string sex = 3;
+ // 头像url
+ string face = 4;
+ // 等级
+ int64 level = 5;
+ }
+ // 认证
+ message Official {
+ // 认证类型
+ int64 verify_type = 1;
+ }
+ // 大会员
+ message Vip {
+ // 会员类型
+ // 0:不是大会员 1:月度会员 2:年度大会员
+ int64 type = 1;
+ // 会员状态
+ int64 status = 2;
+ // 会员样式
+ int64 theme_type = 3;
+ // 会员铭牌样式url
+ string label_path = 4;
+ //
+ string nickname_color = 5;
+ //
+ int32 avatar_subscript = 6;
+ //
+ string label_text = 7;
+ //
+ string vip_label_theme = 8;
+ }
+ // 装扮
+ message Garb {
+ // 头像框url
+ string pendant_image = 1;
+ // 装扮卡url
+ string card_image = 2;
+ // 有关注按钮时的装扮卡url
+ string card_image_with_focus = 3;
+ // 专属装扮页面url
+ string card_jump_url = 4;
+ // 专属装扮id
+ string card_number = 5;
+ // 专属装扮id显示颜色
+ string card_fan_color = 6;
+ // 是否为专属装扮卡
+ bool card_is_fan = 7;
+ }
+ // 粉丝勋章
+ message Medal {
+ // 粉丝勋章名
+ string name = 1;
+ // 粉丝勋章等级
+ int64 level = 2;
+ // 粉丝勋章显示颜色
+ int64 color_start = 3;
+ // 粉丝勋章底色
+ int64 color_end = 4;
+ // 粉丝勋章边框颜色
+ int64 color_border = 5;
+ // 粉丝勋章名颜色
+ int64 color_name = 6;
+ // 粉丝勋章等级颜色
+ int64 color_level = 7;
+ //
+ int64 guard_level = 8;
+ //
+ string first_icon = 9;
+ //
+ int64 level_bg_color = 11;
+ }
+ // 地区类型
+ enum RegionType {
+ DEFAULT = 0; // 默认
+ MAINLAND = 1; // 大陆地区
+ GAT = 2; //
+ }
+ //
+ enum ShowStatus {
+ SHOWDEFAULT = 0; //
+ ZOOMINMAINLAND = 1; //
+ RAW = 2; //
+ }
+ // NFT地区
+ message Region {
+ // 地区类型
+ RegionType type = 1;
+ // 角标url
+ string icon = 2;
+ //
+ ShowStatus show_status = 3;
+ }
+ // NFT信息
+ message Interaction {
+ //
+ string itype = 1;
+ //
+ string metadata_url = 2;
+ //
+ string nft_id = 3;
+ // NFT地区
+ Region region = 4;
+
+ }
+ // NFT
+ message Nft {
+ //
+ int32 face = 1;
+ //
+ Interaction interaction = 2;
+ }
+ // 硬核会员
+ message Senior {
+ // 是否为硬核会员
+ int32 is_senior_member = 1;
+ }
+ // 契约
+ message Contractor {
+ // 是否和up签订契约
+ bool is_contractor = 1;
+ // 契约显示文案
+ string contract_desc = 2;
+ }
+ // 基本信息
+ Basic basic = 1;
+ // 认证信息
+ Official official = 2;
+ // 大会员信息
+ Vip vip = 3;
+ // 装扮信息
+ Garb garb = 4;
+ // 粉丝勋章信息
+ Medal medal = 5;
+ // NFT信息
+ Nft nft = 6;
+ // 硬核会员信息
+ Senior senior = 7;
+ // 契约信息
+ Contractor contractor = 8;
+}
+
+// 排序方式
+enum Mode {
+ DEFAULT = 0; //
+ UNSPECIFIED = 1; // 默认排序
+ MAIN_LIST_TIME = 2; // 按时间
+ MAIN_LIST_HOT = 3; // 按热度
+}
+
+//
+message Notice {
+ //
+ int64 id = 1;
+ //
+ string content = 2;
+ //
+ string link = 3;
+}
+
+//
+message Operation {
+ //
+ int32 type = 1;
+ //
+ int64 id = 2;
+ //
+ OperationTitle title = 3;
+ //
+ OperationTitle subtitle = 4;
+ //
+ string link = 5;
+ //
+ string report_extra = 6;
+ //
+ string icon = 7;
+}
+
+//
+message OperationV2 {
+ //
+ int32 type = 1;
+ //
+ string prefix_text = 2;
+ //
+ OperationIcon icon = 3;
+ //
+ string title = 4;
+ //
+ string link = 5;
+ //
+ string report_extra = 6;
+}
+
+//
+message OperationIcon {
+ //
+ int32 position = 1;
+ //
+ string url = 2;
+}
+
+//
+message OperationTitle {
+ //
+ string content = 1;
+ //
+ bool is_highlight = 2;
+}
+
+// PGC视频项目
+message PGCVideoSearchItem {
+ // 标题
+ string title = 1;
+ // 类别
+ string category = 2;
+ // 封面
+ string cover = 3;
+}
+
+// 评论区预览-回复
+message PreviewListReply {
+ // 页面游标
+ CursorReply cursor = 1;
+ // 评论列表
+ repeated ReplyInfo replies = 2;
+ // 评论区显示控制字段
+ SubjectControl subject_control = 3;
+ // UP置顶评论
+ ReplyInfo upTop = 4;
+ // 管理员置顶评论
+ ReplyInfo admin_top = 5;
+ // 投票置顶评论
+ ReplyInfo vote_top = 6;
+}
+
+// 评论区预览-请求
+message PreviewListReq {
+ // 目标评论区id
+ int64 oid = 1;
+ // 目标评论区业务type
+ int64 type = 2;
+ // 页面游标
+ CursorReq cursor = 3;
+}
+
+//
+message QoeInfo {
+ //
+ int64 id = 1;
+ //
+ int32 type = 2;
+ //
+ int32 style = 3;
+ //
+ string title = 4;
+ //
+ string feedback_title = 5;
+ //
+ repeated QoeScoreItem score_items = 6;
+ //
+ int64 display_rank = 7;
+}
+
+//
+message QoeScoreItem {
+ //
+ string title = 1;
+ //
+ string url = 2;
+ //
+ float score = 3;
+}
+
+// 评论条目标签信息
+message ReplyCardLabel {
+ // 标签文本
+ string text_content = 1;
+ // 文本颜色
+ string text_color_day = 2;
+ // 文本颜色夜间
+ string text_color_night = 3;
+ // 标签颜色
+ string label_color_day = 4;
+ // 标签颜色夜间
+ string label_color_night = 5;
+ //
+ string image = 6;
+ // 标签类型 0:UP主觉得很赞 1:妙评
+ int32 type = 7;
+ // 背景url
+ string background = 8;
+ // 背景宽
+ double background_width = 9;
+ // 背景高
+ double background_height = 10;
+ // 点击跳转url
+ string jump_url = 11;
+ //
+ int64 effect = 12;
+ //
+ int64 effect_start_time = 13;
+}
+
+// 评论条目控制字段
+message ReplyControl {
+ // 操作行为标志
+ // 0:无 1:已点赞 2:已点踩
+ int64 action = 1;
+ // 是否UP觉得很赞
+ bool up_like = 2;
+ // 是否存在UP回复
+ bool up_reply = 3;
+ // 是否显示关注按钮
+ bool show_follow_btn = 4;
+ // 是否协管
+ bool is_assist = 5;
+ // 是否展示标签
+ string label_text = 6;
+ // 是否关注
+ bool following = 7;
+ // 是否粉丝
+ bool followed = 8;
+ // 是否被自己拉黑
+ bool blocked = 9;
+ // 是否存在折叠的二级评论
+ bool has_folded_reply = 10;
+ // 是否折叠
+ bool is_folded_reply = 11;
+ // 是否UP置顶
+ bool is_up_top = 12;
+ // 是否管理置顶
+ bool is_admin_top = 13;
+ // 是否置顶投票评论
+ bool is_vote_top = 14;
+ // 最大收起显示行数
+ int64 max_line = 15;
+ // 该条评论可不可见
+ bool invisible = 16;
+ // 是否和up签订契约
+ bool is_contractor = 17;
+ // 是否是笔记评论
+ bool is_note = 18;
+ // 评论条目标签列表
+ repeated ReplyCardLabel card_labels = 19;
+ // 子评论数文案 "共x条回复"
+ string sub_reply_entry_text = 20;
+ // 子评论数文案 "相关回复共x条"
+ string sub_reply_title_text = 21;
+ // 契约显示文案
+ string contract_desc = 22;
+ // 发布时间文案 "x天前发布"
+ string time_desc = 23;
+ //
+ string biz_scene = 24;
+ // IP属地信息 "IP属地:xxx"
+ string location = 25;
+}
+
+//
+message ReplyExtra {
+ //
+ int64 season_id = 1;
+ //
+ int64 season_type = 2;
+ //
+ int64 ep_id = 3;
+ //
+ bool is_story = 4;
+}
+
+// 评论条目信息
+message ReplyInfo {
+ // 二级评论列表
+ repeated ReplyInfo replies = 1;
+ // 评论rpid
+ int64 id = 2;
+ // 评论区对象id
+ int64 oid = 3;
+ // 评论区类型
+ int64 type = 4;
+ // 发布者UID
+ int64 mid = 5;
+ // 根评论rpid
+ int64 root = 6;
+ // 父评论rpid
+ int64 parent = 7;
+ // 对话评论rpid
+ int64 dialog = 8;
+ // 点赞数
+ int64 like = 9;
+ // 发布时间
+ int64 ctime = 10;
+ // 回复数
+ int64 count = 11;
+ // 评论主体信息
+ Content content = 12;
+ // 发布者信息
+ Member member = 13;
+ // 评论控制字段
+ ReplyControl reply_control = 14;
+ // 发布者信息V2
+ MemberV2 member_v2 = 15;
+}
+
+// 查询单条评论-响应
+message ReplyInfoReply {
+ // 评论条目信息
+ ReplyInfo reply = 1;
+}
+
+// 查询单条评论-请求
+message ReplyInfoReq {
+ // 评论rpid
+ int64 rpid = 1;
+ //
+ int32 scene = 2;
+}
+
+// 富文本
+message RichText {
+ // 富文本类型
+ oneof item {
+ // 笔记
+ RichTextNote note = 1;
+ }
+}
+
+// 笔记
+message RichTextNote {
+ // 预览文本
+ string summary = 1;
+ // 笔记预览图片url列表
+ repeated string images = 2;
+ // 笔记页面url
+ string click_url = 3;
+ // 发布日期 YYYY-mm-dd
+ string last_mtime_text = 4;
+}
+
+// 评论搜索插入项目
+message SearchItem {
+ //
+ string url = 1;
+ // 项目
+ oneof item {
+ // 商品
+ GoodsSearchItem goods = 2;
+ // 视频
+ VideoSearchItem video = 3;
+ // 专栏
+ ArticleSearchItem article = 4;
+ }
+}
+
+// 评论搜索插入项目响应游标
+message SearchItemCursorReply {
+ // 是否有下一页
+ bool has_next = 1;
+ // 下页
+ int64 next = 2;
+}
+
+// 评论搜索插入项目请求游标
+message SearchItemCursorReq {
+ // 下一页
+ int64 next = 1;
+ // tab类型
+ SearchItemType item_type = 2;
+}
+
+// 评论搜索item前置发布-响应
+message SearchItemPreHookReply {
+ // 输入框的文案
+ string placeholder_text = 1;
+ // 背景空白的时候的文案
+ string background_text = 2;
+ // 有权限的tab栏的顺序
+ repeated SearchItemType ordered_type = 3;
+}
+
+// 评论搜索item前置发布-请求
+message SearchItemPreHookReq {
+ // 目标评论区id
+ int64 oid = 1;
+ // 目标评论区业务type
+ int64 type = 2;
+}
+
+// 评论搜索插入项目-回复
+message SearchItemReply {
+ //
+ SearchItemCursorReply cursor = 1;
+ // 搜索的结果
+ repeated SearchItem items = 2;
+ // 附加信息
+ SearchItemReplyExtraInfo extra = 3;
+}
+
+//
+message SearchItemReplyExtraInfo {
+ //
+ string event_id = 1;
+}
+
+// 评论搜索插入项目-请求
+message SearchItemReq {
+ // 页面游标
+ SearchItemCursorReq cursor = 1;
+ // 目标评论区id
+ int64 oid = 2;
+ // 目标评论区业务type
+ int64 type = 3;
+ // 搜索关键词
+ string keyword = 4;
+}
+
+//
+enum SearchItemType {
+ DEFAULT_ITEM_TYPE = 0; //
+ GOODS = 1; //
+ VIDEO = 2; //
+ ARTICLE = 3; //
+}
+
+//
+enum SearchItemVideoSubType {
+ UGC = 0; //
+ PGC = 1; //
+}
+
+// 评论分享材料-请求
+message ShareRepliesInfoReq {
+ // 评论rpid列表
+ repeated int64 rpids = 1;
+ // 目标评论区id
+ int64 oid = 2;
+ // 目标评论区业务type
+ int64 type = 3;
+}
+
+// 评论分享材料-响应
+message ShareRepliesInfoResp {
+ //
+ message ShareExtra {
+ //
+ bool is_pgc = 1;
+ }
+ // 评论分享条目列表
+ repeated ShareReplyInfo infos = 1;
+ // 源内容标题
+ string from_title = 2;
+ // 源内容UP主
+ string from_up = 3;
+ // 源内容封面url
+ string from_pic = 4;
+ // 源内容页面url
+ string url = 5;
+ // logo url
+ string slogan_pic = 6;
+ // 标语
+ string slogan_text = 7;
+ //
+ ShareReplyTopic topic = 8;
+ //
+ ShareExtra extra = 9;
+}
+
+// 评论分享条目信息
+message ShareReplyInfo {
+ // 用户信息
+ Member member = 1;
+ // 评论主体信息
+ Content content = 2;
+ // 分享标题(评论发布者昵称)
+ string title = 3;
+ // 分享副标题 "发表了评论"
+ string sub_title = 4;
+ // 荣誉信息文案 "获得了up主点赞"
+ string achievement_text = 5;
+ //
+ string label_url = 6;
+}
+
+//
+message ShareReplyTopic {
+ //
+ Topic topic = 1;
+ //
+ string origin_text = 2;
+}
+
+// 评论区控制字段
+message SubjectControl {
+ // 评论区筛选类型
+ message FilterTag {
+ // 类型名
+ string name = 1;
+ //
+ string event_id = 2;
+ }
+ // UP主mid
+ int64 up_mid = 1;
+ // 自己是否为协管
+ bool is_assist = 2;
+ // 是否只读
+ bool read_only = 3;
+ // 是否有发起投票权限
+ bool has_vote_access = 4;
+ // 是否有发起抽奖权限
+ bool has_lottery_access = 5;
+ // 是否有被折叠评论
+ bool has_folded_reply = 6;
+ // 空评论区背景文案
+ string bg_text = 7;
+ // 是否被UP拉黑
+ bool up_blocked = 8;
+ // 是否有发起活动权限
+ bool has_activity_access = 9;
+ // 标题展示控制
+ bool show_title = 10;
+ // 是否显示UP主操作标志
+ bool show_up_action = 11;
+ // 是否显示评论区排序切换按钮
+ int64 switcher_type = 12;
+ // 是否禁止输入框
+ bool input_disable = 13;
+ // 根评论输入框背景文案
+ string root_text = 14;
+ // 子评论输入框背景文案
+ string child_text = 15;
+ // 评论总数
+ int64 count = 16;
+ // 评论区标题
+ string title = 17;
+ // 离开态输入框的文案
+ string giveup_text = 18;
+ // 是否允许笔记
+ bool has_note_access = 19;
+ //
+ bool disable_jump_emote = 20;
+ //
+ string empty_background_text_plain = 21;
+ //
+ string empty_background_text_highlight = 22;
+ //
+ string empty_background_uri = 23;
+ // 评论区筛选类型列表
+ repeated FilterTag support_filter_tags = 24;
+}
+
+// 评论表情推荐列表-请求
+message SuggestEmotesReq {
+ // 目标评论区id
+ int64 oid = 1;
+ // 目标评论区业务type
+ int64 type = 2;
+}
+
+// 评论表情推荐列表-响应
+message SuggestEmotesResp {
+ // 表情推荐列表
+ repeated Emote emotes = 1;
+}
+
+// 话题项
+message Topic {
+ // 跳转url
+ string link = 1;
+ // 话题id
+ int64 id = 2;
+}
+
+// UGC视频项目
+message UGCVideoSearchItem {
+ // 标题
+ string title = 1;
+ // UP主昵称
+ string up_nickname = 2;
+ // 时长(单位为秒)
+ int64 duration = 3;
+ // 封面
+ string cover = 4;
+}
+
+// 精选评论
+message UpSelection {
+ // 待审评论数
+ int64 pending_count = 1;
+ // 忽略评论数
+ int64 ignore_count = 2;
+}
+
+// 超链项
+message Url {
+ // 扩展字段
+ message Extra {
+ //
+ int64 goods_item_id = 1;
+ //
+ string goods_prefetched_cache = 2;
+ //
+ int32 goods_show_type = 3;
+ // 热词搜索
+ bool is_word_search = 4;
+ //
+ int64 goods_cm_control = 5;
+ }
+ // 标题
+ string title = 1;
+ //
+ int64 state = 2;
+ // 图标url
+ string prefix_icon = 3;
+ // 客户端内跳转uri
+ string app_url_schema = 4;
+ //
+ string app_name = 5;
+ //
+ string app_package_name = 6;
+ // 点击上报数据
+ string click_report = 7;
+ // 是否半屏打开
+ bool is_half_screen = 8;
+ // 展现上报数据
+ string exposure_report = 9;
+ // 扩展字段
+ Extra extra = 10;
+ // 是否下划线
+ bool underline = 11;
+ //
+ bool match_once = 12;
+ // 网页url
+ string pc_url = 13;
+ //
+ int32 icon_position = 14;
+}
+
+//
+enum UserCallbackAction {
+ Dismiss = 0; //
+}
+
+// 用户回调上报-响应
+message UserCallbackReply {}
+
+// 用户回调上报-请求
+message UserCallbackReq {
+ // 用户mid
+ int64 mid = 1;
+ //
+ UserCallbackScene scene = 2;
+ //
+ UserCallbackAction action = 3;
+ // 目标评论区id
+ int64 oid = 4;
+ // 目标评论区业务type
+ int64 type = 5;
+}
+
+//
+enum UserCallbackScene {
+ Insert = 0; //
+}
+
+// 视频项目
+message VideoSearchItem {
+ //
+ SearchItemVideoSubType type = 1;
+ //
+ oneof video_item {
+ // UGC视频
+ UGCVideoSearchItem ugc = 2;
+ // PGC视频
+ PGCVideoSearchItem pgc = 3;
+ }
+}
+
+// 投票信息
+message Vote {
+ // 投票id
+ int64 id = 1;
+ // 投票标题
+ string title = 2;
+ // 参与人数
+ int64 count = 3;
+}
+
+//
+message VoteCard{
+ // 投票id
+ int64 vote_id = 1;
+ // 投票标题
+ string title = 2;
+ //
+ int64 count = 3;
+ //
+ repeated VoteCardOption options = 4;
+ //
+ int64 my_vote_option = 5;
+}
+
+//
+message VoteCardOption{
+ //
+ int64 idx = 1;
+ //
+ string desc = 2;
+ //
+ int64 count = 3;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/metadata/device/device.proto b/bili-api/grpc/proto/bilibili/metadata/device/device.proto
new file mode 100644
index 000000000..2cd3e674a
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/metadata/device/device.proto
@@ -0,0 +1,43 @@
+syntax = "proto3";
+
+package bilibili.metadata.device;
+
+option java_multiple_files = true;
+
+// 设备信息
+// gRPC头部:x-bili-device-bin
+message Device {
+ // 产品id
+ // 粉 白 蓝 直播姬 HD 海外 OTT 漫画 TV野版 小视频 网易漫画 网易漫画 网易漫画HD 国际版 东南亚版
+ // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 30
+ int32 app_id = 1;
+ // 构建id
+ int32 build = 2;
+ // 设备buvid
+ string buvid = 3;
+ // 包类型
+ string mobi_app = 4;
+ // 平台类型
+ // ios android
+ string platform = 5;
+ // 设备类型
+ string device = 6;
+ // 渠道
+ string channel = 7;
+ // 手机品牌
+ string brand = 8;
+ // 手机型号
+ string model = 9;
+ // 系统版本
+ string osver = 10;
+ // 本地设备指纹
+ string fp_local = 11;
+ // 远程设备指纹
+ string fp_remote = 12;
+ // APP版本号
+ string version_name = 13;
+ // 设备指纹, 不区分本地或远程设备指纹,作为推送目标的索引
+ string fp = 14;
+ // 首次启动时的毫秒时间戳
+ int64 fts = 15;
+}
diff --git a/bili-api-grpc/proto/bilibili/metadata/fawkes/fawkes.proto b/bili-api/grpc/proto/bilibili/metadata/fawkes/fawkes.proto
similarity index 57%
rename from bili-api-grpc/proto/bilibili/metadata/fawkes/fawkes.proto
rename to bili-api/grpc/proto/bilibili/metadata/fawkes/fawkes.proto
index 9b77d9f75..ec677c873 100644
--- a/bili-api-grpc/proto/bilibili/metadata/fawkes/fawkes.proto
+++ b/bili-api/grpc/proto/bilibili/metadata/fawkes/fawkes.proto
@@ -14,10 +14,10 @@ message FawkesReply {
//
message FawkesReq {
- // 客户端在fawkes系统的唯一名, 如 `android64`
- string appkey = 1;
- // 客户端在fawkes系统中的环境参数, 如 `prod`
- string env = 2;
- // 启动id, 8 位 0~9, a~z 组成的字符串
- string session_id = 3;
+ // 客户端在fawkes系统的唯一名, 如 `android64`
+ string appkey = 1;
+ // 客户端在fawkes系统中的环境参数, 如 `prod`
+ string env = 2;
+ // 启动id, 8 位 0~9, a~z 组成的字符串
+ string session_id = 3;
}
diff --git a/bili-api-grpc/proto/bilibili/metadata/locale/locale.proto b/bili-api/grpc/proto/bilibili/metadata/locale/locale.proto
similarity index 64%
rename from bili-api-grpc/proto/bilibili/metadata/locale/locale.proto
rename to bili-api/grpc/proto/bilibili/metadata/locale/locale.proto
index 04de4b887..58c8355c6 100644
--- a/bili-api-grpc/proto/bilibili/metadata/locale/locale.proto
+++ b/bili-api/grpc/proto/bilibili/metadata/locale/locale.proto
@@ -13,16 +13,16 @@ message Locale {
LocaleIds s_locale = 2;
// sim卡的国家码+运营商码
string sim_code = 3;
- // 时区
- string timezone = 4;
+ // 时区
+ string timezone = 4;
}
// Defined by https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html
message LocaleIds {
- // A language designator is a code that represents a language.
- string language = 1;
- // Writing systems.
- string script = 2;
- // A region designator is a code that represents a country or an area.
- string region = 3;
+ // A language designator is a code that represents a language.
+ string language = 1;
+ // Writing systems.
+ string script = 2;
+ // A region designator is a code that represents a country or an area.
+ string region = 3;
}
diff --git a/bili-api/grpc/proto/bilibili/metadata/metadata.proto b/bili-api/grpc/proto/bilibili/metadata/metadata.proto
new file mode 100644
index 000000000..d4d1a7da2
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/metadata/metadata.proto
@@ -0,0 +1,24 @@
+syntax = "proto3";
+
+package bilibili.metadata;
+
+option java_multiple_files = true;
+
+// 请求元数据
+// gRPC头部:x-bili-metadata-bin
+message Metadata {
+ // 登录 access_key
+ string access_key = 1;
+ // 包类型, 如 `android`
+ string mobi_app = 2;
+ // 运行设备, 留空即可
+ string device = 3;
+ // 构建id, 如 `7380300`
+ int32 build = 4;
+ // APP分发渠道, 如 `master`
+ string channel = 5;
+ // 设备唯一标识
+ string buvid = 6;
+ // 平台类型, 如 `android`
+ string platform = 7;
+}
diff --git a/bili-api/grpc/proto/bilibili/metadata/network/network.proto b/bili-api/grpc/proto/bilibili/metadata/network/network.proto
new file mode 100644
index 000000000..de2b279f8
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/metadata/network/network.proto
@@ -0,0 +1,37 @@
+syntax = "proto3";
+
+package bilibili.metadata.network;
+
+option java_multiple_files = true;
+
+// 网络类型标识
+// gRPC头部:x-bili-network-bin
+message Network {
+ // 网络类型
+ NetworkType type = 1;
+ // 免流类型
+ TFType tf = 2;
+ // 运营商
+ string oid = 3;
+}
+
+// 网络类型
+enum NetworkType {
+ NT_UNKNOWN = 0; // 未知
+ WIFI = 1; // WIFI
+ CELLULAR = 2; // 蜂窝网络
+ OFFLINE = 3; // 未连接
+ OTHERNET = 4; // 其他网络
+ ETHERNET = 5; // 以太网
+}
+
+// 免流类型
+enum TFType {
+ TF_UNKNOWN = 0; // 正常计费
+ U_CARD = 1; // 联通卡
+ U_PKG = 2; // 联通包
+ C_CARD = 3; // 移动卡
+ C_PKG = 4; // 移动包
+ T_CARD = 5; // 电信卡
+ T_PKG = 6; // 电信包
+}
diff --git a/bili-api-grpc/proto/bilibili/metadata/parabox/parabox.proto b/bili-api/grpc/proto/bilibili/metadata/parabox/parabox.proto
similarity index 83%
rename from bili-api-grpc/proto/bilibili/metadata/parabox/parabox.proto
rename to bili-api/grpc/proto/bilibili/metadata/parabox/parabox.proto
index 5ba3760d0..0736ed058 100644
--- a/bili-api-grpc/proto/bilibili/metadata/parabox/parabox.proto
+++ b/bili-api/grpc/proto/bilibili/metadata/parabox/parabox.proto
@@ -14,6 +14,6 @@ message Exp {
//
message Exps {
- //
- repeated Exp exps = 1;
+ //
+ repeated Exp exps = 1;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/metadata/restriction/restriction.proto b/bili-api/grpc/proto/bilibili/metadata/restriction/restriction.proto
new file mode 100644
index 000000000..d138cc793
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/metadata/restriction/restriction.proto
@@ -0,0 +1,26 @@
+syntax = "proto3";
+
+package bilibili.metadata.restriction;
+
+option java_multiple_files = true;
+
+// 模式类型
+enum ModeType {
+ NORMAL = 0; // 正常模式
+ TEENAGERS = 1; // 青少年模式
+ LESSONS = 2; // 课堂模式
+}
+
+// 限制条件
+message Restriction {
+ // 青少年模式开关状态
+ bool teenagers_mode = 1;
+ // 课堂模式开关状态
+ bool lessons_mode = 2;
+ // 模式类型(旧版)
+ ModeType mode = 3;
+ // app 审核review状态
+ bool review = 4;
+ // 客户端是否选择关闭个性化推荐
+ bool disable_rcmd = 5;
+}
diff --git a/bili-api-grpc/proto/bilibili/pagination/pagination.proto b/bili-api/grpc/proto/bilibili/pagination/pagination.proto
similarity index 60%
rename from bili-api-grpc/proto/bilibili/pagination/pagination.proto
rename to bili-api/grpc/proto/bilibili/pagination/pagination.proto
index 5a4c9ca4f..2ea759e0d 100644
--- a/bili-api-grpc/proto/bilibili/pagination/pagination.proto
+++ b/bili-api/grpc/proto/bilibili/pagination/pagination.proto
@@ -16,26 +16,26 @@ message FeedPagination {
// 分页信息
message FeedPaginationReply {
- //
- string next_offset = 1;
- //
- string prev_offset = 2;
- //
- string last_read_offset = 3;
+ //
+ string next_offset = 1;
+ //
+ string prev_offset = 2;
+ //
+ string last_read_offset = 3;
}
// 分页信息
message Pagination {
- //
- int32 page_size = 1;
- //
- string next = 2;
+ //
+ int32 page_size = 1;
+ //
+ string next = 2;
}
// 分页信息
message PaginationReply {
- //
- string next = 1;
- //
- string prev = 2;
+ //
+ string next = 1;
+ //
+ string prev = 2;
}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/pangu/gallery/v1/gallery.proto b/bili-api/grpc/proto/bilibili/pangu/gallery/v1/gallery.proto
new file mode 100644
index 000000000..8488e778a
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/pangu/gallery/v1/gallery.proto
@@ -0,0 +1,252 @@
+syntax = "proto3";
+
+package bilibili.pangu.gallery.v1;
+
+option java_multiple_files = true;
+
+import "google/protobuf/empty.proto";
+
+//
+service GalleryInterface {
+ //
+ rpc Ping (google.protobuf.Empty) returns (google.protobuf.Empty);
+ //
+ rpc UserInfo (GetUserInfoReq) returns (GetUserInfoReply);
+ //
+ rpc ListNFTByMid (ListNFTByMidReq) returns (ListNFTByMidReply);
+ //
+ rpc ListOrderByMid (ListOrderByMidReq) returns (ListOrderByMidReply);
+ //
+ rpc BasicInfo (BasicInfoReq) returns (BasicInfoReply);
+ //
+ rpc UserCheck (UserCheckReq) returns (UserCheckReply);
+ //
+ rpc AgreePolicy (AgreePolicyReq) returns (AgreePolicyReply);
+ //
+ rpc GetLastPolicy (GetLastPolicyReq) returns (GetLastPolicyReply);
+}
+
+//
+message AgreePolicyReply {
+
+}
+
+//
+message AgreePolicyReq {
+ //
+ PolicyType policy_type = 1;
+ //
+ string version = 2;
+}
+
+//
+message BasicInfoReply {
+ //
+ string customer_service_url = 1;
+ //
+ string agreement_url = 2;
+ //
+ string privacy_url = 3;
+ //
+ repeated Link links = 4;
+}
+
+//
+message BasicInfoReq {
+ //
+ int64 mid = 1;
+}
+
+//
+message Display {
+ //
+ string bg_theme_light = 1;
+ //
+ string bg_theme_night = 2;
+ //
+ string nft_poster = 3;
+ //
+ string nft_raw = 4;
+}
+
+//
+enum GT14Status {
+ LT14 = 0; //
+ GE14 = 1; //
+ UNKNOWN_GT14 = 2; //
+}
+
+//
+message GetLastPolicyReply {
+ //
+ string short_desc = 1;
+ //
+ string detail_jump = 2;
+ //
+ string version = 3;
+}
+
+//
+message GetLastPolicyReq {
+ //
+ PolicyType policy_type = 1;
+}
+
+//
+message GetUserInfoReply {
+ //
+ int64 mid = 1;
+ //
+ string name = 2;
+ //
+ string address = 3;
+ //
+ string avatar_url = 4;
+ //
+ string help_url = 5;
+}
+
+//
+message GetUserInfoReq {
+ //
+ int64 mid = 1;
+}
+
+//
+message Link {
+ //
+ string name = 1;
+ //
+ string link_url = 2;
+ //
+ string track_event_id = 3;
+}
+
+//
+message ListNFTByMidReply {
+ //
+ repeated NFT nfts = 1;
+ //
+ int64 anchor_id = 2;
+ //
+ bool end = 3;
+}
+
+//
+message ListNFTByMidReq {
+ //
+ int64 mid = 1;
+ //
+ string category = 2;
+ //
+ string biz_type = 3;
+ //
+ int64 anchor_id = 4;
+ //
+ int64 page_size = 5;
+}
+
+//
+message ListOrderByMidReply {
+ //
+ repeated Order orders = 1;
+ //
+ int64 anchor_id = 2;
+ //
+ bool end = 3;
+}
+
+//
+message ListOrderByMidReq {
+ //
+ int64 mid = 1;
+ //
+ int64 anchor_id = 2;
+ //
+ int64 page_size = 3;
+}
+
+//
+message NFT {
+ //
+ string nft_id = 1;
+ //
+ string item_name = 2;
+ //
+ string serial_number = 3;
+ //
+ string issuer = 4;
+ //
+ Display display = 5;
+ //
+ string detail_url = 6;
+ //
+ NFTStatus nft_status = 7;
+ //
+ int64 item_id = 8;
+}
+
+//
+enum NFTStatus {
+ UNDEFINED = 0; //
+ NORMAL = 1; //
+ DOING = 2; //
+}
+
+//
+message Order {
+ //
+ string item_name = 1;
+ //
+ string serial_number = 2;
+ //
+ string tx_hash = 3;
+ //
+ string tx_time = 4;
+ //
+ string issuer = 5;
+ //
+ string issue_time = 6;
+ //
+ string token_id = 7;
+ //
+ Display display = 8;
+ //
+ string contract_address = 9;
+ //
+ string hash_jump = 10;
+ //
+ string contract_jump = 11;
+ //
+ bool disable_browser_jump = 12;
+}
+
+//
+enum PolicyAgreeStatus {
+ UNSIGNED = 0; //
+ ACCEPTED = 1; //
+ EXPIRED = 2; //
+}
+
+//
+enum PolicyType {
+ UNKNOWN_POLICY = 0; //
+ WALLET = 1; //
+ SALE = 2; //
+}
+
+//
+message UserCheckReply {
+ //
+ int32 policy_status = 1;
+ //
+ int32 gt14 = 2;
+}
+
+//
+message UserCheckReq {
+ //
+ int64 mid = 1;
+ //
+ int32 policy_type = 2;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/pgc/gateway/player/v1/playurl.proto b/bili-api/grpc/proto/bilibili/pgc/gateway/player/v1/playurl.proto
new file mode 100644
index 000000000..5950dd9c8
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/pgc/gateway/player/v1/playurl.proto
@@ -0,0 +1,267 @@
+syntax = "proto3";
+
+package bilibili.pgc.gateway.player.v1;
+
+option java_multiple_files = true;
+
+import "bilibili/app/playurl/v1/playurl.proto";
+
+// 播放地址
+service PlayURL {
+ // 播放页信息
+ rpc PlayView (PlayViewReq) returns (PlayViewReply);
+ // 获取投屏地址
+ rpc Project (ProjectReq) returns (ProjectReply);
+ // 直播播放页信息
+ rpc LivePlayView (LivePlayViewReq) returns (LivePlayViewReply);
+}
+
+// 其他业务信息
+message BusinessInfo {
+ // 当前视频是否是预览
+ bool is_preview = 1;
+ // 用户是否承包过
+ bool bp = 2;
+ // drm使用
+ string marlin_token = 3;
+}
+
+// 事件
+message Event {
+ // 震动
+ Shake shake = 1;
+}
+
+// 播放信息
+message LivePlayInfo {
+ //
+ int32 current_qn = 1;
+ //
+ repeated QualityDescription quality_description = 2;
+ //
+ repeated ResponseDataUrl durl = 3;
+}
+
+// 直播播放页信息-响应
+message LivePlayViewReply {
+ // 房间信息
+ RoomInfo room_info = 1;
+ // 播放信息
+ LivePlayInfo play_info = 2;
+}
+
+// 直播播放页信息-请求
+message LivePlayViewReq {
+ // 剧集epid
+ int64 ep_id = 1;
+ // 清晰度
+ // 0,10000:原画 400:蓝光 250:超清 150:高清 80:流畅
+ uint32 quality = 2;
+ // 类型
+ // 0:音频 2:hevc 4:dash 8:p2p, 16:蒙版
+ uint32 ptype = 3;
+ // 是否请求https
+ bool https = 4;
+ // 0:默认直播间播放 1:投屏播放
+ uint32 play_type = 5;
+ // 投屏设备
+ // 0:默认其他 1:OTT设备
+ int32 device_type = 6;
+}
+
+// 禁用功能配置
+message PlayAbilityConf {
+ bool background_play_disable = 1; // 后台播放
+ bool flip_disable = 2; // 镜像反转
+ bool cast_disable = 3; // 投屏
+ bool feedback_disable = 4; // 反馈
+ bool subtitle_disable = 5; // 字幕
+ bool playback_rate_disable = 6; // 播放速度
+ bool time_up_disable = 7; // 定时停止
+ bool playback_mode_disable = 8; // 播放方式
+ bool scale_mode_disable = 9; // 画面尺寸
+ bool like_disable = 10; // 赞
+ bool dislike_disable = 11; // 踩
+ bool coin_disable = 12; // 投币
+ bool elec_disable = 13; // 充电
+ bool share_disable = 14; // 分享
+ bool screen_shot_disable = 15; // 截图
+ bool lock_screen_disable = 16; // 锁定
+ bool recommend_disable = 17; // 相关推荐
+ bool playback_speed_disable = 18; // 播放速度
+ bool definition_disable = 19; // 清晰度
+ bool selections_disable = 20; // 选集
+ bool next_disable = 21; // 下一集
+ bool edit_dm_disable = 22; // 编辑弹幕
+ bool small_window_disable = 23; // 小窗
+ bool shake_disable = 24; // 震动
+ bool outer_dm_disable = 25; // 外层面板弹幕设置
+ bool inner_dm_disable = 26; // 三点内弹幕设置
+ bool freya_enter_disable = 27; // 一起看入口
+ bool dolby_disable = 28; // 杜比音效
+ bool freya_full_disable = 29; // 全屏一起看入口
+ bool skip_oped_switch_disable = 30; //
+}
+
+// 播放页信息-响应
+message PlayViewReply {
+ // 视频流信息
+ bilibili.app.playurl.v1.VideoInfo video_info = 1;
+ // 播放控件用户自定义配置
+ PlayAbilityConf play_conf = 2;
+ // 业务需要的其他信息
+ BusinessInfo business = 3;
+ // 事件
+ Event event = 4;
+}
+
+// 播放页信息-请求
+message PlayViewReq {
+ // 剧集epid
+ int64 epid = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 force_host = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string from_spmid = 10;
+ // 青少年模式
+ int32 teenagers_mode = 11;
+ // 视频编码
+ bilibili.app.playurl.v1.CodeType prefer_codec_type = 12;
+ // 是否强制请求预览视频
+ bool is_preview = 13;
+ // 一起看房间id
+ int64 room_id = 14;
+}
+
+// 投屏地址-响应
+message ProjectReply {
+ bilibili.app.playurl.v1.PlayURLReply project = 1;
+}
+
+// 投屏地址-请求
+message ProjectReq {
+ // 剧集epid
+ int64 ep_id = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 forceHost = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string fromSpmid = 10;
+ // 使用协议
+ // 0:默认乐播 1:自建协议 2:云投屏 3:airplay
+ int32 protocol = 11;
+ // 投屏设备
+ // 0:默认其他 1:OTT设备
+ int32 device_type = 12;
+ //
+ bool use_new_project_code = 13;
+}
+
+//
+message QualityDescription {
+ //
+ int32 qn = 1;
+ //
+ string desc = 2;
+}
+
+//
+message ResponseDataUrl {
+ string url = 1;
+ // 表示stream类型,按位表示
+ // Value| 1 | 1 | 1 | 1 | 1
+ // --------------------------------------------
+ // desc | mask | p2p | dash | hevc | only-audio
+ uint32 stream_type = 2;
+ // 表示支持p2p的cdn厂商,按位表示
+ // 值 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
+ // -----------------------------------------------
+ // CDN | hw | bdy | bsy | ws | txy | qn | js | bvc
+ uint32 ptag = 3;
+}
+
+// 房间信息
+message RoomInfo {
+ // 房间长号
+ int64 room_id = 1;
+ // 主播mid
+ int64 uid = 2;
+ // 状态相关
+ RoomStatusInfo status = 3;
+ // 展示相关
+ RoomShowInfo show = 4;
+}
+
+// 房间信息-展示相关
+message RoomShowInfo {
+ // 短号
+ int64 short_id = 1;
+ // 人气值
+ int64 popularity_count = 8;
+ // 最近一次开播时间戳
+ int64 live_start_time = 10;
+}
+
+// 房间信息-状态相关
+message RoomStatusInfo {
+ // 直播间状态
+ // 0:未开播 1:直播中 2:轮播中
+ int64 live_status = 1;
+ // 横竖屏方向
+ // 0:横屏 1:竖屏
+ int64 live_screen_type = 2;
+ // 是否开播过标识
+ int64 live_mark = 3;
+ // 封禁状态
+ // 0:未封禁 1:审核封禁 2:全网封禁
+ int64 lock_status = 4;
+ // 封禁时间戳
+ int64 lock_time = 5;
+ // 隐藏状态
+ // 0:不隐藏 1:隐藏
+ int64 hidden_status = 6;
+ // 隐藏时间戳
+ int64 hidden_time = 7;
+ // 直播类型
+ // 0:默认 1:摄像头直播 2;录屏直播 3:语音直播
+ int64 live_type = 8;
+ //
+ int64 room_shield = 9;
+}
+
+// 震动
+message Shake {
+ // 文件地址
+ string file = 1;
+}
diff --git a/bili-api/grpc/proto/bilibili/pgc/gateway/player/v2/playurl.proto b/bili-api/grpc/proto/bilibili/pgc/gateway/player/v2/playurl.proto
new file mode 100644
index 000000000..6f3891509
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/pgc/gateway/player/v2/playurl.proto
@@ -0,0 +1,1129 @@
+syntax = "proto3";
+
+package bilibili.pgc.gateway.player.v2;
+
+option java_multiple_files = true;
+
+import "google/protobuf/timestamp.proto";
+
+// 视频url
+service PlayURL {
+ // 播放页信息
+ rpc PlayView (PlayViewReq) returns (PlayViewReply);
+ //
+ rpc PlayViewComic(PlayViewReq) returns (PlayViewReply);
+}
+
+//
+message Animation {
+ //
+ map qn_svga_animation_map = 1;
+}
+
+//
+message AudioMaterialProto {
+ //
+ string audio_id = 1;
+ //
+ string title = 2;
+ //
+ string edition = 3;
+ //
+ uint64 person_id = 4;
+ //
+ string person_name = 5;
+ //
+ string person_avatar = 6;
+ //
+ repeated DashItem audio = 7;
+}
+
+// 角标信息
+message BadgeInfo {
+ // 角标文案
+ string text = 1;
+ // 角标色值
+ string bg_color = 2;
+ // 角标色值-夜间模式
+ string bg_color_night = 3;
+ // 文案色值
+ string text_color = 4;
+ // ? 新版本客户端已弃用此项
+ GradientColor bg_gradient_color = 5;
+ //
+ string img = 6;
+}
+
+// Dialog组件: 底部显示
+message BottomDisplay {
+ // 文案
+ TextInfo title = 1;
+ // 图标
+ string icon = 2;
+}
+
+// 按钮信息
+message ButtonInfo {
+ // 按钮文案
+ string text = 1;
+ // 按钮字体色值
+ string text_color = 2;
+ // 按钮字体色值-夜间模式
+ string text_color_night = 3;
+ // 按钮背景色
+ string bg_color = 4;
+ // 按钮背景色-夜间模式
+ string bg_color_night = 5;
+ // 按钮链接
+ string link = 6;
+ // 按钮动作类型
+ string action_type = 7;
+ // 角标信息
+ BadgeInfo badge_info = 8;
+ // 埋点上报信息
+ Report report = 9;
+ // 左侧删除线样式文案
+ string left_strikethrough_text = 10;
+ // 缩略按钮文案信息
+ TextInfo simple_text_info = 11;
+ // 缩略按钮背景色值
+ string simple_bg_color = 12;
+ // 缩略按钮字体色值-夜间模式
+ string simple_bg_color_night = 13;
+ //
+ GradientColor bg_gradient_color = 14;
+ //
+ map order_report_params = 15;
+ //
+ TaskParam task_param = 16;
+ //
+ string pc_link = 17;
+}
+
+// 投屏限制. code = 0 时为无限制, 否则表示不不允许投屏并提示message
+message CastTips {
+ //
+ int32 code = 1;
+ //
+ string message = 2;
+}
+
+// 跳过片头/片尾配置
+message ClipInfo {
+ //
+ int64 material_no = 1;
+ // DASH分段始
+ int32 start = 2;
+ // DASH分段终
+ int32 end = 3;
+ // Clip类型
+ ClipType clip_type = 4;
+ // 跳过片头/片尾时的提示语
+ string toast_text = 5;
+ //
+ MultiView multi_view = 6;
+}
+
+// 跳过片头/片尾配置: Clip类型
+enum ClipType {
+ NT_UNKNOWN = 0; //
+ CLIP_TYPE_OP = 1; // 跳过OP
+ CLIP_TYPE_ED = 2; // 跳过ED
+ CLIP_TYPE_HE = 3; //
+ CLIP_TYPE_MULTI_VIEW = 4; //
+ CLIP_TYPE_AD = 5; //
+}
+
+// 编码类型
+enum CodeType {
+ NOCODE = 0; // 默认
+ CODE264 = 1; // H.264
+ CODE265 = 2; // H.265
+}
+
+//
+message ContinuePlayInfo {
+ //
+ int64 continue_play_ep_id = 1;
+}
+
+// 优惠券
+message Coupon {
+ // 优惠券token
+ string coupon_token = 1;
+ // 优惠券类型
+ // 1:折扣券 2:满减券 3:兑换券
+ int64 type = 2;
+ // 优惠券面值
+ string value = 3;
+ // 优惠券使用描述
+ string use_desc = 4;
+ // 优惠券标题
+ string title = 5;
+ // 优惠券描述
+ string desc = 6;
+ // 优惠券支付按钮文案
+ string pay_button_text = 7;
+ // 优惠券支付按钮删除线文案
+ string pay_button_text_line_through = 8;
+ // 实付金额
+ string real_amount = 9;
+ // 使用过期时间
+ google.protobuf.Timestamp expire_time = 10;
+ //
+ int64 otype = 11;
+ //
+ string amount = 12;
+}
+
+// 优惠券信息
+message CouponInfo {
+ // 提示框信息
+ CouponToast toast = 1;
+ // 弹窗信息
+ PopWin pop_win = 2;
+}
+
+// 优惠券提示框文案信息
+message CouponTextInfo {
+ // 提示框文案-播正片6分钟预览
+ string positive_preview = 1;
+ // 提示框文案-播非正片分节ep
+ string section = 2;
+}
+
+// 优惠券提示框信息
+message CouponToast {
+ // 提示框文案信息
+ CouponTextInfo text_info = 1;
+ // 提示框按钮
+ ButtonInfo button = 2;
+}
+
+// dash条目
+message DashItem {
+ // 清晰度
+ uint32 id = 1;
+ // 主线流
+ string base_url = 2;
+ // 备用流
+ repeated string backup_url = 3;
+ // 带宽
+ uint32 bandwidth = 4;
+ // 编码id
+ uint32 codecid = 5;
+ // md5
+ string md5 = 6;
+ // 视频大小
+ uint64 size = 7;
+ // 帧率
+ string frame_rate = 8;
+ // DRM widevine 密钥
+ string widevine_pssh = 9;
+}
+
+// dash视频流
+message DashVideo {
+ // 主线流
+ string base_url = 1;
+ // 备用流
+ repeated string backup_url = 2;
+ // 带宽
+ uint32 bandwidth = 3;
+ // 编码id
+ uint32 codecid = 4;
+ // md5
+ string md5 = 5;
+ // 大小
+ uint64 size = 6;
+ // 伴音质量id
+ uint32 audio_id = 7;
+ // 是否非全二压
+ bool no_rexcode = 8;
+ // 帧率
+ string frame_rate = 9;
+ // 宽
+ int32 width = 10;
+ // 高
+ int32 height = 11;
+ // DRM 密钥
+ string widevine_pssh = 12;
+}
+
+//
+message DataControl {
+ //
+ bool need_watch_progress = 1;
+}
+
+// 鉴权浮层
+message Dialog {
+ // 鉴权限制码
+ int64 code = 1;
+ // 鉴权限制信息
+ string msg = 2;
+ // 浮层类型
+ string type = 3;
+ // 浮层样式类型
+ string style_type = 4;
+ // 浮层配置
+ DialogConfig config = 5;
+ // 标题
+ TextInfo title = 6;
+ // 副标题
+ TextInfo subtitle = 7;
+ // 图片信息
+ ImageInfo image = 8;
+ // 按钮列表
+ repeated ButtonInfo button = 9;
+ // 底部描述
+ ButtonInfo bottom_desc = 10;
+ // 埋点上报信息
+ Report report = 11;
+ // 倒计时 秒
+ int32 count_down_sec = 12;
+ // 右下描述
+ TextInfo right_bottom_desc = 13;
+ //
+ repeated BottomDisplay bottom_display = 14;
+ //
+ repeated PlayList play_list = 15;
+}
+
+// 鉴权浮层配置
+message DialogConfig {
+ // 是否显示高斯模糊背景图
+ bool is_show_cover = 1;
+ // 是否响应转屏
+ bool is_orientation_enable = 2;
+ // 是否响应上滑吸顶
+ bool is_nested_scroll_enable = 3;
+ // 是否强制竖屏
+ bool is_force_halfscreen_enable = 4;
+ // 是否启用背景半透明
+ bool is_background_translucent_enable = 5;
+}
+
+// 当前分辨率信息
+message Dimension {
+ // 宽
+ int32 width = 1;
+ // 长
+ int32 height = 2;
+ // 旋转角度
+ int32 rotate = 3;
+}
+
+// 杜比音频信息
+message DolbyItem {
+ // 杜比类型
+ enum Type {
+ NONE = 0; // NONE
+ COMMON = 1; // 普通杜比音效
+ ATMOS = 2; // 全景杜比音效
+ }
+ // 杜比类型
+ Type type = 1;
+ // 音频流
+ DashItem audio = 2;
+}
+
+// DRM技术类型
+enum DrmTechType {
+ NON = 0; //
+ FAIR_PLAY = 1; //
+ WIDE_VINE = 2; //
+ BILI_DRM = 3; //
+}
+
+// 播放结束后的尾页Dialog
+message EndPage {
+ //
+ Dialog dialog = 1;
+ //
+ bool hide = 2;
+}
+
+//
+message EpInlineVideo {
+ //
+ int64 material_no = 1;
+ //
+ int64 aid = 2;
+ //
+ int64 cid = 3;
+}
+
+// 剧集广告信息
+message EpisodeAdvertisementInfo {
+ //
+ int64 aid = 1;
+ //
+ string title = 2;
+ //
+ string link = 3;
+ //
+ int32 follow_video_bnt_flag = 4;
+ //
+ string next_video_title = 5;
+ //
+ string next_video_link = 6;
+ //
+ int64 cid = 7;
+ //
+ int32 season_id = 8;
+ //
+ int32 follow = 9;
+}
+
+// EP信息
+message EpisodeInfo {
+ //
+ int32 ep_id = 1;
+ //
+ int64 cid = 2;
+ //
+ int64 aid = 3;
+ //
+ int64 ep_status = 4;
+ //
+ SeasonInfo season_info = 5;
+ //
+ string cover = 6;
+ //
+ string title = 7;
+ //
+ Interaction interaction = 8;
+ //
+ string long_title = 9;
+}
+
+//
+message EpPreVideo {
+ //
+ int64 aid = 1;
+ //
+ int64 cid = 2;
+}
+
+//
+message EpPublicityVideo {
+ //
+ enum Type {
+ DATA_NOT_SET = 0;
+ EP_PRE_VIDEO = 2;
+ EP_INLINE = 3;
+ }
+ //
+ Type type = 1;
+ //
+ oneof data {
+ //
+ EpPreVideo ep_pre_video = 2;
+ //
+ EpInlineVideo ep_inline_video = 3;
+ }
+}
+
+//
+enum EpPublicityVideoType {
+ //
+ PRE = 0;
+ //
+ INLINE = 1;
+}
+
+// 事件
+message Event {
+ // 震动
+ Shake shake = 1;
+}
+
+// 放映室提示语
+message FreyaConfig {
+ //
+ string desc = 1;
+ //
+ int32 type = 2;
+ //
+ int32 issued_cnt = 3;
+ //
+ bool is_always_show = 4;
+ //
+ int32 screen_number = 5;
+ //
+ int32 full_screen_number = 6;
+}
+
+// 渐变色信息
+message GradientColor {
+ //
+ string start_color = 1;
+ //
+ string end_color = 2;
+}
+
+// 高画质试看信息
+message HighDefinitionTrialInfo {
+ //
+ bool trial_able = 1;
+ //
+ int32 remaining_times = 2;
+ //
+ int32 start = 3;
+ //
+ int32 time_length = 4;
+ //
+ Toast start_toast = 5;
+ //
+ Toast end_toast = 6;
+ //
+ Report report = 7;
+ //
+ ButtonInfo quality_open_tip_btn = 8;
+ //
+ ButtonInfo no_longer_trial_btn = 9;
+}
+
+// 历史记录节点
+message HistoryNode {
+ // 节点ID
+ int64 node_id = 1;
+ // 节点标题
+ string title = 2;
+ // 对应CID
+ int64 cid = 3;
+}
+
+// 图片信息
+message ImageInfo {
+ // 图片链接
+ string url = 1;
+}
+
+//
+enum InlineScene {
+ UNKNOWN = 0; //
+ RELATED_EP = 1; //
+ HE = 2; //
+ SKIP = 3; //
+}
+
+//
+enum InlineType {
+ TYPE_UNKNOWN = 0; //
+ TYPE_WHOLE = 1; //
+ TYPE_HE_CLIP = 2; //
+ TYPE_PREVIEW = 3; //
+}
+
+// 交互信息
+message Interaction {
+ // 历史节点
+ HistoryNode history_node = 1;
+ // 版本
+ int64 graph_version = 2;
+ // 交互消息
+ string msg = 3;
+ // 是否为交互
+ bool is_interaction = 4;
+}
+
+// 限制操作类型
+enum LimitActionType {
+ //
+ LAT_UNKNOWN = 0;
+ //
+ SHOW_LIMIT_DIALOG = 1;
+ //
+ SKIP_CURRENT_EP = 2;
+}
+
+//
+message MultiView {
+ //
+ string button_material = 1;
+ //
+ int64 ep_id = 2;
+ //
+ int64 cid = 3;
+ //
+ int64 avid = 4;
+}
+
+// 大会员广告: 支付提示信息
+message PayTip {
+ // 标题
+ string title = 1;
+ // 跳转链接
+ string url = 2;
+ // 图标
+ string icon = 3;
+ // 浮层类型
+ int32 type = 4;
+ // 显示类型
+ int32 show_type = 5;
+ // 图片信息
+ string img = 6;
+ // 白天背景颜色
+ string bg_day_color = 7;
+ // 夜间背景颜色
+ string bg_night_color = 8;
+ // 白天线条颜色
+ string bg_line_color = 9;
+ // 夜间线条颜色
+ string bg_night_line_color = 10;
+ // 文字颜色
+ string text_color = 11;
+ // 夜间文字颜色
+ string text_night_color = 12;
+ // 视图展示起始时间
+ int64 view_start_time = 13;
+ // 按钮列表
+ repeated ButtonInfo button = 14;
+ // 跳转链接打开方式
+ int32 url_open_type = 15;
+ // 埋点上报信息
+ Report report = 16;
+ // 角度样式
+ int32 angle_style = 17;
+ // 埋点上报类型
+ int32 report_type = 18;
+ // 订单埋点上报参数
+ map order_report_params = 19;
+ // 巨屏图片信息
+ string giant_screen_img = 20;
+}
+
+// 禁用功能配置
+message PlayAbilityConf {
+ bool background_play_disable = 1; // 后台播放
+ bool flip_disable = 2; // 镜像反转
+ bool cast_disable = 3; // 投屏
+ bool feedback_disable = 4; // 反馈
+ bool subtitle_disable = 5; // 字幕
+ bool playback_rate_disable = 6; // 播放速度
+ bool time_up_disable = 7; // 定时停止
+ bool playback_mode_disable = 8; // 播放方式
+ bool scale_mode_disable = 9; // 画面尺寸
+ bool like_disable = 10; // 赞
+ bool dislike_disable = 11; // 踩
+ bool coin_disable = 12; // 投币
+ bool elec_disable = 13; // 充电
+ bool share_disable = 14; // 分享
+ bool screen_shot_disable = 15; // 截图
+ bool lock_screen_disable = 16; // 锁定
+ bool recommend_disable = 17; // 相关推荐
+ bool playback_speed_disable = 18; // 播放速度
+ bool definition_disable = 19; // 清晰度
+ bool selections_disable = 20; // 选集
+ bool next_disable = 21; // 下一集
+ bool edit_dm_disable = 22; // 编辑弹幕
+ bool small_window_disable = 23; // 小窗
+ bool shake_disable = 24; // 震动
+ bool outer_dm_disable = 25; // 外层面板弹幕设置
+ bool inner_dm_disable = 26; // 三点内弹幕设置
+ bool freya_enter_disable = 27; // 一起看入口
+ bool dolby_disable = 28; // 杜比音效
+ bool freya_full_disable = 29; // 全屏一起看入口
+ bool skip_oped_switch_disable = 30; // 跳过片头片尾
+ bool record_screen_disable = 31; // 录屏
+ bool color_optimize_disable = 32; // 色觉优化
+ bool dubbing_disable = 33; // 配音
+}
+
+// 云控扩展配置信息
+message PlayAbilityExtConf {
+ //
+ bool allow_close_subtitle = 1;
+ //
+ FreyaConfig freya_config = 2;
+ //
+ CastTips cast_tips = 3;
+}
+
+// 播放配音信息
+message PlayDubbingInfo {
+ // 背景音频
+ AudioMaterialProto background_audio = 1;
+ // 角色音频列表
+ repeated RoleAudioProto role_audio_list = 2;
+ // 引导文本
+ string guide_text = 3;
+}
+
+// 错误码
+enum PlayErr {
+ NoErr = 0; //
+ WithMultiDeviceLoginErr = 1; // 管控类型的错误码
+}
+
+
+// 播放扩展信息
+message PlayExtInfo {
+ // 播放配音信息
+ PlayDubbingInfo play_dubbing_info = 1;
+}
+
+//
+message PlayList {
+ //
+ int32 season_id = 1;
+ //
+ string title = 2;
+ //
+ string cover = 3;
+ //
+ string link = 4;
+ //
+ BadgeInfo badge_info = 5;
+}
+
+// 其他业务信息
+message PlayViewBusinessInfo {
+ // 当前视频是否是预览
+ bool is_preview = 1;
+ // 用户是否承包过
+ bool bp = 2;
+ // drm使用
+ string marlin_token = 3;
+ // 倍速动效色值
+ string playback_speed_color = 4;
+ //
+ ContinuePlayInfo continue_play_info = 5;
+ // 跳过片头/片尾配置
+ repeated ClipInfo clip_info = 6;
+ //
+ InlineType inline_type = 7;
+ //
+ int32 ep_whole_duration = 8;
+ // 当前分辨率信息
+ Dimension dimension = 9;
+ //
+ map quality_ext_map = 10;
+ //
+ map exp_map = 11;
+ // DRM技术类型
+ DrmTechType drm_tech_type = 12;
+ //
+ int32 limit_action_type = 13;
+ //
+ bool is_drm = 14;
+ //
+ RecordInfo record_info = 15;
+ //
+ int32 vip_status = 16;
+ //
+ bool is_live_pre = 17;
+ //
+ EpisodeInfo episode_info = 18;
+ //
+ EpisodeAdvertisementInfo episode_advertisement_info = 19;
+ //
+ UserStatus user_status = 20;
+}
+
+// 播放页信息-响应
+message PlayViewReply {
+ // 视频流信息
+ VideoInfo video_info = 1;
+ // 播放控件用户自定义配置
+ PlayAbilityConf play_conf = 2;
+ // 业务需要的其他信息
+ PlayViewBusinessInfo business = 3;
+ // 事件
+ Event event = 4;
+ // 展示信息
+ ViewInfo view_info = 5;
+ // 自定义配置扩展信息
+ PlayAbilityExtConf play_ext_conf = 6;
+ // 播放扩展信息
+ PlayExtInfo play_ext_info = 7;
+}
+
+// 播放页信息-请求
+message PlayViewReq {
+ // 剧集epid
+ int64 epid = 1;
+ // 视频cid
+ int64 cid = 2;
+ // 清晰度
+ int64 qn = 3;
+ // 视频流版本
+ int32 fnver = 4;
+ // 视频流格式
+ int32 fnval = 5;
+ // 下载模式
+ // 0:播放 1:flv下载 2:dash下载
+ uint32 download = 6;
+ // 流url强制是用域名
+ // 0:允许使用ip 1:使用http 2:使用https
+ int32 force_host = 7;
+ // 是否4K
+ bool fourk = 8;
+ // 当前页spm
+ string spmid = 9;
+ // 上一页spm
+ string from_spmid = 10;
+ // 青少年模式
+ int32 teenagers_mode = 11;
+ // 视频编码
+ CodeType prefer_codec_type = 12;
+ // 是否强制请求预览视频
+ bool is_preview = 13;
+ // 一起看房间id
+ int64 room_id = 14;
+ // 是否需要展示信息
+ bool is_need_view_info = 15;
+ // 场景控制
+ SceneControl scene_control = 16;
+ //
+ InlineScene inline_scene = 17;
+ //
+ int64 material_no = 18;
+ // DRM 安全等级
+ int32 security_level = 19;
+ //
+ int64 season_id = 20;
+ //
+ DataControl data_control = 21;
+}
+
+// 弹窗信息
+message PopWin {
+ // 弹窗标题 老字段
+ string title = 1;
+ // 优惠券列表
+ repeated Coupon coupon = 2;
+ // 弹窗按钮列表
+ repeated ButtonInfo button = 3;
+ // 底部文案 老字段
+ string bottom_text = 4;
+ // 弹窗标题 新字段
+ TextInfo pop_title = 5;
+ // 弹窗副标题
+ TextInfo subtitle = 6;
+ // 底部描述 新字段
+ ButtonInfo bottom_desc = 7;
+ // 弹窗小图
+ string cover = 8;
+ // 弹窗类型
+ string pop_type = 9;
+}
+
+// 广告组件: 竖屏时视频下部提示栏
+message PromptBar {
+ // 主标题, 如: "本片含大会员专享内容"
+ TextInfo title = 1;
+ // 副标题, 如: "成为大会员可免费看全部剧集"
+ TextInfo sub_title = 2;
+ // 副标题前面的icon
+ string sub_title_icon = 3;
+ // 背景图
+ string bg_image = 4;
+ // 背景渐变色
+ GradientColor bg_gradient_color = 5;
+ // 按钮
+ repeated ButtonInfo button = 6;
+ // 埋点上报信息
+ Report report = 7;
+ //
+ string full_screen_ip_icon = 8;
+ //
+ GradientColor full_screen_bg_gradient_color = 9;
+}
+
+// 云控拓展视频画质信息
+message QualityExtInfo {
+ // 是否支持试看
+ bool trial_support = 1;
+}
+
+// 备案信息
+message RecordInfo {
+ // 记录
+ string record = 1;
+ // 记录图标
+ string record_icon = 2;
+}
+
+// 埋点上报信息
+message Report {
+ // 曝光事件
+ string show_event_id = 1;
+ // 点击事件
+ string click_event_id = 2;
+ // 埋点透传参数
+ string extends = 3;
+}
+
+// 分段流条目
+message ResponseUrl {
+ // 分段序号
+ uint32 order = 1;
+ // 分段时长
+ uint64 length = 2;
+ // 分段大小
+ uint64 size = 3;
+ // 主线流
+ string url = 4;
+ // 备用流
+ repeated string backup_url = 5;
+ // md5
+ string md5 = 6;
+}
+
+// 权限信息
+message Rights {
+ // 是否可以观看
+ int32 can_watch = 1;
+}
+
+// 角色配音信息
+message RoleAudioProto {
+ // 角色ID
+ int64 role_id = 1;
+ // 角色名称
+ string role_name = 2;
+ // 角色头像
+ string role_avatar = 3;
+ // 音频素材列表
+ repeated AudioMaterialProto audio_material_list = 4;
+}
+
+// 场景控制
+message SceneControl {
+ // 是否收藏播单
+ bool fav_playlist = 1;
+ // 是否小窗
+ bool small_window = 2;
+ // 是否画中画
+ bool pip = 3;
+ //
+ bool was_he_inline = 4;
+ //
+ bool is_need_trial = 5;
+}
+
+// 方案
+message Scheme {
+ enum ActionType {
+ UNKNOWN = 0;
+ SHOW_TOAST = 1;
+ }
+ //
+ ActionType action_type = 1;
+ //
+ string toast = 2;
+}
+
+// PGC SEASON 信息
+message SeasonInfo {
+ // PGC SEASON ID
+ int32 season_id = 1;
+ // PGC SEASON 类型
+ int32 season_type = 2;
+ // PGC SEASON 状态
+ int32 season_status = 3;
+ // 封面
+ string cover = 4;
+ // 标题
+ string title = 5;
+ // 权限信息
+ Rights rights = 6;
+ // 模式
+ int32 mode = 7;
+}
+
+// DRM 安全等级
+enum SecurityLevel {
+ LEVEL_UNKNOWN = 0; //
+ LEVEL_L1 = 1; //
+ LEVEL_L2 = 2; //
+ LEVEL_L3 = 3; //
+}
+
+// 分段视频流
+message SegmentVideo {
+ //分段视频流列表
+ repeated ResponseUrl segment = 1;
+}
+
+// 震动
+message Shake {
+ // 文件地址
+ string file = 1;
+}
+
+// 视频流信息
+message Stream {
+ // 元数据
+ StreamInfo info = 1;
+ // 流数据
+ oneof content {
+ // dash流
+ DashVideo dash_video = 2;
+ // 分段流
+ SegmentVideo segment_video = 3;
+ }
+}
+
+// 流媒体元数据
+message StreamInfo {
+ // 视频质量
+ int32 quality = 1;
+ // 视频格式
+ string format = 2;
+ // 描述信息
+ string description = 3;
+ // 错误码
+ int32 err_code = 4;
+ // 流限制信息
+ StreamLimit limit = 5;
+ // 是否需要VIP
+ bool need_vip = 6;
+ // 是否需要登录
+ bool need_login = 7;
+ // 是否完整
+ bool intact = 8;
+ // 权限信息
+ int64 attribute = 10;
+ // 新版描述信息
+ string new_description = 11;
+ // 显示描述信息
+ string display_desc = 12;
+ // 上标
+ string superscript = 13;
+ // 方案信息
+ Scheme scheme = 14;
+ // 是否支持DRM
+ bool support_drm = 15;
+ // 字幕信息
+ string subtitle = 16;
+}
+
+// 清晰度不满足条件信息
+message StreamLimit {
+ // 标题
+ string title = 1;
+ // 跳转地址
+ string uri = 2;
+ // 提示信息
+ string msg = 3;
+}
+
+// 任务参数信息
+message TaskParam {
+ // 任务类型
+ string task_type = 1;
+ // 活动ID
+ int64 activity_id = 2;
+ // 提示ID
+ int64 tips_id = 3;
+}
+
+// 文案信息
+message TextInfo {
+ // 文案
+ string text = 1;
+ // 字体色值
+ string text_color = 2;
+ // 字体色值-夜间模式
+ string text_color_night = 3;
+}
+
+// toast
+message Toast {
+ // toast文案 老字段
+ string text = 1;
+ // toast按钮
+ ButtonInfo button = 2;
+ // 显示样式类型
+ int32 show_style_type = 3;
+ // 图标
+ string icon = 4;
+ // toast文案 新字段
+ TextInfo toast_text = 5;
+ // 埋点上报信息
+ Report report = 6;
+ //
+ map order_report_params = 7;
+}
+
+// 用户状态信息
+message UserStatus {
+ // 是否支付
+ bool pay_check = 1;
+ // 是否承包
+ bool sponsor = 2;
+ // 观看进度
+ WatchProgress watch_progress = 3;
+ // 系列观看进度
+ WatchProgress aid_watch_progress = 4;
+}
+
+// 视频url信息
+message VideoInfo {
+ // 视频清晰度
+ uint32 quality = 1;
+ // 视频格式
+ string format = 2;
+ // 视频时长
+ uint64 timelength = 3;
+ // 视频编码id
+ uint32 video_codecid = 4;
+ // 视频流
+ repeated Stream stream_list = 5;
+ // 伴音流
+ repeated DashItem dash_audio = 6;
+ // 杜比伴音流
+ DolbyItem dolby = 7;
+}
+
+// 展示信息
+message ViewInfo {
+ // 弹窗
+ Dialog dialog = 1;
+ // Toast
+ Toast toast = 2;
+ // 优惠券信息
+ CouponInfo coupon_info = 3;
+ // 未支付剧集ID列表
+ repeated int64 demand_no_pay_epids = 4;
+ // 结束页
+ EndPage end_page = 5;
+ // 扩展配置
+ map exp_config = 6;
+ // 弹窗
+ PopWin pop_win = 7;
+ // 试看提示栏
+ PromptBar try_watch_prompt_bar = 8;
+ // 支付提示信息
+ PayTip pay_tip = 9;
+ // 高清试看提示信息
+ HighDefinitionTrialInfo high_definition_trial_info = 10;
+ // 弹窗扩展
+ map ext_dialog = 11;
+ // 动画
+ Animation animation = 12;
+ // Toast扩展
+ map ext_toast = 13;
+}
+
+// 观看进度信息
+message WatchProgress {
+ // 上次观看的 EP ID
+ int32 last_ep_id = 1;
+ // 上次观看到的EP INDEX
+ string last_ep_index = 2;
+ // 上次观看的进度
+ int64 progress = 3;
+ // 上次观看的 CID
+ int64 last_play_cid = 4;
+ // 带时间的提示信息
+ Toast toast = 5;
+ // 不带时间的提示信息
+ Toast toast_without_time = 6;
+ // 上次观看的 AID
+ int64 last_play_aid = 7;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/pgc/service/premiere/v1/premiere.proto b/bili-api/grpc/proto/bilibili/pgc/service/premiere/v1/premiere.proto
new file mode 100644
index 000000000..976ed755e
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/pgc/service/premiere/v1/premiere.proto
@@ -0,0 +1,35 @@
+syntax = "proto3";
+
+package bilibili.pgc.service.premiere.v1;
+
+option java_multiple_files = true;
+
+// 首播服务
+service Premiere {
+ // 获取首播状态
+ rpc Status (PremiereStatusReq) returns (PremiereStatusReply);
+}
+
+// 获取首播状态-请求
+message PremiereStatusReq {
+ // 剧集epid
+ int64 ep_id = 1;
+}
+
+// 获取首播状态-响应
+message PremiereStatusReply {
+ // 服务端播放进度 单位ms 用户实际播放进度:progress - delay_time
+ int64 progress = 1;
+ // 起播时间戳 单位ms
+ int64 start_time = 2;
+ // 延迟播放时长 单位ms
+ int64 delay_time = 3;
+ // 首播在线人数
+ int64 online_count = 4;
+ // 首播状态
+ // 1:预热 2:首播中 3:紧急停播 4:已结束
+ int32 status = 5;
+ // 首播结束后跳转类型
+ // 1:下架 2:转点播
+ int32 after_premiere_type = 6;
+}
\ No newline at end of file
diff --git a/bili-api/grpc/proto/bilibili/playershared/playershared.proto b/bili-api/grpc/proto/bilibili/playershared/playershared.proto
new file mode 100644
index 000000000..be74a8218
--- /dev/null
+++ b/bili-api/grpc/proto/bilibili/playershared/playershared.proto
@@ -0,0 +1,835 @@
+syntax = "proto3";
+
+package bilibili.playershared;
+
+option java_multiple_files = true;
+
+// ArcConf消息
+message ArcConf {
+ // 是否支持
+ bool is_support = 1;
+ // 是否禁用
+ bool disabled = 2;
+ // 额外内容
+ ExtraContent extra_content = 3;
+ // 不支持场景列表
+ repeated int32 unsupport_scene = 4;
+}
+
+//
+enum ArcType {
+ //
+ ARC_TYPE_NORMAL = 0;
+ //
+ ARC_TYPE_INTERACT = 1;
+}
+
+//
+message BackgroundInfo {
+ //
+ string drawable_color = 1;
+ //
+ string drawable_bitmap_url = 2;
+ //
+ int32 effects = 3;
+}
+
+//
+message BadgeInfo {
+ //
+ string text = 1;
+ //
+ string bg_color = 2;
+ //
+ string bg_color_night = 3;
+ //
+ string text_color = 4;
+ //
+ GradientColor bg_gradient_color = 5;
+ //
+ string img = 6;
+}
+
+//
+enum BizType {
+ //
+ BIZ_TYPE_UNKNOWN = 0;
+ //
+ BIZ_TYPE_UGC = 1;
+ //
+ BIZ_TYPE_PGC = 2;
+ //
+ BIZ_TYPE_PUGV = 3;
+}
+
+//
+message BottomDisplay {
+ //
+ TextInfo title = 1;
+ //
+ string icon = 2;
+}
+
+// 按钮组件
+message Button {
+ // 按钮文本
+ string text = 1;
+ // 按钮跳转链接
+ string link = 2;
+ // 埋点上报相关
+ map report_params = 3;
+}
+
+enum ButtonAction {
+ //
+ BUTTON_UNKNOWN = 0;
+ //
+ PAY = 1;
+ //
+ VIP = 2;
+ //
+ PACK = 3;
+ //
+ LINK = 4;
+ //
+ COUPON = 5;
+ //
+ DEMAND = 6;
+ //
+ DEMAND_PACK = 7;
+ //
+ FOLLOW = 8;
+ //
+ APPOINTMENT = 9;
+ //
+ VIP_FREE = 10;
+ //
+ TASK = 11;
+ //
+ CHARGINGPLUS = 12;
+ //
+ BP = 13;
+ //
+ PRE_SELL = 14;
+}
+
+//
+message ButtonInfo {
+ //
+ string text = 1;
+ //
+ string text_color = 2;
+ //
+ string text_color_night = 3;
+ //
+ string bg_color = 4;
+ //
+ string bg_color_night = 5;
+ //
+ string link = 6;
+ //
+ ButtonAction action_type = 7;
+ //
+ BadgeInfo badge_info = 8;
+ //
+ Report report = 9;
+ //
+ string left_strikethrough_text = 10;
+ //
+ TextInfo simple_text_info = 11;
+ //
+ string simple_bg_color = 12;
+ //
+ string simple_bg_color_night = 13;
+ //
+ GradientColor bg_gradient_color = 14;
+ //
+ map order_report_params = 15;
+ //
+ TaskParam task_param = 16;
+ //
+ string frame_color = 17;
+ //
+ string icon = 18;
+}
+
+// 视频编码
+enum CodeType {
+ NOCODE = 0; // 不指定
+ CODE264 = 1; // H264
+ CODE265 = 2; // H265
+ CODEAV1 = 3; // AV1
+}
+
+//
+message ComprehensiveToast {
+ //
+ int32 type = 1;
+ //
+ ButtonInfo button = 2;
+ //
+ int32 show_style_type = 3;
+ //
+ string icon = 4;
+ //
+ TextInfo toast_text = 5;
+ //
+ Report report = 6;
+ //
+ map order_report_params = 7;
+}
+
+// 功能类型
+enum ConfType {
+ NoType = 0;
+ FLIPCONF = 1;
+ CASTCONF = 2;
+ FEEDBACK = 3;
+ SUBTITLE = 4;
+ PLAYBACKRATE = 5;
+ TIMEUP = 6;
+ PLAYBACKMODE = 7;
+ SCALEMODE = 8;
+ BACKGROUNDPLAY = 9;
+ LIKE = 10;
+ DISLIKE = 11;
+ COIN = 12;
+ ELEC = 13;
+ SHARE = 14;
+ SCREENSHOT = 15;
+ LOCKSCREEN = 16;
+ RECOMMEND = 17;
+ PLAYBACKSPEED = 18;
+ DEFINITION = 19;
+ SELECTIONS = 20;
+ NEXT = 21;
+ EDITDM = 22;
+ SMALLWINDOW = 23;
+ SHAKE = 24;
+ OUTERDM = 25;
+ INNERDM = 26;
+ PANORAMA = 27;
+ DOLBY = 28;
+ COLORFILTER = 29;
+ LOSSLESS = 30;
+ FREYAENTER = 31;
+ FREYAFULLENTER = 32;
+ SKIPOPED = 33;
+ RECORDSCREEN = 34;
+ DUBBING = 35;
+ LISTEN = 36;
+}
+
+//
+message ConfValue {
+ oneof value {
+ //
+ int32 switch_val = 1;
+ //
+ int32 selected_val = 2;
+ }
+}
+
+// Dash条目
+message DashItem {
+ // 清晰度
+ uint32 id = 1;
+ // 主线流
+ string base_url = 2;
+ // 备用流
+ repeated string backup_url = 3;
+ // 带宽
+ uint32 bandwidth = 4;
+ // 编码id
+ uint32 codecid = 5;
+ // md5
+ string md5 = 6;
+ // 大小
+ uint64 size = 7;
+ // 帧率
+ string frame_rate = 8;
+ // DRM密钥
+ string widevine_pssh = 9;
+}
+
+// 视频流信息: dash流
+message DashVideo {
+ // 主线流
+ string base_url = 1;
+ // 备用流
+ repeated string backup_url = 2;
+ // 带宽
+ uint32 bandwidth = 3;
+ // 编码id
+ uint32 codecid = 4;
+ // md5
+ string md5 = 5;
+ // 大小
+ uint64 size = 6;
+ // 伴音质量id
+ uint32 audio_id = 7;
+ // 是否非全二压
+ bool no_rexcode = 8;
+ // 帧率
+ string frame_rate = 9;
+ // 宽
+ int32 width = 10;
+ // 高
+ int32 height = 11;
+ // DRM密钥
+ string widevine_pssh = 12;
+}
+
+//
+message DeviceConf {
+ ConfValue conf_value = 1;
+}
+
+//
+message Dialog {
+ //
+ int32 style_type = 1;
+ //
+ BackgroundInfo background_info = 2;
+ //
+ TextInfo title = 3;
+ //
+ TextInfo subtitle = 4;
+ //
+ ImageInfo image = 5;
+ //
+ repeated ButtonInfo button = 6;
+ //
+ ButtonInfo bottom_desc = 7;
+ //
+ Report report = 8;
+ //
+ int32 count_down_sec = 9;
+ //
+ TextInfo right_bottom_desc = 10;
+ //
+ repeated BottomDisplay bottom_display = 11;
+ //
+ ExtData ext_data = 12;
+ //
+ int32 limit_action_type = 13;
+}
+
+// 当前分辨率信息
+message Dimension {
+ // 宽
+ int32 width = 1;
+ // 长
+ int32 height = 2;
+ // 旋转角度
+ int32 rotate = 3;
+}
+
+// 杜比伴音流信息
+message DolbyItem {
+ // 杜比类型
+ enum Type {
+ NONE = 0; // NONE
+ COMMON = 1; // 普通杜比音效
+ ATMOS = 2; // 全景杜比音效
+ }
+ // 杜比类型
+ Type type = 1;
+ // 音频流
+ repeated DashItem audio = 2;
+}
+
+// DRM类型
+enum DrmTechType {
+ //
+ UNKNOWN_DRM = 0;
+ //
+ FAIR_PLAY = 1;
+ //
+ WIDE_VINE = 2;
+ // 哔哩哔哩自研DRM
+ BILI_DRM = 3;
+}
+
+enum Effects {
+ //
+ EFFECTS_UNKNOWN = 0;
+ //
+ GAUSSIAN_BLUR = 1;
+ //
+ HALF_ALPHA = 2;
+}
+
+// 事件
+message Event {
+ // 震动
+ Shake shake = 1;
+}
+
+//
+message ExtData {
+ //
+ ExtDataType type = 1;
+ //
+ oneof data {
+ PlayListInfo play_list_info = 2;
+ }
+}
+
+enum ExtDataType {
+ //
+ EXT_DATA_TYPE_UNKNOWN = 0;
+ //
+ PLAY_LIST = 1;
+}
+
+// ? 错误码补充信息
+message ExtraContent {
+ //
+ string disable_reason = 1;
+ //
+ int64 disable_code = 2;
+}
+
+//
+message GradientColor {
+ //
+ string start_color = 1;
+ //
+ string end_color = 2;
+}
+
+//
+enum GuideStyle {
+ //
+ STYLE_UNKNOWN = 0;
+ //
+ HORIZONTAL_IMAGE = 1;
+ //
+ VERTICAL_TEXT = 2;
+ //
+ SIMPLE_TEXT = 3;
+ //
+ CHARGING_TEXT = 4;
+}
+
+// 播放历史
+message History {
+ //
+ HistoryInfo current_video = 1;
+ //
+ HistoryInfo related_video = 2;
+}
+
+//
+message HistoryInfo {
+ //
+ int64 progress = 1;
+ //
+ int64 last_play_cid = 2;
+ //
+ Toast toast = 3;
+ //
+ Toast toast_without_time = 4;
+ //
+ int64 last_play_aid = 5;
+}
+
+//
+message ImageInfo {
+ //
+ string url = 1;
+}
+
+//
+message Interaction {
+ //
+ Node history_node = 1;
+ //
+ int64 graph_version = 2;
+ //
+ string msg = 3;
+ //
+ int64 mark = 4;
+}
+
+enum LimitActionType {
+ //
+ LAT_UNKNOWN = 0;
+ //
+ SHOW_LIMIT_DIALOG = 1;
+ //
+ SKIP_CURRENT_EP = 2;
+}
+
+// HIRES伴音流信息
+message LossLessItem {
+ // 是否为hires
+ bool is_lossless_audio = 1;
+ // 音频流信息
+ DashItem audio = 2;
+ // 是否需要大会员
+ bool need_vip = 3;
+}
+
+//
+message Node {
+ //
+ int64 node_id = 1;
+ //
+ string title = 2;
+ //
+ int64 cid = 3;
+}
+
+//
+message PlayArc {
+ //
+ BizType video_type = 1;
+ //
+ uint64 aid = 2;
+ //
+ uint64 cid = 3;
+ //
+ DrmTechType drm_tech_type = 4;
+ //
+ ArcType arc_type = 5;
+ //
+ Interaction interaction = 6;
+ //
+ Dimension dimension = 7;
+ //
+ int64 duration = 8;
+ //
+ bool is_preview = 9;
+}
+
+// 播放页信息-响应: PlayArcConf
+message PlayArcConf {
+ map arc_confs = 1;
+}
+
+//
+message PlayDeviceConf {
+ //
+ map