@dan-uni/dan-any 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"core-D7LMAB5h.mjs","names":["JSON","JSON","enumModeCodec","enumPoolCodec","DanuniPbMode","DanuniPbPool","JSON","enumModeCodec","enumPoolCodec","JSON","chunksTable","chunks"],"sources":["../src/utils/bigint.ts","../src/utils/modeExtCheck.ts","../src/utils/migrations/v2/extra.ts","../src/utils/migrations/v2/progress.ts","../src/adapters/danuni/json.ts","../src/utils/proto/gen/danuni/danmaku/v1/danmaku_pb.ts","../src/adapters/danuni/pb.ts","../src/utils/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts","../src/adapters/bili/command-grpc.ts","../src/utils/transCtime.ts","../src/utils/bin.ts","../src/adapters/bili/grpc.ts","../src/adapters/bili/up.ts","../src/adapters/bili/xml.ts","../src/utils/transMode.ts","../src/adapters/artplayer.ts","../src/adapters/ddplay.ts","../src/adapters/dplayer.ts","../src/adapters/index.ts","../src/core/id.ts","../src/core/index.ts"],"sourcesContent":["import JSONbig from \"json-bigint\";\n\nexport const JSON = JSONbig({\n useNativeBigInt: true,\n});\n","import { ModeSchema } from \"@/core/db/schema.ts\";\nimport type { Extra, ExtraBili } from \"@/core/dm-extra.ts\";\nimport { z } from \"zod\";\n\ninterface ModeExtCheckDanmaku {\n mode: z.infer<typeof ModeSchema>;\n extra: Extra | null;\n}\n\nconst checkExtraBili = (obj?: ExtraBili) =>\n obj ? ([\"adv\", \"bas\", \"code\", \"command\"] as (keyof ExtraBili)[]).some((k) => obj[k]) : false;\n\n/**\n * 检查特殊弹幕(extra非普通弹幕扩展分区,即 extra.danuni.merge与extra.bili中的共通部分 以外)的弹幕是否正确设置了Ext模式\n * @param danmaku 待检查的弹幕对象\n * @returns 是否存在模式与extra不匹配的情况\n */\nexport function modeExtCheck(danmaku: ModeExtCheckDanmaku) {\n if (danmaku.mode !== \"Ext\" && danmaku.extra) {\n if (danmaku.extra.artplayer || checkExtraBili(danmaku.extra.bili)) {\n danmaku.mode = \"Ext\"; // 若传入引用则判断后自动修改,否则需手动修改\n return true;\n }\n }\n return false;\n}\n","/**\n * 将 v1 版本的 extraStr 转换为新的 extra 格式\n * - extraStr -> extra\n * - extra.bili.dmid extra.bili.mid : bigint -> string\n */\n\nimport type { Extra, ExtraBili } from \"@/core/dm-extra.ts\";\nimport { JSON } from \"@/utils/bigint.ts\";\nimport type { Simplify } from \"type-fest\";\n\ntype V1_ExtraBili = Omit<ExtraBili, \"dmid\" | \"mid\"> & {\n dmid?: bigint;\n mid?: bigint;\n};\nexport type V1_Extra = Simplify<\n Omit<Extra, \"bili\"> & {\n bili?: V1_ExtraBili;\n }\n>;\n\nexport function migrateToV2Extra(extraStr: string): Extra {\n const extra: V1_Extra = JSON.parse(extraStr);\n return {\n ...extra,\n bili: extra.bili\n ? { ...extra.bili, dmid: extra.bili.dmid?.toString(), mid: extra.bili.mid?.toString() }\n : undefined,\n } satisfies Extra;\n}\n","import { z } from \"zod\";\n\nconst progressV1Zod = z.float32();\nconst progressV2Zod = z.int();\n\nexport function migrateToV2Progress(\n progressV1: z.infer<typeof progressV1Zod>,\n): z.infer<typeof progressV2Zod> {\n return progressV2Zod.parse(~~(progressV1Zod.parse(progressV1) * 1000));\n}\n","import { danmakus } from \"@/core/db/schema.ts\";\nimport { defineTransformer, defineAdapter, type Transformer } from \"../index.ts\";\nimport { defaultUniDM, DMAttr, Modes, Pools, type UniDMObj } from \"@/core/dm.ts\";\nimport { z } from \"zod\";\nimport { modeExtCheck } from \"@/utils/modeExtCheck.ts\";\n\nimport { migrateToV2Extra } from \"@/utils/migrations/v2/extra.ts\";\nimport { migrateToV2Progress } from \"@/utils/migrations/v2/progress.ts\";\n\nexport const enumModeCodec = z.codec(\n z.enum(Modes).default(Modes.Normal),\n z.enum(danmakus.mode.enumValues),\n {\n decode: (danuniMode) => danmakus.mode.enumValues[danuniMode] || \"Normal\",\n encode: (dbMode) => Modes[dbMode] || Modes.Normal,\n },\n);\nexport const enumPoolCodec = z.codec(\n z.enum(Pools).default(Pools.Def),\n z.enum(danmakus.pool.enumValues),\n {\n decode: (danuniPool) => danmakus.pool.enumValues[danuniPool] || \"Def\",\n encode: (dbPool) => Pools[dbPool] || Pools.Def,\n },\n);\nexport const enumAttrsCodec = z.codec(\n z.enum(DMAttr).array(),\n z.enum(danmakus.attr.enumValues).array(),\n {\n decode: (danuniAttrs) => danuniAttrs,\n encode: (dbAttrs) => dbAttrs.map((attr) => DMAttr[attr]),\n },\n);\n\nfunction isV1(\n json: Partial<UniDMObj> & { extraStr?: string },\n): json is Partial<UniDMObj> & { extraStr: string } {\n const progressIsV1 = !Number.isInteger(json.progress);\n const extraIsV1 = typeof json.extraStr === \"string\";\n return progressIsV1 || extraIsV1;\n}\n\nexport const DanuniJsonAdapter = defineAdapter(\n (json: Partial<UniDMObj & { extraStr?: string }>[]) => {\n return async (udb, uchunk) => {\n const now = new Date();\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const isV1Fmt = json.some((d) => isV1(d));\n await chunk.upsertDanmakus(\n json.map((d) => {\n const map_d = {\n SOID: d.SOID || defaultUniDM.SOID,\n progress: d.progress\n ? isV1Fmt\n ? migrateToV2Progress(d.progress)\n : d.progress\n : defaultUniDM.progress,\n mode: enumModeCodec.decode(d.mode),\n fontsize: d.fontsize ?? defaultUniDM.fontsize,\n color: d.color ?? defaultUniDM.color,\n senderID: d.senderID || defaultUniDM.senderID,\n content: d.content ?? defaultUniDM.content,\n ctime: d.ctime ? new Date(d.ctime) : now,\n weight: d.weight ?? defaultUniDM.weight,\n pool: enumPoolCodec.decode(d.pool),\n attr: d.attr ? enumAttrsCodec.decode(d.attr) : defaultUniDM.attr,\n platform: d.platform ?? defaultUniDM.platform,\n extra: d.extra ?? (d.extraStr ? migrateToV2Extra(d.extraStr) : defaultUniDM.extra),\n };\n modeExtCheck(map_d);\n return {\n ...map_d,\n DMID: !isV1Fmt && d.DMID ? d.DMID : chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\ninterface DanuniJsonTransformerOptions {\n /**\n * 是否启用minify模式,启用后会将输出中与默认值相同的字段转为undefined(DMID除外),以减小输出体积\n */\n minify?: boolean;\n}\n\nexport function DanuniJsonTransformerConfigurator(\n options: DanuniJsonTransformerOptions & { minify: true },\n): Transformer<Promise<Partial<UniDMObj>[]>>;\nexport function DanuniJsonTransformerConfigurator(\n options?: DanuniJsonTransformerOptions,\n): Transformer<Promise<UniDMObj[]>>;\nexport function DanuniJsonTransformerConfigurator(\n options?: DanuniJsonTransformerOptions,\n): Transformer {\n return defineTransformer((udanmakus) =>\n udanmakus.then((data) => {\n if (options?.minify) {\n return data.map((d) => ({\n SOID: d.SOID === defaultUniDM.SOID ? undefined : d.SOID,\n progress: d.progress === defaultUniDM.progress ? undefined : d.progress,\n mode: d.mode === \"Normal\" ? undefined : enumModeCodec.encode(d.mode),\n fontsize: d.fontsize === defaultUniDM.fontsize ? undefined : d.fontsize,\n color: d.color === defaultUniDM.color ? undefined : d.color,\n senderID: d.senderID === defaultUniDM.senderID ? undefined : d.senderID,\n content: d.content === defaultUniDM.content ? undefined : d.content,\n ctime: d.ctime,\n weight: d.weight === defaultUniDM.weight ? undefined : d.weight,\n pool: d.pool === \"Def\" ? undefined : enumPoolCodec.encode(d.pool),\n attr: d.attr && d.attr.length > 0 ? enumAttrsCodec.encode(d.attr) : undefined,\n platform: d.platform ?? undefined,\n extra: d.extra ?? undefined,\n DMID: d.DMID,\n }));\n } else\n return data.map((d) => ({\n ...d,\n mode: enumModeCodec.encode(d.mode)!,\n pool: enumPoolCodec.encode(d.pool)!,\n attr: enumAttrsCodec.encode(d.attr),\n }));\n }),\n );\n}\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts\"\n// @generated from file danuni/danmaku/v1/danmaku.proto (package danuni.danmaku.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenEnum, GenFile, GenMessage, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file danuni/danmaku/v1/danmaku.proto.\n */\nexport const file_danuni_danmaku_v1_danmaku: GenFile = /*@__PURE__*/\n fileDesc(\"Ch9kYW51bmkvZGFubWFrdS92MS9kYW5tYWt1LnByb3RvEhFkYW51bmkuZGFubWFrdS52MSI2Cg5MaXN0RGFuUmVxdWVzdBIKCgJpZBgBIAEoCRIQCgNzZWcYAiABKAVIAIgBAUIGCgRfc2VnIpMDCgdEYW5tYWt1EhIKBHNvaWQYASABKAlSBFNPSUQSEgoEZG1pZBgCIAEoCVIERE1JRBIQCghwcm9ncmVzcxgDIAEoBRIlCgRtb2RlGAQgASgOMhcuZGFudW5pLmRhbm1ha3UudjEuTW9kZRIQCghmb250c2l6ZRgFIAEoBRINCgVjb2xvchgGIAEoBRIbCglzZW5kZXJfaWQYByABKAlSCHNlbmRlcklEEg8KB2NvbnRlbnQYCCABKAkSKQoFY3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg4KBndlaWdodBgKIAEoBRIlCgRwb29sGAsgASgOMhcuZGFudW5pLmRhbm1ha3UudjEuUG9vbBIMCgRhdHRyGAwgAygJEhUKCHBsYXRmb3JtGA0gASgJSACIAQESGQoIZXh0cmFfdjEYDiABKAlCAhgBSAGIAQESEgoFZXh0cmEYDyABKAlIAogBAUILCglfcGxhdGZvcm1CCwoJX2V4dHJhX3YxQggKBl9leHRyYSI/Cg9MaXN0RGFuUmVzcG9uc2USLAoIZGFubWFrdXMYASADKAsyGi5kYW51bmkuZGFubWFrdS52MS5EYW5tYWt1KmIKBE1vZGUSGwoXTU9ERV9OT1JNQUxfVU5TUEVDSUZJRUQQABIPCgtNT0RFX0JPVFRPTRABEgwKCE1PREVfVE9QEAISEAoMTU9ERV9SRVZFUlNFEAMSDAoITU9ERV9FWFQQBCpJCgRQb29sEhgKFFBPT0xfREVGX1VOU1BFQ0lGSUVEEAASDAoIUE9PTF9TVUIQARIMCghQT09MX0FEVhACEgsKB1BPT0xfSVgQAzJkCg5EYW5tYWt1U2VydmljZRJSCgdMaXN0RGFuEiEuZGFudW5pLmRhbm1ha3UudjEuTGlzdERhblJlcXVlc3QaIi5kYW51bmkuZGFubWFrdS52MS5MaXN0RGFuUmVzcG9uc2UiAEKLAQoVY29tLmRhbnVuaS5kYW5tYWt1LnYxQgxEYW5tYWt1UHJvdG9QAaICA0REWKoCEURhbnVuaS5EYW5tYWt1LlYxygIRRGFudW5pXERhbm1ha3VcVjHiAh1EYW51bmlcRGFubWFrdVxWMVxHUEJNZXRhZGF0YeoCE0RhbnVuaTo6RGFubWFrdTo6VjFiBnByb3RvMw\", [file_google_protobuf_timestamp]);\n\n/**\n * @generated from message danuni.danmaku.v1.ListDanRequest\n */\nexport type ListDanRequest = Message<\"danuni.danmaku.v1.ListDanRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: optional int32 seg = 2;\n */\n seg?: number | undefined;\n};\n\n/**\n * Describes the message danuni.danmaku.v1.ListDanRequest.\n * Use `create(ListDanRequestSchema)` to create a new message.\n */\nexport const ListDanRequestSchema: GenMessage<ListDanRequest> = /*@__PURE__*/\n messageDesc(file_danuni_danmaku_v1_danmaku, 0);\n\n/**\n * @generated from message danuni.danmaku.v1.Danmaku\n */\nexport type Danmaku = Message<\"danuni.danmaku.v1.Danmaku\"> & {\n /**\n * @generated from field: string soid = 1 [json_name = \"SOID\"];\n */\n soid: string;\n\n /**\n * @generated from field: string dmid = 2 [json_name = \"DMID\"];\n */\n dmid: string;\n\n /**\n * @generated from field: int32 progress = 3;\n */\n progress: number;\n\n /**\n * @generated from field: danuni.danmaku.v1.Mode mode = 4;\n */\n mode: Mode;\n\n /**\n * @generated from field: int32 fontsize = 5;\n */\n fontsize: number;\n\n /**\n * @generated from field: int32 color = 6;\n */\n color: number;\n\n /**\n * @generated from field: string sender_id = 7 [json_name = \"senderID\"];\n */\n senderId: string;\n\n /**\n * @generated from field: string content = 8;\n */\n content: string;\n\n /**\n * @generated from field: google.protobuf.Timestamp ctime = 9;\n */\n ctime?: Timestamp | undefined;\n\n /**\n * @generated from field: int32 weight = 10;\n */\n weight: number;\n\n /**\n * @generated from field: danuni.danmaku.v1.Pool pool = 11;\n */\n pool: Pool;\n\n /**\n * @generated from field: repeated string attr = 12;\n */\n attr: string[];\n\n /**\n * @generated from field: optional string platform = 13;\n */\n platform?: string | undefined;\n\n /**\n * @generated from field: optional string extra_v1 = 14 [deprecated = true];\n * @deprecated\n */\n extraV1?: string | undefined;\n\n /**\n * @generated from field: optional string extra = 15;\n */\n extra?: string | undefined;\n};\n\n/**\n * Describes the message danuni.danmaku.v1.Danmaku.\n * Use `create(DanmakuSchema)` to create a new message.\n */\nexport const DanmakuSchema: GenMessage<Danmaku> = /*@__PURE__*/\n messageDesc(file_danuni_danmaku_v1_danmaku, 1);\n\n/**\n * @generated from message danuni.danmaku.v1.ListDanResponse\n */\nexport type ListDanResponse = Message<\"danuni.danmaku.v1.ListDanResponse\"> & {\n /**\n * @generated from field: repeated danuni.danmaku.v1.Danmaku danmakus = 1;\n */\n danmakus: Danmaku[];\n};\n\n/**\n * Describes the message danuni.danmaku.v1.ListDanResponse.\n * Use `create(ListDanResponseSchema)` to create a new message.\n */\nexport const ListDanResponseSchema: GenMessage<ListDanResponse> = /*@__PURE__*/\n messageDesc(file_danuni_danmaku_v1_danmaku, 2);\n\n/**\n * 此处作为数字应与danuni库相应类型一一对应\n *\n * @generated from enum danuni.danmaku.v1.Mode\n */\nexport enum Mode {\n /**\n * @generated from enum value: MODE_NORMAL_UNSPECIFIED = 0;\n */\n NORMAL_UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: MODE_BOTTOM = 1;\n */\n BOTTOM = 1,\n\n /**\n * @generated from enum value: MODE_TOP = 2;\n */\n TOP = 2,\n\n /**\n * @generated from enum value: MODE_REVERSE = 3;\n */\n REVERSE = 3,\n\n /**\n * @generated from enum value: MODE_EXT = 4;\n */\n EXT = 4,\n}\n\n/**\n * Describes the enum danuni.danmaku.v1.Mode.\n */\nexport const ModeSchema: GenEnum<Mode> = /*@__PURE__*/\n enumDesc(file_danuni_danmaku_v1_danmaku, 0);\n\n/**\n * 此处作为数字应与danuni库相应类型一一对应\n *\n * @generated from enum danuni.danmaku.v1.Pool\n */\nexport enum Pool {\n /**\n * @generated from enum value: POOL_DEF_UNSPECIFIED = 0;\n */\n DEF_UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: POOL_SUB = 1;\n */\n SUB = 1,\n\n /**\n * @generated from enum value: POOL_ADV = 2;\n */\n ADV = 2,\n\n /**\n * @generated from enum value: POOL_IX = 3;\n */\n IX = 3,\n}\n\n/**\n * Describes the enum danuni.danmaku.v1.Pool.\n */\nexport const PoolSchema: GenEnum<Pool> = /*@__PURE__*/\n enumDesc(file_danuni_danmaku_v1_danmaku, 1);\n\n/**\n * @generated from service danuni.danmaku.v1.DanmakuService\n */\nexport const DanmakuService: GenService<{\n /**\n * @generated from rpc danuni.danmaku.v1.DanmakuService.ListDan\n */\n listDan: {\n methodKind: \"unary\";\n input: typeof ListDanRequestSchema;\n output: typeof ListDanResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_danuni_danmaku_v1_danmaku, 0);\n\n","import {\n Mode as DanuniPbMode,\n Pool as DanuniPbPool,\n} from \"@/utils/proto/gen/danuni/danmaku/v1/danmaku_pb.ts\";\n\nimport { create, fromBinary, toBinary } from \"@bufbuild/protobuf\";\nimport { timestampDate, timestampFromDate, timestampNow } from \"@bufbuild/protobuf/wkt\";\n\nimport { ListDanResponseSchema } from \"@/utils/proto/gen/danuni/danmaku/v1/danmaku_pb.ts\";\nimport { defineAdapter, defineTransformer } from \"../index.ts\";\nimport { danmakus } from \"@/core/db/schema.ts\";\nimport { z } from \"zod\";\n\nimport { JSON } from \"@/utils/bigint.ts\";\nimport { migrateToV2Extra } from \"@/utils/migrations/v2/extra.ts\";\n\nconst enumModeCodec = z.codec(z.enum(DanuniPbMode), z.enum(danmakus.mode.enumValues), {\n decode: (danuniPbMode) => danmakus.mode.enumValues[danuniPbMode] || \"Normal\",\n encode: (dbMode) => {\n const i = danmakus.mode.enumValues.indexOf(dbMode);\n return i === -1 ? DanuniPbMode.NORMAL_UNSPECIFIED : i;\n },\n});\nconst enumPoolCodec = z.codec(z.enum(DanuniPbPool), z.enum(danmakus.pool.enumValues), {\n decode: (danuniPbPool) => danmakus.pool.enumValues[danuniPbPool] || \"Def\",\n encode: (dbPool) => {\n const i = danmakus.pool.enumValues.indexOf(dbPool);\n return i === -1 ? DanuniPbPool.DEF_UNSPECIFIED : i;\n },\n});\n\nexport const DanuniPbAdapter = defineAdapter((bin: Uint8Array | ArrayBuffer) => {\n return async (udb, uchunk) => {\n const data = fromBinary(ListDanResponseSchema, new Uint8Array(bin));\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const isV1Fmt = data.danmakus.some((d) => d.extraV1);\n await chunk.upsertDanmakus(\n data.danmakus.map((d) => {\n const map_d = {\n ...d,\n SOID: d.soid,\n DMID: d.dmid,\n // progress: d.progress,\n mode: enumModeCodec.decode(d.mode),\n // fontsize: d.fontsize,\n // color: d.color,\n senderID: d.senderId,\n // content: d.content,\n ctime: timestampDate(d.ctime || timestampNow()),\n // weight: d.weight,\n pool: enumPoolCodec.decode(d.pool),\n attr: z.enum(danmakus.attr.enumValues).array().parse(d.attr),\n // platform: d.platform,\n extra: d.extra\n ? JSON.parse(d.extra)\n : d.extraV1\n ? migrateToV2Extra(d.extraV1)\n : undefined,\n };\n if (isV1Fmt) return { ...map_d, DMID: chunk.$UniDB.DMIDGenerator(map_d) };\n else return map_d;\n }),\n );\n return chunk;\n };\n});\n\nexport const DanuniPbTransformer = defineTransformer((udanmakus): Promise<Uint8Array> => {\n return udanmakus.then((data) =>\n toBinary(\n ListDanResponseSchema,\n create(ListDanResponseSchema, {\n danmakus: data.map((d) => ({\n ...d,\n soid: d.SOID,\n dmid: d.DMID,\n mode: enumModeCodec.encode(d.mode),\n senderId: d.senderID,\n ctime: timestampFromDate(d.ctime),\n pool: enumPoolCodec.encode(d.pool),\n // attr: d.attr,\n platform: d.platform ?? undefined,\n extra: JSON.stringify(d.extra),\n // $typeName: \"danuni.danmaku.v1.Danmaku\" as const,\n })),\n }),\n ),\n );\n});\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts\"\n// @generated from file bilibili/community/service/dm/v1/dm.proto (package bilibili.community.service.dm.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenEnum, GenFile, GenMessage, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file bilibili/community/service/dm/v1/dm.proto.\n */\nexport const file_bilibili_community_service_dm_v1_dm: GenFile = /*@__PURE__*/\n fileDesc(\"CiliaWxpYmlsaS9jb21tdW5pdHkvc2VydmljZS9kbS92MS9kbS5wcm90bxIgYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEiZAoGQXZhdGFyEgoKAmlkGAEgASgJEgsKA3VybBgCIAEoCRJBCgthdmF0YXJfdHlwZRgDIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkF2YXRhclR5cGUiIwoGQnViYmxlEgwKBHRleHQYASABKAkSCwoDdXJsGAIgASgJIsYBCghCdWJibGVWMhIMCgR0ZXh0GAEgASgJEgsKA3VybBgCIAEoCRJBCgtidWJibGVfdHlwZRgDIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1YmJsZVR5cGUSFQoNZXhwb3N1cmVfb25jZRgEIAEoCBJFCg1leHBvc3VyZV90eXBlGAUgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIlsKBkJ1dHRvbhIMCgR0ZXh0GAEgASgJEkMKBmFjdGlvbhgCIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0RnVuY3Rpb25UeXBlIlgKDkJ1enp3b3JkQ29uZmlnEkYKCGtleXdvcmRzGAEgAygLMjQuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnV6endvcmRTaG93Q29uZmlnIngKEkJ1enp3b3JkU2hvd0NvbmZpZxIMCgRuYW1lGAEgASgJEg4KBnNjaGVtYRgCIAEoCRIOCgZzb3VyY2UYAyABKAUSCgoCaWQYBCABKAMSEwoLYnV6endvcmRfaWQYBSABKAMSEwoLc2NoZW1hX3R5cGUYBiABKAUiewoIQ2hlY2tCb3gSDAoEdGV4dBgBIAEoCRI8CgR0eXBlGAIgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tib3hUeXBlEhUKDWRlZmF1bHRfdmFsdWUYAyABKAgSDAoEc2hvdxgEIAEoCCJvCgpDaGVja0JveFYyEgwKBHRleHQYASABKAkSPAoEdHlwZRgCIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrYm94VHlwZRIVCg1kZWZhdWx0X3ZhbHVlGAMgASgIIoICCgtDbGlja0J1dHRvbhIVCg1wb3J0cmFpdF90ZXh0GAEgAygJEhYKDmxhbmRzY2FwZV90ZXh0GAIgAygJEhsKE3BvcnRyYWl0X3RleHRfZm9jdXMYAyADKAkSHAoUbGFuZHNjYXBlX3RleHRfZm9jdXMYBCADKAkSQQoLcmVuZGVyX3R5cGUYBSABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5SZW5kZXJUeXBlEgwKBHNob3cYBiABKAgSOAoGYnViYmxlGAcgASgLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlIrMCCg1DbGlja0J1dHRvblYyEhUKDXBvcnRyYWl0X3RleHQYASADKAkSFgoObGFuZHNjYXBlX3RleHQYAiADKAkSGwoTcG9ydHJhaXRfdGV4dF9mb2N1cxgDIAMoCRIcChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIAMoCRJBCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSFwoPdGV4dF9pbnB1dF9wb3N0GAYgASgIEhUKDWV4cG9zdXJlX29uY2UYByABKAgSRQoNZXhwb3N1cmVfdHlwZRgIIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cG9zdXJlVHlwZSJLCgdDb21tYW5kEkAKC2NvbW1hbmRfZG1zGAEgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ29tbWFuZERtIuYBCglDb21tYW5kRG0SCgoCaWQYASABKAMSCwoDb2lkGAIgASgDEgsKA21pZBgDIAEoAxIPCgdjb21tYW5kGAQgASgJEg8KB2NvbnRlbnQYBSABKAkSEAoIcHJvZ3Jlc3MYBiABKAUSDQoFY3RpbWUYByABKAkSDQoFbXRpbWUYCCABKAkSDQoFZXh0cmEYCSABKAkSDQoFaWRTdHIYCiABKAkSDAoEdHlwZRgLIAEoBRITCgthdXRvX2NyZWF0ZRgMIAEoCBISCgpjb3VudF9kb3duGA0gASgFEgwKBGF0dHIYDiABKAUiUAoNRGFubWFrdUFJRmxhZxI/CghkbV9mbGFncxgBIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnIosDCgtEYW5tYWt1RWxlbRIKCgJpZBgBIAEoAxIQCghwcm9ncmVzcxgCIAEoBRIMCgRtb2RlGAMgASgFEhAKCGZvbnRzaXplGAQgASgFEj8KBWNvbG9yGAUgASgOMjAuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1Db2xvcmZ1bFR5cGUSEAoIbWlkX2hhc2gYBiABKAkSDwoHY29udGVudBgHIAEoCRINCgVjdGltZRgIIAEoAxIOCgZ3ZWlnaHQYCSABKAUSDgoGYWN0aW9uGAogASgJEgwKBHBvb2wYCyABKAUSDgoGaWRfc3RyGAwgASgJEgwKBGF0dHIYDSABKAUSEQoJYW5pbWF0aW9uGBYgASgJEg0KBWV4dHJhGBcgASgJEkIKCGNvbG9yZnVsGBggASgOMjAuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1Db2xvcmZ1bFR5cGUSDAoEdHlwZRgZIAEoBRILCgNvaWQYGiABKAMiKQoLRGFubWFrdUZsYWcSDAoEZG1pZBgBIAEoAxIMCgRmbGFnGAIgASgFIksKEURhbm1ha3VGbGFnQ29uZmlnEhAKCHJlY19mbGFnGAEgASgFEhAKCHJlY190ZXh0GAIgASgJEhIKCnJlY19zd2l0Y2gYAyABKAUiiwcKGERhbm11RGVmYXVsdFBsYXllckNvbmZpZxIpCiFwbGF5ZXJfZGFubWFrdV91c2VfZGVmYXVsdF9jb25maWcYASABKAgSLAokcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIEisKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUgASgFEh8KF3BsYXllcl9kYW5tYWt1X2Jsb2NrdG9wGAYgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2Nrc2Nyb2xsGAcgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrYm90dG9tGAggASgIEiQKHHBsYXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tyZXBlYXQYCiABKAgSIwobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIEh4KFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAISJAoccGxheWVyX2Rhbm1ha3Vfc2NhbGluZ2ZhY3RvchgNIAEoAhIdChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAISHAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAUSJAocaW5saW5lX3BsYXllcl9kYW5tYWt1X3N3aXRjaBgQIAEoCBIpCiFwbGF5ZXJfZGFubWFrdV9zZW5pb3JfbW9kZV9zd2l0Y2gYESABKAUSLgomcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjIYEiABKAUSmAEKKnBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsX3YyX21hcBgTIAMoCzJkLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11RGVmYXVsdFBsYXllckNvbmZpZy5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIlCh1wbGF5ZXJfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgUIAEoCBpLCilQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIuwJChFEYW5tdVBsYXllckNvbmZpZxIdChVwbGF5ZXJfZGFubWFrdV9zd2l0Y2gYASABKAgSIgoacGxheWVyX2Rhbm1ha3Vfc3dpdGNoX3NhdmUYAiABKAgSKQohcGxheWVyX2Rhbm1ha3VfdXNlX2RlZmF1bHRfY29uZmlnGAMgASgIEiwKJHBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX3N3aXRjaBgEIAEoCBIrCiNwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbBgFIAEoBRIfChdwbGF5ZXJfZGFubWFrdV9ibG9ja3RvcBgGIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja3Njcm9sbBgHIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja2JvdHRvbRgIIAEoCBIkChxwbGF5ZXJfZGFubWFrdV9ibG9ja2NvbG9yZnVsGAkgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrcmVwZWF0GAogASgIEiMKG3BsYXllcl9kYW5tYWt1X2Jsb2Nrc3BlY2lhbBgLIAEoCBIeChZwbGF5ZXJfZGFubWFrdV9vcGFjaXR5GAwgASgCEiQKHHBsYXllcl9kYW5tYWt1X3NjYWxpbmdmYWN0b3IYDSABKAISHQoVcGxheWVyX2Rhbm1ha3VfZG9tYWluGA4gASgCEhwKFHBsYXllcl9kYW5tYWt1X3NwZWVkGA8gASgFEiYKHnBsYXllcl9kYW5tYWt1X2VuYWJsZWJsb2NrbGlzdBgQIAEoCBIkChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBEgASgIEiQKHGlubGluZV9wbGF5ZXJfZGFubWFrdV9jb25maWcYEiABKAUSJgoecGxheWVyX2Rhbm1ha3VfaW9zX3N3aXRjaF9zYXZlGBMgASgFEikKIXBsYXllcl9kYW5tYWt1X3Nlbmlvcl9tb2RlX3N3aXRjaBgUIAEoBRIuCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgVIAEoBRKRAQoqcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjJfbWFwGBYgAygLMl0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWcuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyTWFwRW50cnkSJQodcGxheWVyX2Rhbm1ha3VfZW5hYmxlX2hlcmRfZG0YFyABKAgSJgoecGxheWVyX2Rhbm1ha3VfYmxvY2t0b3BfYm90dG9tGBggASgIEiAKGHBsYXllcl9kYW5tYWt1X2RvbWFpbl92MhgZIAEoBRIeChZwbGF5ZXJfZGFubWFrdV9kZW5zaXR5GBogASgFEiUKHXBsYXllcl9kYW5tYWt1X3N1YnRpdGxlX3Byb29mGBsgASgIEiMKG3BsYXllcl9kYW5tYWt1X3Blb3BsZV9wcm9vZhgcIAEoCBpLCilQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIjAKFkRhbm11UGxheWVyQ29uZmlnUGFuZWwSFgoOc2VsZWN0aW9uX3RleHQYASABKAkiSwoYRGFubXVQbGF5ZXJEeW5hbWljQ29uZmlnEhAKCHByb2dyZXNzGAEgASgFEh0KFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAiKQAwoVRGFubXVQbGF5ZXJWaWV3Q29uZmlnEmEKHWRhbm11a3VfZGVmYXVsdF9wbGF5ZXJfY29uZmlnGAEgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnElIKFWRhbm11a3VfcGxheWVyX2NvbmZpZxgCIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11UGxheWVyQ29uZmlnEmEKHWRhbm11a3VfcGxheWVyX2R5bmFtaWNfY29uZmlnGAMgAygLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJEeW5hbWljQ29uZmlnEl0KG2Rhbm11a3VfcGxheWVyX2NvbmZpZ19wYW5lbBgEIAEoCzI4LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11UGxheWVyQ29uZmlnUGFuZWwimQUKFERhbm11V2ViUGxheWVyQ29uZmlnEhEKCWRtX3N3aXRjaBgBIAEoCBIRCglhaV9zd2l0Y2gYAiABKAgSEAoIYWlfbGV2ZWwYAyABKAUSEAoIYmxvY2t0b3AYBCABKAgSEwoLYmxvY2tzY3JvbGwYBSABKAgSEwoLYmxvY2tib3R0b20YBiABKAgSEgoKYmxvY2tjb2xvchgHIAEoCBIUCgxibG9ja3NwZWNpYWwYCCABKAgSFAoMcHJldmVudHNoYWRlGAkgASgIEg0KBWRtYXNrGAogASgIEg8KB29wYWNpdHkYCyABKAISDgoGZG1hcmVhGAwgASgFEhEKCXNwZWVkcGx1cxgNIAEoAhIQCghmb250c2l6ZRgOIAEoAhISCgpzY3JlZW5zeW5jGA8gASgIEhEKCXNwZWVkc3luYxgQIAEoCBISCgpmb250ZmFtaWx5GBEgASgJEgwKBGJvbGQYEiABKAgSEgoKZm9udGJvcmRlchgTIAEoBRIRCglkcmF3X3R5cGUYFCABKAkSGgoSc2VuaW9yX21vZGVfc3dpdGNoGBUgASgFEhMKC2FpX2xldmVsX3YyGBYgASgFEmEKD2FpX2xldmVsX3YyX21hcBgXIAMoCzJILmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11V2ViUGxheWVyQ29uZmlnLkFpTGV2ZWxWMk1hcEVudHJ5EhcKD2Jsb2NrdG9wX2JvdHRvbRgYIAEoCBISCgpkbV9hcmVhX3YyGBkgASgFEhIKCmRtX2RlbnNpdHkYGiABKAUaMwoRQWlMZXZlbFYyTWFwRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ASJZCgpEbUNvbG9yZnVsEj4KBHR5cGUYASABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRILCgNzcmMYAiABKAkiUAoPRG1FeHBvUmVwb3J0UmVxEhIKCnNlc3Npb25faWQYASABKAkSCwoDb2lkGAIgASgDEg0KBWRtaWRzGAMgASgMEg0KBXNwbWlkGAQgASgJIhEKD0RtRXhwb1JlcG9ydFJlcyJtCgpEbUhlcmRWaWV3EhsKE2Rpc3BsYXlfaGVyZF9kbV9udW0YASABKAUSQgoIaGVyZF9kbXMYAiADKAsyMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWV3SGVyZERtRWxlbSKWAgoKRG1NYXNrV2FsbBINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMSDwoHY29udGVudBgDIAEoCRJNCgxjb250ZW50X3R5cGUYBCABKA4yNy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbU1hc2tXYWxsQ29udGVudFR5cGUSRQoIYml6X3R5cGUYBSABKA4yMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbU1hc2tXYWxsQml6VHlwZRJFCghjb250ZW50cxgGIAMoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50ImsKEURtTWFza1dhbGxDb250ZW50EkUKBHR5cGUYASABKA4yNy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbU1hc2tXYWxsQ29udGVudFR5cGUSDwoHY29udGVudBgCIAEoCSLNEAoRRG1QbGF5ZXJDb25maWdSZXESCgoCdHMYASABKAMSRQoGc3dpdGNoGAIgASgLMjUuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaBJOCgtzd2l0Y2hfc2F2ZRgDIAEoCzI5LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTd2l0Y2hTYXZlElsKEnVzZV9kZWZhdWx0X2NvbmZpZxgEIAEoCzI/LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VVc2VEZWZhdWx0Q29uZmlnEmEKFWFpX3JlY29tbWVuZGVkX3N3aXRjaBgFIAEoCzJCLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkU3dpdGNoEl8KFGFpX3JlY29tbWVuZGVkX2xldmVsGAYgASgLMkEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbBJJCghibG9ja3RvcBgHIAEoCzI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3RvcBJPCgtibG9ja3Njcm9sbBgIIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBJPCgtibG9ja2JvdHRvbRgJIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja2JvdHRvbRJTCg1ibG9ja2NvbG9yZnVsGAogASgLMjwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrY29sb3JmdWwSTwoLYmxvY2tyZXBlYXQYCyABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tyZXBlYXQSUQoMYmxvY2tzcGVjaWFsGAwgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc3BlY2lhbBJHCgdvcGFjaXR5GA0gASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdU9wYWNpdHkSUwoNc2NhbGluZ2ZhY3RvchgOIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTY2FsaW5nZmFjdG9yEkUKBmRvbWFpbhgPIAEoCzI1LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VEb21haW4SQwoFc3BlZWQYECABKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3BlZWQSVwoPZW5hYmxlYmxvY2tsaXN0GBEgASgLMj4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUVuYWJsZWJsb2NrbGlzdBJeChlpbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoGBIgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuSW5saW5lUGxheWVyRGFubWFrdVN3aXRjaBJbChJzZW5pb3JfbW9kZV9zd2l0Y2gYEyABKAsyPy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBJkChdhaV9yZWNvbW1lbmRlZF9sZXZlbF92MhgUIAEoCzJDLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMhJTCg5lbmFibGVfaGVyZF9kbRgVIAEoCzI7LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VFbmFibGVIZXJkRG0SVgoPYmxvY2t0b3BfYm90dG9tGBYgASgLMj0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wQm90dG9tEkoKCWRvbWFpbl92MhgXIAEoCzI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VEb21haW5WMhJHCgdkZW5zaXR5GBggASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURlbnNpdHkSVAoOc3VidGl0bGVfcHJvb2YYGSABKAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3VidGl0bGVQcm9vZhJQCgxwZW9wbGVfcHJvb2YYGiABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1UGVvcGxlUHJvb2YiLwoLRG1TZWdDb25maWcSEQoJcGFnZV9zaXplGAEgASgDEg0KBXRvdGFsGAIgASgDIpECChBEbVNlZ01vYmlsZVJlcGx5EjwKBWVsZW1zGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUVsZW0SDQoFc3RhdGUYAiABKAUSQAoHYWlfZmxhZxgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VBSUZsYWcSFQoNc2VnbWVudF9ydWxlcxgEIAMoAxJCCgxjb2xvcmZ1bF9zcmMYBSADKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsEhMKC2NvbnRleHRfc3JjGAYgASgJIsoBCg5EbVNlZ01vYmlsZVJlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAxIWCg50ZWVuYWdlcnNfbW9kZRgFIAEoBRIKCgJwcxgGIAEoAxIKCgJwZRgHIAEoAxIRCglwdWxsX21vZGUYCCABKAUSEgoKZnJvbV9zY2VuZRgJIAEoBRINCgVzcG1pZBgKIAEoCRITCgtjb250ZXh0X2V4dBgLIAEoCSJcCg1EbVNlZ090dFJlcGx5EjwKBWVsZW1zGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUVsZW0SDQoFc3RhdGUYAiABKAUiTAoLRG1TZWdPdHRSZXESCwoDcGlkGAEgASgDEgsKA29pZBgCIAEoAxIMCgR0eXBlGAMgASgFEhUKDXNlZ21lbnRfaW5kZXgYBCABKAMiXQoNRG1TZWdTREtSZXBseRIOCgZjbG9zZWQYASABKAgSPAoFZWxlbXMYAiADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbSJMCgtEbVNlZ1NES1JlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAyJ3CglEbVN1YlZpZXcSDAoEdHlwZRgBIAEoBRILCgNvaWQYAiABKAMSCwoDcGlkGAMgASgDEkIKC3Bvc3RfcGFuZWwyGAQgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjIioQkKC0RtVmlld1JlcGx5Eg4KBmNsb3NlZBgBIAEoCBI5CgRtYXNrGAIgASgLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVmlkZW9NYXNrEkEKCHN1YnRpdGxlGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVmlkZW9TdWJ0aXRsZRITCgtzcGVjaWFsX2RtcxgEIAMoCRJECgdhaV9mbGFnGAUgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWdDb25maWcSTgoNcGxheWVyX2NvbmZpZxgGIAEoCzI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11UGxheWVyVmlld0NvbmZpZxIWCg5zZW5kX2JveF9zdHlsZRgHIAEoBRINCgVhbGxvdxgIIAEoCBIRCgljaGVja19ib3gYCSABKAgSGgoSY2hlY2tfYm94X3Nob3dfbXNnGAogASgJEhgKEHRleHRfcGxhY2Vob2xkZXIYCyABKAkSGQoRaW5wdXRfcGxhY2Vob2xkZXIYDCABKAkSHQoVcmVwb3J0X2ZpbHRlcl9jb250ZW50GA0gAygJEkEKC2V4cG9fcmVwb3J0GA4gASgLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb1JlcG9ydBJJCg9idXp6d29yZF9jb25maWcYDyABKAsyMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXp6d29yZENvbmZpZxJCCgtleHByZXNzaW9ucxgQIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cHJlc3Npb25zEj8KCnBvc3RfcGFuZWwYESADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWwSFQoNYWN0aXZpdHlfbWV0YRgSIAMoCRJCCgtwb3N0X3BhbmVsMhgTIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbFYyEkIKDGRtX21hc2tfd2FsbBgUIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGwSPQoHZG1faGVyZBgVIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtSGVyZFZpZXcSOgoHY29tbWFuZBgWIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmQSCgoCa3YYFyABKAkSPgoJc3ViX3ZpZXdzGBggAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TdWJWaWV3EjYKA3FvZRgZIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm8ibQoJRG1WaWV3UmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRINCgVzcG1pZBgEIAEoCRIUCgxpc19oYXJkX2Jvb3QYBSABKAUSEwoLY29udGV4dF9leHQYBiABKAkigQYKDkRtV2ViVmlld1JlcGx5Eg0KBXN0YXRlGAEgASgFEgwKBHRleHQYAiABKAkSEQoJdGV4dF9zaWRlGAMgASgJEj0KBmRtX3NnZRgEIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnQ29uZmlnEkEKBGZsYWcYBSABKAsyMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RmxhZ0NvbmZpZxITCgtzcGVjaWFsX2RtcxgGIAMoCRIRCgljaGVja19ib3gYByABKAgSDQoFY291bnQYCCABKAMSQAoLY29tbWFuZF9kbXMYCSADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG0STQoNcGxheWVyX2NvbmZpZxgKIAEoCzI2LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11V2ViUGxheWVyQ29uZmlnEh0KFXJlcG9ydF9maWx0ZXJfY29udGVudBgLIAMoCRJCCgtleHByZXNzaW9ucxgMIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cHJlc3Npb25zEj8KCnBvc3RfcGFuZWwYDSADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWwSFQoNYWN0aXZpdHlfbWV0YRgOIAMoCRJCCgtwb3N0X3BhbmVsMhgPIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbFYyEj4KCXN1Yl92aWV3cxgQIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU3ViVmlldxI2CgNxb2UYESABKAsyKS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Rb2VJbmZvIioKCkV4cG9SZXBvcnQSHAoUc2hvdWxkX3JlcG9ydF9hdF9lbmQYASABKAgiZAoKRXhwcmVzc2lvbhIPCgdrZXl3b3JkGAEgAygJEgsKA3VybBgCIAEoCRI4CgZwZXJpb2QYAyADKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QZXJpb2QiSQoLRXhwcmVzc2lvbnMSOgoEZGF0YRgBIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cHJlc3Npb24iKgoZSW5saW5lUGxheWVyRGFubWFrdVN3aXRjaBINCgV2YWx1ZRgBIAEoCCInCgVMYWJlbBINCgV0aXRsZRgBIAEoCRIPCgdjb250ZW50GAIgAygJIocBCgdMYWJlbFYyEg0KBXRpdGxlGAEgASgJEg8KB2NvbnRlbnQYAiADKAkSFQoNZXhwb3N1cmVfb25jZRgDIAEoCBJFCg1leHBvc3VyZV90eXBlGAQgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIiQKBlBlcmlvZBINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMiMAofUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbBINCgV2YWx1ZRgBIAEoBSIyCiFQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjISDQoFdmFsdWUYASABKAUiMQogUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2gSDQoFdmFsdWUYASABKAgiKQoYUGxheWVyRGFubWFrdUJsb2NrYm90dG9tEg0KBXZhbHVlGAEgASgIIisKGlBsYXllckRhbm1ha3VCbG9ja2NvbG9yZnVsEg0KBXZhbHVlGAEgASgIIikKGFBsYXllckRhbm1ha3VCbG9ja3JlcGVhdBINCgV2YWx1ZRgBIAEoCCIpChhQbGF5ZXJEYW5tYWt1QmxvY2tzY3JvbGwSDQoFdmFsdWUYASABKAgiKgoZUGxheWVyRGFubWFrdUJsb2Nrc3BlY2lhbBINCgV2YWx1ZRgBIAEoCCImChVQbGF5ZXJEYW5tYWt1QmxvY2t0b3ASDQoFdmFsdWUYASABKAgiLAobUGxheWVyRGFubWFrdUJsb2NrdG9wQm90dG9tEg0KBXZhbHVlGAEgASgIIiUKFFBsYXllckRhbm1ha3VEZW5zaXR5Eg0KBXZhbHVlGAEgASgFIiQKE1BsYXllckRhbm1ha3VEb21haW4SDQoFdmFsdWUYASABKAIiJgoVUGxheWVyRGFubWFrdURvbWFpblYyEg0KBXZhbHVlGAEgASgFIioKGVBsYXllckRhbm1ha3VFbmFibGVIZXJkRG0SDQoFdmFsdWUYASABKAgiLQocUGxheWVyRGFubWFrdUVuYWJsZWJsb2NrbGlzdBINCgV2YWx1ZRgBIAEoCCIlChRQbGF5ZXJEYW5tYWt1T3BhY2l0eRINCgV2YWx1ZRgBIAEoAiIpChhQbGF5ZXJEYW5tYWt1UGVvcGxlUHJvb2YSDQoFdmFsdWUYASABKAgiKwoaUGxheWVyRGFubWFrdVNjYWxpbmdmYWN0b3ISDQoFdmFsdWUYASABKAIiLgodUGxheWVyRGFubWFrdVNlbmlvck1vZGVTd2l0Y2gSDQoFdmFsdWUYASABKAUiIwoSUGxheWVyRGFubWFrdVNwZWVkEg0KBXZhbHVlGAEgASgFIisKGlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mEg0KBXZhbHVlGAEgASgIIjgKE1BsYXllckRhbm1ha3VTd2l0Y2gSDQoFdmFsdWUYASABKAgSEgoKY2FuX2lnbm9yZRgCIAEoCCIoChdQbGF5ZXJEYW5tYWt1U3dpdGNoU2F2ZRINCgV2YWx1ZRgBIAEoCCIuCh1QbGF5ZXJEYW5tYWt1VXNlRGVmYXVsdENvbmZpZxINCgV2YWx1ZRgBIAEoCCKMAwoJUG9zdFBhbmVsEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAxIQCghwcmlvcml0eRgDIAEoAxIOCgZiaXpfaWQYBCABKAMSRAoIYml6X3R5cGUYBSABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxCaXpUeXBlEkMKDGNsaWNrX2J1dHRvbhgGIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uEj8KCnRleHRfaW5wdXQYByABKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5UZXh0SW5wdXQSPQoJY2hlY2tfYm94GAggASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tCb3gSNgoFdG9hc3QYCSABKAsyJy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdCKtBAoLUG9zdFBhbmVsVjISDQoFc3RhcnQYASABKAMSCwoDZW5kGAIgASgDEkQKCGJpel90eXBlGAMgASgOMjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsQml6VHlwZRJFCgxjbGlja19idXR0b24YBCABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DbGlja0J1dHRvblYyEkEKCnRleHRfaW5wdXQYBSABKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5UZXh0SW5wdXRWMhI/CgljaGVja19ib3gYBiABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja0JveFYyEjgKBXRvYXN0GAcgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RWMhI6CgZidWJibGUYCCABKAsyKi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdWJibGVWMhI4CgVsYWJlbBgJIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxhYmVsVjISQQoLcG9zdF9zdGF0dXMYCiABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0U3RhdHVzIhcKB1FvZUluZm8SDAoEaW5mbxgBIAEoCSIpCghSZXNwb25zZRIMCgRjb2RlGAEgASgFEg8KB21lc3NhZ2UYAiABKAki+QIKDFN1YnRpdGxlSXRlbRIKCgJpZBgBIAEoAxIOCgZpZF9zdHIYAiABKAkSCwoDbGFuGAMgASgJEg8KB2xhbl9kb2MYBCABKAkSFAoMc3VidGl0bGVfdXJsGAUgASgJEjoKBmF1dGhvchgGIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlVzZXJJbmZvEjwKBHR5cGUYByABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZVR5cGUSFQoNbGFuX2RvY19icmllZhgIIAEoCRJBCgdhaV90eXBlGAkgASgOMjAuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuU3VidGl0bGVBaVR5cGUSRQoJYWlfc3RhdHVzGAogASgOMjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuU3VidGl0bGVBaVN0YXR1cyLoAgoJVGV4dElucHV0EhwKFHBvcnRyYWl0X3BsYWNlaG9sZGVyGAEgAygJEh0KFWxhbmRzY2FwZV9wbGFjZWhvbGRlchgCIAMoCRJBCgtyZW5kZXJfdHlwZRgDIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSGAoQcGxhY2Vob2xkZXJfcG9zdBgEIAEoCBIMCgRzaG93GAUgASgIEjgKBmF2YXRhchgGIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkF2YXRhchJBCgtwb3N0X3N0YXR1cxgHIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RTdGF0dXMSNgoFbGFiZWwYCCABKAsyJy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5MYWJlbCL7AQoLVGV4dElucHV0VjISHAoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAkSHQoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJEkEKC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIYChBwbGFjZWhvbGRlcl9wb3N0GAQgASgIEjgKBmF2YXRhchgFIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkF2YXRhchIYChB0ZXh0X2lucHV0X2xpbWl0GAYgASgFIm8KBVRvYXN0EgwKBHRleHQYASABKAkSEAoIZHVyYXRpb24YAiABKAUSDAoEc2hvdxgDIAEoCBI4CgZidXR0b24YBCABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXR0b24iYgoNVG9hc3RCdXR0b25WMhIMCgR0ZXh0GAEgASgJEkMKBmFjdGlvbhgCIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0RnVuY3Rpb25UeXBlInMKB1RvYXN0VjISDAoEdGV4dBgBIAEoCRIQCghkdXJhdGlvbhgCIAEoBRJICg90b2FzdF9idXR0b25fdjIYAyABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdEJ1dHRvblYyIlwKCFVzZXJJbmZvEgsKA21pZBgBIAEoAxIMCgRuYW1lGAIgASgJEgsKA3NleBgDIAEoCRIMCgRmYWNlGAQgASgJEgwKBHNpZ24YBSABKAkSDAoEcmFuaxgGIAEoBSJTCglWaWRlb01hc2sSCwoDY2lkGAEgASgDEgwKBHBsYXQYAiABKAUSCwoDZnBzGAMgASgFEgwKBHRpbWUYBCABKAMSEAoIbWFza191cmwYBSABKAkicAoNVmlkZW9TdWJ0aXRsZRILCgNsYW4YASABKAkSDwoHbGFuX2RvYxgCIAEoCRJBCglzdWJ0aXRsZXMYAyADKAsyLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUl0ZW0ikgEKDlZpZXdIZXJkRG1FbGVtEhAKCGhlcmRfbXNnGAEgASgJEhYKDmhlcmRfc3RhcnRfY250GAIgASgFEhQKDGhlcmRfZW5kX2NudBgDIAEoBRISCgpyZWdleF9ydWxlGAQgASgJEhYKDnN0YXJ0X3Byb2dyZXNzGAUgASgFEhQKDGVuZF9wcm9ncmVzcxgGIAEoBSozCgpBdmF0YXJUeXBlEhIKDkF2YXRhclR5cGVOb25lEAASEQoNQXZhdGFyVHlwZU5GVBABKlkKCkJ1YmJsZVR5cGUSEgoOQnViYmxlVHlwZU5vbmUQABIZChVCdWJibGVUeXBlQ2xpY2tCdXR0b24QARIcChhCdWJibGVUeXBlRG1TZXR0aW5nUGFuZWwQAipYCgxDaGVja2JveFR5cGUSFAoQQ2hlY2tib3hUeXBlTm9uZRAAEhkKFUNoZWNrYm94VHlwZUVuY291cmFnZRABEhcKE0NoZWNrYm94VHlwZUNvbG9yRE0QAio1Cg5EbUNvbG9yZnVsVHlwZRIMCghOb25lVHlwZRAAEhUKD1ZpcEdyYWR1YWxDb2xvchDh1AMqYAoRRG1NYXNrV2FsbEJpelR5cGUSCwoHVW5rbm93bhAAEgcKA09HVhABEgoKBkJpelBpYxACEggKBE11dGUQAxIKCgZSZWNvcmQQBBIJCgVDbG91ZBAFEggKBEFJR0MQBip2ChVEbU1hc2tXYWxsQ29udGVudFR5cGUSIAocRG1NYXNrV2FsbENvbnRlbnRUeXBlVW5rbm93bhAAEh0KGURtTWFza1dhbGxDb250ZW50VHlwZVRleHQQARIcChhEbU1hc2tXYWxsQ29udGVudFR5cGVQaWMQAio8CgxFeHBvc3VyZVR5cGUSFAoQRXhwb3N1cmVUeXBlTm9uZRAAEhYKEkV4cG9zdXJlVHlwZURNU2VuZBABKoMCChBQb3N0UGFuZWxCaXpUeXBlEhgKFFBvc3RQYW5lbEJpelR5cGVOb25lEAASHQoZUG9zdFBhbmVsQml6VHlwZUVuY291cmFnZRABEhsKF1Bvc3RQYW5lbEJpelR5cGVDb2xvckRNEAISGQoVUG9zdFBhbmVsQml6VHlwZU5GVERNEAMSHQoZUG9zdFBhbmVsQml6VHlwZUZyYWdDbG9zZRAEEh0KGVBvc3RQYW5lbEJpelR5cGVSZWNvbW1lbmQQBRIcChhQb3N0UGFuZWxCaXpUeXBlUGxvdExlYWsQBhIiCh5Qb3N0UGFuZWxCaXpUeXBlQW50aUhhcmFzc21lbnQQByo4CgpQb3N0U3RhdHVzEhQKEFBvc3RTdGF0dXNOb3JtYWwQABIUChBQb3N0U3RhdHVzQ2xvc2VkEAEqTgoKUmVuZGVyVHlwZRISCg5SZW5kZXJUeXBlTm9uZRAAEhQKEFJlbmRlclR5cGVTaW5nbGUQARIWChJSZW5kZXJUeXBlUm90YXRpb24QAio2ChBTdWJ0aXRsZUFpU3RhdHVzEggKBE5vbmUQABIMCghFeHBvc3VyZRABEgoKBkFzc2lzdBACKisKDlN1YnRpdGxlQWlUeXBlEgoKBk5vcm1hbBAAEg0KCVRyYW5zbGF0ZRABKh4KDFN1YnRpdGxlVHlwZRIGCgJDQxAAEgYKAkFJEAEqTgoRVG9hc3RGdW5jdGlvblR5cGUSGQoVVG9hc3RGdW5jdGlvblR5cGVOb25lEAASHgoaVG9hc3RGdW5jdGlvblR5cGVQb3N0UGFuZWwQATKgBQoCRE0ScwoLRG1TZWdNb2JpbGUSMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ01vYmlsZVJlcRoyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnTW9iaWxlUmVwbHkSZAoGRG1WaWV3EisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1WaWV3UmVxGi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1WaWV3UmVwbHkScQoORG1QbGF5ZXJDb25maWcSMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVBsYXllckNvbmZpZ1JlcRoqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlc3BvbnNlEmoKCERtU2VnT3R0Ei0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdPdHRSZXEaLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ090dFJlcGx5EmoKCERtU2VnU0RLEi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdTREtSZXEaLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ1NES1JlcGx5EnQKDERtRXhwb1JlcG9ydBIxLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtRXhwb1JlcG9ydFJlcRoxLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtRXhwb1JlcG9ydFJlc0LUAQokY29tLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxQgdEbVByb3RvUAGiAgRCQ1NEqgIgQmlsaWJpbGkuQ29tbXVuaXR5LlNlcnZpY2UuRG0uVjHKAiBCaWxpYmlsaVxDb21tdW5pdHlcU2VydmljZVxEbVxWMeICLEJpbGliaWxpXENvbW11bml0eVxTZXJ2aWNlXERtXFYxXEdQQk1ldGFkYXRh6gIkQmlsaWJpbGk6OkNvbW11bml0eTo6U2VydmljZTo6RG06OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Avatar\n */\nexport type Avatar = Message<\"bilibili.community.service.dm.v1.Avatar\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.AvatarType avatar_type = 3;\n */\n avatarType: AvatarType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Avatar.\n * Use `create(AvatarSchema)` to create a new message.\n */\nexport const AvatarSchema: GenMessage<Avatar> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 0);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Bubble\n */\nexport type Bubble = Message<\"bilibili.community.service.dm.v1.Bubble\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Bubble.\n * Use `create(BubbleSchema)` to create a new message.\n */\nexport const BubbleSchema: GenMessage<Bubble> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 1);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.BubbleV2\n */\nexport type BubbleV2 = Message<\"bilibili.community.service.dm.v1.BubbleV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.BubbleType bubble_type = 3;\n */\n bubbleType: BubbleType;\n\n /**\n * @generated from field: bool exposure_once = 4;\n */\n exposureOnce: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExposureType exposure_type = 5;\n */\n exposureType: ExposureType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.BubbleV2.\n * Use `create(BubbleV2Schema)` to create a new message.\n */\nexport const BubbleV2Schema: GenMessage<BubbleV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 2);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Button\n */\nexport type Button = Message<\"bilibili.community.service.dm.v1.Button\"> & {\n /**\n *\n *\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.ToastFunctionType action = 2;\n */\n action: ToastFunctionType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Button.\n * Use `create(ButtonSchema)` to create a new message.\n */\nexport const ButtonSchema: GenMessage<Button> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 3);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.BuzzwordConfig\n */\nexport type BuzzwordConfig = Message<\"bilibili.community.service.dm.v1.BuzzwordConfig\"> & {\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.BuzzwordShowConfig keywords = 1;\n */\n keywords: BuzzwordShowConfig[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.BuzzwordConfig.\n * Use `create(BuzzwordConfigSchema)` to create a new message.\n */\nexport const BuzzwordConfigSchema: GenMessage<BuzzwordConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 4);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.BuzzwordShowConfig\n */\nexport type BuzzwordShowConfig = Message<\"bilibili.community.service.dm.v1.BuzzwordShowConfig\"> & {\n /**\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * @generated from field: string schema = 2;\n */\n schema: string;\n\n /**\n * @generated from field: int32 source = 3;\n */\n source: number;\n\n /**\n * @generated from field: int64 id = 4;\n */\n id: bigint;\n\n /**\n * @generated from field: int64 buzzword_id = 5;\n */\n buzzwordId: bigint;\n\n /**\n * @generated from field: int32 schema_type = 6;\n */\n schemaType: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.BuzzwordShowConfig.\n * Use `create(BuzzwordShowConfigSchema)` to create a new message.\n */\nexport const BuzzwordShowConfigSchema: GenMessage<BuzzwordShowConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 5);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.CheckBox\n */\nexport type CheckBox = Message<\"bilibili.community.service.dm.v1.CheckBox\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckboxType type = 2;\n */\n type: CheckboxType;\n\n /**\n * @generated from field: bool default_value = 3;\n */\n defaultValue: boolean;\n\n /**\n * @generated from field: bool show = 4;\n */\n show: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.CheckBox.\n * Use `create(CheckBoxSchema)` to create a new message.\n */\nexport const CheckBoxSchema: GenMessage<CheckBox> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 6);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.CheckBoxV2\n */\nexport type CheckBoxV2 = Message<\"bilibili.community.service.dm.v1.CheckBoxV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckboxType type = 2;\n */\n type: CheckboxType;\n\n /**\n * @generated from field: bool default_value = 3;\n */\n defaultValue: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.CheckBoxV2.\n * Use `create(CheckBoxV2Schema)` to create a new message.\n */\nexport const CheckBoxV2Schema: GenMessage<CheckBoxV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 7);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ClickButton\n */\nexport type ClickButton = Message<\"bilibili.community.service.dm.v1.ClickButton\"> & {\n /**\n * @generated from field: repeated string portrait_text = 1;\n */\n portraitText: string[];\n\n /**\n * @generated from field: repeated string landscape_text = 2;\n */\n landscapeText: string[];\n\n /**\n * @generated from field: repeated string portrait_text_focus = 3;\n */\n portraitTextFocus: string[];\n\n /**\n * @generated from field: repeated string landscape_text_focus = 4;\n */\n landscapeTextFocus: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 5;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool show = 6;\n */\n show: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Bubble bubble = 7;\n */\n bubble?: Bubble | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ClickButton.\n * Use `create(ClickButtonSchema)` to create a new message.\n */\nexport const ClickButtonSchema: GenMessage<ClickButton> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 8);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ClickButtonV2\n */\nexport type ClickButtonV2 = Message<\"bilibili.community.service.dm.v1.ClickButtonV2\"> & {\n /**\n * @generated from field: repeated string portrait_text = 1;\n */\n portraitText: string[];\n\n /**\n * @generated from field: repeated string landscape_text = 2;\n */\n landscapeText: string[];\n\n /**\n * @generated from field: repeated string portrait_text_focus = 3;\n */\n portraitTextFocus: string[];\n\n /**\n * @generated from field: repeated string landscape_text_focus = 4;\n */\n landscapeTextFocus: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 5;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool text_input_post = 6;\n */\n textInputPost: boolean;\n\n /**\n * @generated from field: bool exposure_once = 7;\n */\n exposureOnce: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExposureType exposure_type = 8;\n */\n exposureType: ExposureType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ClickButtonV2.\n * Use `create(ClickButtonV2Schema)` to create a new message.\n */\nexport const ClickButtonV2Schema: GenMessage<ClickButtonV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 9);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.Command\n */\nexport type Command = Message<\"bilibili.community.service.dm.v1.Command\"> & {\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.CommandDm command_dms = 1;\n */\n commandDms: CommandDm[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Command.\n * Use `create(CommandSchema)` to create a new message.\n */\nexport const CommandSchema: GenMessage<Command> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 10);\n\n/**\n * 互动弹幕条目信息\n *\n * @generated from message bilibili.community.service.dm.v1.CommandDm\n */\nexport type CommandDm = Message<\"bilibili.community.service.dm.v1.CommandDm\"> & {\n /**\n * 弹幕id\n *\n * @generated from field: int64 id = 1;\n */\n id: bigint;\n\n /**\n * 对象视频cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 发送者mid\n *\n * @generated from field: int64 mid = 3;\n */\n mid: bigint;\n\n /**\n * 互动弹幕指令\n *\n * @generated from field: string command = 4;\n */\n command: string;\n\n /**\n * 互动弹幕正文\n *\n * @generated from field: string content = 5;\n */\n content: string;\n\n /**\n * 出现时间\n *\n * @generated from field: int32 progress = 6;\n */\n progress: number;\n\n /**\n * 创建时间\n *\n * @generated from field: string ctime = 7;\n */\n ctime: string;\n\n /**\n * 发布时间\n *\n * @generated from field: string mtime = 8;\n */\n mtime: string;\n\n /**\n * 扩展json数据\n *\n * @generated from field: string extra = 9;\n */\n extra: string;\n\n /**\n * 弹幕id str类型\n *\n * @generated from field: string idStr = 10;\n */\n idStr: string;\n\n /**\n *\n *\n * @generated from field: int32 type = 11;\n */\n type: number;\n\n /**\n *\n *\n * @generated from field: bool auto_create = 12;\n */\n autoCreate: boolean;\n\n /**\n *\n *\n * @generated from field: int32 count_down = 13;\n */\n countDown: number;\n\n /**\n *\n *\n * @generated from field: int32 attr = 14;\n */\n attr: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.CommandDm.\n * Use `create(CommandDmSchema)` to create a new message.\n */\nexport const CommandDmSchema: GenMessage<CommandDm> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 11);\n\n/**\n * 弹幕ai云屏蔽列表\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuAIFlag\n */\nexport type DanmakuAIFlag = Message<\"bilibili.community.service.dm.v1.DanmakuAIFlag\"> & {\n /**\n * 弹幕ai云屏蔽条目\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuFlag dm_flags = 1;\n */\n dmFlags: DanmakuFlag[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuAIFlag.\n * Use `create(DanmakuAIFlagSchema)` to create a new message.\n */\nexport const DanmakuAIFlagSchema: GenMessage<DanmakuAIFlag> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 12);\n\n/**\n * 弹幕条目\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuElem\n */\nexport type DanmakuElem = Message<\"bilibili.community.service.dm.v1.DanmakuElem\"> & {\n /**\n * 弹幕dmid\n *\n * @generated from field: int64 id = 1;\n */\n id: bigint;\n\n /**\n * 弹幕出现位置(单位ms)\n *\n * @generated from field: int32 progress = 2;\n */\n progress: number;\n\n /**\n * 弹幕类型 1 2 3:普通弹幕 4:底部弹幕 5:顶部弹幕 6:逆向弹幕 7:高级弹幕 8:代码弹幕 9:BAS弹幕(pool必须为2)\n *\n * @generated from field: int32 mode = 3;\n */\n mode: number;\n\n /**\n * 弹幕字号\n *\n * @generated from field: int32 fontsize = 4;\n */\n fontsize: number;\n\n /**\n * 弹幕颜色\n *\n * @generated from field: bilibili.community.service.dm.v1.DmColorfulType color = 5;\n */\n color: DmColorfulType;\n\n /**\n * 发送者mid hash\n *\n * @generated from field: string mid_hash = 6;\n */\n midHash: string;\n\n /**\n * 弹幕正文\n *\n * @generated from field: string content = 7;\n */\n content: string;\n\n /**\n * 发送时间\n *\n * @generated from field: int64 ctime = 8;\n */\n ctime: bigint;\n\n /**\n * 权重 用于屏蔽等级 区间:[1,10]\n *\n * @generated from field: int32 weight = 9;\n */\n weight: number;\n\n /**\n * 动作\n *\n * @generated from field: string action = 10;\n */\n action: string;\n\n /**\n * 弹幕池 0:普通池 1:字幕池 2:特殊池(代码/BAS弹幕)\n *\n * @generated from field: int32 pool = 11;\n */\n pool: number;\n\n /**\n * 弹幕dmid str\n *\n * @generated from field: string id_str = 12;\n */\n idStr: string;\n\n /**\n * 弹幕属性位(bin求AND)\n * bit0:保护 bit1:直播 bit2:高赞\n *\n * @generated from field: int32 attr = 13;\n */\n attr: number;\n\n /**\n * @generated from field: string animation = 22;\n */\n animation: string;\n\n /**\n * @generated from field: string extra = 23;\n */\n extra: string;\n\n /**\n * 大会员专属颜色\n *\n * @generated from field: bilibili.community.service.dm.v1.DmColorfulType colorful = 24;\n */\n colorful: DmColorfulType;\n\n /**\n *\n *\n * @generated from field: int32 type = 25;\n */\n type: number;\n\n /**\n *\n *\n * @generated from field: int64 oid = 26;\n */\n oid: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuElem.\n * Use `create(DanmakuElemSchema)` to create a new message.\n */\nexport const DanmakuElemSchema: GenMessage<DanmakuElem> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 13);\n\n/**\n * 弹幕ai云屏蔽条目\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuFlag\n */\nexport type DanmakuFlag = Message<\"bilibili.community.service.dm.v1.DanmakuFlag\"> & {\n /**\n * 弹幕dmid\n *\n * @generated from field: int64 dmid = 1;\n */\n dmid: bigint;\n\n /**\n * 评分\n *\n * @generated from field: int32 flag = 2;\n */\n flag: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuFlag.\n * Use `create(DanmakuFlagSchema)` to create a new message.\n */\nexport const DanmakuFlagSchema: GenMessage<DanmakuFlag> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 14);\n\n/**\n * 云屏蔽配置信息\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuFlagConfig\n */\nexport type DanmakuFlagConfig = Message<\"bilibili.community.service.dm.v1.DanmakuFlagConfig\"> & {\n /**\n * 云屏蔽等级\n *\n * @generated from field: int32 rec_flag = 1;\n */\n recFlag: number;\n\n /**\n * 云屏蔽文案\n *\n * @generated from field: string rec_text = 2;\n */\n recText: string;\n\n /**\n * 云屏蔽开关\n *\n * @generated from field: int32 rec_switch = 3;\n */\n recSwitch: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuFlagConfig.\n * Use `create(DanmakuFlagConfigSchema)` to create a new message.\n */\nexport const DanmakuFlagConfigSchema: GenMessage<DanmakuFlagConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 15);\n\n/**\n * 弹幕默认配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig\n */\nexport type DanmuDefaultPlayerConfig = Message<\"bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig\"> & {\n /**\n * 是否使用推荐弹幕设置\n *\n * @generated from field: bool player_danmaku_use_default_config = 1;\n */\n playerDanmakuUseDefaultConfig: boolean;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bool player_danmaku_ai_recommended_switch = 4;\n */\n playerDanmakuAiRecommendedSwitch: boolean;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: int32 player_danmaku_ai_recommended_level = 5;\n */\n playerDanmakuAiRecommendedLevel: number;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bool player_danmaku_blocktop = 6;\n */\n playerDanmakuBlocktop: boolean;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bool player_danmaku_blockscroll = 7;\n */\n playerDanmakuBlockscroll: boolean;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bool player_danmaku_blockbottom = 8;\n */\n playerDanmakuBlockbottom: boolean;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bool player_danmaku_blockcolorful = 9;\n */\n playerDanmakuBlockcolorful: boolean;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bool player_danmaku_blockrepeat = 10;\n */\n playerDanmakuBlockrepeat: boolean;\n\n /**\n * 是否屏蔽高级弹幕\n *\n * @generated from field: bool player_danmaku_blockspecial = 11;\n */\n playerDanmakuBlockspecial: boolean;\n\n /**\n * 弹幕不透明度\n *\n * @generated from field: float player_danmaku_opacity = 12;\n */\n playerDanmakuOpacity: number;\n\n /**\n * 弹幕缩放比例\n *\n * @generated from field: float player_danmaku_scalingfactor = 13;\n */\n playerDanmakuScalingfactor: number;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: float player_danmaku_domain = 14;\n */\n playerDanmakuDomain: number;\n\n /**\n * 弹幕速度\n *\n * @generated from field: int32 player_danmaku_speed = 15;\n */\n playerDanmakuSpeed: number;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool inline_player_danmaku_switch = 16;\n */\n inlinePlayerDanmakuSwitch: boolean;\n\n /**\n * @generated from field: int32 player_danmaku_senior_mode_switch = 17;\n */\n playerDanmakuSeniorModeSwitch: number;\n\n /**\n * @generated from field: int32 player_danmaku_ai_recommended_level_v2 = 18;\n */\n playerDanmakuAiRecommendedLevelV2: number;\n\n /**\n * @generated from field: map<int32, int32> player_danmaku_ai_recommended_level_v2_map = 19;\n */\n playerDanmakuAiRecommendedLevelV2Map: { [key: number]: number };\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_enable_herd_dm = 20;\n */\n playerDanmakuEnableHerdDm: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig.\n * Use `create(DanmuDefaultPlayerConfigSchema)` to create a new message.\n */\nexport const DanmuDefaultPlayerConfigSchema: GenMessage<DanmuDefaultPlayerConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 16);\n\n/**\n * 弹幕配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerConfig\n */\nexport type DanmuPlayerConfig = Message<\"bilibili.community.service.dm.v1.DanmuPlayerConfig\"> & {\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool player_danmaku_switch = 1;\n */\n playerDanmakuSwitch: boolean;\n\n /**\n * 是否记录弹幕开关设置\n *\n * @generated from field: bool player_danmaku_switch_save = 2;\n */\n playerDanmakuSwitchSave: boolean;\n\n /**\n * 是否使用推荐弹幕设置\n *\n * @generated from field: bool player_danmaku_use_default_config = 3;\n */\n playerDanmakuUseDefaultConfig: boolean;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bool player_danmaku_ai_recommended_switch = 4;\n */\n playerDanmakuAiRecommendedSwitch: boolean;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: int32 player_danmaku_ai_recommended_level = 5;\n */\n playerDanmakuAiRecommendedLevel: number;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bool player_danmaku_blocktop = 6;\n */\n playerDanmakuBlocktop: boolean;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bool player_danmaku_blockscroll = 7;\n */\n playerDanmakuBlockscroll: boolean;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bool player_danmaku_blockbottom = 8;\n */\n playerDanmakuBlockbottom: boolean;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bool player_danmaku_blockcolorful = 9;\n */\n playerDanmakuBlockcolorful: boolean;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bool player_danmaku_blockrepeat = 10;\n */\n playerDanmakuBlockrepeat: boolean;\n\n /**\n * 是否屏蔽高级弹幕\n *\n * @generated from field: bool player_danmaku_blockspecial = 11;\n */\n playerDanmakuBlockspecial: boolean;\n\n /**\n * 弹幕不透明度\n *\n * @generated from field: float player_danmaku_opacity = 12;\n */\n playerDanmakuOpacity: number;\n\n /**\n * 弹幕缩放比例\n *\n * @generated from field: float player_danmaku_scalingfactor = 13;\n */\n playerDanmakuScalingfactor: number;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: float player_danmaku_domain = 14;\n */\n playerDanmakuDomain: number;\n\n /**\n * 弹幕速度\n *\n * @generated from field: int32 player_danmaku_speed = 15;\n */\n playerDanmakuSpeed: number;\n\n /**\n * 是否开启屏蔽列表\n *\n * @generated from field: bool player_danmaku_enableblocklist = 16;\n */\n playerDanmakuEnableblocklist: boolean;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool inline_player_danmaku_switch = 17;\n */\n inlinePlayerDanmakuSwitch: boolean;\n\n /**\n * @generated from field: int32 inline_player_danmaku_config = 18;\n */\n inlinePlayerDanmakuConfig: number;\n\n /**\n * @generated from field: int32 player_danmaku_ios_switch_save = 19;\n */\n playerDanmakuIosSwitchSave: number;\n\n /**\n * @generated from field: int32 player_danmaku_senior_mode_switch = 20;\n */\n playerDanmakuSeniorModeSwitch: number;\n\n /**\n * @generated from field: int32 player_danmaku_ai_recommended_level_v2 = 21;\n */\n playerDanmakuAiRecommendedLevelV2: number;\n\n /**\n * @generated from field: map<int32, int32> player_danmaku_ai_recommended_level_v2_map = 22;\n */\n playerDanmakuAiRecommendedLevelV2Map: { [key: number]: number };\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_enable_herd_dm = 23;\n */\n playerDanmakuEnableHerdDm: boolean;\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_blocktop_bottom = 24;\n */\n playerDanmakuBlocktopBottom: boolean;\n\n /**\n *\n *\n * @generated from field: int32 player_danmaku_domain_v2 = 25;\n */\n playerDanmakuDomainV2: number;\n\n /**\n *\n *\n * @generated from field: int32 player_danmaku_density = 26;\n */\n playerDanmakuDensity: number;\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_subtitle_proof = 27;\n */\n playerDanmakuSubtitleProof: boolean;\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_people_proof = 28;\n */\n playerDanmakuPeopleProof: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerConfig.\n * Use `create(DanmuPlayerConfigSchema)` to create a new message.\n */\nexport const DanmuPlayerConfigSchema: GenMessage<DanmuPlayerConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 17);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerConfigPanel\n */\nexport type DanmuPlayerConfigPanel = Message<\"bilibili.community.service.dm.v1.DanmuPlayerConfigPanel\"> & {\n /**\n * @generated from field: string selection_text = 1;\n */\n selectionText: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerConfigPanel.\n * Use `create(DanmuPlayerConfigPanelSchema)` to create a new message.\n */\nexport const DanmuPlayerConfigPanelSchema: GenMessage<DanmuPlayerConfigPanel> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 18);\n\n/**\n * 弹幕显示区域自动配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig\n */\nexport type DanmuPlayerDynamicConfig = Message<\"bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig\"> & {\n /**\n * 时间\n *\n * @generated from field: int32 progress = 1;\n */\n progress: number;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: float player_danmaku_domain = 14;\n */\n playerDanmakuDomain: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig.\n * Use `create(DanmuPlayerDynamicConfigSchema)` to create a new message.\n */\nexport const DanmuPlayerDynamicConfigSchema: GenMessage<DanmuPlayerDynamicConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 19);\n\n/**\n * 弹幕配置信息\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerViewConfig\n */\nexport type DanmuPlayerViewConfig = Message<\"bilibili.community.service.dm.v1.DanmuPlayerViewConfig\"> & {\n /**\n * 弹幕默认配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig danmuku_default_player_config = 1;\n */\n danmukuDefaultPlayerConfig?: DanmuDefaultPlayerConfig | undefined;\n\n /**\n * 弹幕用户配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuPlayerConfig danmuku_player_config = 2;\n */\n danmukuPlayerConfig?: DanmuPlayerConfig | undefined;\n\n /**\n * 弹幕显示区域自动配置列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig danmuku_player_dynamic_config = 3;\n */\n danmukuPlayerDynamicConfig: DanmuPlayerDynamicConfig[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.DanmuPlayerConfigPanel danmuku_player_config_panel = 4;\n */\n danmukuPlayerConfigPanel?: DanmuPlayerConfigPanel | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerViewConfig.\n * Use `create(DanmuPlayerViewConfigSchema)` to create a new message.\n */\nexport const DanmuPlayerViewConfigSchema: GenMessage<DanmuPlayerViewConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 20);\n\n/**\n * web端用户弹幕配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuWebPlayerConfig\n */\nexport type DanmuWebPlayerConfig = Message<\"bilibili.community.service.dm.v1.DanmuWebPlayerConfig\"> & {\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool dm_switch = 1;\n */\n dmSwitch: boolean;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bool ai_switch = 2;\n */\n aiSwitch: boolean;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: int32 ai_level = 3;\n */\n aiLevel: number;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bool blocktop = 4;\n */\n blocktop: boolean;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bool blockscroll = 5;\n */\n blockscroll: boolean;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bool blockbottom = 6;\n */\n blockbottom: boolean;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bool blockcolor = 7;\n */\n blockcolor: boolean;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bool blockspecial = 8;\n */\n blockspecial: boolean;\n\n /**\n *\n *\n * @generated from field: bool preventshade = 9;\n */\n preventshade: boolean;\n\n /**\n *\n *\n * @generated from field: bool dmask = 10;\n */\n dmask: boolean;\n\n /**\n *\n *\n * @generated from field: float opacity = 11;\n */\n opacity: number;\n\n /**\n *\n *\n * @generated from field: int32 dmarea = 12;\n */\n dmarea: number;\n\n /**\n *\n *\n * @generated from field: float speedplus = 13;\n */\n speedplus: number;\n\n /**\n * 弹幕字号\n *\n * @generated from field: float fontsize = 14;\n */\n fontsize: number;\n\n /**\n *\n *\n * @generated from field: bool screensync = 15;\n */\n screensync: boolean;\n\n /**\n *\n *\n * @generated from field: bool speedsync = 16;\n */\n speedsync: boolean;\n\n /**\n *\n *\n * @generated from field: string fontfamily = 17;\n */\n fontfamily: string;\n\n /**\n * 是否使用加粗\n *\n * @generated from field: bool bold = 18;\n */\n bold: boolean;\n\n /**\n *\n *\n * @generated from field: int32 fontborder = 19;\n */\n fontborder: number;\n\n /**\n * 弹幕渲染类型\n *\n * @generated from field: string draw_type = 20;\n */\n drawType: string;\n\n /**\n * @generated from field: int32 senior_mode_switch = 21;\n */\n seniorModeSwitch: number;\n\n /**\n * @generated from field: int32 ai_level_v2 = 22;\n */\n aiLevelV2: number;\n\n /**\n * @generated from field: map<int32, int32> ai_level_v2_map = 23;\n */\n aiLevelV2Map: { [key: number]: number };\n\n /**\n *\n *\n * @generated from field: bool blocktop_bottom = 24;\n */\n blocktopBottom: boolean;\n\n /**\n *\n *\n * @generated from field: int32 dm_area_v2 = 25;\n */\n dmAreaV2: number;\n\n /**\n *\n *\n * @generated from field: int32 dm_density = 26;\n */\n dmDensity: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuWebPlayerConfig.\n * Use `create(DanmuWebPlayerConfigSchema)` to create a new message.\n */\nexport const DanmuWebPlayerConfigSchema: GenMessage<DanmuWebPlayerConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 21);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DmColorful\n */\nexport type DmColorful = Message<\"bilibili.community.service.dm.v1.DmColorful\"> & {\n /**\n * 颜色类型\n *\n * @generated from field: bilibili.community.service.dm.v1.DmColorfulType type = 1;\n */\n type: DmColorfulType;\n\n /**\n * @generated from field: string src = 2;\n */\n src: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmColorful.\n * Use `create(DmColorfulSchema)` to create a new message.\n */\nexport const DmColorfulSchema: GenMessage<DmColorful> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 22);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DmExpoReportReq\n */\nexport type DmExpoReportReq = Message<\"bilibili.community.service.dm.v1.DmExpoReportReq\"> & {\n /**\n * @generated from field: string session_id = 1;\n */\n sessionId: string;\n\n /**\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n *\n *\n * @generated from field: bytes dmids = 3;\n */\n dmids: Uint8Array;\n\n /**\n * @generated from field: string spmid = 4;\n */\n spmid: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmExpoReportReq.\n * Use `create(DmExpoReportReqSchema)` to create a new message.\n */\nexport const DmExpoReportReqSchema: GenMessage<DmExpoReportReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 23);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmExpoReportRes\n */\nexport type DmExpoReportRes = Message<\"bilibili.community.service.dm.v1.DmExpoReportRes\"> & {\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmExpoReportRes.\n * Use `create(DmExpoReportResSchema)` to create a new message.\n */\nexport const DmExpoReportResSchema: GenMessage<DmExpoReportRes> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 24);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmHerdView\n */\nexport type DmHerdView = Message<\"bilibili.community.service.dm.v1.DmHerdView\"> & {\n /**\n *\n *\n * @generated from field: int32 display_herd_dm_num = 1;\n */\n displayHerdDmNum: number;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.ViewHerdDmElem herd_dms = 2;\n */\n herdDms: ViewHerdDmElem[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmHerdView.\n * Use `create(DmHerdViewSchema)` to create a new message.\n */\nexport const DmHerdViewSchema: GenMessage<DmHerdView> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 25);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmMaskWall\n */\nexport type DmMaskWall = Message<\"bilibili.community.service.dm.v1.DmMaskWall\"> & {\n /**\n *\n *\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n *\n *\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n\n /**\n *\n *\n * @generated from field: string content = 3;\n */\n content: string;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmMaskWallContentType content_type = 4;\n */\n contentType: DmMaskWallContentType;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmMaskWallBizType biz_type = 5;\n */\n bizType: DmMaskWallBizType;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmMaskWallContent contents = 6;\n */\n contents: DmMaskWallContent[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmMaskWall.\n * Use `create(DmMaskWallSchema)` to create a new message.\n */\nexport const DmMaskWallSchema: GenMessage<DmMaskWall> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 26);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmMaskWallContent\n */\nexport type DmMaskWallContent = Message<\"bilibili.community.service.dm.v1.DmMaskWallContent\"> & {\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmMaskWallContentType type = 1;\n */\n type: DmMaskWallContentType;\n\n /**\n *\n *\n * @generated from field: string content = 2;\n */\n content: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmMaskWallContent.\n * Use `create(DmMaskWallContentSchema)` to create a new message.\n */\nexport const DmMaskWallContentSchema: GenMessage<DmMaskWallContent> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 27);\n\n/**\n * 修改弹幕配置-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmPlayerConfigReq\n */\nexport type DmPlayerConfigReq = Message<\"bilibili.community.service.dm.v1.DmPlayerConfigReq\"> & {\n /**\n * @generated from field: int64 ts = 1;\n */\n ts: bigint;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSwitch switch = 2;\n */\n switch?: PlayerDanmakuSwitch | undefined;\n\n /**\n * 是否记录弹幕开关设置\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave switch_save = 3;\n */\n switchSave?: PlayerDanmakuSwitchSave | undefined;\n\n /**\n * 是否使用推荐弹幕设置\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig use_default_config = 4;\n */\n useDefaultConfig?: PlayerDanmakuUseDefaultConfig | undefined;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch ai_recommended_switch = 5;\n */\n aiRecommendedSwitch?: PlayerDanmakuAiRecommendedSwitch | undefined;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel ai_recommended_level = 6;\n */\n aiRecommendedLevel?: PlayerDanmakuAiRecommendedLevel | undefined;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlocktop blocktop = 7;\n */\n blocktop?: PlayerDanmakuBlocktop | undefined;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll blockscroll = 8;\n */\n blockscroll?: PlayerDanmakuBlockscroll | undefined;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom blockbottom = 9;\n */\n blockbottom?: PlayerDanmakuBlockbottom | undefined;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful blockcolorful = 10;\n */\n blockcolorful?: PlayerDanmakuBlockcolorful | undefined;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat blockrepeat = 11;\n */\n blockrepeat?: PlayerDanmakuBlockrepeat | undefined;\n\n /**\n * 是否屏蔽高级弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial blockspecial = 12;\n */\n blockspecial?: PlayerDanmakuBlockspecial | undefined;\n\n /**\n * 弹幕不透明度\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuOpacity opacity = 13;\n */\n opacity?: PlayerDanmakuOpacity | undefined;\n\n /**\n * 弹幕缩放比例\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor scalingfactor = 14;\n */\n scalingfactor?: PlayerDanmakuScalingfactor | undefined;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuDomain domain = 15;\n */\n domain?: PlayerDanmakuDomain | undefined;\n\n /**\n * 弹幕速度\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSpeed speed = 16;\n */\n speed?: PlayerDanmakuSpeed | undefined;\n\n /**\n * 是否开启屏蔽列表\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist enableblocklist = 17;\n */\n enableblocklist?: PlayerDanmakuEnableblocklist | undefined;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch inlinePlayerDanmakuSwitch = 18;\n */\n inlinePlayerDanmakuSwitch?: InlinePlayerDanmakuSwitch | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch senior_mode_switch = 19;\n */\n seniorModeSwitch?: PlayerDanmakuSeniorModeSwitch | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2 ai_recommended_level_v2 = 20;\n */\n aiRecommendedLevelV2?: PlayerDanmakuAiRecommendedLevelV2 | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm enable_herd_dm = 21;\n */\n enableHerdDm?: PlayerDanmakuEnableHerdDm | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom blocktop_bottom = 22;\n */\n blocktopBottom?: PlayerDanmakuBlocktopBottom | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuDomainV2 domain_v2 = 23;\n */\n domainV2?: PlayerDanmakuDomainV2 | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuDensity density = 24;\n */\n density?: PlayerDanmakuDensity | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof subtitle_proof = 25;\n */\n subtitleProof?: PlayerDanmakuSubtitleProof | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof people_proof = 26;\n */\n peopleProof?: PlayerDanmakuPeopleProof | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmPlayerConfigReq.\n * Use `create(DmPlayerConfigReqSchema)` to create a new message.\n */\nexport const DmPlayerConfigReqSchema: GenMessage<DmPlayerConfigReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 28);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DmSegConfig\n */\nexport type DmSegConfig = Message<\"bilibili.community.service.dm.v1.DmSegConfig\"> & {\n /**\n * @generated from field: int64 page_size = 1;\n */\n pageSize: bigint;\n\n /**\n * @generated from field: int64 total = 2;\n */\n total: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegConfig.\n * Use `create(DmSegConfigSchema)` to create a new message.\n */\nexport const DmSegConfigSchema: GenMessage<DmSegConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 29);\n\n/**\n * 获取弹幕-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegMobileReply\n */\nexport type DmSegMobileReply = Message<\"bilibili.community.service.dm.v1.DmSegMobileReply\"> & {\n /**\n * 弹幕列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuElem elems = 1;\n */\n elems: DanmakuElem[];\n\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: int32 state = 2;\n */\n state: number;\n\n /**\n * 弹幕云屏蔽ai评分值\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmakuAIFlag ai_flag = 3;\n */\n aiFlag?: DanmakuAIFlag | undefined;\n\n /**\n *\n *\n * @generated from field: repeated int64 segment_rules = 4;\n */\n segmentRules: bigint[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.DmColorful colorful_src = 5;\n */\n colorfulSrc: DmColorful[];\n\n /**\n *\n *\n * @generated from field: string context_src = 6;\n */\n contextSrc: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegMobileReply.\n * Use `create(DmSegMobileReplySchema)` to create a new message.\n */\nexport const DmSegMobileReplySchema: GenMessage<DmSegMobileReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 30);\n\n/**\n * 获取弹幕-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegMobileReq\n */\nexport type DmSegMobileReq = Message<\"bilibili.community.service.dm.v1.DmSegMobileReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 分段(6min)\n *\n * @generated from field: int64 segment_index = 4;\n */\n segmentIndex: bigint;\n\n /**\n * 是否青少年模式\n *\n * @generated from field: int32 teenagers_mode = 5;\n */\n teenagersMode: number;\n\n /**\n * @generated from field: int64 ps = 6;\n */\n ps: bigint;\n\n /**\n * @generated from field: int64 pe = 7;\n */\n pe: bigint;\n\n /**\n * @generated from field: int32 pull_mode = 8;\n */\n pullMode: number;\n\n /**\n * @generated from field: int32 from_scene = 9;\n */\n fromScene: number;\n\n /**\n *\n *\n * @generated from field: string spmid = 10;\n */\n spmid: string;\n\n /**\n *\n *\n * @generated from field: string context_ext = 11;\n */\n contextExt: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegMobileReq.\n * Use `create(DmSegMobileReqSchema)` to create a new message.\n */\nexport const DmSegMobileReqSchema: GenMessage<DmSegMobileReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 31);\n\n/**\n * ott弹幕列表-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegOttReply\n */\nexport type DmSegOttReply = Message<\"bilibili.community.service.dm.v1.DmSegOttReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuElem elems = 1;\n */\n elems: DanmakuElem[];\n\n /**\n * 弹幕列表\n *\n * @generated from field: int32 state = 2;\n */\n state: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegOttReply.\n * Use `create(DmSegOttReplySchema)` to create a new message.\n */\nexport const DmSegOttReplySchema: GenMessage<DmSegOttReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 32);\n\n/**\n * ott弹幕列表-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegOttReq\n */\nexport type DmSegOttReq = Message<\"bilibili.community.service.dm.v1.DmSegOttReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 分段(6min)\n *\n * @generated from field: int64 segment_index = 4;\n */\n segmentIndex: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegOttReq.\n * Use `create(DmSegOttReqSchema)` to create a new message.\n */\nexport const DmSegOttReqSchema: GenMessage<DmSegOttReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 33);\n\n/**\n * 弹幕SDK-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegSDKReply\n */\nexport type DmSegSDKReply = Message<\"bilibili.community.service.dm.v1.DmSegSDKReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: bool closed = 1;\n */\n closed: boolean;\n\n /**\n * 弹幕列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuElem elems = 2;\n */\n elems: DanmakuElem[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegSDKReply.\n * Use `create(DmSegSDKReplySchema)` to create a new message.\n */\nexport const DmSegSDKReplySchema: GenMessage<DmSegSDKReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 34);\n\n/**\n * 弹幕SDK-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegSDKReq\n */\nexport type DmSegSDKReq = Message<\"bilibili.community.service.dm.v1.DmSegSDKReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 分段(6min)\n *\n * @generated from field: int64 segment_index = 4;\n */\n segmentIndex: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegSDKReq.\n * Use `create(DmSegSDKReqSchema)` to create a new message.\n */\nexport const DmSegSDKReqSchema: GenMessage<DmSegSDKReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 35);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmSubView\n */\nexport type DmSubView = Message<\"bilibili.community.service.dm.v1.DmSubView\"> & {\n /**\n *\n *\n * @generated from field: int32 type = 1;\n */\n type: number;\n\n /**\n *\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n *\n *\n * @generated from field: int64 pid = 3;\n */\n pid: bigint;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanelV2 post_panel2 = 4;\n */\n postPanel2: PostPanelV2[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSubView.\n * Use `create(DmSubViewSchema)` to create a new message.\n */\nexport const DmSubViewSchema: GenMessage<DmSubView> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 36);\n\n/**\n * 客户端弹幕元数据-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmViewReply\n */\nexport type DmViewReply = Message<\"bilibili.community.service.dm.v1.DmViewReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: bool closed = 1;\n */\n closed: boolean;\n\n /**\n * 智能防挡弹幕蒙版信息\n *\n * @generated from field: bilibili.community.service.dm.v1.VideoMask mask = 2;\n */\n mask?: VideoMask | undefined;\n\n /**\n * 视频字幕\n *\n * @generated from field: bilibili.community.service.dm.v1.VideoSubtitle subtitle = 3;\n */\n subtitle?: VideoSubtitle | undefined;\n\n /**\n * 高级弹幕专包url(bfs)\n *\n * @generated from field: repeated string special_dms = 4;\n */\n specialDms: string[];\n\n /**\n * 云屏蔽配置信息\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmakuFlagConfig ai_flag = 5;\n */\n aiFlag?: DanmakuFlagConfig | undefined;\n\n /**\n * 弹幕配置信息\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuPlayerViewConfig player_config = 6;\n */\n playerConfig?: DanmuPlayerViewConfig | undefined;\n\n /**\n * 弹幕发送框样式\n *\n * @generated from field: int32 send_box_style = 7;\n */\n sendBoxStyle: number;\n\n /**\n * 是否允许\n *\n * @generated from field: bool allow = 8;\n */\n allow: boolean;\n\n /**\n * check box 是否展示\n *\n * @generated from field: bool check_box = 9;\n */\n checkBox: boolean;\n\n /**\n * check box 展示文本\n *\n * @generated from field: string check_box_show_msg = 10;\n */\n checkBoxShowMsg: string;\n\n /**\n * 展示文案\n *\n * @generated from field: string text_placeholder = 11;\n */\n textPlaceholder: string;\n\n /**\n * 弹幕输入框文案\n *\n * @generated from field: string input_placeholder = 12;\n */\n inputPlaceholder: string;\n\n /**\n * 用户举报弹幕 cid维度屏蔽的正则规则\n *\n * @generated from field: repeated string report_filter_content = 13;\n */\n reportFilterContent: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExpoReport expo_report = 14;\n */\n expoReport?: ExpoReport | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.BuzzwordConfig buzzword_config = 15;\n */\n buzzwordConfig?: BuzzwordConfig | undefined;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Expressions expressions = 16;\n */\n expressions: Expressions[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanel post_panel = 17;\n */\n postPanel: PostPanel[];\n\n /**\n * @generated from field: repeated string activity_meta = 18;\n */\n activityMeta: string[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanelV2 post_panel2 = 19;\n */\n postPanel2: PostPanelV2[];\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmMaskWall dm_mask_wall = 20;\n */\n dmMaskWall: DmMaskWall[];\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmHerdView dm_herd = 21;\n */\n dmHerd?: DmHerdView | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.Command command = 22;\n */\n command?: Command | undefined;\n\n /**\n *\n *\n * @generated from field: string kv = 23;\n */\n kv: string;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmSubView sub_views = 24;\n */\n subViews: DmSubView[];\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.QoeInfo qoe = 25;\n */\n qoe?: QoeInfo | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmViewReply.\n * Use `create(DmViewReplySchema)` to create a new message.\n */\nexport const DmViewReplySchema: GenMessage<DmViewReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 37);\n\n/**\n * 客户端弹幕元数据-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmViewReq\n */\nexport type DmViewReq = Message<\"bilibili.community.service.dm.v1.DmViewReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 页面spm\n *\n * @generated from field: string spmid = 4;\n */\n spmid: string;\n\n /**\n * 是否冷启\n *\n * @generated from field: int32 is_hard_boot = 5;\n */\n isHardBoot: number;\n\n /**\n *\n *\n * @generated from field: string context_ext = 6;\n */\n contextExt: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmViewReq.\n * Use `create(DmViewReqSchema)` to create a new message.\n */\nexport const DmViewReqSchema: GenMessage<DmViewReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 38);\n\n/**\n * web端弹幕元数据-响应\n * https://api.bilibili.com/x/v2/dm/web/view\n *\n * @generated from message bilibili.community.service.dm.v1.DmWebViewReply\n */\nexport type DmWebViewReply = Message<\"bilibili.community.service.dm.v1.DmWebViewReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: int32 state = 1;\n */\n state: number;\n\n /**\n * @generated from field: string text = 2;\n */\n text: string;\n\n /**\n * @generated from field: string text_side = 3;\n */\n textSide: string;\n\n /**\n * 分段弹幕配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DmSegConfig dm_sge = 4;\n */\n dmSge?: DmSegConfig | undefined;\n\n /**\n * 云屏蔽配置信息\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmakuFlagConfig flag = 5;\n */\n flag?: DanmakuFlagConfig | undefined;\n\n /**\n * 高级弹幕专包url(bfs)\n *\n * @generated from field: repeated string special_dms = 6;\n */\n specialDms: string[];\n\n /**\n * check box 是否展示\n *\n * @generated from field: bool check_box = 7;\n */\n checkBox: boolean;\n\n /**\n * 弹幕数\n *\n * @generated from field: int64 count = 8;\n */\n count: bigint;\n\n /**\n * 互动弹幕\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.CommandDm command_dms = 9;\n */\n commandDms: CommandDm[];\n\n /**\n * 用户弹幕配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuWebPlayerConfig player_config = 10;\n */\n playerConfig?: DanmuWebPlayerConfig | undefined;\n\n /**\n * 用户举报弹幕 cid维度屏蔽\n *\n * @generated from field: repeated string report_filter_content = 11;\n */\n reportFilterContent: string[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Expressions expressions = 12;\n */\n expressions: Expressions[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanel post_panel = 13;\n */\n postPanel: PostPanel[];\n\n /**\n * @generated from field: repeated string activity_meta = 14;\n */\n activityMeta: string[];\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanelV2 post_panel2 = 15;\n */\n postPanel2: PostPanelV2[];\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmSubView sub_views = 16;\n */\n subViews: DmSubView[];\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.QoeInfo qoe = 17;\n */\n qoe?: QoeInfo | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmWebViewReply.\n * Use `create(DmWebViewReplySchema)` to create a new message.\n */\nexport const DmWebViewReplySchema: GenMessage<DmWebViewReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 39);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ExpoReport\n */\nexport type ExpoReport = Message<\"bilibili.community.service.dm.v1.ExpoReport\"> & {\n /**\n * @generated from field: bool should_report_at_end = 1;\n */\n shouldReportAtEnd: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ExpoReport.\n * Use `create(ExpoReportSchema)` to create a new message.\n */\nexport const ExpoReportSchema: GenMessage<ExpoReport> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 40);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Expression\n */\nexport type Expression = Message<\"bilibili.community.service.dm.v1.Expression\"> & {\n /**\n * @generated from field: repeated string keyword = 1;\n */\n keyword: string[];\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Period period = 3;\n */\n period: Period[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Expression.\n * Use `create(ExpressionSchema)` to create a new message.\n */\nexport const ExpressionSchema: GenMessage<Expression> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 41);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Expressions\n */\nexport type Expressions = Message<\"bilibili.community.service.dm.v1.Expressions\"> & {\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Expression data = 1;\n */\n data: Expression[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Expressions.\n * Use `create(ExpressionsSchema)` to create a new message.\n */\nexport const ExpressionsSchema: GenMessage<Expressions> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 42);\n\n/**\n * 是否开启弹幕\n *\n * @generated from message bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch\n */\nexport type InlinePlayerDanmakuSwitch = Message<\"bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch.\n * Use `create(InlinePlayerDanmakuSwitchSchema)` to create a new message.\n */\nexport const InlinePlayerDanmakuSwitchSchema: GenMessage<InlinePlayerDanmakuSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 43);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Label\n */\nexport type Label = Message<\"bilibili.community.service.dm.v1.Label\"> & {\n /**\n * @generated from field: string title = 1;\n */\n title: string;\n\n /**\n * @generated from field: repeated string content = 2;\n */\n content: string[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Label.\n * Use `create(LabelSchema)` to create a new message.\n */\nexport const LabelSchema: GenMessage<Label> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 44);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.LabelV2\n */\nexport type LabelV2 = Message<\"bilibili.community.service.dm.v1.LabelV2\"> & {\n /**\n * @generated from field: string title = 1;\n */\n title: string;\n\n /**\n * @generated from field: repeated string content = 2;\n */\n content: string[];\n\n /**\n * @generated from field: bool exposure_once = 3;\n */\n exposureOnce: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExposureType exposure_type = 4;\n */\n exposureType: ExposureType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.LabelV2.\n * Use `create(LabelV2Schema)` to create a new message.\n */\nexport const LabelV2Schema: GenMessage<LabelV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 45);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Period\n */\nexport type Period = Message<\"bilibili.community.service.dm.v1.Period\"> & {\n /**\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Period.\n * Use `create(PeriodSchema)` to create a new message.\n */\nexport const PeriodSchema: GenMessage<Period> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 46);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel\n */\nexport type PlayerDanmakuAiRecommendedLevel = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel.\n * Use `create(PlayerDanmakuAiRecommendedLevelSchema)` to create a new message.\n */\nexport const PlayerDanmakuAiRecommendedLevelSchema: GenMessage<PlayerDanmakuAiRecommendedLevel> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 47);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2\n */\nexport type PlayerDanmakuAiRecommendedLevelV2 = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2.\n * Use `create(PlayerDanmakuAiRecommendedLevelV2Schema)` to create a new message.\n */\nexport const PlayerDanmakuAiRecommendedLevelV2Schema: GenMessage<PlayerDanmakuAiRecommendedLevelV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 48);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch\n */\nexport type PlayerDanmakuAiRecommendedSwitch = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch.\n * Use `create(PlayerDanmakuAiRecommendedSwitchSchema)` to create a new message.\n */\nexport const PlayerDanmakuAiRecommendedSwitchSchema: GenMessage<PlayerDanmakuAiRecommendedSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 49);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom\n */\nexport type PlayerDanmakuBlockbottom = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom.\n * Use `create(PlayerDanmakuBlockbottomSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockbottomSchema: GenMessage<PlayerDanmakuBlockbottom> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 50);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful\n */\nexport type PlayerDanmakuBlockcolorful = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful.\n * Use `create(PlayerDanmakuBlockcolorfulSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockcolorfulSchema: GenMessage<PlayerDanmakuBlockcolorful> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 51);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat\n */\nexport type PlayerDanmakuBlockrepeat = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat.\n * Use `create(PlayerDanmakuBlockrepeatSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockrepeatSchema: GenMessage<PlayerDanmakuBlockrepeat> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 52);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll\n */\nexport type PlayerDanmakuBlockscroll = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll.\n * Use `create(PlayerDanmakuBlockscrollSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockscrollSchema: GenMessage<PlayerDanmakuBlockscroll> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 53);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial\n */\nexport type PlayerDanmakuBlockspecial = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial.\n * Use `create(PlayerDanmakuBlockspecialSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockspecialSchema: GenMessage<PlayerDanmakuBlockspecial> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 54);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlocktop\n */\nexport type PlayerDanmakuBlocktop = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlocktop\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlocktop.\n * Use `create(PlayerDanmakuBlocktopSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlocktopSchema: GenMessage<PlayerDanmakuBlocktop> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 55);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom\n */\nexport type PlayerDanmakuBlocktopBottom = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom.\n * Use `create(PlayerDanmakuBlocktopBottomSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlocktopBottomSchema: GenMessage<PlayerDanmakuBlocktopBottom> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 56);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuDensity\n */\nexport type PlayerDanmakuDensity = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuDensity\"> & {\n /**\n *\n *\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuDensity.\n * Use `create(PlayerDanmakuDensitySchema)` to create a new message.\n */\nexport const PlayerDanmakuDensitySchema: GenMessage<PlayerDanmakuDensity> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 57);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuDomain\n */\nexport type PlayerDanmakuDomain = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuDomain\"> & {\n /**\n * @generated from field: float value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuDomain.\n * Use `create(PlayerDanmakuDomainSchema)` to create a new message.\n */\nexport const PlayerDanmakuDomainSchema: GenMessage<PlayerDanmakuDomain> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 58);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuDomainV2\n */\nexport type PlayerDanmakuDomainV2 = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuDomainV2\"> & {\n /**\n *\n *\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuDomainV2.\n * Use `create(PlayerDanmakuDomainV2Schema)` to create a new message.\n */\nexport const PlayerDanmakuDomainV2Schema: GenMessage<PlayerDanmakuDomainV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 59);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm\n */\nexport type PlayerDanmakuEnableHerdDm = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm.\n * Use `create(PlayerDanmakuEnableHerdDmSchema)` to create a new message.\n */\nexport const PlayerDanmakuEnableHerdDmSchema: GenMessage<PlayerDanmakuEnableHerdDm> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 60);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist\n */\nexport type PlayerDanmakuEnableblocklist = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist.\n * Use `create(PlayerDanmakuEnableblocklistSchema)` to create a new message.\n */\nexport const PlayerDanmakuEnableblocklistSchema: GenMessage<PlayerDanmakuEnableblocklist> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 61);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuOpacity\n */\nexport type PlayerDanmakuOpacity = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuOpacity\"> & {\n /**\n * @generated from field: float value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuOpacity.\n * Use `create(PlayerDanmakuOpacitySchema)` to create a new message.\n */\nexport const PlayerDanmakuOpacitySchema: GenMessage<PlayerDanmakuOpacity> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 62);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof\n */\nexport type PlayerDanmakuPeopleProof = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof.\n * Use `create(PlayerDanmakuPeopleProofSchema)` to create a new message.\n */\nexport const PlayerDanmakuPeopleProofSchema: GenMessage<PlayerDanmakuPeopleProof> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 63);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor\n */\nexport type PlayerDanmakuScalingfactor = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor\"> & {\n /**\n * @generated from field: float value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor.\n * Use `create(PlayerDanmakuScalingfactorSchema)` to create a new message.\n */\nexport const PlayerDanmakuScalingfactorSchema: GenMessage<PlayerDanmakuScalingfactor> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 64);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch\n */\nexport type PlayerDanmakuSeniorModeSwitch = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch.\n * Use `create(PlayerDanmakuSeniorModeSwitchSchema)` to create a new message.\n */\nexport const PlayerDanmakuSeniorModeSwitchSchema: GenMessage<PlayerDanmakuSeniorModeSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 65);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSpeed\n */\nexport type PlayerDanmakuSpeed = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSpeed\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSpeed.\n * Use `create(PlayerDanmakuSpeedSchema)` to create a new message.\n */\nexport const PlayerDanmakuSpeedSchema: GenMessage<PlayerDanmakuSpeed> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 66);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof\n */\nexport type PlayerDanmakuSubtitleProof = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof.\n * Use `create(PlayerDanmakuSubtitleProofSchema)` to create a new message.\n */\nexport const PlayerDanmakuSubtitleProofSchema: GenMessage<PlayerDanmakuSubtitleProof> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 67);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSwitch\n */\nexport type PlayerDanmakuSwitch = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSwitch\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n\n /**\n * @generated from field: bool can_ignore = 2;\n */\n canIgnore: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSwitch.\n * Use `create(PlayerDanmakuSwitchSchema)` to create a new message.\n */\nexport const PlayerDanmakuSwitchSchema: GenMessage<PlayerDanmakuSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 68);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave\n */\nexport type PlayerDanmakuSwitchSave = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave.\n * Use `create(PlayerDanmakuSwitchSaveSchema)` to create a new message.\n */\nexport const PlayerDanmakuSwitchSaveSchema: GenMessage<PlayerDanmakuSwitchSave> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 69);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig\n */\nexport type PlayerDanmakuUseDefaultConfig = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig.\n * Use `create(PlayerDanmakuUseDefaultConfigSchema)` to create a new message.\n */\nexport const PlayerDanmakuUseDefaultConfigSchema: GenMessage<PlayerDanmakuUseDefaultConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 70);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PostPanel\n */\nexport type PostPanel = Message<\"bilibili.community.service.dm.v1.PostPanel\"> & {\n /**\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n\n /**\n * @generated from field: int64 priority = 3;\n */\n priority: bigint;\n\n /**\n * @generated from field: int64 biz_id = 4;\n */\n bizId: bigint;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostPanelBizType biz_type = 5;\n */\n bizType: PostPanelBizType;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ClickButton click_button = 6;\n */\n clickButton?: ClickButton | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.TextInput text_input = 7;\n */\n textInput?: TextInput | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckBox check_box = 8;\n */\n checkBox?: CheckBox | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Toast toast = 9;\n */\n toast?: Toast | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PostPanel.\n * Use `create(PostPanelSchema)` to create a new message.\n */\nexport const PostPanelSchema: GenMessage<PostPanel> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 71);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PostPanelV2\n */\nexport type PostPanelV2 = Message<\"bilibili.community.service.dm.v1.PostPanelV2\"> & {\n /**\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostPanelBizType biz_type = 3;\n */\n bizType: PostPanelBizType;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ClickButtonV2 click_button = 4;\n */\n clickButton?: ClickButtonV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.TextInputV2 text_input = 5;\n */\n textInput?: TextInputV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckBoxV2 check_box = 6;\n */\n checkBox?: CheckBoxV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ToastV2 toast = 7;\n */\n toast?: ToastV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.BubbleV2 bubble = 8;\n */\n bubble?: BubbleV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.LabelV2 label = 9;\n */\n label?: LabelV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostStatus post_status = 10;\n */\n postStatus: PostStatus;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PostPanelV2.\n * Use `create(PostPanelV2Schema)` to create a new message.\n */\nexport const PostPanelV2Schema: GenMessage<PostPanelV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 72);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.QoeInfo\n */\nexport type QoeInfo = Message<\"bilibili.community.service.dm.v1.QoeInfo\"> & {\n /**\n *\n *\n * @generated from field: string info = 1;\n */\n info: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.QoeInfo.\n * Use `create(QoeInfoSchema)` to create a new message.\n */\nexport const QoeInfoSchema: GenMessage<QoeInfo> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 73);\n\n/**\n * 修改弹幕配置-响应\n *\n * @generated from message bilibili.community.service.dm.v1.Response\n */\nexport type Response = Message<\"bilibili.community.service.dm.v1.Response\"> & {\n /**\n * @generated from field: int32 code = 1;\n */\n code: number;\n\n /**\n * @generated from field: string message = 2;\n */\n message: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Response.\n * Use `create(ResponseSchema)` to create a new message.\n */\nexport const ResponseSchema: GenMessage<Response> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 74);\n\n/**\n * 单个字幕信息\n *\n * @generated from message bilibili.community.service.dm.v1.SubtitleItem\n */\nexport type SubtitleItem = Message<\"bilibili.community.service.dm.v1.SubtitleItem\"> & {\n /**\n * 字幕id\n *\n * @generated from field: int64 id = 1;\n */\n id: bigint;\n\n /**\n * 字幕id str\n *\n * @generated from field: string id_str = 2;\n */\n idStr: string;\n\n /**\n * 字幕语言代码\n *\n * @generated from field: string lan = 3;\n */\n lan: string;\n\n /**\n * 字幕语言\n *\n * @generated from field: string lan_doc = 4;\n */\n lanDoc: string;\n\n /**\n * 字幕文件url\n *\n * @generated from field: string subtitle_url = 5;\n */\n subtitleUrl: string;\n\n /**\n * 字幕作者信息\n *\n * @generated from field: bilibili.community.service.dm.v1.UserInfo author = 6;\n */\n author?: UserInfo | undefined;\n\n /**\n * 字幕类型\n *\n * @generated from field: bilibili.community.service.dm.v1.SubtitleType type = 7;\n */\n type: SubtitleType;\n\n /**\n * @generated from field: string lan_doc_brief = 8;\n */\n lanDocBrief: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.SubtitleAiType ai_type = 9;\n */\n aiType: SubtitleAiType;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.SubtitleAiStatus ai_status = 10;\n */\n aiStatus: SubtitleAiStatus;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.SubtitleItem.\n * Use `create(SubtitleItemSchema)` to create a new message.\n */\nexport const SubtitleItemSchema: GenMessage<SubtitleItem> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 75);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.TextInput\n */\nexport type TextInput = Message<\"bilibili.community.service.dm.v1.TextInput\"> & {\n /**\n * @generated from field: repeated string portrait_placeholder = 1;\n */\n portraitPlaceholder: string[];\n\n /**\n * @generated from field: repeated string landscape_placeholder = 2;\n */\n landscapePlaceholder: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 3;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool placeholder_post = 4;\n */\n placeholderPost: boolean;\n\n /**\n * @generated from field: bool show = 5;\n */\n show: boolean;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Avatar avatar = 6;\n */\n avatar: Avatar[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostStatus post_status = 7;\n */\n postStatus: PostStatus;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Label label = 8;\n */\n label?: Label | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.TextInput.\n * Use `create(TextInputSchema)` to create a new message.\n */\nexport const TextInputSchema: GenMessage<TextInput> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 76);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.TextInputV2\n */\nexport type TextInputV2 = Message<\"bilibili.community.service.dm.v1.TextInputV2\"> & {\n /**\n * @generated from field: repeated string portrait_placeholder = 1;\n */\n portraitPlaceholder: string[];\n\n /**\n * @generated from field: repeated string landscape_placeholder = 2;\n */\n landscapePlaceholder: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 3;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool placeholder_post = 4;\n */\n placeholderPost: boolean;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Avatar avatar = 5;\n */\n avatar: Avatar[];\n\n /**\n * @generated from field: int32 text_input_limit = 6;\n */\n textInputLimit: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.TextInputV2.\n * Use `create(TextInputV2Schema)` to create a new message.\n */\nexport const TextInputV2Schema: GenMessage<TextInputV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 77);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Toast\n */\nexport type Toast = Message<\"bilibili.community.service.dm.v1.Toast\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: int32 duration = 2;\n */\n duration: number;\n\n /**\n * @generated from field: bool show = 3;\n */\n show: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Button button = 4;\n */\n button?: Button | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Toast.\n * Use `create(ToastSchema)` to create a new message.\n */\nexport const ToastSchema: GenMessage<Toast> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 78);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ToastButtonV2\n */\nexport type ToastButtonV2 = Message<\"bilibili.community.service.dm.v1.ToastButtonV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ToastFunctionType action = 2;\n */\n action: ToastFunctionType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ToastButtonV2.\n * Use `create(ToastButtonV2Schema)` to create a new message.\n */\nexport const ToastButtonV2Schema: GenMessage<ToastButtonV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 79);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ToastV2\n */\nexport type ToastV2 = Message<\"bilibili.community.service.dm.v1.ToastV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: int32 duration = 2;\n */\n duration: number;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ToastButtonV2 toast_button_v2 = 3;\n */\n toastButtonV2?: ToastButtonV2 | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ToastV2.\n * Use `create(ToastV2Schema)` to create a new message.\n */\nexport const ToastV2Schema: GenMessage<ToastV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 80);\n\n/**\n * 字幕作者信息\n *\n * @generated from message bilibili.community.service.dm.v1.UserInfo\n */\nexport type UserInfo = Message<\"bilibili.community.service.dm.v1.UserInfo\"> & {\n /**\n * 用户mid\n *\n * @generated from field: int64 mid = 1;\n */\n mid: bigint;\n\n /**\n * 用户昵称\n *\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * 用户性别\n *\n * @generated from field: string sex = 3;\n */\n sex: string;\n\n /**\n * 用户头像url\n *\n * @generated from field: string face = 4;\n */\n face: string;\n\n /**\n * 用户签名\n *\n * @generated from field: string sign = 5;\n */\n sign: string;\n\n /**\n * 用户等级\n *\n * @generated from field: int32 rank = 6;\n */\n rank: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.UserInfo.\n * Use `create(UserInfoSchema)` to create a new message.\n */\nexport const UserInfoSchema: GenMessage<UserInfo> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 81);\n\n/**\n * 智能防挡弹幕蒙版信息\n *\n * @generated from message bilibili.community.service.dm.v1.VideoMask\n */\nexport type VideoMask = Message<\"bilibili.community.service.dm.v1.VideoMask\"> & {\n /**\n * 视频cid\n *\n * @generated from field: int64 cid = 1;\n */\n cid: bigint;\n\n /**\n * 平台\n * 0:web端 1:客户端\n *\n * @generated from field: int32 plat = 2;\n */\n plat: number;\n\n /**\n * 帧率\n *\n * @generated from field: int32 fps = 3;\n */\n fps: number;\n\n /**\n * 间隔时间\n *\n * @generated from field: int64 time = 4;\n */\n time: bigint;\n\n /**\n * 蒙版url\n *\n * @generated from field: string mask_url = 5;\n */\n maskUrl: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.VideoMask.\n * Use `create(VideoMaskSchema)` to create a new message.\n */\nexport const VideoMaskSchema: GenMessage<VideoMask> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 82);\n\n/**\n * 视频字幕信息\n *\n * @generated from message bilibili.community.service.dm.v1.VideoSubtitle\n */\nexport type VideoSubtitle = Message<\"bilibili.community.service.dm.v1.VideoSubtitle\"> & {\n /**\n * 视频原语言代码\n *\n * @generated from field: string lan = 1;\n */\n lan: string;\n\n /**\n * 视频原语言\n *\n * @generated from field: string lan_doc = 2;\n */\n lanDoc: string;\n\n /**\n * 视频字幕列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.SubtitleItem subtitles = 3;\n */\n subtitles: SubtitleItem[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.VideoSubtitle.\n * Use `create(VideoSubtitleSchema)` to create a new message.\n */\nexport const VideoSubtitleSchema: GenMessage<VideoSubtitle> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 83);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.ViewHerdDmElem\n */\nexport type ViewHerdDmElem = Message<\"bilibili.community.service.dm.v1.ViewHerdDmElem\"> & {\n /**\n *\n *\n * @generated from field: string herd_msg = 1;\n */\n herdMsg: string;\n\n /**\n *\n *\n * @generated from field: int32 herd_start_cnt = 2;\n */\n herdStartCnt: number;\n\n /**\n *\n *\n * @generated from field: int32 herd_end_cnt = 3;\n */\n herdEndCnt: number;\n\n /**\n *\n *\n * @generated from field: string regex_rule = 4;\n */\n regexRule: string;\n\n /**\n *\n *\n * @generated from field: int32 start_progress = 5;\n */\n startProgress: number;\n\n /**\n *\n *\n * @generated from field: int32 end_progress = 6;\n */\n endProgress: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ViewHerdDmElem.\n * Use `create(ViewHerdDmElemSchema)` to create a new message.\n */\nexport const ViewHerdDmElemSchema: GenMessage<ViewHerdDmElem> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 84);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.AvatarType\n */\nexport enum AvatarType {\n /**\n * @generated from enum value: AvatarTypeNone = 0;\n */\n AvatarTypeNone = 0,\n\n /**\n * @generated from enum value: AvatarTypeNFT = 1;\n */\n AvatarTypeNFT = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.AvatarType.\n */\nexport const AvatarTypeSchema: GenEnum<AvatarType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 0);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.BubbleType\n */\nexport enum BubbleType {\n /**\n * @generated from enum value: BubbleTypeNone = 0;\n */\n BubbleTypeNone = 0,\n\n /**\n * @generated from enum value: BubbleTypeClickButton = 1;\n */\n BubbleTypeClickButton = 1,\n\n /**\n * @generated from enum value: BubbleTypeDmSettingPanel = 2;\n */\n BubbleTypeDmSettingPanel = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.BubbleType.\n */\nexport const BubbleTypeSchema: GenEnum<BubbleType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 1);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.CheckboxType\n */\nexport enum CheckboxType {\n /**\n * @generated from enum value: CheckboxTypeNone = 0;\n */\n CheckboxTypeNone = 0,\n\n /**\n * @generated from enum value: CheckboxTypeEncourage = 1;\n */\n CheckboxTypeEncourage = 1,\n\n /**\n * @generated from enum value: CheckboxTypeColorDM = 2;\n */\n CheckboxTypeColorDM = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.CheckboxType.\n */\nexport const CheckboxTypeSchema: GenEnum<CheckboxType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 2);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.DmColorfulType\n */\nexport enum DmColorfulType {\n /**\n * 无\n *\n * @generated from enum value: NoneType = 0;\n */\n NoneType = 0,\n\n /**\n * 渐变色\n *\n * @generated from enum value: VipGradualColor = 60001;\n */\n VipGradualColor = 60001,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.DmColorfulType.\n */\nexport const DmColorfulTypeSchema: GenEnum<DmColorfulType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 3);\n\n/**\n *\n *\n * @generated from enum bilibili.community.service.dm.v1.DmMaskWallBizType\n */\nexport enum DmMaskWallBizType {\n /**\n *\n *\n * @generated from enum value: Unknown = 0;\n */\n Unknown = 0,\n\n /**\n *\n *\n * @generated from enum value: OGV = 1;\n */\n OGV = 1,\n\n /**\n *\n *\n * @generated from enum value: BizPic = 2;\n */\n BizPic = 2,\n\n /**\n *\n *\n * @generated from enum value: Mute = 3;\n */\n Mute = 3,\n\n /**\n *\n *\n * @generated from enum value: Record = 4;\n */\n Record = 4,\n\n /**\n *\n *\n * @generated from enum value: Cloud = 5;\n */\n Cloud = 5,\n\n /**\n *\n *\n * @generated from enum value: AIGC = 6;\n */\n AIGC = 6,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.DmMaskWallBizType.\n */\nexport const DmMaskWallBizTypeSchema: GenEnum<DmMaskWallBizType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 4);\n\n/**\n *\n *\n * @generated from enum bilibili.community.service.dm.v1.DmMaskWallContentType\n */\nexport enum DmMaskWallContentType {\n /**\n *\n *\n * @generated from enum value: DmMaskWallContentTypeUnknown = 0;\n */\n DmMaskWallContentTypeUnknown = 0,\n\n /**\n *\n *\n * @generated from enum value: DmMaskWallContentTypeText = 1;\n */\n DmMaskWallContentTypeText = 1,\n\n /**\n *\n *\n * @generated from enum value: DmMaskWallContentTypePic = 2;\n */\n DmMaskWallContentTypePic = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.DmMaskWallContentType.\n */\nexport const DmMaskWallContentTypeSchema: GenEnum<DmMaskWallContentType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 5);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.ExposureType\n */\nexport enum ExposureType {\n /**\n * @generated from enum value: ExposureTypeNone = 0;\n */\n ExposureTypeNone = 0,\n\n /**\n * @generated from enum value: ExposureTypeDMSend = 1;\n */\n ExposureTypeDMSend = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.ExposureType.\n */\nexport const ExposureTypeSchema: GenEnum<ExposureType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 6);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.PostPanelBizType\n */\nexport enum PostPanelBizType {\n /**\n * @generated from enum value: PostPanelBizTypeNone = 0;\n */\n PostPanelBizTypeNone = 0,\n\n /**\n * @generated from enum value: PostPanelBizTypeEncourage = 1;\n */\n PostPanelBizTypeEncourage = 1,\n\n /**\n * @generated from enum value: PostPanelBizTypeColorDM = 2;\n */\n PostPanelBizTypeColorDM = 2,\n\n /**\n * @generated from enum value: PostPanelBizTypeNFTDM = 3;\n */\n PostPanelBizTypeNFTDM = 3,\n\n /**\n * @generated from enum value: PostPanelBizTypeFragClose = 4;\n */\n PostPanelBizTypeFragClose = 4,\n\n /**\n * @generated from enum value: PostPanelBizTypeRecommend = 5;\n */\n PostPanelBizTypeRecommend = 5,\n\n /**\n *\n *\n * @generated from enum value: PostPanelBizTypePlotLeak = 6;\n */\n PostPanelBizTypePlotLeak = 6,\n\n /**\n *\n *\n * @generated from enum value: PostPanelBizTypeAntiHarassment = 7;\n */\n PostPanelBizTypeAntiHarassment = 7,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.PostPanelBizType.\n */\nexport const PostPanelBizTypeSchema: GenEnum<PostPanelBizType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 7);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.PostStatus\n */\nexport enum PostStatus {\n /**\n * @generated from enum value: PostStatusNormal = 0;\n */\n PostStatusNormal = 0,\n\n /**\n * @generated from enum value: PostStatusClosed = 1;\n */\n PostStatusClosed = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.PostStatus.\n */\nexport const PostStatusSchema: GenEnum<PostStatus> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 8);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.RenderType\n */\nexport enum RenderType {\n /**\n * @generated from enum value: RenderTypeNone = 0;\n */\n RenderTypeNone = 0,\n\n /**\n * @generated from enum value: RenderTypeSingle = 1;\n */\n RenderTypeSingle = 1,\n\n /**\n * @generated from enum value: RenderTypeRotation = 2;\n */\n RenderTypeRotation = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.RenderType.\n */\nexport const RenderTypeSchema: GenEnum<RenderType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 9);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.SubtitleAiStatus\n */\nexport enum SubtitleAiStatus {\n /**\n * @generated from enum value: None = 0;\n */\n None = 0,\n\n /**\n * @generated from enum value: Exposure = 1;\n */\n Exposure = 1,\n\n /**\n * @generated from enum value: Assist = 2;\n */\n Assist = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.SubtitleAiStatus.\n */\nexport const SubtitleAiStatusSchema: GenEnum<SubtitleAiStatus> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 10);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.SubtitleAiType\n */\nexport enum SubtitleAiType {\n /**\n * @generated from enum value: Normal = 0;\n */\n Normal = 0,\n\n /**\n * @generated from enum value: Translate = 1;\n */\n Translate = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.SubtitleAiType.\n */\nexport const SubtitleAiTypeSchema: GenEnum<SubtitleAiType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 11);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.SubtitleType\n */\nexport enum SubtitleType {\n /**\n * CC字幕\n *\n * @generated from enum value: CC = 0;\n */\n CC = 0,\n\n /**\n * AI生成字幕\n *\n * @generated from enum value: AI = 1;\n */\n AI = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.SubtitleType.\n */\nexport const SubtitleTypeSchema: GenEnum<SubtitleType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 12);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.ToastFunctionType\n */\nexport enum ToastFunctionType {\n /**\n * @generated from enum value: ToastFunctionTypeNone = 0;\n */\n ToastFunctionTypeNone = 0,\n\n /**\n * @generated from enum value: ToastFunctionTypePostPanel = 1;\n */\n ToastFunctionTypePostPanel = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.ToastFunctionType.\n */\nexport const ToastFunctionTypeSchema: GenEnum<ToastFunctionType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 13);\n\n/**\n * 弹幕\n *\n * @generated from service bilibili.community.service.dm.v1.DM\n */\nexport const DM: GenService<{\n /**\n * 获取分段弹幕\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmSegMobile\n */\n dmSegMobile: {\n methodKind: \"unary\";\n input: typeof DmSegMobileReqSchema;\n output: typeof DmSegMobileReplySchema;\n },\n /**\n * 客户端弹幕元数据 字幕、分段、防挡蒙版等\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmView\n */\n dmView: {\n methodKind: \"unary\";\n input: typeof DmViewReqSchema;\n output: typeof DmViewReplySchema;\n },\n /**\n * 修改弹幕配置\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmPlayerConfig\n */\n dmPlayerConfig: {\n methodKind: \"unary\";\n input: typeof DmPlayerConfigReqSchema;\n output: typeof ResponseSchema;\n },\n /**\n * ott弹幕列表\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmSegOtt\n */\n dmSegOtt: {\n methodKind: \"unary\";\n input: typeof DmSegOttReqSchema;\n output: typeof DmSegOttReplySchema;\n },\n /**\n * SDK弹幕列表\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmSegSDK\n */\n dmSegSDK: {\n methodKind: \"unary\";\n input: typeof DmSegSDKReqSchema;\n output: typeof DmSegSDKReplySchema;\n },\n /**\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmExpoReport\n */\n dmExpoReport: {\n methodKind: \"unary\";\n input: typeof DmExpoReportReqSchema;\n output: typeof DmExpoReportResSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_bilibili_community_service_dm_v1_dm, 0);\n\n","import { defineAdapter } from \"../index.ts\";\n\nimport { defaultUniDM, DMAttr } from \"@/core/dm.ts\";\nimport { PlatformVideoSource } from \"@/core/platform.ts\";\nimport { fromBinary } from \"@bufbuild/protobuf\";\nimport { DmWebViewReplySchema } from \"@/utils/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\nexport const BiliCommandGrpcAdapter = defineAdapter((bin: Uint8Array | ArrayBuffer) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const data = fromBinary(DmWebViewReplySchema, new Uint8Array(bin));\n const json = data.commandDms;\n await chunk.upsertDanmakus(\n json.map((args) => {\n const SOID = `def_${PlatformVideoSource.Bilibili}+${UniID.fromBili({ cid: args.oid }).toString()}`;\n const senderID = UniID.fromBili({ mid: args.mid });\n const map_d = {\n SOID,\n progress: args.progress,\n mode: \"Ext\" as const,\n fontsize: defaultUniDM.fontsize,\n color: defaultUniDM.color,\n senderID: senderID.toString(),\n content: args.content,\n ctime: new Date(`${args.ctime} GMT+0800`), // 无视本地时区,按照B站的东8区计算时间\n weight: 11,\n pool: \"Adv\" as const,\n attr: [DMAttr.Protect],\n platform: PlatformVideoSource.Bilibili,\n extra: {\n bili: {\n dmid: args.idStr,\n attr: args.attr,\n mid: args.mid?.toString(),\n command: args,\n },\n },\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n});\n","type ctime = string | number | bigint | Date;\n\nfunction isMsTs(ts: number | bigint, tsUnit?: \"ms\" | \"s\") {\n if (tsUnit === \"ms\") return true;\n else if (tsUnit === \"s\") return false;\n else return ts < 100000000;\n}\n\n/**\n * 将各种类型的时间进行格式化\n * @param oriCtime\n * @param tsUnit 当`oriCtime`为数字类型表时间戳时的单位;\n * 为 毫秒(ms)/秒(s)\n * @returns {Date} Date格式时间\n */\nexport function transCtime(oriCtime: ctime, tsUnit?: \"ms\" | \"s\"): Date {\n if (typeof oriCtime === \"number\" || typeof oriCtime === \"bigint\")\n if (isMsTs(oriCtime, tsUnit)) return new Date(Number(oriCtime));\n else return new Date(Number(oriCtime) * 1000);\n else if (typeof oriCtime === \"string\") {\n if (/^\\d+n$/.test(oriCtime)) return new Date(Number(oriCtime.slice(0, -1)));\n else return new Date(oriCtime);\n } else return oriCtime;\n}\n","/**\n * 获得数字的二进制,每位以boolean(true/false)表示1/0,从低位向高位\n * @param number 任意进制数字\n */\nexport const toBits = (number: number) => {\n // 低速方案\n // return [...number.toString(2)].map(Number)\n // 高速方案,位运算允许范围内更快\n const bits: boolean[] = [];\n do {\n bits.unshift(!!(number & 1)); // boolean[]\n // bits.unshift(number & 1) // (0|1)[]\n number >>= 1;\n } while (number);\n return bits.toReversed();\n};\n\nexport class SetBin {\n constructor(public bin: number) {}\n set1(bit: number) {\n this.bin |= 1 << bit;\n }\n set0(bit: number) {\n this.bin &= ~(1 << bit);\n }\n}\n","import { defineAdapter } from \"../index.ts\";\n\nimport { DMAttr, Modes, Pools } from \"@/core/dm.ts\";\nimport { PlatformVideoSource, type PlatformDanmakuSource } from \"@/core/platform.ts\";\nimport { type DMIDGenerator } from \"@/core/id.ts\";\nimport { transCtime } from \"@/utils/transCtime.ts\";\nimport { enumModeCodec, enumPoolCodec } from \"../danuni/json.ts\";\nimport { fromBinary } from \"@bufbuild/protobuf\";\nimport { DmSegMobileReplySchema } from \"@/utils/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts\";\nimport { SetBin, toBits } from \"@/utils/bin.ts\";\nimport type { UniChunk } from \"@/core/index.ts\";\nimport type { z } from \"zod\";\nimport type { DanmakusSelect } from \"@/core/db/schema.ts\";\nimport type { Extra, ExtraBili } from \"@/core/dm-extra.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\ninterface DMBili {\n id: bigint; // xml 7\n progress: number; // xml 0 ; xml s, protobuf ms\n mode: number; // xml 1\n fontsize: number; // xml 2\n color: number; // xml 3\n mid?: bigint; // 仅创作中心源\n midHash: string; // xml 6\n /**\n * 特殊类型解析:\n * - [ohh] : /oh{2,}/gi\n * - [前方高能]\n * - [...] (JS数组) : 高级弹幕\n */\n content: string; // xml content\n ctime: bigint; // xml 4\n pool: number; // xml 5\n weight?: number; // xml 8\n action?: string;\n idStr?: string;\n attr?: number;\n animation?: string;\n extra?: string;\n colorful?: number;\n type?: number;\n oid?: bigint;\n}\n\nconst DMAttrUtils = {\n fromBin(bin: number = 0, format?: PlatformDanmakuSource) {\n const array = toBits(bin);\n const attr: DMAttr[] = [];\n if (format === \"bili\") {\n if (array[0]) attr.push(DMAttr.Protect);\n if (array[1]) attr.push(DMAttr.FromLive);\n if (array[2]) attr.push(DMAttr.HighLike);\n }\n return attr;\n },\n toBin(\n attr: DMAttr[] = [],\n /**\n * 对于二进制格式的读取,应该分别读取各位,\n * 但由于不知道B站及其它使用该参数程序的读取逻辑,\n * 所以单独提供 bili 格式\n */\n format?: PlatformDanmakuSource,\n ) {\n const bin = new SetBin(0);\n if (format === \"bili\") {\n if (attr.includes(DMAttr.Protect)) bin.set1(0);\n if (attr.includes(DMAttr.FromLive)) bin.set1(1);\n if (attr.includes(DMAttr.HighLike)) bin.set1(2);\n }\n return bin.bin;\n },\n};\n\nexport function BiliCommonParser(chunk: UniChunk, args: DMBili, cid?: bigint, recSOID?: string) {\n if (args.oid && !cid) cid = args.oid;\n const SOID =\n recSOID || `def_${PlatformVideoSource.Bilibili}+${UniID.fromBili({ cid }).toString()}`;\n const senderID = UniID.validateString(args.midHash)\n ? args.midHash\n : UniID.fromBili({ midHash: args.midHash }).toString();\n let mode: Modes;\n const pool = args.pool; //暂时不做处理,兼容bili的pool格式\n const extra: Extra = {\n bili: {\n mode: args.mode,\n pool: args.pool,\n dmid: args.idStr ?? args.id.toString(),\n attr: args.attr,\n mid: args.mid?.toString(),\n adv: undefined,\n code: undefined,\n bas: undefined,\n },\n };\n //重复 transMode ,但此处有关于extra的额外处理\n switch (args.mode) {\n case 4:\n mode = Modes.Bottom;\n break;\n case 5:\n mode = Modes.Top;\n break;\n case 6:\n mode = Modes.Reverse;\n break;\n case 7:\n mode = Modes.Ext;\n extra.bili!.adv = args.content;\n break;\n case 8:\n mode = Modes.Ext;\n extra.bili!.code = args.content;\n break;\n case 9:\n mode = Modes.Ext;\n extra.bili!.bas = args.content;\n break;\n\n default:\n mode = Modes.Normal;\n break;\n }\n const map_d = {\n ...args,\n SOID,\n mode,\n senderID,\n ctime: transCtime(args.ctime, \"s\"),\n weight: args.weight || (pool === Pools.Ix ? 1 : 0),\n pool,\n attr: DMAttrUtils.fromBin(args.attr, PlatformVideoSource.Bilibili),\n platform: PlatformVideoSource.Bilibili,\n // 需改进,7=>advanced 8=>code 9=>bas 互动=>command\n // 同时塞进无法/无需直接解析的数据\n // 另开一个解析器,为大部分播放器(无法解析该类dm)做文本类型降级处理\n extra,\n };\n return {\n ...map_d,\n mode: enumModeCodec.decode(mode),\n pool: enumPoolCodec.decode(pool),\n DMID: chunk.$UniDB.DMIDGenerator({\n ...map_d,\n mode: enumModeCodec.decode(mode),\n pool: enumPoolCodec.decode(pool),\n }),\n };\n}\n\ninterface BiliCommonBuilderOptions {\n skipBiliCommand?: boolean;\n /**\n * 见 ../index.ts UniPool.toBiliXML() 的 options,该option不宜手动调用,判断逻辑未封装\n */\n avoidSenderIDWithAt?: boolean;\n}\nexport const BiliCommonModeRec = (mode: z.infer<typeof enumModeCodec.out>, extra?: ExtraBili) => {\n switch (mode) {\n case \"Normal\":\n return 1;\n case \"Bottom\":\n return 4;\n case \"Top\":\n return 5;\n case \"Reverse\":\n return 6;\n case \"Ext\":\n if (!extra) return 1;\n else if (extra.adv) return 7;\n else if (extra.code) return 8;\n else if (extra.bas) return 9;\n else return 1;\n default:\n return 1;\n }\n};\nexport function BiliCommonBuilder(\n DMIDGenerator: DMIDGenerator,\n that: DanmakusSelect,\n options?: BiliCommonBuilderOptions,\n) {\n if (options?.skipBiliCommand && that.extra?.bili?.command) return null;\n const rMode = that.extra?.bili?.mode || BiliCommonModeRec(that.mode, that.extra?.bili);\n let content;\n switch (rMode) {\n case 7:\n content = that.extra?.bili?.adv;\n break;\n case 8:\n content = that.extra?.bili?.code;\n break;\n case 9:\n content = that.extra?.bili?.bas;\n break;\n default:\n content = that.content;\n break;\n }\n return {\n \"#text\": content ?? that.content,\n \"@_p\": [\n that.progress / 1000, // 当前该函数仅用于 bili xml ,故时间格式与其同步\n rMode,\n that.fontsize,\n that.color,\n that.ctime.getTime() / 1000, // 当前该函数仅用于 bili xml ,故时间格式与其同步\n that.extra?.bili?.pool || that.pool, // 目前pool与bili兼容\n options?.avoidSenderIDWithAt\n ? that.senderID.replaceAll(`@${PlatformVideoSource.Bilibili}`, \"\")\n : that.senderID,\n that.extra?.bili?.dmid || that.DMID || DMIDGenerator(that),\n that.weight,\n ].join(\",\"),\n };\n}\n\nexport const BiliGrpcAdapter = defineAdapter((bin: Uint8Array | ArrayBuffer) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const data = fromBinary(DmSegMobileReplySchema, new Uint8Array(bin));\n const json = data.elems;\n await chunk.upsertDanmakus(json.map((d) => BiliCommonParser(chunk, d)));\n return chunk;\n };\n});\n","import { defineAdapter } from \"../index.ts\";\n\nimport { BiliCommonParser } from \"./grpc.ts\";\n\ninterface DM_JSON_BiliUp {\n /** 接口状态码,0 表示成功 */\n code: number;\n /** 文本形式的状态码,约定为字符串 \"0\" */\n message: string;\n /** TTL(time to live) 标识,本接口常量为 1 */\n ttl: number;\n data: {\n /** 分页元信息 */\n page: {\n /** 当前页序号,从 1 开始 */\n num: number;\n /** 每页返回的弹幕条数 */\n size: number;\n /** 总页数 */\n total: number;\n };\n result: {\n /** 弹幕 ID,int64 */\n id: bigint;\n /** 弹幕 ID 字符串形式 */\n id_str: string;\n /** 弹幕类型:1 表示视频弹幕(当前接口恒为 1) */\n type: number;\n aid: bigint;\n bvid: string;\n oid: bigint;\n mid: bigint;\n /** 发送者 mid 的 CRC 哈希(正常接口里用的是这个,保护隐私) */\n mid_hash: string;\n /** 弹幕池 */\n pool: number;\n /** 属性位字符串,逗号分隔的数字列表,对应 attr 二进制位 */\n attrs: string;\n /** 弹幕出现时间,单位毫秒(注意,此处与protobuf接口保持一致,但xml中progress是秒) */\n progress: number;\n mode: number;\n /** 弹幕内容, content */\n msg: string;\n state: number; // ?\n fontsize: number;\n /** 弹幕颜色,需将16进制转化为普通弹幕的10进制,示例:\"ffffff\" */\n color: string;\n /** 发送时间戳,单位秒 */\n ctime: number;\n /** 发送者昵称 */\n uname: string;\n /** 发送者头像链接 */\n uface: string;\n /** 视频主标题 */\n title: string;\n self_seen: boolean; // 尽自己可见?\n /** 弹幕点赞数 */\n like_count: number;\n user_like: number; // ?\n /** 分 P 标题 */\n p_title: string;\n /** 视频封面链接 */\n cover: string;\n is_charge: boolean; // 该up是否开通充电计划?\n is_charge_plus: boolean; // 该up是否开通高级充电计划?\n following: boolean; // 当前登录用户是否关注该发送者?\n extra_cps: null; // ?\n }[];\n };\n}\n\nexport const BiliUpAdapter = defineAdapter((json: DM_JSON_BiliUp) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({}));\n await chunk.upsertDanmakus(\n json.data.result.map((d) => {\n // 处理 attrs 字符串转换为 attr 二进制\n // attrs 格式如 \"1,13,21\",每个数字对应二进制位\n const attrBin = d.attrs\n ? d.attrs\n .split(\",\")\n .map(Number)\n .reduce((bin, bitPosition) => bin | (1 << (bitPosition - 1)), 0)\n : 0;\n return BiliCommonParser(chunk, {\n id: BigInt(d.id_str || d.id),\n idStr: d.id_str,\n progress: d.progress,\n mode: d.mode,\n fontsize: d.fontsize,\n color: Number.parseInt(d.color, 16),\n mid: d.mid,\n midHash: d.mid_hash,\n content: d.msg,\n ctime: BigInt(d.ctime),\n pool: d.pool,\n // idStr: d.id_str,\n attr: attrBin,\n oid: BigInt(d.oid),\n });\n }),\n );\n return chunk;\n };\n});\n","import { defineTransformer, defineAdapter } from \"../index.ts\";\n\nimport { XMLParser } from \"fast-xml-parser\";\nimport { DanUniConvertTipTemplate, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { BiliCommonBuilder, BiliCommonParser } from \"./grpc.ts\";\nimport { PlatformVideoSource } from \"@/core/platform.ts\";\nimport XMLBuilder from \"fast-xml-builder\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\ninterface DM_XML_Bili {\n i: {\n chatserver: string;\n chatid: bigint;\n mission: number;\n maxlimit: number;\n state: number;\n real_name: number;\n source: string;\n d: {\n \"#text\": string;\n \"@_p\": string;\n }[];\n };\n}\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n isArray: (_name, jpath, _isLeafNode, _isAttribute) => {\n if (jpath === \"i.d\") return true;\n return false;\n },\n});\nconst builder = new XMLBuilder({ ignoreAttributes: false });\n\nfunction parseBiliSingle(p: string, c: string) {\n const p_arr = p.split(\",\");\n return {\n content: c,\n progress: ~~(Number.parseFloat(p_arr[0]) * 1000),\n mode: Number.parseInt(p_arr[1]),\n fontsize: Number.parseInt(p_arr[2]),\n color: Number.parseInt(p_arr[3]),\n ctime: BigInt(p_arr[4]),\n pool: Number.parseInt(p_arr[5]),\n midHash: p_arr[6],\n id: BigInt(p_arr[7]),\n idStr: p_arr[7],\n weight: Number.parseInt(p_arr[8]),\n };\n}\n\nexport const BiliXmlAdapter = defineAdapter((xml: string) => {\n return async (udb, uchunk) => {\n const oriData: DM_XML_Bili & { i: { danuni?: DanUniConvertTip } } = parser.parse(xml);\n const dans = oriData.i.d;\n const fromConverted = !!oriData.i.danuni;\n const cid = BigInt(oriData.i.chatid);\n const recSOID = fromConverted ? oriData.i.danuni?.data : undefined;\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted }));\n await chunk.upsertDanmakus(\n dans.map((d) => BiliCommonParser(chunk, parseBiliSingle(d[\"@_p\"], d[\"#text\"]), cid, recSOID)),\n );\n return chunk;\n };\n});\n\ninterface BiliXmlTransformerOptions {\n /**\n * 当SOID非来源bili时,若此处指定则使用该值为cid,否则使用SOID\n */\n cid?: bigint;\n /**\n * 跳过command类型的特殊弹幕\n */\n skipBiliCommand?: boolean;\n /**\n * 当仅含有来自bili的弹幕时,启用将保持发送者标识不含`@`\n * @description\n * bili的弹幕含midHash(crc),不启用该处使用senderID填充,启用则去除`@bili`部分,提高兼容性\n */\n avoidSenderIDWithAt?: boolean;\n}\n\nconst genCID = (id?: string, options?: BiliXmlTransformerOptions) => {\n if (id) {\n const uniID = UniID.fromStringSafe(id);\n if (uniID.domain === PlatformVideoSource.Bilibili) {\n const cid = uniID.id.replaceAll(`def_${PlatformVideoSource.Bilibili}+`, \"\");\n if (cid) return cid;\n }\n return options?.cid || id;\n } else return options?.cid || UniID.fromNull().toString();\n};\n\nexport const BiliXmlTransformerConfigurator = (options?: BiliXmlTransformerOptions) =>\n defineTransformer(async (udanmakus, ctx) => {\n const dans = await udanmakus;\n if (options?.avoidSenderIDWithAt) {\n const ok = dans.every((d) => d.senderID.endsWith(`@${PlatformVideoSource.Bilibili}`));\n if (!ok) throw new Error(\"存在其他来源的senderID,请关闭该功能再试!\");\n }\n let ds = dans.map((dan) => BiliCommonBuilder(ctx.DMIDGenerator, dan, options));\n if (options?.skipBiliCommand) ds = ds.filter((d) => d !== null);\n return builder.build({\n \"?xml\": {\n \"@_version\": \"1.0\",\n \"@_encoding\": \"UTF-8\",\n },\n i: {\n chatserver: \"chat.bilibili.com\",\n chatid: genCID(dans[0]?.SOID),\n mission: 0,\n maxlimit: dans.length,\n state: 0,\n real_name: 0,\n source: \"k-v\",\n danuni: { ...DanUniConvertTipTemplate, data: [...new Set(dans.map((d) => d.SOID))][0] },\n d: ds,\n },\n });\n });\n","import type { enumModeCodec } from \"@/adapters/index.ts\";\nimport type { z } from \"zod\";\n\nexport function transMode(\n oriMode: number,\n fmt: \"bili\" | \"dplayer\" | \"artplayer\" | \"ddplay\",\n): z.infer<typeof enumModeCodec.out> {\n let mode: z.infer<typeof enumModeCodec.out> = \"Normal\";\n switch (fmt) {\n case \"bili\":\n // 类型 1 2 3:普通弹幕 4:底部弹幕 5:顶部弹幕 6:逆向弹幕 7:高级弹幕 8:代码弹幕 9:BAS弹幕(pool必须为2)\n switch (oriMode) {\n case 4:\n mode = \"Bottom\";\n break;\n case 5:\n mode = \"Top\";\n break;\n case 6:\n mode = \"Reverse\";\n break;\n case 7:\n mode = \"Ext\";\n break;\n case 8:\n mode = \"Ext\";\n break;\n case 9:\n mode = \"Ext\";\n break;\n }\n break;\n\n case \"dplayer\":\n if (oriMode === 1) mode = \"Top\";\n else if (oriMode === 2) mode = \"Bottom\";\n break;\n\n case \"artplayer\":\n if (oriMode === 1) mode = \"Top\";\n else if (oriMode === 2) mode = \"Bottom\";\n break;\n\n case \"ddplay\":\n // 弹幕模式:1-普通弹幕,4-底部弹幕,5-顶部弹幕\n // 其适配为bili格式子集\n mode = transMode(oriMode, \"bili\");\n break;\n\n default:\n mode = \"Normal\";\n break;\n }\n return mode;\n}\n","import type { Extra } from \"@/core/dm-extra.ts\";\nimport { defineAdapter, defineTransformer } from \"./index.ts\";\n\nimport { DanUniConvertTipTemplate, defaultUniDM, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\nimport { transMode } from \"@/utils/transMode.ts\";\n\ninterface DM_JSON_Artplayer {\n danmuku: {\n text: string; // 弹幕文本\n time?: number; // 弹幕时间,默认为当前播放器时间 - 秒\n mode?: number; // 弹幕模式:0: 滚动 (默认),1: 顶部,2: 底部\n color?: string; // 弹幕颜色,默认为白色\n border?: boolean; // 弹幕是否有描边,默认为 false\n style?: {}; // 弹幕自定义样式,默认为空对象\n }[];\n}\n\nexport const ArtplayerAdapter = defineAdapter(\n (json: DM_JSON_Artplayer & { danuni?: DanUniConvertTip }, playerID: string, domain = \"other\") => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted: !!json.danuni }));\n const SOID = UniID.fromUnknown(playerID, domain).toString();\n const senderID = UniID.fromNull(domain).toString();\n const now = new Date();\n await chunk.upsertDanmakus(\n json.danmuku.map((args) => {\n let extra = args.border\n ? ({ artplayer: { border: args.border, style: {} } } as Extra)\n : null;\n if (args.style) {\n if (extra)\n extra = {\n ...extra,\n artplayer: { ...extra.artplayer, border: args.border, style: args.style },\n };\n else extra = { artplayer: { border: args.border, style: args.style } };\n }\n const mode = transMode(args.mode ?? 0, \"artplayer\");\n const map_d = {\n attr: defaultUniDM.attr,\n fontsize: defaultUniDM.fontsize,\n ctime: now,\n weight: defaultUniDM.weight,\n pool: \"Def\" as const,\n content: args.text,\n progress: (args.time ?? 0) * 1000,\n mode,\n color: Number((args.color || \"FFFFFF\").replace(\"#\", \"0x\")),\n style: args.style,\n SOID,\n senderID,\n platform: domain,\n extra,\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\nexport const ArtplayerTransformer = defineTransformer(\n (udanmakus): Promise<DM_JSON_Artplayer & { danuni?: DanUniConvertTip }> => {\n return udanmakus.then((dans) => ({\n danuni: {\n ...DanUniConvertTipTemplate,\n data: dans[0]?.SOID.split(\"@\")[0],\n },\n danmuku: dans.map((d) => {\n let mode = 0;\n if (d.mode === \"Top\") mode = 1;\n else if (d.mode === \"Bottom\") mode = 2;\n return {\n text: d.content,\n time: d.progress / 1000,\n mode: mode as 0 | 1 | 2,\n color: `#${d.color.toString(16).toUpperCase() || \"FFFFFF\"}`,\n border: d.extra?.artplayer?.border,\n style: d.extra?.artplayer?.style,\n };\n }),\n }));\n },\n);\n","import { defineAdapter, defineTransformer } from \"./index.ts\";\n\nimport { DanUniConvertTipTemplate, defaultUniDM, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { transMode } from \"@/utils/transMode.ts\";\nimport { PlatformDanmakuOnlySource } from \"@/core/platform.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\ninterface DM_JSON_DDPlay {\n count: number | string;\n comments: {\n cid: number;\n p: string;\n m: string;\n }[];\n}\n\nexport const DdplayAdapter = defineAdapter(\n (\n json: DM_JSON_DDPlay & { danuni?: DanUniConvertTip },\n episodeId: string,\n domain = PlatformDanmakuOnlySource.DanDanPlay,\n ) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted: !!json.danuni }));\n const SOID = UniID.fromUnknown(\n `def_${PlatformDanmakuOnlySource.DanDanPlay}+${episodeId}`,\n domain,\n ).toString();\n const now = new Date();\n await chunk.upsertDanmakus(\n json.comments.map((d) => {\n const p_arr = d.p.split(\",\");\n const uid = p_arr[3];\n const senderID = UniID.fromUnknown(uid, domain).toString();\n const mode = transMode(Number.parseInt(p_arr[1]), \"ddplay\");\n const map_d = {\n SOID,\n color: Number.parseInt(p_arr[2]),\n progress: Number.parseFloat(p_arr[0]) * 1000,\n mode,\n senderID,\n content: d.m,\n platform: domain,\n extra: { ddplay: { cid: d.cid, uid } },\n attr: defaultUniDM.attr,\n fontsize: defaultUniDM.fontsize,\n ctime: now,\n weight: defaultUniDM.weight,\n pool: \"Def\" as const,\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\nexport const DdplayTransformer = defineTransformer(\n (udanmakus): Promise<DM_JSON_DDPlay & { danuni?: DanUniConvertTip }> => {\n return udanmakus.then((dans) => ({\n danuni: {\n ...DanUniConvertTipTemplate,\n data: dans[0]?.SOID.split(\"@\")[0].replaceAll(\n `def_${PlatformDanmakuOnlySource.DanDanPlay}+`,\n \"\",\n ),\n },\n count: dans.length,\n comments: dans.map((dan) => {\n let mode = 1;\n if (dan.mode === \"Top\") mode = 5;\n else if (dan.mode === \"Bottom\") mode = 4;\n return {\n cid:\n dan.extra?.ddplay?.cid ??\n Number.parseInt(`0x${Buffer.from(dan.DMID).toString(\"hex\")}`) ??\n 0,\n p: `${dan.progress / 1000},${mode},${dan.color},${dan.extra?.ddplay?.uid ?? dan.senderID}`,\n m: dan.content,\n };\n }),\n }));\n },\n);\n","import { defineAdapter, defineTransformer } from \"./index.ts\";\n\nimport { DanUniConvertTipTemplate, defaultUniDM, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\nimport { transMode } from \"@/utils/transMode.ts\";\n\ninterface DM_JSON_Dplayer {\n code: number;\n /**\n * progress,mode,color,midHash,content\n */\n data: [number, number, number, string, string][];\n}\n\nexport const DplayerAdapter = defineAdapter(\n (\n json: DM_JSON_Dplayer & { danuni?: DanUniConvertTip },\n playerID: string,\n domain: string = \"other\",\n ) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted: !!json.danuni }));\n const SOID = UniID.fromUnknown(playerID, domain).toString();\n const now = new Date();\n await chunk.upsertDanmakus(\n json.data.map(([progress, ori_mode, color, midHash, content]) => {\n const mode = transMode(ori_mode, \"dplayer\");\n const map_d = {\n attr: defaultUniDM.attr,\n fontsize: defaultUniDM.fontsize,\n ctime: now,\n weight: defaultUniDM.weight,\n extra: defaultUniDM.extra,\n pool: \"Def\" as const,\n progress: progress * 1000,\n mode,\n color,\n midHash,\n content,\n SOID,\n senderID: UniID.fromUnknown(midHash, domain).toString(),\n platform: domain,\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\nexport const DplayerTransformer = defineTransformer(\n (udanmakus): Promise<DM_JSON_Dplayer & { danuni?: DanUniConvertTip }> => {\n return udanmakus.then((dans) => ({\n code: 0,\n danuni: {\n ...DanUniConvertTipTemplate,\n data: dans[0]?.SOID.split(\"@\")[0],\n },\n data: dans.map((dan) => {\n let mode = 0;\n if (dan.mode === \"Top\") mode = 1;\n else if (dan.mode === \"Bottom\") mode = 2;\n return [dan.progress / 1000, mode, dan.color, dan.senderID, dan.content];\n }),\n }));\n },\n);\n","import { UniChunk, type AdapterStore, type DMIDGenerator, type InitedUniDB } from \"@/core/index.ts\";\nimport type { Promisable } from \"type-fest\";\n\nexport type TransformerInput = InitedUniDB | UniChunk;\nexport function transformerInput2Danmakus(input: TransformerInput) {\n return input.$danmakus;\n}\n\nexport type UDanmaku = Awaited<ReturnType<typeof transformerInput2Danmakus>>[number];\n\nexport type Adapter<Args extends unknown[] = unknown[]> = (\n ...args: Args\n) => Promisable<AdapterStore>;\nexport type Transformer<T = unknown> = (\n udanmakus: ReturnType<typeof transformerInput2Danmakus>,\n ctx: {\n uchunk?: Awaited<ReturnType<typeof UniChunk.prototype.$chunk>>;\n DMIDGenerator: DMIDGenerator;\n },\n) => Promisable<T>;\nexport type Plugin<T = unknown> = (uchunk: UniChunk) => Promisable<T>;\n\nexport function defineAdapter<T extends (...args: any[]) => Promisable<AdapterStore>>(adapter: T) {\n return adapter;\n}\nexport function defineTransformer<T extends Transformer>(transformer: T) {\n return transformer;\n}\nexport function definePlugin<T extends Plugin>(plugin: T) {\n return plugin;\n}\n\nexport * from \"./danuni/json.ts\";\nexport * from \"./danuni/pb.ts\";\nexport * from \"./bili/command-grpc.ts\";\nexport * from \"./bili/grpc.ts\";\nexport * from \"./bili/up.ts\";\nexport * from \"./bili/xml.ts\";\nexport * from \"./artplayer.ts\";\nexport * from \"./ddplay.ts\";\nexport * from \"./dplayer.ts\";\n","import { sha3_256 } from \"@noble/hashes/sha3.js\";\nimport { z } from \"zod\";\nimport { JSON } from \"@/utils/bigint.ts\";\nimport { bytesToHex, utf8ToBytes } from \"@noble/hashes/utils.js\";\nimport { enumModeCodec, enumPoolCodec } from \"@/adapters/index.ts\";\nimport type { Extra } from \"./dm-extra.ts\";\n\ninterface DMIDGeneratorDanmaku {\n content: string;\n mode: z.infer<typeof enumModeCodec.out>;\n pool: z.infer<typeof enumPoolCodec.out>;\n platform?: string | null;\n extra: Extra | null;\n senderID: string;\n ctime: Date;\n}\nexport type DMIDGenerator = (dan: DMIDGeneratorDanmaku, slice?: number) => string;\n\nexport const createDMID: DMIDGenerator = (dan: DMIDGeneratorDanmaku, slice = 8) => {\n const raw = `${dan.content}|${dan.mode}|${dan.pool}|${dan.platform ?? null}|${JSON.stringify(dan.extra)}|${dan.senderID}|${dan.ctime.toISOString()}`;\n const data = utf8ToBytes(raw);\n const digest = sha3_256.create().update(data).digest();\n const str = bytesToHex(digest);\n return str.slice(0, slice);\n};\n","import type { Plugin, Transformer, TransformerInput } from \"@/adapters/index.ts\";\nimport { closeDb, db, dumpDb, initDb } from \"./db/index.ts\";\nimport {\n chunks as chunksTable,\n chunksZod,\n danmakus,\n chunk2danmakus,\n onConflictDoUpdate,\n type DanmakusInsert,\n} from \"./db/schema.ts\";\nimport { eq } from \"drizzle-orm\";\nimport type { Asyncify, Promisable, Simplify } from \"type-fest\";\nimport { createDMID, type DMIDGenerator } from \"./id.ts\";\nimport type { z } from \"zod\";\n\nexport type AdapterStore = (udb: InitedUniDB, uchunk?: UniChunk) => Promisable<UniChunk>;\n\nexport class UniDB {\n constructor(\n public $drizzle = db,\n public DMIDGenerator: DMIDGenerator = createDMID,\n ) {}\n async init(dump?: File) {\n return new InitedUniDB(await initDb(dump), this.DMIDGenerator);\n }\n async dump() {\n const dump = await dumpDb(this.$drizzle!);\n return dump;\n }\n async close() {\n this.$drizzle = null;\n await closeDb();\n }\n}\n\nexport class InitedUniDB extends UniDB {\n constructor(\n public $drizzle: NonNullable<UniDB[\"$drizzle\"]>,\n public DMIDGenerator: DMIDGenerator = createDMID,\n ) {\n super($drizzle, DMIDGenerator);\n }\n get $db() {\n return this.$drizzle;\n }\n get $chunks() {\n return this.$db.query.chunks.findMany();\n }\n get $danmakus() {\n return this.$db.query.chunks\n .findFirst({\n with: {\n danmakus: true,\n },\n })\n .then((data) => data?.danmakus ?? []);\n }\n async listChunks() {\n const cs = await this.$chunks;\n return cs.map((c) => new UniChunk(this, c.id));\n }\n async makeChunk(data: z.infer<typeof chunksZod>) {\n return UniChunk.makeChunk(this, data);\n }\n async upsertDanmakus(data: DanmakusInsert[]) {\n await this.$db.insert(danmakus).values(data).onConflictDoUpdate(onConflictDoUpdate.danmakus);\n }\n /**\n * 清理临时chunks\n */\n async shrink() {\n const uchunks = await this.$db.query.chunks.findMany({\n where: {\n tmp: true,\n },\n });\n for (const c of uchunks) await new UniChunk(this, c.id).delete();\n }\n async import(adapterStore: AdapterStore) {\n return adapterStore(this);\n }\n export<T extends Transformer>(transformer: T): ReturnType<T>;\n async export<T extends Asyncify<Transformer>>(transformer: T): Promise<ReturnType<T>>;\n export<T extends Transformer | Asyncify<Transformer>>(transformer: T): Promisable<ReturnType<T>> {\n return <ReturnType<T>>transformer(this.$danmakus, { DMIDGenerator: this.DMIDGenerator });\n }\n}\n\nexport class UniChunk {\n constructor(\n public $UniDB: InitedUniDB,\n public id: number,\n ) {}\n get $db() {\n return this.$UniDB.$drizzle;\n }\n static async makeChunk(u: TransformerInput, data: z.infer<typeof chunksZod>) {\n const chunk = await u.$db.insert(chunksTable).values(data).returning();\n return new UniChunk(u instanceof InitedUniDB ? u : u.$UniDB, chunk[0].id);\n }\n /**\n * 合并弹幕库\n * @description 将多个chunk的弹幕合并到base chunk中,合并后原chunk会被删除\n * @param base 目标chunk,合并后其他chunk的弹幕会被移到这个chunk中\n * @param chunks 待合并的chunk列表,这些chunk中的弹幕会被移到base chunk中,合并后这些chunk会被删除\n * @returns 合并后的目标chunk实例\n * @throws 如果chunks列表为空,函数会直接返回base chunk;如果目标chunk在数据库中未找到,会抛出错误;如果chunks中有来自不同数据库的chunk且options.allowDifferentDB为false,也会抛出错误\n */\n static async assign(base: UniChunk, chunks: UniChunk[]) {\n if (chunks.length < 1) return base;\n const baseDB = base.$UniDB;\n const drizzle = baseDB.$drizzle;\n const targetId = base.id;\n const targetRow = await base.$chunk();\n let newFromConverted = targetRow.fromConverted;\n for (const c of chunks) {\n const srcChunkRow = await c.$chunk();\n newFromConverted = newFromConverted && !!srcChunkRow.fromConverted;\n const srcDanmakus = await c.$danmakus;\n await base.upsertDanmakus(srcDanmakus, false);\n await c.delete();\n }\n await drizzle\n .update(chunksTable)\n .set({ fromConverted: newFromConverted })\n .where(eq(chunksTable.id, targetId));\n return new UniChunk(baseDB, targetId);\n }\n /**\n * 比较两个chunk的弹幕是否相同\n * @description 可用于跨DB比较\n */\n static async compare(u1: UniChunk, u2: UniChunk) {\n const dms1 = await u1.$danmakus;\n const dms2 = await u2.$danmakus;\n if (dms1.length !== dms2.length) return false;\n const dmidSet = new Set<string>();\n for (const dm of dms1) {\n dmidSet.add(dm.DMID);\n }\n for (const dm of dms2) {\n const target = dmidSet.has(dm.DMID);\n if (!target) return false;\n if (JSON.stringify(target) !== JSON.stringify(dm)) return false;\n }\n return true;\n }\n /**\n * 获取当前chunk的数据库记录\n * @description 虽然数组仅会包含一个值,但这里保持数据库原始返回\n */\n get $chunks() {\n return this.$db.select().from(chunksTable).where(eq(chunksTable.id, this.id));\n }\n async $chunk() {\n const c = await this.$chunks;\n return c[0];\n }\n get $danmakus() {\n return this.$db.query.chunks\n .findFirst({\n where: {\n id: this.id,\n },\n with: {\n danmakus: true,\n },\n })\n .then((data) => data?.danmakus ?? []);\n }\n async upsertDanmakus(\n data: Simplify<DanmakusInsert & { DMID: string }>[],\n autoSetDMID?: false,\n ): Promise<void>;\n async upsertDanmakus(\n data: Simplify<DanmakusInsert & { DMID?: undefined }>[],\n autoSetDMID: true,\n ): Promise<void>;\n async upsertDanmakus(data: (DanmakusInsert & { DMID?: string })[], autoSetDMID = false) {\n if (autoSetDMID) data = data.map((d) => ({ ...d, DMID: this.$UniDB.DMIDGenerator(d) }));\n // 写入/更新 danmakus 表\n await this.$UniDB.upsertDanmakus(data);\n await this.$db\n .insert(chunk2danmakus)\n .values(data.map((d) => ({ chunkID: this.id, DMID: d.DMID })))\n .onConflictDoNothing();\n }\n async import(adapterStore: AdapterStore) {\n const chunk = await adapterStore(this.$UniDB, this);\n return chunk;\n }\n async export<T extends Transformer | Asyncify<Transformer>>(\n transformer: T,\n ): Promise<ReturnType<T>> {\n // transformer 格式转换器 不应对数据库执行任何写操作\n return <ReturnType<T>>transformer(this.$danmakus, {\n DMIDGenerator: this.$UniDB.DMIDGenerator,\n uchunk: await this.$chunk(),\n });\n }\n plugin<T extends Plugin>(plugin: T): ReturnType<T>;\n async plugin<T extends Asyncify<Plugin>>(plugin: T): Promise<ReturnType<T>>;\n plugin<T extends Plugin | Asyncify<Plugin>>(plugin: T): Promisable<ReturnType<T>> {\n const output = <ReturnType<T>>plugin(this);\n return output;\n }\n async delete() {\n await this.$db.transaction(async (tx) => {\n // 1) 查询当前 chunk 对应的 DMID 列表\n const maps = await tx\n .select()\n .from(chunk2danmakus)\n .where(eq(chunk2danmakus.chunkID, this.id));\n const DMIDs = maps.map((m) => m.DMID);\n // 2) 删除映射关系\n await tx.delete(chunk2danmakus).where(eq(chunk2danmakus.chunkID, this.id));\n // 3) 对于不再被任何 chunk 引用的弹幕,删除它们\n for (const id of DMIDs) {\n const still = await tx.select().from(chunk2danmakus).where(eq(chunk2danmakus.DMID, id));\n if (still.length === 0) {\n await tx.delete(danmakus).where(eq(danmakus.DMID, id));\n }\n }\n // 4) 删除 chunk 本身\n await tx.delete(chunksTable).where(eq(chunksTable.id, this.id));\n });\n }\n}\n\nexport * from \"./dm.ts\";\nexport * from \"./id.ts\";\nexport * from \"./platform.ts\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"core-BsUKRX1y.mjs","names":["JSON","JSON","enumModeCodec","enumPoolCodec","DanuniPbMode","DanuniPbPool","JSON","enumModeCodec","enumPoolCodec","JSON","chunksTable","chunks"],"sources":["../src/utils/bigint.ts","../src/utils/modeExtCheck.ts","../src/utils/migrations/v2/extra.ts","../src/utils/migrations/v2/progress.ts","../src/adapters/danuni/json.ts","../src/utils/proto/gen/danuni/danmaku/v1/danmaku_pb.ts","../src/adapters/danuni/pb.ts","../src/utils/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts","../src/adapters/bili/command-grpc.ts","../src/utils/transCtime.ts","../src/utils/bin.ts","../src/adapters/bili/grpc.ts","../src/adapters/bili/up.ts","../src/adapters/bili/xml.ts","../src/utils/transMode.ts","../src/adapters/artplayer.ts","../src/adapters/ddplay.ts","../src/adapters/dplayer.ts","../src/adapters/index.ts","../src/core/id.ts","../src/core/index.ts"],"sourcesContent":["import JSONbig from \"json-bigint\";\n\nexport const JSON = JSONbig({\n useNativeBigInt: true,\n});\n","import { ModeSchema } from \"@/core/db/schema.ts\";\nimport type { Extra, ExtraBili } from \"@/core/dm-extra.ts\";\nimport { z } from \"zod\";\n\ninterface ModeExtCheckDanmaku {\n mode: z.infer<typeof ModeSchema>;\n extra: Extra | null;\n}\n\nconst checkExtraBili = (obj?: ExtraBili) =>\n obj ? ([\"adv\", \"bas\", \"code\", \"command\"] as (keyof ExtraBili)[]).some((k) => obj[k]) : false;\n\n/**\n * 检查特殊弹幕(extra非普通弹幕扩展分区,即 extra.danuni.merge与extra.bili中的共通部分 以外)的弹幕是否正确设置了Ext模式\n * @param danmaku 待检查的弹幕对象\n * @returns 是否存在模式与extra不匹配的情况\n */\nexport function modeExtCheck(danmaku: ModeExtCheckDanmaku) {\n if (danmaku.mode !== \"Ext\" && danmaku.extra) {\n if (danmaku.extra.artplayer || checkExtraBili(danmaku.extra.bili)) {\n danmaku.mode = \"Ext\"; // 若传入引用则判断后自动修改,否则需手动修改\n return true;\n }\n }\n return false;\n}\n","/**\n * 将 v1 版本的 extraStr 转换为新的 extra 格式\n * - extraStr -> extra\n * - extra.bili.dmid extra.bili.mid : bigint -> string\n */\n\nimport type { Extra, ExtraBili } from \"@/core/dm-extra.ts\";\nimport { JSON } from \"@/utils/bigint.ts\";\nimport type { Simplify } from \"type-fest\";\n\ntype V1_ExtraBili = Omit<ExtraBili, \"dmid\" | \"mid\"> & {\n dmid?: bigint;\n mid?: bigint;\n};\nexport type V1_Extra = Simplify<\n Omit<Extra, \"bili\"> & {\n bili?: V1_ExtraBili;\n }\n>;\n\nexport function migrateToV2Extra(extraStr: string): Extra {\n const extra: V1_Extra = JSON.parse(extraStr);\n return {\n ...extra,\n bili: extra.bili\n ? { ...extra.bili, dmid: extra.bili.dmid?.toString(), mid: extra.bili.mid?.toString() }\n : undefined,\n } satisfies Extra;\n}\n","import { z } from \"zod\";\n\nconst progressV1Zod = z.float32();\nconst progressV2Zod = z.int();\n\nexport function migrateToV2Progress(\n progressV1: z.infer<typeof progressV1Zod>,\n): z.infer<typeof progressV2Zod> {\n return progressV2Zod.parse(~~(progressV1Zod.parse(progressV1) * 1000));\n}\n","import { danmakus } from \"@/core/db/schema.ts\";\nimport { defineTransformer, defineAdapter, type Transformer } from \"../index.ts\";\nimport { defaultUniDM, DMAttr, Modes, Pools, type UniDMObj } from \"@/core/dm.ts\";\nimport { z } from \"zod\";\nimport { modeExtCheck } from \"@/utils/modeExtCheck.ts\";\n\nimport { migrateToV2Extra } from \"@/utils/migrations/v2/extra.ts\";\nimport { migrateToV2Progress } from \"@/utils/migrations/v2/progress.ts\";\n\nexport const enumModeCodec = z.codec(\n z.enum(Modes).default(Modes.Normal),\n z.enum(danmakus.mode.enumValues),\n {\n decode: (danuniMode) => danmakus.mode.enumValues[danuniMode] || \"Normal\",\n encode: (dbMode) => Modes[dbMode] || Modes.Normal,\n },\n);\nexport const enumPoolCodec = z.codec(\n z.enum(Pools).default(Pools.Def),\n z.enum(danmakus.pool.enumValues),\n {\n decode: (danuniPool) => danmakus.pool.enumValues[danuniPool] || \"Def\",\n encode: (dbPool) => Pools[dbPool] || Pools.Def,\n },\n);\nexport const enumAttrsCodec = z.codec(\n z.enum(DMAttr).array(),\n z.enum(danmakus.attr.enumValues).array(),\n {\n decode: (danuniAttrs) => danuniAttrs,\n encode: (dbAttrs) => dbAttrs.map((attr) => DMAttr[attr]),\n },\n);\n\nfunction isV1(\n json: Partial<UniDMObj> & { extraStr?: string },\n): json is Partial<UniDMObj> & { extraStr: string } {\n const progressIsV1 = !Number.isInteger(json.progress);\n const extraIsV1 = typeof json.extraStr === \"string\";\n return progressIsV1 || extraIsV1;\n}\n\nexport const DanuniJsonAdapter = defineAdapter(\n (json: Partial<UniDMObj & { extraStr?: string }>[]) => {\n return async (udb, uchunk) => {\n const now = new Date();\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const isV1Fmt = json.some((d) => isV1(d));\n await chunk.upsertDanmakus(\n json.map((d) => {\n const map_d = {\n SOID: d.SOID || defaultUniDM.SOID,\n progress: d.progress\n ? isV1Fmt\n ? migrateToV2Progress(d.progress)\n : d.progress\n : defaultUniDM.progress,\n mode: enumModeCodec.decode(d.mode),\n fontsize: d.fontsize ?? defaultUniDM.fontsize,\n color: d.color ?? defaultUniDM.color,\n senderID: d.senderID || defaultUniDM.senderID,\n content: d.content ?? defaultUniDM.content,\n ctime: d.ctime ? new Date(d.ctime) : now,\n weight: d.weight ?? defaultUniDM.weight,\n pool: enumPoolCodec.decode(d.pool),\n attr: d.attr ? enumAttrsCodec.decode(d.attr) : defaultUniDM.attr,\n platform: d.platform ?? defaultUniDM.platform,\n extra: d.extra ?? (d.extraStr ? migrateToV2Extra(d.extraStr) : defaultUniDM.extra),\n };\n modeExtCheck(map_d);\n return {\n ...map_d,\n DMID: !isV1Fmt && d.DMID ? d.DMID : chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\ninterface DanuniJsonTransformerOptions {\n /**\n * 是否启用minify模式,启用后会将输出中与默认值相同的字段转为undefined(DMID除外),以减小输出体积\n */\n minify?: boolean;\n}\n\nexport function DanuniJsonTransformerConfigurator(\n options: DanuniJsonTransformerOptions & { minify: true },\n): Transformer<Promise<Partial<UniDMObj>[]>>;\nexport function DanuniJsonTransformerConfigurator(\n options?: DanuniJsonTransformerOptions,\n): Transformer<Promise<UniDMObj[]>>;\nexport function DanuniJsonTransformerConfigurator(\n options?: DanuniJsonTransformerOptions,\n): Transformer {\n return defineTransformer((udanmakus) =>\n udanmakus.then((data) => {\n if (options?.minify) {\n return data.map((d) => ({\n SOID: d.SOID === defaultUniDM.SOID ? undefined : d.SOID,\n progress: d.progress === defaultUniDM.progress ? undefined : d.progress,\n mode: d.mode === \"Normal\" ? undefined : enumModeCodec.encode(d.mode),\n fontsize: d.fontsize === defaultUniDM.fontsize ? undefined : d.fontsize,\n color: d.color === defaultUniDM.color ? undefined : d.color,\n senderID: d.senderID === defaultUniDM.senderID ? undefined : d.senderID,\n content: d.content === defaultUniDM.content ? undefined : d.content,\n ctime: d.ctime,\n weight: d.weight === defaultUniDM.weight ? undefined : d.weight,\n pool: d.pool === \"Def\" ? undefined : enumPoolCodec.encode(d.pool),\n attr: d.attr && d.attr.length > 0 ? enumAttrsCodec.encode(d.attr) : undefined,\n platform: d.platform ?? undefined,\n extra: d.extra ?? undefined,\n DMID: d.DMID,\n }));\n } else\n return data.map((d) => ({\n ...d,\n mode: enumModeCodec.encode(d.mode)!,\n pool: enumPoolCodec.encode(d.pool)!,\n attr: enumAttrsCodec.encode(d.attr),\n }));\n }),\n );\n}\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts\"\n// @generated from file danuni/danmaku/v1/danmaku.proto (package danuni.danmaku.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenEnum, GenFile, GenMessage, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Timestamp } from \"@bufbuild/protobuf/wkt\";\nimport { file_google_protobuf_timestamp } from \"@bufbuild/protobuf/wkt\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file danuni/danmaku/v1/danmaku.proto.\n */\nexport const file_danuni_danmaku_v1_danmaku: GenFile = /*@__PURE__*/\n fileDesc(\"Ch9kYW51bmkvZGFubWFrdS92MS9kYW5tYWt1LnByb3RvEhFkYW51bmkuZGFubWFrdS52MSI2Cg5MaXN0RGFuUmVxdWVzdBIKCgJpZBgBIAEoCRIQCgNzZWcYAiABKAVIAIgBAUIGCgRfc2VnIpMDCgdEYW5tYWt1EhIKBHNvaWQYASABKAlSBFNPSUQSEgoEZG1pZBgCIAEoCVIERE1JRBIQCghwcm9ncmVzcxgDIAEoBRIlCgRtb2RlGAQgASgOMhcuZGFudW5pLmRhbm1ha3UudjEuTW9kZRIQCghmb250c2l6ZRgFIAEoBRINCgVjb2xvchgGIAEoBRIbCglzZW5kZXJfaWQYByABKAlSCHNlbmRlcklEEg8KB2NvbnRlbnQYCCABKAkSKQoFY3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg4KBndlaWdodBgKIAEoBRIlCgRwb29sGAsgASgOMhcuZGFudW5pLmRhbm1ha3UudjEuUG9vbBIMCgRhdHRyGAwgAygJEhUKCHBsYXRmb3JtGA0gASgJSACIAQESGQoIZXh0cmFfdjEYDiABKAlCAhgBSAGIAQESEgoFZXh0cmEYDyABKAlIAogBAUILCglfcGxhdGZvcm1CCwoJX2V4dHJhX3YxQggKBl9leHRyYSI/Cg9MaXN0RGFuUmVzcG9uc2USLAoIZGFubWFrdXMYASADKAsyGi5kYW51bmkuZGFubWFrdS52MS5EYW5tYWt1KmIKBE1vZGUSGwoXTU9ERV9OT1JNQUxfVU5TUEVDSUZJRUQQABIPCgtNT0RFX0JPVFRPTRABEgwKCE1PREVfVE9QEAISEAoMTU9ERV9SRVZFUlNFEAMSDAoITU9ERV9FWFQQBCpJCgRQb29sEhgKFFBPT0xfREVGX1VOU1BFQ0lGSUVEEAASDAoIUE9PTF9TVUIQARIMCghQT09MX0FEVhACEgsKB1BPT0xfSVgQAzJkCg5EYW5tYWt1U2VydmljZRJSCgdMaXN0RGFuEiEuZGFudW5pLmRhbm1ha3UudjEuTGlzdERhblJlcXVlc3QaIi5kYW51bmkuZGFubWFrdS52MS5MaXN0RGFuUmVzcG9uc2UiAEKLAQoVY29tLmRhbnVuaS5kYW5tYWt1LnYxQgxEYW5tYWt1UHJvdG9QAaICA0REWKoCEURhbnVuaS5EYW5tYWt1LlYxygIRRGFudW5pXERhbm1ha3VcVjHiAh1EYW51bmlcRGFubWFrdVxWMVxHUEJNZXRhZGF0YeoCE0RhbnVuaTo6RGFubWFrdTo6VjFiBnByb3RvMw\", [file_google_protobuf_timestamp]);\n\n/**\n * @generated from message danuni.danmaku.v1.ListDanRequest\n */\nexport type ListDanRequest = Message<\"danuni.danmaku.v1.ListDanRequest\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: optional int32 seg = 2;\n */\n seg?: number | undefined;\n};\n\n/**\n * Describes the message danuni.danmaku.v1.ListDanRequest.\n * Use `create(ListDanRequestSchema)` to create a new message.\n */\nexport const ListDanRequestSchema: GenMessage<ListDanRequest> = /*@__PURE__*/\n messageDesc(file_danuni_danmaku_v1_danmaku, 0);\n\n/**\n * @generated from message danuni.danmaku.v1.Danmaku\n */\nexport type Danmaku = Message<\"danuni.danmaku.v1.Danmaku\"> & {\n /**\n * @generated from field: string soid = 1 [json_name = \"SOID\"];\n */\n soid: string;\n\n /**\n * @generated from field: string dmid = 2 [json_name = \"DMID\"];\n */\n dmid: string;\n\n /**\n * @generated from field: int32 progress = 3;\n */\n progress: number;\n\n /**\n * @generated from field: danuni.danmaku.v1.Mode mode = 4;\n */\n mode: Mode;\n\n /**\n * @generated from field: int32 fontsize = 5;\n */\n fontsize: number;\n\n /**\n * @generated from field: int32 color = 6;\n */\n color: number;\n\n /**\n * @generated from field: string sender_id = 7 [json_name = \"senderID\"];\n */\n senderId: string;\n\n /**\n * @generated from field: string content = 8;\n */\n content: string;\n\n /**\n * @generated from field: google.protobuf.Timestamp ctime = 9;\n */\n ctime?: Timestamp | undefined;\n\n /**\n * @generated from field: int32 weight = 10;\n */\n weight: number;\n\n /**\n * @generated from field: danuni.danmaku.v1.Pool pool = 11;\n */\n pool: Pool;\n\n /**\n * @generated from field: repeated string attr = 12;\n */\n attr: string[];\n\n /**\n * @generated from field: optional string platform = 13;\n */\n platform?: string | undefined;\n\n /**\n * @generated from field: optional string extra_v1 = 14 [deprecated = true];\n * @deprecated\n */\n extraV1?: string | undefined;\n\n /**\n * @generated from field: optional string extra = 15;\n */\n extra?: string | undefined;\n};\n\n/**\n * Describes the message danuni.danmaku.v1.Danmaku.\n * Use `create(DanmakuSchema)` to create a new message.\n */\nexport const DanmakuSchema: GenMessage<Danmaku> = /*@__PURE__*/\n messageDesc(file_danuni_danmaku_v1_danmaku, 1);\n\n/**\n * @generated from message danuni.danmaku.v1.ListDanResponse\n */\nexport type ListDanResponse = Message<\"danuni.danmaku.v1.ListDanResponse\"> & {\n /**\n * @generated from field: repeated danuni.danmaku.v1.Danmaku danmakus = 1;\n */\n danmakus: Danmaku[];\n};\n\n/**\n * Describes the message danuni.danmaku.v1.ListDanResponse.\n * Use `create(ListDanResponseSchema)` to create a new message.\n */\nexport const ListDanResponseSchema: GenMessage<ListDanResponse> = /*@__PURE__*/\n messageDesc(file_danuni_danmaku_v1_danmaku, 2);\n\n/**\n * 此处作为数字应与danuni库相应类型一一对应\n *\n * @generated from enum danuni.danmaku.v1.Mode\n */\nexport enum Mode {\n /**\n * @generated from enum value: MODE_NORMAL_UNSPECIFIED = 0;\n */\n NORMAL_UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: MODE_BOTTOM = 1;\n */\n BOTTOM = 1,\n\n /**\n * @generated from enum value: MODE_TOP = 2;\n */\n TOP = 2,\n\n /**\n * @generated from enum value: MODE_REVERSE = 3;\n */\n REVERSE = 3,\n\n /**\n * @generated from enum value: MODE_EXT = 4;\n */\n EXT = 4,\n}\n\n/**\n * Describes the enum danuni.danmaku.v1.Mode.\n */\nexport const ModeSchema: GenEnum<Mode> = /*@__PURE__*/\n enumDesc(file_danuni_danmaku_v1_danmaku, 0);\n\n/**\n * 此处作为数字应与danuni库相应类型一一对应\n *\n * @generated from enum danuni.danmaku.v1.Pool\n */\nexport enum Pool {\n /**\n * @generated from enum value: POOL_DEF_UNSPECIFIED = 0;\n */\n DEF_UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: POOL_SUB = 1;\n */\n SUB = 1,\n\n /**\n * @generated from enum value: POOL_ADV = 2;\n */\n ADV = 2,\n\n /**\n * @generated from enum value: POOL_IX = 3;\n */\n IX = 3,\n}\n\n/**\n * Describes the enum danuni.danmaku.v1.Pool.\n */\nexport const PoolSchema: GenEnum<Pool> = /*@__PURE__*/\n enumDesc(file_danuni_danmaku_v1_danmaku, 1);\n\n/**\n * @generated from service danuni.danmaku.v1.DanmakuService\n */\nexport const DanmakuService: GenService<{\n /**\n * @generated from rpc danuni.danmaku.v1.DanmakuService.ListDan\n */\n listDan: {\n methodKind: \"unary\";\n input: typeof ListDanRequestSchema;\n output: typeof ListDanResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_danuni_danmaku_v1_danmaku, 0);\n\n","import {\n Mode as DanuniPbMode,\n Pool as DanuniPbPool,\n} from \"@/utils/proto/gen/danuni/danmaku/v1/danmaku_pb.ts\";\n\nimport { create, fromBinary, toBinary } from \"@bufbuild/protobuf\";\nimport { timestampDate, timestampFromDate, timestampNow } from \"@bufbuild/protobuf/wkt\";\n\nimport { ListDanResponseSchema } from \"@/utils/proto/gen/danuni/danmaku/v1/danmaku_pb.ts\";\nimport { defineAdapter, defineTransformer } from \"../index.ts\";\nimport { danmakus } from \"@/core/db/schema.ts\";\nimport { z } from \"zod\";\n\nimport { JSON } from \"@/utils/bigint.ts\";\nimport { migrateToV2Extra } from \"@/utils/migrations/v2/extra.ts\";\n\nconst enumModeCodec = z.codec(z.enum(DanuniPbMode), z.enum(danmakus.mode.enumValues), {\n decode: (danuniPbMode) => danmakus.mode.enumValues[danuniPbMode] || \"Normal\",\n encode: (dbMode) => {\n const i = danmakus.mode.enumValues.indexOf(dbMode);\n return i === -1 ? DanuniPbMode.NORMAL_UNSPECIFIED : i;\n },\n});\nconst enumPoolCodec = z.codec(z.enum(DanuniPbPool), z.enum(danmakus.pool.enumValues), {\n decode: (danuniPbPool) => danmakus.pool.enumValues[danuniPbPool] || \"Def\",\n encode: (dbPool) => {\n const i = danmakus.pool.enumValues.indexOf(dbPool);\n return i === -1 ? DanuniPbPool.DEF_UNSPECIFIED : i;\n },\n});\n\nexport const DanuniPbAdapter = defineAdapter((bin: Uint8Array | ArrayBuffer) => {\n return async (udb, uchunk) => {\n const data = fromBinary(ListDanResponseSchema, new Uint8Array(bin));\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const isV1Fmt = data.danmakus.some((d) => d.extraV1);\n await chunk.upsertDanmakus(\n data.danmakus.map((d) => {\n const map_d = {\n ...d,\n SOID: d.soid,\n DMID: d.dmid,\n // progress: d.progress,\n mode: enumModeCodec.decode(d.mode),\n // fontsize: d.fontsize,\n // color: d.color,\n senderID: d.senderId,\n // content: d.content,\n ctime: timestampDate(d.ctime || timestampNow()),\n // weight: d.weight,\n pool: enumPoolCodec.decode(d.pool),\n attr: z.enum(danmakus.attr.enumValues).array().parse(d.attr),\n // platform: d.platform,\n extra: d.extra\n ? JSON.parse(d.extra)\n : d.extraV1\n ? migrateToV2Extra(d.extraV1)\n : undefined,\n };\n if (isV1Fmt) return { ...map_d, DMID: chunk.$UniDB.DMIDGenerator(map_d) };\n else return map_d;\n }),\n );\n return chunk;\n };\n});\n\nexport const DanuniPbTransformer = defineTransformer((udanmakus): Promise<Uint8Array> => {\n return udanmakus.then((data) =>\n toBinary(\n ListDanResponseSchema,\n create(ListDanResponseSchema, {\n danmakus: data.map((d) => ({\n ...d,\n soid: d.SOID,\n dmid: d.DMID,\n mode: enumModeCodec.encode(d.mode),\n senderId: d.senderID,\n ctime: timestampFromDate(d.ctime),\n pool: enumPoolCodec.encode(d.pool),\n // attr: d.attr,\n platform: d.platform ?? undefined,\n extra: JSON.stringify(d.extra),\n // $typeName: \"danuni.danmaku.v1.Danmaku\" as const,\n })),\n }),\n ),\n );\n});\n","// @generated by protoc-gen-es v2.12.0 with parameter \"target=ts\"\n// @generated from file bilibili/community/service/dm/v1/dm.proto (package bilibili.community.service.dm.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenEnum, GenFile, GenMessage, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file bilibili/community/service/dm/v1/dm.proto.\n */\nexport const file_bilibili_community_service_dm_v1_dm: GenFile = /*@__PURE__*/\n fileDesc(\"CiliaWxpYmlsaS9jb21tdW5pdHkvc2VydmljZS9kbS92MS9kbS5wcm90bxIgYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEiZAoGQXZhdGFyEgoKAmlkGAEgASgJEgsKA3VybBgCIAEoCRJBCgthdmF0YXJfdHlwZRgDIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkF2YXRhclR5cGUiIwoGQnViYmxlEgwKBHRleHQYASABKAkSCwoDdXJsGAIgASgJIsYBCghCdWJibGVWMhIMCgR0ZXh0GAEgASgJEgsKA3VybBgCIAEoCRJBCgtidWJibGVfdHlwZRgDIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkJ1YmJsZVR5cGUSFQoNZXhwb3N1cmVfb25jZRgEIAEoCBJFCg1leHBvc3VyZV90eXBlGAUgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIlsKBkJ1dHRvbhIMCgR0ZXh0GAEgASgJEkMKBmFjdGlvbhgCIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0RnVuY3Rpb25UeXBlIlgKDkJ1enp3b3JkQ29uZmlnEkYKCGtleXdvcmRzGAEgAygLMjQuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnV6endvcmRTaG93Q29uZmlnIngKEkJ1enp3b3JkU2hvd0NvbmZpZxIMCgRuYW1lGAEgASgJEg4KBnNjaGVtYRgCIAEoCRIOCgZzb3VyY2UYAyABKAUSCgoCaWQYBCABKAMSEwoLYnV6endvcmRfaWQYBSABKAMSEwoLc2NoZW1hX3R5cGUYBiABKAUiewoIQ2hlY2tCb3gSDAoEdGV4dBgBIAEoCRI8CgR0eXBlGAIgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tib3hUeXBlEhUKDWRlZmF1bHRfdmFsdWUYAyABKAgSDAoEc2hvdxgEIAEoCCJvCgpDaGVja0JveFYyEgwKBHRleHQYASABKAkSPAoEdHlwZRgCIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNoZWNrYm94VHlwZRIVCg1kZWZhdWx0X3ZhbHVlGAMgASgIIoICCgtDbGlja0J1dHRvbhIVCg1wb3J0cmFpdF90ZXh0GAEgAygJEhYKDmxhbmRzY2FwZV90ZXh0GAIgAygJEhsKE3BvcnRyYWl0X3RleHRfZm9jdXMYAyADKAkSHAoUbGFuZHNjYXBlX3RleHRfZm9jdXMYBCADKAkSQQoLcmVuZGVyX3R5cGUYBSABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5SZW5kZXJUeXBlEgwKBHNob3cYBiABKAgSOAoGYnViYmxlGAcgASgLMiguYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQnViYmxlIrMCCg1DbGlja0J1dHRvblYyEhUKDXBvcnRyYWl0X3RleHQYASADKAkSFgoObGFuZHNjYXBlX3RleHQYAiADKAkSGwoTcG9ydHJhaXRfdGV4dF9mb2N1cxgDIAMoCRIcChRsYW5kc2NhcGVfdGV4dF9mb2N1cxgEIAMoCRJBCgtyZW5kZXJfdHlwZRgFIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSFwoPdGV4dF9pbnB1dF9wb3N0GAYgASgIEhUKDWV4cG9zdXJlX29uY2UYByABKAgSRQoNZXhwb3N1cmVfdHlwZRgIIAEoDjIuLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cG9zdXJlVHlwZSJLCgdDb21tYW5kEkAKC2NvbW1hbmRfZG1zGAEgAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ29tbWFuZERtIuYBCglDb21tYW5kRG0SCgoCaWQYASABKAMSCwoDb2lkGAIgASgDEgsKA21pZBgDIAEoAxIPCgdjb21tYW5kGAQgASgJEg8KB2NvbnRlbnQYBSABKAkSEAoIcHJvZ3Jlc3MYBiABKAUSDQoFY3RpbWUYByABKAkSDQoFbXRpbWUYCCABKAkSDQoFZXh0cmEYCSABKAkSDQoFaWRTdHIYCiABKAkSDAoEdHlwZRgLIAEoBRITCgthdXRvX2NyZWF0ZRgMIAEoCBISCgpjb3VudF9kb3duGA0gASgFEgwKBGF0dHIYDiABKAUiUAoNRGFubWFrdUFJRmxhZxI/CghkbV9mbGFncxgBIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VGbGFnIosDCgtEYW5tYWt1RWxlbRIKCgJpZBgBIAEoAxIQCghwcm9ncmVzcxgCIAEoBRIMCgRtb2RlGAMgASgFEhAKCGZvbnRzaXplGAQgASgFEj8KBWNvbG9yGAUgASgOMjAuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1Db2xvcmZ1bFR5cGUSEAoIbWlkX2hhc2gYBiABKAkSDwoHY29udGVudBgHIAEoCRINCgVjdGltZRgIIAEoAxIOCgZ3ZWlnaHQYCSABKAUSDgoGYWN0aW9uGAogASgJEgwKBHBvb2wYCyABKAUSDgoGaWRfc3RyGAwgASgJEgwKBGF0dHIYDSABKAUSEQoJYW5pbWF0aW9uGBYgASgJEg0KBWV4dHJhGBcgASgJEkIKCGNvbG9yZnVsGBggASgOMjAuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1Db2xvcmZ1bFR5cGUSDAoEdHlwZRgZIAEoBRILCgNvaWQYGiABKAMiKQoLRGFubWFrdUZsYWcSDAoEZG1pZBgBIAEoAxIMCgRmbGFnGAIgASgFIksKEURhbm1ha3VGbGFnQ29uZmlnEhAKCHJlY19mbGFnGAEgASgFEhAKCHJlY190ZXh0GAIgASgJEhIKCnJlY19zd2l0Y2gYAyABKAUiiwcKGERhbm11RGVmYXVsdFBsYXllckNvbmZpZxIpCiFwbGF5ZXJfZGFubWFrdV91c2VfZGVmYXVsdF9jb25maWcYASABKAgSLAokcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfc3dpdGNoGAQgASgIEisKI3BsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsGAUgASgFEh8KF3BsYXllcl9kYW5tYWt1X2Jsb2NrdG9wGAYgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2Nrc2Nyb2xsGAcgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrYm90dG9tGAggASgIEiQKHHBsYXllcl9kYW5tYWt1X2Jsb2NrY29sb3JmdWwYCSABKAgSIgoacGxheWVyX2Rhbm1ha3VfYmxvY2tyZXBlYXQYCiABKAgSIwobcGxheWVyX2Rhbm1ha3VfYmxvY2tzcGVjaWFsGAsgASgIEh4KFnBsYXllcl9kYW5tYWt1X29wYWNpdHkYDCABKAISJAoccGxheWVyX2Rhbm1ha3Vfc2NhbGluZ2ZhY3RvchgNIAEoAhIdChVwbGF5ZXJfZGFubWFrdV9kb21haW4YDiABKAISHAoUcGxheWVyX2Rhbm1ha3Vfc3BlZWQYDyABKAUSJAocaW5saW5lX3BsYXllcl9kYW5tYWt1X3N3aXRjaBgQIAEoCBIpCiFwbGF5ZXJfZGFubWFrdV9zZW5pb3JfbW9kZV9zd2l0Y2gYESABKAUSLgomcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjIYEiABKAUSmAEKKnBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX2xldmVsX3YyX21hcBgTIAMoCzJkLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11RGVmYXVsdFBsYXllckNvbmZpZy5QbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRIlCh1wbGF5ZXJfZGFubWFrdV9lbmFibGVfaGVyZF9kbRgUIAEoCBpLCilQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIuwJChFEYW5tdVBsYXllckNvbmZpZxIdChVwbGF5ZXJfZGFubWFrdV9zd2l0Y2gYASABKAgSIgoacGxheWVyX2Rhbm1ha3Vfc3dpdGNoX3NhdmUYAiABKAgSKQohcGxheWVyX2Rhbm1ha3VfdXNlX2RlZmF1bHRfY29uZmlnGAMgASgIEiwKJHBsYXllcl9kYW5tYWt1X2FpX3JlY29tbWVuZGVkX3N3aXRjaBgEIAEoCBIrCiNwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbBgFIAEoBRIfChdwbGF5ZXJfZGFubWFrdV9ibG9ja3RvcBgGIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja3Njcm9sbBgHIAEoCBIiChpwbGF5ZXJfZGFubWFrdV9ibG9ja2JvdHRvbRgIIAEoCBIkChxwbGF5ZXJfZGFubWFrdV9ibG9ja2NvbG9yZnVsGAkgASgIEiIKGnBsYXllcl9kYW5tYWt1X2Jsb2NrcmVwZWF0GAogASgIEiMKG3BsYXllcl9kYW5tYWt1X2Jsb2Nrc3BlY2lhbBgLIAEoCBIeChZwbGF5ZXJfZGFubWFrdV9vcGFjaXR5GAwgASgCEiQKHHBsYXllcl9kYW5tYWt1X3NjYWxpbmdmYWN0b3IYDSABKAISHQoVcGxheWVyX2Rhbm1ha3VfZG9tYWluGA4gASgCEhwKFHBsYXllcl9kYW5tYWt1X3NwZWVkGA8gASgFEiYKHnBsYXllcl9kYW5tYWt1X2VuYWJsZWJsb2NrbGlzdBgQIAEoCBIkChxpbmxpbmVfcGxheWVyX2Rhbm1ha3Vfc3dpdGNoGBEgASgIEiQKHGlubGluZV9wbGF5ZXJfZGFubWFrdV9jb25maWcYEiABKAUSJgoecGxheWVyX2Rhbm1ha3VfaW9zX3N3aXRjaF9zYXZlGBMgASgFEikKIXBsYXllcl9kYW5tYWt1X3Nlbmlvcl9tb2RlX3N3aXRjaBgUIAEoBRIuCiZwbGF5ZXJfZGFubWFrdV9haV9yZWNvbW1lbmRlZF9sZXZlbF92MhgVIAEoBRKRAQoqcGxheWVyX2Rhbm1ha3VfYWlfcmVjb21tZW5kZWRfbGV2ZWxfdjJfbWFwGBYgAygLMl0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJDb25maWcuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbFYyTWFwRW50cnkSJQodcGxheWVyX2Rhbm1ha3VfZW5hYmxlX2hlcmRfZG0YFyABKAgSJgoecGxheWVyX2Rhbm1ha3VfYmxvY2t0b3BfYm90dG9tGBggASgIEiAKGHBsYXllcl9kYW5tYWt1X2RvbWFpbl92MhgZIAEoBRIeChZwbGF5ZXJfZGFubWFrdV9kZW5zaXR5GBogASgFEiUKHXBsYXllcl9kYW5tYWt1X3N1YnRpdGxlX3Byb29mGBsgASgIEiMKG3BsYXllcl9kYW5tYWt1X3Blb3BsZV9wcm9vZhgcIAEoCBpLCilQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjJNYXBFbnRyeRILCgNrZXkYASABKAUSDQoFdmFsdWUYAiABKAU6AjgBIjAKFkRhbm11UGxheWVyQ29uZmlnUGFuZWwSFgoOc2VsZWN0aW9uX3RleHQYASABKAkiSwoYRGFubXVQbGF5ZXJEeW5hbWljQ29uZmlnEhAKCHByb2dyZXNzGAEgASgFEh0KFXBsYXllcl9kYW5tYWt1X2RvbWFpbhgOIAEoAiKQAwoVRGFubXVQbGF5ZXJWaWV3Q29uZmlnEmEKHWRhbm11a3VfZGVmYXVsdF9wbGF5ZXJfY29uZmlnGAEgASgLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVEZWZhdWx0UGxheWVyQ29uZmlnElIKFWRhbm11a3VfcGxheWVyX2NvbmZpZxgCIAEoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11UGxheWVyQ29uZmlnEmEKHWRhbm11a3VfcGxheWVyX2R5bmFtaWNfY29uZmlnGAMgAygLMjouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubXVQbGF5ZXJEeW5hbWljQ29uZmlnEl0KG2Rhbm11a3VfcGxheWVyX2NvbmZpZ19wYW5lbBgEIAEoCzI4LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11UGxheWVyQ29uZmlnUGFuZWwimQUKFERhbm11V2ViUGxheWVyQ29uZmlnEhEKCWRtX3N3aXRjaBgBIAEoCBIRCglhaV9zd2l0Y2gYAiABKAgSEAoIYWlfbGV2ZWwYAyABKAUSEAoIYmxvY2t0b3AYBCABKAgSEwoLYmxvY2tzY3JvbGwYBSABKAgSEwoLYmxvY2tib3R0b20YBiABKAgSEgoKYmxvY2tjb2xvchgHIAEoCBIUCgxibG9ja3NwZWNpYWwYCCABKAgSFAoMcHJldmVudHNoYWRlGAkgASgIEg0KBWRtYXNrGAogASgIEg8KB29wYWNpdHkYCyABKAISDgoGZG1hcmVhGAwgASgFEhEKCXNwZWVkcGx1cxgNIAEoAhIQCghmb250c2l6ZRgOIAEoAhISCgpzY3JlZW5zeW5jGA8gASgIEhEKCXNwZWVkc3luYxgQIAEoCBISCgpmb250ZmFtaWx5GBEgASgJEgwKBGJvbGQYEiABKAgSEgoKZm9udGJvcmRlchgTIAEoBRIRCglkcmF3X3R5cGUYFCABKAkSGgoSc2VuaW9yX21vZGVfc3dpdGNoGBUgASgFEhMKC2FpX2xldmVsX3YyGBYgASgFEmEKD2FpX2xldmVsX3YyX21hcBgXIAMoCzJILmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11V2ViUGxheWVyQ29uZmlnLkFpTGV2ZWxWMk1hcEVudHJ5EhcKD2Jsb2NrdG9wX2JvdHRvbRgYIAEoCBISCgpkbV9hcmVhX3YyGBkgASgFEhIKCmRtX2RlbnNpdHkYGiABKAUaMwoRQWlMZXZlbFYyTWFwRW50cnkSCwoDa2V5GAEgASgFEg0KBXZhbHVlGAIgASgFOgI4ASJZCgpEbUNvbG9yZnVsEj4KBHR5cGUYASABKA4yMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsVHlwZRILCgNzcmMYAiABKAkiUAoPRG1FeHBvUmVwb3J0UmVxEhIKCnNlc3Npb25faWQYASABKAkSCwoDb2lkGAIgASgDEg0KBWRtaWRzGAMgASgMEg0KBXNwbWlkGAQgASgJIhEKD0RtRXhwb1JlcG9ydFJlcyJtCgpEbUhlcmRWaWV3EhsKE2Rpc3BsYXlfaGVyZF9kbV9udW0YASABKAUSQgoIaGVyZF9kbXMYAiADKAsyMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5WaWV3SGVyZERtRWxlbSKWAgoKRG1NYXNrV2FsbBINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMSDwoHY29udGVudBgDIAEoCRJNCgxjb250ZW50X3R5cGUYBCABKA4yNy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbU1hc2tXYWxsQ29udGVudFR5cGUSRQoIYml6X3R5cGUYBSABKA4yMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbU1hc2tXYWxsQml6VHlwZRJFCghjb250ZW50cxgGIAMoCzIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGxDb250ZW50ImsKEURtTWFza1dhbGxDb250ZW50EkUKBHR5cGUYASABKA4yNy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbU1hc2tXYWxsQ29udGVudFR5cGUSDwoHY29udGVudBgCIAEoCSLNEAoRRG1QbGF5ZXJDb25maWdSZXESCgoCdHMYASABKAMSRQoGc3dpdGNoGAIgASgLMjUuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdVN3aXRjaBJOCgtzd2l0Y2hfc2F2ZRgDIAEoCzI5LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTd2l0Y2hTYXZlElsKEnVzZV9kZWZhdWx0X2NvbmZpZxgEIAEoCzI/LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VVc2VEZWZhdWx0Q29uZmlnEmEKFWFpX3JlY29tbWVuZGVkX3N3aXRjaBgFIAEoCzJCLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkU3dpdGNoEl8KFGFpX3JlY29tbWVuZGVkX2xldmVsGAYgASgLMkEuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbBJJCghibG9ja3RvcBgHIAEoCzI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3RvcBJPCgtibG9ja3Njcm9sbBgIIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja3Njcm9sbBJPCgtibG9ja2JvdHRvbRgJIAEoCzI6LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VCbG9ja2JvdHRvbRJTCg1ibG9ja2NvbG9yZnVsGAogASgLMjwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrY29sb3JmdWwSTwoLYmxvY2tyZXBlYXQYCyABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1QmxvY2tyZXBlYXQSUQoMYmxvY2tzcGVjaWFsGAwgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2Nrc3BlY2lhbBJHCgdvcGFjaXR5GA0gASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdU9wYWNpdHkSUwoNc2NhbGluZ2ZhY3RvchgOIAEoCzI8LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VTY2FsaW5nZmFjdG9yEkUKBmRvbWFpbhgPIAEoCzI1LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VEb21haW4SQwoFc3BlZWQYECABKAsyNC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3BlZWQSVwoPZW5hYmxlYmxvY2tsaXN0GBEgASgLMj4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUVuYWJsZWJsb2NrbGlzdBJeChlpbmxpbmVQbGF5ZXJEYW5tYWt1U3dpdGNoGBIgASgLMjsuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuSW5saW5lUGxheWVyRGFubWFrdVN3aXRjaBJbChJzZW5pb3JfbW9kZV9zd2l0Y2gYEyABKAsyPy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U2VuaW9yTW9kZVN3aXRjaBJkChdhaV9yZWNvbW1lbmRlZF9sZXZlbF92MhgUIAEoCzJDLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VBaVJlY29tbWVuZGVkTGV2ZWxWMhJTCg5lbmFibGVfaGVyZF9kbRgVIAEoCzI7LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VFbmFibGVIZXJkRG0SVgoPYmxvY2t0b3BfYm90dG9tGBYgASgLMj0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdUJsb2NrdG9wQm90dG9tEkoKCWRvbWFpbl92MhgXIAEoCzI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBsYXllckRhbm1ha3VEb21haW5WMhJHCgdkZW5zaXR5GBggASgLMjYuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUGxheWVyRGFubWFrdURlbnNpdHkSVAoOc3VidGl0bGVfcHJvb2YYGSABKAsyPC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1U3VidGl0bGVQcm9vZhJQCgxwZW9wbGVfcHJvb2YYGiABKAsyOi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QbGF5ZXJEYW5tYWt1UGVvcGxlUHJvb2YiLwoLRG1TZWdDb25maWcSEQoJcGFnZV9zaXplGAEgASgDEg0KBXRvdGFsGAIgASgDIpECChBEbVNlZ01vYmlsZVJlcGx5EjwKBWVsZW1zGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUVsZW0SDQoFc3RhdGUYAiABKAUSQAoHYWlfZmxhZxgDIAEoCzIvLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm1ha3VBSUZsYWcSFQoNc2VnbWVudF9ydWxlcxgEIAMoAxJCCgxjb2xvcmZ1bF9zcmMYBSADKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbUNvbG9yZnVsEhMKC2NvbnRleHRfc3JjGAYgASgJIsoBCg5EbVNlZ01vYmlsZVJlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAxIWCg50ZWVuYWdlcnNfbW9kZRgFIAEoBRIKCgJwcxgGIAEoAxIKCgJwZRgHIAEoAxIRCglwdWxsX21vZGUYCCABKAUSEgoKZnJvbV9zY2VuZRgJIAEoBRINCgVzcG1pZBgKIAEoCRITCgtjb250ZXh0X2V4dBgLIAEoCSJcCg1EbVNlZ090dFJlcGx5EjwKBWVsZW1zGAEgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUVsZW0SDQoFc3RhdGUYAiABKAUiTAoLRG1TZWdPdHRSZXESCwoDcGlkGAEgASgDEgsKA29pZBgCIAEoAxIMCgR0eXBlGAMgASgFEhUKDXNlZ21lbnRfaW5kZXgYBCABKAMiXQoNRG1TZWdTREtSZXBseRIOCgZjbG9zZWQYASABKAgSPAoFZWxlbXMYAiADKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RWxlbSJMCgtEbVNlZ1NES1JlcRILCgNwaWQYASABKAMSCwoDb2lkGAIgASgDEgwKBHR5cGUYAyABKAUSFQoNc2VnbWVudF9pbmRleBgEIAEoAyJ3CglEbVN1YlZpZXcSDAoEdHlwZRgBIAEoBRILCgNvaWQYAiABKAMSCwoDcGlkGAMgASgDEkIKC3Bvc3RfcGFuZWwyGAQgAygLMi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsVjIioQkKC0RtVmlld1JlcGx5Eg4KBmNsb3NlZBgBIAEoCBI5CgRtYXNrGAIgASgLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVmlkZW9NYXNrEkEKCHN1YnRpdGxlGAMgASgLMi8uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVmlkZW9TdWJ0aXRsZRITCgtzcGVjaWFsX2RtcxgEIAMoCRJECgdhaV9mbGFnGAUgASgLMjMuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRGFubWFrdUZsYWdDb25maWcSTgoNcGxheWVyX2NvbmZpZxgGIAEoCzI3LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11UGxheWVyVmlld0NvbmZpZxIWCg5zZW5kX2JveF9zdHlsZRgHIAEoBRINCgVhbGxvdxgIIAEoCBIRCgljaGVja19ib3gYCSABKAgSGgoSY2hlY2tfYm94X3Nob3dfbXNnGAogASgJEhgKEHRleHRfcGxhY2Vob2xkZXIYCyABKAkSGQoRaW5wdXRfcGxhY2Vob2xkZXIYDCABKAkSHQoVcmVwb3J0X2ZpbHRlcl9jb250ZW50GA0gAygJEkEKC2V4cG9fcmVwb3J0GA4gASgLMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb1JlcG9ydBJJCg9idXp6d29yZF9jb25maWcYDyABKAsyMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXp6d29yZENvbmZpZxJCCgtleHByZXNzaW9ucxgQIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cHJlc3Npb25zEj8KCnBvc3RfcGFuZWwYESADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWwSFQoNYWN0aXZpdHlfbWV0YRgSIAMoCRJCCgtwb3N0X3BhbmVsMhgTIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbFYyEkIKDGRtX21hc2tfd2FsbBgUIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtTWFza1dhbGwSPQoHZG1faGVyZBgVIAEoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtSGVyZFZpZXcSOgoHY29tbWFuZBgWIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNvbW1hbmQSCgoCa3YYFyABKAkSPgoJc3ViX3ZpZXdzGBggAygLMisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TdWJWaWV3EjYKA3FvZRgZIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlFvZUluZm8ibQoJRG1WaWV3UmVxEgsKA3BpZBgBIAEoAxILCgNvaWQYAiABKAMSDAoEdHlwZRgDIAEoBRINCgVzcG1pZBgEIAEoCRIUCgxpc19oYXJkX2Jvb3QYBSABKAUSEwoLY29udGV4dF9leHQYBiABKAkigQYKDkRtV2ViVmlld1JlcGx5Eg0KBXN0YXRlGAEgASgFEgwKBHRleHQYAiABKAkSEQoJdGV4dF9zaWRlGAMgASgJEj0KBmRtX3NnZRgEIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnQ29uZmlnEkEKBGZsYWcYBSABKAsyMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EYW5tYWt1RmxhZ0NvbmZpZxITCgtzcGVjaWFsX2RtcxgGIAMoCRIRCgljaGVja19ib3gYByABKAgSDQoFY291bnQYCCABKAMSQAoLY29tbWFuZF9kbXMYCSADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Db21tYW5kRG0STQoNcGxheWVyX2NvbmZpZxgKIAEoCzI2LmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRhbm11V2ViUGxheWVyQ29uZmlnEh0KFXJlcG9ydF9maWx0ZXJfY29udGVudBgLIAMoCRJCCgtleHByZXNzaW9ucxgMIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cHJlc3Npb25zEj8KCnBvc3RfcGFuZWwYDSADKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWwSFQoNYWN0aXZpdHlfbWV0YRgOIAMoCRJCCgtwb3N0X3BhbmVsMhgPIAMoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RQYW5lbFYyEj4KCXN1Yl92aWV3cxgQIAMoCzIrLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU3ViVmlldxI2CgNxb2UYESABKAsyKS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Rb2VJbmZvIioKCkV4cG9SZXBvcnQSHAoUc2hvdWxkX3JlcG9ydF9hdF9lbmQYASABKAgiZAoKRXhwcmVzc2lvbhIPCgdrZXl3b3JkGAEgAygJEgsKA3VybBgCIAEoCRI4CgZwZXJpb2QYAyADKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5QZXJpb2QiSQoLRXhwcmVzc2lvbnMSOgoEZGF0YRgBIAMoCzIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkV4cHJlc3Npb24iKgoZSW5saW5lUGxheWVyRGFubWFrdVN3aXRjaBINCgV2YWx1ZRgBIAEoCCInCgVMYWJlbBINCgV0aXRsZRgBIAEoCRIPCgdjb250ZW50GAIgAygJIocBCgdMYWJlbFYyEg0KBXRpdGxlGAEgASgJEg8KB2NvbnRlbnQYAiADKAkSFQoNZXhwb3N1cmVfb25jZRgDIAEoCBJFCg1leHBvc3VyZV90eXBlGAQgASgOMi4uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRXhwb3N1cmVUeXBlIiQKBlBlcmlvZBINCgVzdGFydBgBIAEoAxILCgNlbmQYAiABKAMiMAofUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRMZXZlbBINCgV2YWx1ZRgBIAEoBSIyCiFQbGF5ZXJEYW5tYWt1QWlSZWNvbW1lbmRlZExldmVsVjISDQoFdmFsdWUYASABKAUiMQogUGxheWVyRGFubWFrdUFpUmVjb21tZW5kZWRTd2l0Y2gSDQoFdmFsdWUYASABKAgiKQoYUGxheWVyRGFubWFrdUJsb2NrYm90dG9tEg0KBXZhbHVlGAEgASgIIisKGlBsYXllckRhbm1ha3VCbG9ja2NvbG9yZnVsEg0KBXZhbHVlGAEgASgIIikKGFBsYXllckRhbm1ha3VCbG9ja3JlcGVhdBINCgV2YWx1ZRgBIAEoCCIpChhQbGF5ZXJEYW5tYWt1QmxvY2tzY3JvbGwSDQoFdmFsdWUYASABKAgiKgoZUGxheWVyRGFubWFrdUJsb2Nrc3BlY2lhbBINCgV2YWx1ZRgBIAEoCCImChVQbGF5ZXJEYW5tYWt1QmxvY2t0b3ASDQoFdmFsdWUYASABKAgiLAobUGxheWVyRGFubWFrdUJsb2NrdG9wQm90dG9tEg0KBXZhbHVlGAEgASgIIiUKFFBsYXllckRhbm1ha3VEZW5zaXR5Eg0KBXZhbHVlGAEgASgFIiQKE1BsYXllckRhbm1ha3VEb21haW4SDQoFdmFsdWUYASABKAIiJgoVUGxheWVyRGFubWFrdURvbWFpblYyEg0KBXZhbHVlGAEgASgFIioKGVBsYXllckRhbm1ha3VFbmFibGVIZXJkRG0SDQoFdmFsdWUYASABKAgiLQocUGxheWVyRGFubWFrdUVuYWJsZWJsb2NrbGlzdBINCgV2YWx1ZRgBIAEoCCIlChRQbGF5ZXJEYW5tYWt1T3BhY2l0eRINCgV2YWx1ZRgBIAEoAiIpChhQbGF5ZXJEYW5tYWt1UGVvcGxlUHJvb2YSDQoFdmFsdWUYASABKAgiKwoaUGxheWVyRGFubWFrdVNjYWxpbmdmYWN0b3ISDQoFdmFsdWUYASABKAIiLgodUGxheWVyRGFubWFrdVNlbmlvck1vZGVTd2l0Y2gSDQoFdmFsdWUYASABKAUiIwoSUGxheWVyRGFubWFrdVNwZWVkEg0KBXZhbHVlGAEgASgFIisKGlBsYXllckRhbm1ha3VTdWJ0aXRsZVByb29mEg0KBXZhbHVlGAEgASgIIjgKE1BsYXllckRhbm1ha3VTd2l0Y2gSDQoFdmFsdWUYASABKAgSEgoKY2FuX2lnbm9yZRgCIAEoCCIoChdQbGF5ZXJEYW5tYWt1U3dpdGNoU2F2ZRINCgV2YWx1ZRgBIAEoCCIuCh1QbGF5ZXJEYW5tYWt1VXNlRGVmYXVsdENvbmZpZxINCgV2YWx1ZRgBIAEoCCKMAwoJUG9zdFBhbmVsEg0KBXN0YXJ0GAEgASgDEgsKA2VuZBgCIAEoAxIQCghwcmlvcml0eRgDIAEoAxIOCgZiaXpfaWQYBCABKAMSRAoIYml6X3R5cGUYBSABKA4yMi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0UGFuZWxCaXpUeXBlEkMKDGNsaWNrX2J1dHRvbhgGIAEoCzItLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkNsaWNrQnV0dG9uEj8KCnRleHRfaW5wdXQYByABKAsyKy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5UZXh0SW5wdXQSPQoJY2hlY2tfYm94GAggASgLMiouYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuQ2hlY2tCb3gSNgoFdG9hc3QYCSABKAsyJy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdCKtBAoLUG9zdFBhbmVsVjISDQoFc3RhcnQYASABKAMSCwoDZW5kGAIgASgDEkQKCGJpel90eXBlGAMgASgOMjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUG9zdFBhbmVsQml6VHlwZRJFCgxjbGlja19idXR0b24YBCABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DbGlja0J1dHRvblYyEkEKCnRleHRfaW5wdXQYBSABKAsyLS5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5UZXh0SW5wdXRWMhI/CgljaGVja19ib3gYBiABKAsyLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5DaGVja0JveFYyEjgKBXRvYXN0GAcgASgLMikuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuVG9hc3RWMhI6CgZidWJibGUYCCABKAsyKi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdWJibGVWMhI4CgVsYWJlbBgJIAEoCzIpLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkxhYmVsVjISQQoLcG9zdF9zdGF0dXMYCiABKA4yLC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Qb3N0U3RhdHVzIhcKB1FvZUluZm8SDAoEaW5mbxgBIAEoCSIpCghSZXNwb25zZRIMCgRjb2RlGAEgASgFEg8KB21lc3NhZ2UYAiABKAki+QIKDFN1YnRpdGxlSXRlbRIKCgJpZBgBIAEoAxIOCgZpZF9zdHIYAiABKAkSCwoDbGFuGAMgASgJEg8KB2xhbl9kb2MYBCABKAkSFAoMc3VidGl0bGVfdXJsGAUgASgJEjoKBmF1dGhvchgGIAEoCzIqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlVzZXJJbmZvEjwKBHR5cGUYByABKA4yLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZVR5cGUSFQoNbGFuX2RvY19icmllZhgIIAEoCRJBCgdhaV90eXBlGAkgASgOMjAuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuU3VidGl0bGVBaVR5cGUSRQoJYWlfc3RhdHVzGAogASgOMjIuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuU3VidGl0bGVBaVN0YXR1cyLoAgoJVGV4dElucHV0EhwKFHBvcnRyYWl0X3BsYWNlaG9sZGVyGAEgAygJEh0KFWxhbmRzY2FwZV9wbGFjZWhvbGRlchgCIAMoCRJBCgtyZW5kZXJfdHlwZRgDIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlbmRlclR5cGUSGAoQcGxhY2Vob2xkZXJfcG9zdBgEIAEoCBIMCgRzaG93GAUgASgIEjgKBmF2YXRhchgGIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkF2YXRhchJBCgtwb3N0X3N0YXR1cxgHIAEoDjIsLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlBvc3RTdGF0dXMSNgoFbGFiZWwYCCABKAsyJy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5MYWJlbCL7AQoLVGV4dElucHV0VjISHAoUcG9ydHJhaXRfcGxhY2Vob2xkZXIYASADKAkSHQoVbGFuZHNjYXBlX3BsYWNlaG9sZGVyGAIgAygJEkEKC3JlbmRlcl90eXBlGAMgASgOMiwuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuUmVuZGVyVHlwZRIYChBwbGFjZWhvbGRlcl9wb3N0GAQgASgIEjgKBmF2YXRhchgFIAMoCzIoLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkF2YXRhchIYChB0ZXh0X2lucHV0X2xpbWl0GAYgASgFIm8KBVRvYXN0EgwKBHRleHQYASABKAkSEAoIZHVyYXRpb24YAiABKAUSDAoEc2hvdxgDIAEoCBI4CgZidXR0b24YBCABKAsyKC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5CdXR0b24iYgoNVG9hc3RCdXR0b25WMhIMCgR0ZXh0GAEgASgJEkMKBmFjdGlvbhgCIAEoDjIzLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlRvYXN0RnVuY3Rpb25UeXBlInMKB1RvYXN0VjISDAoEdGV4dBgBIAEoCRIQCghkdXJhdGlvbhgCIAEoBRJICg90b2FzdF9idXR0b25fdjIYAyABKAsyLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5Ub2FzdEJ1dHRvblYyIlwKCFVzZXJJbmZvEgsKA21pZBgBIAEoAxIMCgRuYW1lGAIgASgJEgsKA3NleBgDIAEoCRIMCgRmYWNlGAQgASgJEgwKBHNpZ24YBSABKAkSDAoEcmFuaxgGIAEoBSJTCglWaWRlb01hc2sSCwoDY2lkGAEgASgDEgwKBHBsYXQYAiABKAUSCwoDZnBzGAMgASgFEgwKBHRpbWUYBCABKAMSEAoIbWFza191cmwYBSABKAkicAoNVmlkZW9TdWJ0aXRsZRILCgNsYW4YASABKAkSDwoHbGFuX2RvYxgCIAEoCRJBCglzdWJ0aXRsZXMYAyADKAsyLi5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5TdWJ0aXRsZUl0ZW0ikgEKDlZpZXdIZXJkRG1FbGVtEhAKCGhlcmRfbXNnGAEgASgJEhYKDmhlcmRfc3RhcnRfY250GAIgASgFEhQKDGhlcmRfZW5kX2NudBgDIAEoBRISCgpyZWdleF9ydWxlGAQgASgJEhYKDnN0YXJ0X3Byb2dyZXNzGAUgASgFEhQKDGVuZF9wcm9ncmVzcxgGIAEoBSozCgpBdmF0YXJUeXBlEhIKDkF2YXRhclR5cGVOb25lEAASEQoNQXZhdGFyVHlwZU5GVBABKlkKCkJ1YmJsZVR5cGUSEgoOQnViYmxlVHlwZU5vbmUQABIZChVCdWJibGVUeXBlQ2xpY2tCdXR0b24QARIcChhCdWJibGVUeXBlRG1TZXR0aW5nUGFuZWwQAipYCgxDaGVja2JveFR5cGUSFAoQQ2hlY2tib3hUeXBlTm9uZRAAEhkKFUNoZWNrYm94VHlwZUVuY291cmFnZRABEhcKE0NoZWNrYm94VHlwZUNvbG9yRE0QAio1Cg5EbUNvbG9yZnVsVHlwZRIMCghOb25lVHlwZRAAEhUKD1ZpcEdyYWR1YWxDb2xvchDh1AMqYAoRRG1NYXNrV2FsbEJpelR5cGUSCwoHVW5rbm93bhAAEgcKA09HVhABEgoKBkJpelBpYxACEggKBE11dGUQAxIKCgZSZWNvcmQQBBIJCgVDbG91ZBAFEggKBEFJR0MQBip2ChVEbU1hc2tXYWxsQ29udGVudFR5cGUSIAocRG1NYXNrV2FsbENvbnRlbnRUeXBlVW5rbm93bhAAEh0KGURtTWFza1dhbGxDb250ZW50VHlwZVRleHQQARIcChhEbU1hc2tXYWxsQ29udGVudFR5cGVQaWMQAio8CgxFeHBvc3VyZVR5cGUSFAoQRXhwb3N1cmVUeXBlTm9uZRAAEhYKEkV4cG9zdXJlVHlwZURNU2VuZBABKoMCChBQb3N0UGFuZWxCaXpUeXBlEhgKFFBvc3RQYW5lbEJpelR5cGVOb25lEAASHQoZUG9zdFBhbmVsQml6VHlwZUVuY291cmFnZRABEhsKF1Bvc3RQYW5lbEJpelR5cGVDb2xvckRNEAISGQoVUG9zdFBhbmVsQml6VHlwZU5GVERNEAMSHQoZUG9zdFBhbmVsQml6VHlwZUZyYWdDbG9zZRAEEh0KGVBvc3RQYW5lbEJpelR5cGVSZWNvbW1lbmQQBRIcChhQb3N0UGFuZWxCaXpUeXBlUGxvdExlYWsQBhIiCh5Qb3N0UGFuZWxCaXpUeXBlQW50aUhhcmFzc21lbnQQByo4CgpQb3N0U3RhdHVzEhQKEFBvc3RTdGF0dXNOb3JtYWwQABIUChBQb3N0U3RhdHVzQ2xvc2VkEAEqTgoKUmVuZGVyVHlwZRISCg5SZW5kZXJUeXBlTm9uZRAAEhQKEFJlbmRlclR5cGVTaW5nbGUQARIWChJSZW5kZXJUeXBlUm90YXRpb24QAio2ChBTdWJ0aXRsZUFpU3RhdHVzEggKBE5vbmUQABIMCghFeHBvc3VyZRABEgoKBkFzc2lzdBACKisKDlN1YnRpdGxlQWlUeXBlEgoKBk5vcm1hbBAAEg0KCVRyYW5zbGF0ZRABKh4KDFN1YnRpdGxlVHlwZRIGCgJDQxAAEgYKAkFJEAEqTgoRVG9hc3RGdW5jdGlvblR5cGUSGQoVVG9hc3RGdW5jdGlvblR5cGVOb25lEAASHgoaVG9hc3RGdW5jdGlvblR5cGVQb3N0UGFuZWwQATKgBQoCRE0ScwoLRG1TZWdNb2JpbGUSMC5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ01vYmlsZVJlcRoyLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtU2VnTW9iaWxlUmVwbHkSZAoGRG1WaWV3EisuYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1WaWV3UmVxGi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1WaWV3UmVwbHkScQoORG1QbGF5ZXJDb25maWcSMy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVBsYXllckNvbmZpZ1JlcRoqLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLlJlc3BvbnNlEmoKCERtU2VnT3R0Ei0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdPdHRSZXEaLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ090dFJlcGx5EmoKCERtU2VnU0RLEi0uYmlsaWJpbGkuY29tbXVuaXR5LnNlcnZpY2UuZG0udjEuRG1TZWdTREtSZXEaLy5iaWxpYmlsaS5jb21tdW5pdHkuc2VydmljZS5kbS52MS5EbVNlZ1NES1JlcGx5EnQKDERtRXhwb1JlcG9ydBIxLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtRXhwb1JlcG9ydFJlcRoxLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxLkRtRXhwb1JlcG9ydFJlc0LUAQokY29tLmJpbGliaWxpLmNvbW11bml0eS5zZXJ2aWNlLmRtLnYxQgdEbVByb3RvUAGiAgRCQ1NEqgIgQmlsaWJpbGkuQ29tbXVuaXR5LlNlcnZpY2UuRG0uVjHKAiBCaWxpYmlsaVxDb21tdW5pdHlcU2VydmljZVxEbVxWMeICLEJpbGliaWxpXENvbW11bml0eVxTZXJ2aWNlXERtXFYxXEdQQk1ldGFkYXRh6gIkQmlsaWJpbGk6OkNvbW11bml0eTo6U2VydmljZTo6RG06OlYxYgZwcm90bzM\");\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Avatar\n */\nexport type Avatar = Message<\"bilibili.community.service.dm.v1.Avatar\"> & {\n /**\n * @generated from field: string id = 1;\n */\n id: string;\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.AvatarType avatar_type = 3;\n */\n avatarType: AvatarType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Avatar.\n * Use `create(AvatarSchema)` to create a new message.\n */\nexport const AvatarSchema: GenMessage<Avatar> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 0);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Bubble\n */\nexport type Bubble = Message<\"bilibili.community.service.dm.v1.Bubble\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Bubble.\n * Use `create(BubbleSchema)` to create a new message.\n */\nexport const BubbleSchema: GenMessage<Bubble> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 1);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.BubbleV2\n */\nexport type BubbleV2 = Message<\"bilibili.community.service.dm.v1.BubbleV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.BubbleType bubble_type = 3;\n */\n bubbleType: BubbleType;\n\n /**\n * @generated from field: bool exposure_once = 4;\n */\n exposureOnce: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExposureType exposure_type = 5;\n */\n exposureType: ExposureType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.BubbleV2.\n * Use `create(BubbleV2Schema)` to create a new message.\n */\nexport const BubbleV2Schema: GenMessage<BubbleV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 2);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Button\n */\nexport type Button = Message<\"bilibili.community.service.dm.v1.Button\"> & {\n /**\n *\n *\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.ToastFunctionType action = 2;\n */\n action: ToastFunctionType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Button.\n * Use `create(ButtonSchema)` to create a new message.\n */\nexport const ButtonSchema: GenMessage<Button> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 3);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.BuzzwordConfig\n */\nexport type BuzzwordConfig = Message<\"bilibili.community.service.dm.v1.BuzzwordConfig\"> & {\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.BuzzwordShowConfig keywords = 1;\n */\n keywords: BuzzwordShowConfig[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.BuzzwordConfig.\n * Use `create(BuzzwordConfigSchema)` to create a new message.\n */\nexport const BuzzwordConfigSchema: GenMessage<BuzzwordConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 4);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.BuzzwordShowConfig\n */\nexport type BuzzwordShowConfig = Message<\"bilibili.community.service.dm.v1.BuzzwordShowConfig\"> & {\n /**\n * @generated from field: string name = 1;\n */\n name: string;\n\n /**\n * @generated from field: string schema = 2;\n */\n schema: string;\n\n /**\n * @generated from field: int32 source = 3;\n */\n source: number;\n\n /**\n * @generated from field: int64 id = 4;\n */\n id: bigint;\n\n /**\n * @generated from field: int64 buzzword_id = 5;\n */\n buzzwordId: bigint;\n\n /**\n * @generated from field: int32 schema_type = 6;\n */\n schemaType: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.BuzzwordShowConfig.\n * Use `create(BuzzwordShowConfigSchema)` to create a new message.\n */\nexport const BuzzwordShowConfigSchema: GenMessage<BuzzwordShowConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 5);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.CheckBox\n */\nexport type CheckBox = Message<\"bilibili.community.service.dm.v1.CheckBox\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckboxType type = 2;\n */\n type: CheckboxType;\n\n /**\n * @generated from field: bool default_value = 3;\n */\n defaultValue: boolean;\n\n /**\n * @generated from field: bool show = 4;\n */\n show: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.CheckBox.\n * Use `create(CheckBoxSchema)` to create a new message.\n */\nexport const CheckBoxSchema: GenMessage<CheckBox> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 6);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.CheckBoxV2\n */\nexport type CheckBoxV2 = Message<\"bilibili.community.service.dm.v1.CheckBoxV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckboxType type = 2;\n */\n type: CheckboxType;\n\n /**\n * @generated from field: bool default_value = 3;\n */\n defaultValue: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.CheckBoxV2.\n * Use `create(CheckBoxV2Schema)` to create a new message.\n */\nexport const CheckBoxV2Schema: GenMessage<CheckBoxV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 7);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ClickButton\n */\nexport type ClickButton = Message<\"bilibili.community.service.dm.v1.ClickButton\"> & {\n /**\n * @generated from field: repeated string portrait_text = 1;\n */\n portraitText: string[];\n\n /**\n * @generated from field: repeated string landscape_text = 2;\n */\n landscapeText: string[];\n\n /**\n * @generated from field: repeated string portrait_text_focus = 3;\n */\n portraitTextFocus: string[];\n\n /**\n * @generated from field: repeated string landscape_text_focus = 4;\n */\n landscapeTextFocus: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 5;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool show = 6;\n */\n show: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Bubble bubble = 7;\n */\n bubble?: Bubble | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ClickButton.\n * Use `create(ClickButtonSchema)` to create a new message.\n */\nexport const ClickButtonSchema: GenMessage<ClickButton> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 8);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ClickButtonV2\n */\nexport type ClickButtonV2 = Message<\"bilibili.community.service.dm.v1.ClickButtonV2\"> & {\n /**\n * @generated from field: repeated string portrait_text = 1;\n */\n portraitText: string[];\n\n /**\n * @generated from field: repeated string landscape_text = 2;\n */\n landscapeText: string[];\n\n /**\n * @generated from field: repeated string portrait_text_focus = 3;\n */\n portraitTextFocus: string[];\n\n /**\n * @generated from field: repeated string landscape_text_focus = 4;\n */\n landscapeTextFocus: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 5;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool text_input_post = 6;\n */\n textInputPost: boolean;\n\n /**\n * @generated from field: bool exposure_once = 7;\n */\n exposureOnce: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExposureType exposure_type = 8;\n */\n exposureType: ExposureType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ClickButtonV2.\n * Use `create(ClickButtonV2Schema)` to create a new message.\n */\nexport const ClickButtonV2Schema: GenMessage<ClickButtonV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 9);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.Command\n */\nexport type Command = Message<\"bilibili.community.service.dm.v1.Command\"> & {\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.CommandDm command_dms = 1;\n */\n commandDms: CommandDm[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Command.\n * Use `create(CommandSchema)` to create a new message.\n */\nexport const CommandSchema: GenMessage<Command> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 10);\n\n/**\n * 互动弹幕条目信息\n *\n * @generated from message bilibili.community.service.dm.v1.CommandDm\n */\nexport type CommandDm = Message<\"bilibili.community.service.dm.v1.CommandDm\"> & {\n /**\n * 弹幕id\n *\n * @generated from field: int64 id = 1;\n */\n id: bigint;\n\n /**\n * 对象视频cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 发送者mid\n *\n * @generated from field: int64 mid = 3;\n */\n mid: bigint;\n\n /**\n * 互动弹幕指令\n *\n * @generated from field: string command = 4;\n */\n command: string;\n\n /**\n * 互动弹幕正文\n *\n * @generated from field: string content = 5;\n */\n content: string;\n\n /**\n * 出现时间\n *\n * @generated from field: int32 progress = 6;\n */\n progress: number;\n\n /**\n * 创建时间\n *\n * @generated from field: string ctime = 7;\n */\n ctime: string;\n\n /**\n * 发布时间\n *\n * @generated from field: string mtime = 8;\n */\n mtime: string;\n\n /**\n * 扩展json数据\n *\n * @generated from field: string extra = 9;\n */\n extra: string;\n\n /**\n * 弹幕id str类型\n *\n * @generated from field: string idStr = 10;\n */\n idStr: string;\n\n /**\n *\n *\n * @generated from field: int32 type = 11;\n */\n type: number;\n\n /**\n *\n *\n * @generated from field: bool auto_create = 12;\n */\n autoCreate: boolean;\n\n /**\n *\n *\n * @generated from field: int32 count_down = 13;\n */\n countDown: number;\n\n /**\n *\n *\n * @generated from field: int32 attr = 14;\n */\n attr: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.CommandDm.\n * Use `create(CommandDmSchema)` to create a new message.\n */\nexport const CommandDmSchema: GenMessage<CommandDm> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 11);\n\n/**\n * 弹幕ai云屏蔽列表\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuAIFlag\n */\nexport type DanmakuAIFlag = Message<\"bilibili.community.service.dm.v1.DanmakuAIFlag\"> & {\n /**\n * 弹幕ai云屏蔽条目\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuFlag dm_flags = 1;\n */\n dmFlags: DanmakuFlag[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuAIFlag.\n * Use `create(DanmakuAIFlagSchema)` to create a new message.\n */\nexport const DanmakuAIFlagSchema: GenMessage<DanmakuAIFlag> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 12);\n\n/**\n * 弹幕条目\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuElem\n */\nexport type DanmakuElem = Message<\"bilibili.community.service.dm.v1.DanmakuElem\"> & {\n /**\n * 弹幕dmid\n *\n * @generated from field: int64 id = 1;\n */\n id: bigint;\n\n /**\n * 弹幕出现位置(单位ms)\n *\n * @generated from field: int32 progress = 2;\n */\n progress: number;\n\n /**\n * 弹幕类型 1 2 3:普通弹幕 4:底部弹幕 5:顶部弹幕 6:逆向弹幕 7:高级弹幕 8:代码弹幕 9:BAS弹幕(pool必须为2)\n *\n * @generated from field: int32 mode = 3;\n */\n mode: number;\n\n /**\n * 弹幕字号\n *\n * @generated from field: int32 fontsize = 4;\n */\n fontsize: number;\n\n /**\n * 弹幕颜色\n *\n * @generated from field: bilibili.community.service.dm.v1.DmColorfulType color = 5;\n */\n color: DmColorfulType;\n\n /**\n * 发送者mid hash\n *\n * @generated from field: string mid_hash = 6;\n */\n midHash: string;\n\n /**\n * 弹幕正文\n *\n * @generated from field: string content = 7;\n */\n content: string;\n\n /**\n * 发送时间\n *\n * @generated from field: int64 ctime = 8;\n */\n ctime: bigint;\n\n /**\n * 权重 用于屏蔽等级 区间:[1,10]\n *\n * @generated from field: int32 weight = 9;\n */\n weight: number;\n\n /**\n * 动作\n *\n * @generated from field: string action = 10;\n */\n action: string;\n\n /**\n * 弹幕池 0:普通池 1:字幕池 2:特殊池(代码/BAS弹幕)\n *\n * @generated from field: int32 pool = 11;\n */\n pool: number;\n\n /**\n * 弹幕dmid str\n *\n * @generated from field: string id_str = 12;\n */\n idStr: string;\n\n /**\n * 弹幕属性位(bin求AND)\n * bit0:保护 bit1:直播 bit2:高赞\n *\n * @generated from field: int32 attr = 13;\n */\n attr: number;\n\n /**\n * @generated from field: string animation = 22;\n */\n animation: string;\n\n /**\n * @generated from field: string extra = 23;\n */\n extra: string;\n\n /**\n * 大会员专属颜色\n *\n * @generated from field: bilibili.community.service.dm.v1.DmColorfulType colorful = 24;\n */\n colorful: DmColorfulType;\n\n /**\n *\n *\n * @generated from field: int32 type = 25;\n */\n type: number;\n\n /**\n *\n *\n * @generated from field: int64 oid = 26;\n */\n oid: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuElem.\n * Use `create(DanmakuElemSchema)` to create a new message.\n */\nexport const DanmakuElemSchema: GenMessage<DanmakuElem> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 13);\n\n/**\n * 弹幕ai云屏蔽条目\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuFlag\n */\nexport type DanmakuFlag = Message<\"bilibili.community.service.dm.v1.DanmakuFlag\"> & {\n /**\n * 弹幕dmid\n *\n * @generated from field: int64 dmid = 1;\n */\n dmid: bigint;\n\n /**\n * 评分\n *\n * @generated from field: int32 flag = 2;\n */\n flag: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuFlag.\n * Use `create(DanmakuFlagSchema)` to create a new message.\n */\nexport const DanmakuFlagSchema: GenMessage<DanmakuFlag> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 14);\n\n/**\n * 云屏蔽配置信息\n *\n * @generated from message bilibili.community.service.dm.v1.DanmakuFlagConfig\n */\nexport type DanmakuFlagConfig = Message<\"bilibili.community.service.dm.v1.DanmakuFlagConfig\"> & {\n /**\n * 云屏蔽等级\n *\n * @generated from field: int32 rec_flag = 1;\n */\n recFlag: number;\n\n /**\n * 云屏蔽文案\n *\n * @generated from field: string rec_text = 2;\n */\n recText: string;\n\n /**\n * 云屏蔽开关\n *\n * @generated from field: int32 rec_switch = 3;\n */\n recSwitch: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmakuFlagConfig.\n * Use `create(DanmakuFlagConfigSchema)` to create a new message.\n */\nexport const DanmakuFlagConfigSchema: GenMessage<DanmakuFlagConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 15);\n\n/**\n * 弹幕默认配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig\n */\nexport type DanmuDefaultPlayerConfig = Message<\"bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig\"> & {\n /**\n * 是否使用推荐弹幕设置\n *\n * @generated from field: bool player_danmaku_use_default_config = 1;\n */\n playerDanmakuUseDefaultConfig: boolean;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bool player_danmaku_ai_recommended_switch = 4;\n */\n playerDanmakuAiRecommendedSwitch: boolean;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: int32 player_danmaku_ai_recommended_level = 5;\n */\n playerDanmakuAiRecommendedLevel: number;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bool player_danmaku_blocktop = 6;\n */\n playerDanmakuBlocktop: boolean;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bool player_danmaku_blockscroll = 7;\n */\n playerDanmakuBlockscroll: boolean;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bool player_danmaku_blockbottom = 8;\n */\n playerDanmakuBlockbottom: boolean;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bool player_danmaku_blockcolorful = 9;\n */\n playerDanmakuBlockcolorful: boolean;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bool player_danmaku_blockrepeat = 10;\n */\n playerDanmakuBlockrepeat: boolean;\n\n /**\n * 是否屏蔽高级弹幕\n *\n * @generated from field: bool player_danmaku_blockspecial = 11;\n */\n playerDanmakuBlockspecial: boolean;\n\n /**\n * 弹幕不透明度\n *\n * @generated from field: float player_danmaku_opacity = 12;\n */\n playerDanmakuOpacity: number;\n\n /**\n * 弹幕缩放比例\n *\n * @generated from field: float player_danmaku_scalingfactor = 13;\n */\n playerDanmakuScalingfactor: number;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: float player_danmaku_domain = 14;\n */\n playerDanmakuDomain: number;\n\n /**\n * 弹幕速度\n *\n * @generated from field: int32 player_danmaku_speed = 15;\n */\n playerDanmakuSpeed: number;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool inline_player_danmaku_switch = 16;\n */\n inlinePlayerDanmakuSwitch: boolean;\n\n /**\n * @generated from field: int32 player_danmaku_senior_mode_switch = 17;\n */\n playerDanmakuSeniorModeSwitch: number;\n\n /**\n * @generated from field: int32 player_danmaku_ai_recommended_level_v2 = 18;\n */\n playerDanmakuAiRecommendedLevelV2: number;\n\n /**\n * @generated from field: map<int32, int32> player_danmaku_ai_recommended_level_v2_map = 19;\n */\n playerDanmakuAiRecommendedLevelV2Map: { [key: number]: number };\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_enable_herd_dm = 20;\n */\n playerDanmakuEnableHerdDm: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig.\n * Use `create(DanmuDefaultPlayerConfigSchema)` to create a new message.\n */\nexport const DanmuDefaultPlayerConfigSchema: GenMessage<DanmuDefaultPlayerConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 16);\n\n/**\n * 弹幕配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerConfig\n */\nexport type DanmuPlayerConfig = Message<\"bilibili.community.service.dm.v1.DanmuPlayerConfig\"> & {\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool player_danmaku_switch = 1;\n */\n playerDanmakuSwitch: boolean;\n\n /**\n * 是否记录弹幕开关设置\n *\n * @generated from field: bool player_danmaku_switch_save = 2;\n */\n playerDanmakuSwitchSave: boolean;\n\n /**\n * 是否使用推荐弹幕设置\n *\n * @generated from field: bool player_danmaku_use_default_config = 3;\n */\n playerDanmakuUseDefaultConfig: boolean;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bool player_danmaku_ai_recommended_switch = 4;\n */\n playerDanmakuAiRecommendedSwitch: boolean;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: int32 player_danmaku_ai_recommended_level = 5;\n */\n playerDanmakuAiRecommendedLevel: number;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bool player_danmaku_blocktop = 6;\n */\n playerDanmakuBlocktop: boolean;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bool player_danmaku_blockscroll = 7;\n */\n playerDanmakuBlockscroll: boolean;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bool player_danmaku_blockbottom = 8;\n */\n playerDanmakuBlockbottom: boolean;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bool player_danmaku_blockcolorful = 9;\n */\n playerDanmakuBlockcolorful: boolean;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bool player_danmaku_blockrepeat = 10;\n */\n playerDanmakuBlockrepeat: boolean;\n\n /**\n * 是否屏蔽高级弹幕\n *\n * @generated from field: bool player_danmaku_blockspecial = 11;\n */\n playerDanmakuBlockspecial: boolean;\n\n /**\n * 弹幕不透明度\n *\n * @generated from field: float player_danmaku_opacity = 12;\n */\n playerDanmakuOpacity: number;\n\n /**\n * 弹幕缩放比例\n *\n * @generated from field: float player_danmaku_scalingfactor = 13;\n */\n playerDanmakuScalingfactor: number;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: float player_danmaku_domain = 14;\n */\n playerDanmakuDomain: number;\n\n /**\n * 弹幕速度\n *\n * @generated from field: int32 player_danmaku_speed = 15;\n */\n playerDanmakuSpeed: number;\n\n /**\n * 是否开启屏蔽列表\n *\n * @generated from field: bool player_danmaku_enableblocklist = 16;\n */\n playerDanmakuEnableblocklist: boolean;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool inline_player_danmaku_switch = 17;\n */\n inlinePlayerDanmakuSwitch: boolean;\n\n /**\n * @generated from field: int32 inline_player_danmaku_config = 18;\n */\n inlinePlayerDanmakuConfig: number;\n\n /**\n * @generated from field: int32 player_danmaku_ios_switch_save = 19;\n */\n playerDanmakuIosSwitchSave: number;\n\n /**\n * @generated from field: int32 player_danmaku_senior_mode_switch = 20;\n */\n playerDanmakuSeniorModeSwitch: number;\n\n /**\n * @generated from field: int32 player_danmaku_ai_recommended_level_v2 = 21;\n */\n playerDanmakuAiRecommendedLevelV2: number;\n\n /**\n * @generated from field: map<int32, int32> player_danmaku_ai_recommended_level_v2_map = 22;\n */\n playerDanmakuAiRecommendedLevelV2Map: { [key: number]: number };\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_enable_herd_dm = 23;\n */\n playerDanmakuEnableHerdDm: boolean;\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_blocktop_bottom = 24;\n */\n playerDanmakuBlocktopBottom: boolean;\n\n /**\n *\n *\n * @generated from field: int32 player_danmaku_domain_v2 = 25;\n */\n playerDanmakuDomainV2: number;\n\n /**\n *\n *\n * @generated from field: int32 player_danmaku_density = 26;\n */\n playerDanmakuDensity: number;\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_subtitle_proof = 27;\n */\n playerDanmakuSubtitleProof: boolean;\n\n /**\n *\n *\n * @generated from field: bool player_danmaku_people_proof = 28;\n */\n playerDanmakuPeopleProof: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerConfig.\n * Use `create(DanmuPlayerConfigSchema)` to create a new message.\n */\nexport const DanmuPlayerConfigSchema: GenMessage<DanmuPlayerConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 17);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerConfigPanel\n */\nexport type DanmuPlayerConfigPanel = Message<\"bilibili.community.service.dm.v1.DanmuPlayerConfigPanel\"> & {\n /**\n * @generated from field: string selection_text = 1;\n */\n selectionText: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerConfigPanel.\n * Use `create(DanmuPlayerConfigPanelSchema)` to create a new message.\n */\nexport const DanmuPlayerConfigPanelSchema: GenMessage<DanmuPlayerConfigPanel> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 18);\n\n/**\n * 弹幕显示区域自动配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig\n */\nexport type DanmuPlayerDynamicConfig = Message<\"bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig\"> & {\n /**\n * 时间\n *\n * @generated from field: int32 progress = 1;\n */\n progress: number;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: float player_danmaku_domain = 14;\n */\n playerDanmakuDomain: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig.\n * Use `create(DanmuPlayerDynamicConfigSchema)` to create a new message.\n */\nexport const DanmuPlayerDynamicConfigSchema: GenMessage<DanmuPlayerDynamicConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 19);\n\n/**\n * 弹幕配置信息\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuPlayerViewConfig\n */\nexport type DanmuPlayerViewConfig = Message<\"bilibili.community.service.dm.v1.DanmuPlayerViewConfig\"> & {\n /**\n * 弹幕默认配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuDefaultPlayerConfig danmuku_default_player_config = 1;\n */\n danmukuDefaultPlayerConfig?: DanmuDefaultPlayerConfig | undefined;\n\n /**\n * 弹幕用户配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuPlayerConfig danmuku_player_config = 2;\n */\n danmukuPlayerConfig?: DanmuPlayerConfig | undefined;\n\n /**\n * 弹幕显示区域自动配置列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmuPlayerDynamicConfig danmuku_player_dynamic_config = 3;\n */\n danmukuPlayerDynamicConfig: DanmuPlayerDynamicConfig[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.DanmuPlayerConfigPanel danmuku_player_config_panel = 4;\n */\n danmukuPlayerConfigPanel?: DanmuPlayerConfigPanel | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuPlayerViewConfig.\n * Use `create(DanmuPlayerViewConfigSchema)` to create a new message.\n */\nexport const DanmuPlayerViewConfigSchema: GenMessage<DanmuPlayerViewConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 20);\n\n/**\n * web端用户弹幕配置\n *\n * @generated from message bilibili.community.service.dm.v1.DanmuWebPlayerConfig\n */\nexport type DanmuWebPlayerConfig = Message<\"bilibili.community.service.dm.v1.DanmuWebPlayerConfig\"> & {\n /**\n * 是否开启弹幕\n *\n * @generated from field: bool dm_switch = 1;\n */\n dmSwitch: boolean;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bool ai_switch = 2;\n */\n aiSwitch: boolean;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: int32 ai_level = 3;\n */\n aiLevel: number;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bool blocktop = 4;\n */\n blocktop: boolean;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bool blockscroll = 5;\n */\n blockscroll: boolean;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bool blockbottom = 6;\n */\n blockbottom: boolean;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bool blockcolor = 7;\n */\n blockcolor: boolean;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bool blockspecial = 8;\n */\n blockspecial: boolean;\n\n /**\n *\n *\n * @generated from field: bool preventshade = 9;\n */\n preventshade: boolean;\n\n /**\n *\n *\n * @generated from field: bool dmask = 10;\n */\n dmask: boolean;\n\n /**\n *\n *\n * @generated from field: float opacity = 11;\n */\n opacity: number;\n\n /**\n *\n *\n * @generated from field: int32 dmarea = 12;\n */\n dmarea: number;\n\n /**\n *\n *\n * @generated from field: float speedplus = 13;\n */\n speedplus: number;\n\n /**\n * 弹幕字号\n *\n * @generated from field: float fontsize = 14;\n */\n fontsize: number;\n\n /**\n *\n *\n * @generated from field: bool screensync = 15;\n */\n screensync: boolean;\n\n /**\n *\n *\n * @generated from field: bool speedsync = 16;\n */\n speedsync: boolean;\n\n /**\n *\n *\n * @generated from field: string fontfamily = 17;\n */\n fontfamily: string;\n\n /**\n * 是否使用加粗\n *\n * @generated from field: bool bold = 18;\n */\n bold: boolean;\n\n /**\n *\n *\n * @generated from field: int32 fontborder = 19;\n */\n fontborder: number;\n\n /**\n * 弹幕渲染类型\n *\n * @generated from field: string draw_type = 20;\n */\n drawType: string;\n\n /**\n * @generated from field: int32 senior_mode_switch = 21;\n */\n seniorModeSwitch: number;\n\n /**\n * @generated from field: int32 ai_level_v2 = 22;\n */\n aiLevelV2: number;\n\n /**\n * @generated from field: map<int32, int32> ai_level_v2_map = 23;\n */\n aiLevelV2Map: { [key: number]: number };\n\n /**\n *\n *\n * @generated from field: bool blocktop_bottom = 24;\n */\n blocktopBottom: boolean;\n\n /**\n *\n *\n * @generated from field: int32 dm_area_v2 = 25;\n */\n dmAreaV2: number;\n\n /**\n *\n *\n * @generated from field: int32 dm_density = 26;\n */\n dmDensity: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DanmuWebPlayerConfig.\n * Use `create(DanmuWebPlayerConfigSchema)` to create a new message.\n */\nexport const DanmuWebPlayerConfigSchema: GenMessage<DanmuWebPlayerConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 21);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DmColorful\n */\nexport type DmColorful = Message<\"bilibili.community.service.dm.v1.DmColorful\"> & {\n /**\n * 颜色类型\n *\n * @generated from field: bilibili.community.service.dm.v1.DmColorfulType type = 1;\n */\n type: DmColorfulType;\n\n /**\n * @generated from field: string src = 2;\n */\n src: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmColorful.\n * Use `create(DmColorfulSchema)` to create a new message.\n */\nexport const DmColorfulSchema: GenMessage<DmColorful> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 22);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DmExpoReportReq\n */\nexport type DmExpoReportReq = Message<\"bilibili.community.service.dm.v1.DmExpoReportReq\"> & {\n /**\n * @generated from field: string session_id = 1;\n */\n sessionId: string;\n\n /**\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n *\n *\n * @generated from field: bytes dmids = 3;\n */\n dmids: Uint8Array;\n\n /**\n * @generated from field: string spmid = 4;\n */\n spmid: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmExpoReportReq.\n * Use `create(DmExpoReportReqSchema)` to create a new message.\n */\nexport const DmExpoReportReqSchema: GenMessage<DmExpoReportReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 23);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmExpoReportRes\n */\nexport type DmExpoReportRes = Message<\"bilibili.community.service.dm.v1.DmExpoReportRes\"> & {\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmExpoReportRes.\n * Use `create(DmExpoReportResSchema)` to create a new message.\n */\nexport const DmExpoReportResSchema: GenMessage<DmExpoReportRes> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 24);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmHerdView\n */\nexport type DmHerdView = Message<\"bilibili.community.service.dm.v1.DmHerdView\"> & {\n /**\n *\n *\n * @generated from field: int32 display_herd_dm_num = 1;\n */\n displayHerdDmNum: number;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.ViewHerdDmElem herd_dms = 2;\n */\n herdDms: ViewHerdDmElem[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmHerdView.\n * Use `create(DmHerdViewSchema)` to create a new message.\n */\nexport const DmHerdViewSchema: GenMessage<DmHerdView> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 25);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmMaskWall\n */\nexport type DmMaskWall = Message<\"bilibili.community.service.dm.v1.DmMaskWall\"> & {\n /**\n *\n *\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n *\n *\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n\n /**\n *\n *\n * @generated from field: string content = 3;\n */\n content: string;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmMaskWallContentType content_type = 4;\n */\n contentType: DmMaskWallContentType;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmMaskWallBizType biz_type = 5;\n */\n bizType: DmMaskWallBizType;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmMaskWallContent contents = 6;\n */\n contents: DmMaskWallContent[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmMaskWall.\n * Use `create(DmMaskWallSchema)` to create a new message.\n */\nexport const DmMaskWallSchema: GenMessage<DmMaskWall> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 26);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmMaskWallContent\n */\nexport type DmMaskWallContent = Message<\"bilibili.community.service.dm.v1.DmMaskWallContent\"> & {\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmMaskWallContentType type = 1;\n */\n type: DmMaskWallContentType;\n\n /**\n *\n *\n * @generated from field: string content = 2;\n */\n content: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmMaskWallContent.\n * Use `create(DmMaskWallContentSchema)` to create a new message.\n */\nexport const DmMaskWallContentSchema: GenMessage<DmMaskWallContent> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 27);\n\n/**\n * 修改弹幕配置-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmPlayerConfigReq\n */\nexport type DmPlayerConfigReq = Message<\"bilibili.community.service.dm.v1.DmPlayerConfigReq\"> & {\n /**\n * @generated from field: int64 ts = 1;\n */\n ts: bigint;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSwitch switch = 2;\n */\n switch?: PlayerDanmakuSwitch | undefined;\n\n /**\n * 是否记录弹幕开关设置\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave switch_save = 3;\n */\n switchSave?: PlayerDanmakuSwitchSave | undefined;\n\n /**\n * 是否使用推荐弹幕设置\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig use_default_config = 4;\n */\n useDefaultConfig?: PlayerDanmakuUseDefaultConfig | undefined;\n\n /**\n * 是否开启智能云屏蔽\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch ai_recommended_switch = 5;\n */\n aiRecommendedSwitch?: PlayerDanmakuAiRecommendedSwitch | undefined;\n\n /**\n * 智能云屏蔽等级\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel ai_recommended_level = 6;\n */\n aiRecommendedLevel?: PlayerDanmakuAiRecommendedLevel | undefined;\n\n /**\n * 是否屏蔽顶端弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlocktop blocktop = 7;\n */\n blocktop?: PlayerDanmakuBlocktop | undefined;\n\n /**\n * 是否屏蔽滚动弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll blockscroll = 8;\n */\n blockscroll?: PlayerDanmakuBlockscroll | undefined;\n\n /**\n * 是否屏蔽底端弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom blockbottom = 9;\n */\n blockbottom?: PlayerDanmakuBlockbottom | undefined;\n\n /**\n * 是否屏蔽彩色弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful blockcolorful = 10;\n */\n blockcolorful?: PlayerDanmakuBlockcolorful | undefined;\n\n /**\n * 是否屏蔽重复弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat blockrepeat = 11;\n */\n blockrepeat?: PlayerDanmakuBlockrepeat | undefined;\n\n /**\n * 是否屏蔽高级弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial blockspecial = 12;\n */\n blockspecial?: PlayerDanmakuBlockspecial | undefined;\n\n /**\n * 弹幕不透明度\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuOpacity opacity = 13;\n */\n opacity?: PlayerDanmakuOpacity | undefined;\n\n /**\n * 弹幕缩放比例\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor scalingfactor = 14;\n */\n scalingfactor?: PlayerDanmakuScalingfactor | undefined;\n\n /**\n * 弹幕显示区域\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuDomain domain = 15;\n */\n domain?: PlayerDanmakuDomain | undefined;\n\n /**\n * 弹幕速度\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSpeed speed = 16;\n */\n speed?: PlayerDanmakuSpeed | undefined;\n\n /**\n * 是否开启屏蔽列表\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist enableblocklist = 17;\n */\n enableblocklist?: PlayerDanmakuEnableblocklist | undefined;\n\n /**\n * 是否开启弹幕\n *\n * @generated from field: bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch inlinePlayerDanmakuSwitch = 18;\n */\n inlinePlayerDanmakuSwitch?: InlinePlayerDanmakuSwitch | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch senior_mode_switch = 19;\n */\n seniorModeSwitch?: PlayerDanmakuSeniorModeSwitch | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2 ai_recommended_level_v2 = 20;\n */\n aiRecommendedLevelV2?: PlayerDanmakuAiRecommendedLevelV2 | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm enable_herd_dm = 21;\n */\n enableHerdDm?: PlayerDanmakuEnableHerdDm | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom blocktop_bottom = 22;\n */\n blocktopBottom?: PlayerDanmakuBlocktopBottom | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuDomainV2 domain_v2 = 23;\n */\n domainV2?: PlayerDanmakuDomainV2 | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuDensity density = 24;\n */\n density?: PlayerDanmakuDensity | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof subtitle_proof = 25;\n */\n subtitleProof?: PlayerDanmakuSubtitleProof | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof people_proof = 26;\n */\n peopleProof?: PlayerDanmakuPeopleProof | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmPlayerConfigReq.\n * Use `create(DmPlayerConfigReqSchema)` to create a new message.\n */\nexport const DmPlayerConfigReqSchema: GenMessage<DmPlayerConfigReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 28);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.DmSegConfig\n */\nexport type DmSegConfig = Message<\"bilibili.community.service.dm.v1.DmSegConfig\"> & {\n /**\n * @generated from field: int64 page_size = 1;\n */\n pageSize: bigint;\n\n /**\n * @generated from field: int64 total = 2;\n */\n total: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegConfig.\n * Use `create(DmSegConfigSchema)` to create a new message.\n */\nexport const DmSegConfigSchema: GenMessage<DmSegConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 29);\n\n/**\n * 获取弹幕-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegMobileReply\n */\nexport type DmSegMobileReply = Message<\"bilibili.community.service.dm.v1.DmSegMobileReply\"> & {\n /**\n * 弹幕列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuElem elems = 1;\n */\n elems: DanmakuElem[];\n\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: int32 state = 2;\n */\n state: number;\n\n /**\n * 弹幕云屏蔽ai评分值\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmakuAIFlag ai_flag = 3;\n */\n aiFlag?: DanmakuAIFlag | undefined;\n\n /**\n *\n *\n * @generated from field: repeated int64 segment_rules = 4;\n */\n segmentRules: bigint[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.DmColorful colorful_src = 5;\n */\n colorfulSrc: DmColorful[];\n\n /**\n *\n *\n * @generated from field: string context_src = 6;\n */\n contextSrc: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegMobileReply.\n * Use `create(DmSegMobileReplySchema)` to create a new message.\n */\nexport const DmSegMobileReplySchema: GenMessage<DmSegMobileReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 30);\n\n/**\n * 获取弹幕-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegMobileReq\n */\nexport type DmSegMobileReq = Message<\"bilibili.community.service.dm.v1.DmSegMobileReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 分段(6min)\n *\n * @generated from field: int64 segment_index = 4;\n */\n segmentIndex: bigint;\n\n /**\n * 是否青少年模式\n *\n * @generated from field: int32 teenagers_mode = 5;\n */\n teenagersMode: number;\n\n /**\n * @generated from field: int64 ps = 6;\n */\n ps: bigint;\n\n /**\n * @generated from field: int64 pe = 7;\n */\n pe: bigint;\n\n /**\n * @generated from field: int32 pull_mode = 8;\n */\n pullMode: number;\n\n /**\n * @generated from field: int32 from_scene = 9;\n */\n fromScene: number;\n\n /**\n *\n *\n * @generated from field: string spmid = 10;\n */\n spmid: string;\n\n /**\n *\n *\n * @generated from field: string context_ext = 11;\n */\n contextExt: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegMobileReq.\n * Use `create(DmSegMobileReqSchema)` to create a new message.\n */\nexport const DmSegMobileReqSchema: GenMessage<DmSegMobileReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 31);\n\n/**\n * ott弹幕列表-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegOttReply\n */\nexport type DmSegOttReply = Message<\"bilibili.community.service.dm.v1.DmSegOttReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuElem elems = 1;\n */\n elems: DanmakuElem[];\n\n /**\n * 弹幕列表\n *\n * @generated from field: int32 state = 2;\n */\n state: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegOttReply.\n * Use `create(DmSegOttReplySchema)` to create a new message.\n */\nexport const DmSegOttReplySchema: GenMessage<DmSegOttReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 32);\n\n/**\n * ott弹幕列表-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegOttReq\n */\nexport type DmSegOttReq = Message<\"bilibili.community.service.dm.v1.DmSegOttReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 分段(6min)\n *\n * @generated from field: int64 segment_index = 4;\n */\n segmentIndex: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegOttReq.\n * Use `create(DmSegOttReqSchema)` to create a new message.\n */\nexport const DmSegOttReqSchema: GenMessage<DmSegOttReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 33);\n\n/**\n * 弹幕SDK-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegSDKReply\n */\nexport type DmSegSDKReply = Message<\"bilibili.community.service.dm.v1.DmSegSDKReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: bool closed = 1;\n */\n closed: boolean;\n\n /**\n * 弹幕列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DanmakuElem elems = 2;\n */\n elems: DanmakuElem[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegSDKReply.\n * Use `create(DmSegSDKReplySchema)` to create a new message.\n */\nexport const DmSegSDKReplySchema: GenMessage<DmSegSDKReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 34);\n\n/**\n * 弹幕SDK-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmSegSDKReq\n */\nexport type DmSegSDKReq = Message<\"bilibili.community.service.dm.v1.DmSegSDKReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 分段(6min)\n *\n * @generated from field: int64 segment_index = 4;\n */\n segmentIndex: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSegSDKReq.\n * Use `create(DmSegSDKReqSchema)` to create a new message.\n */\nexport const DmSegSDKReqSchema: GenMessage<DmSegSDKReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 35);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.DmSubView\n */\nexport type DmSubView = Message<\"bilibili.community.service.dm.v1.DmSubView\"> & {\n /**\n *\n *\n * @generated from field: int32 type = 1;\n */\n type: number;\n\n /**\n *\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n *\n *\n * @generated from field: int64 pid = 3;\n */\n pid: bigint;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanelV2 post_panel2 = 4;\n */\n postPanel2: PostPanelV2[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmSubView.\n * Use `create(DmSubViewSchema)` to create a new message.\n */\nexport const DmSubViewSchema: GenMessage<DmSubView> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 36);\n\n/**\n * 客户端弹幕元数据-响应\n *\n * @generated from message bilibili.community.service.dm.v1.DmViewReply\n */\nexport type DmViewReply = Message<\"bilibili.community.service.dm.v1.DmViewReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: bool closed = 1;\n */\n closed: boolean;\n\n /**\n * 智能防挡弹幕蒙版信息\n *\n * @generated from field: bilibili.community.service.dm.v1.VideoMask mask = 2;\n */\n mask?: VideoMask | undefined;\n\n /**\n * 视频字幕\n *\n * @generated from field: bilibili.community.service.dm.v1.VideoSubtitle subtitle = 3;\n */\n subtitle?: VideoSubtitle | undefined;\n\n /**\n * 高级弹幕专包url(bfs)\n *\n * @generated from field: repeated string special_dms = 4;\n */\n specialDms: string[];\n\n /**\n * 云屏蔽配置信息\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmakuFlagConfig ai_flag = 5;\n */\n aiFlag?: DanmakuFlagConfig | undefined;\n\n /**\n * 弹幕配置信息\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuPlayerViewConfig player_config = 6;\n */\n playerConfig?: DanmuPlayerViewConfig | undefined;\n\n /**\n * 弹幕发送框样式\n *\n * @generated from field: int32 send_box_style = 7;\n */\n sendBoxStyle: number;\n\n /**\n * 是否允许\n *\n * @generated from field: bool allow = 8;\n */\n allow: boolean;\n\n /**\n * check box 是否展示\n *\n * @generated from field: bool check_box = 9;\n */\n checkBox: boolean;\n\n /**\n * check box 展示文本\n *\n * @generated from field: string check_box_show_msg = 10;\n */\n checkBoxShowMsg: string;\n\n /**\n * 展示文案\n *\n * @generated from field: string text_placeholder = 11;\n */\n textPlaceholder: string;\n\n /**\n * 弹幕输入框文案\n *\n * @generated from field: string input_placeholder = 12;\n */\n inputPlaceholder: string;\n\n /**\n * 用户举报弹幕 cid维度屏蔽的正则规则\n *\n * @generated from field: repeated string report_filter_content = 13;\n */\n reportFilterContent: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExpoReport expo_report = 14;\n */\n expoReport?: ExpoReport | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.BuzzwordConfig buzzword_config = 15;\n */\n buzzwordConfig?: BuzzwordConfig | undefined;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Expressions expressions = 16;\n */\n expressions: Expressions[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanel post_panel = 17;\n */\n postPanel: PostPanel[];\n\n /**\n * @generated from field: repeated string activity_meta = 18;\n */\n activityMeta: string[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanelV2 post_panel2 = 19;\n */\n postPanel2: PostPanelV2[];\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmMaskWall dm_mask_wall = 20;\n */\n dmMaskWall: DmMaskWall[];\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.DmHerdView dm_herd = 21;\n */\n dmHerd?: DmHerdView | undefined;\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.Command command = 22;\n */\n command?: Command | undefined;\n\n /**\n *\n *\n * @generated from field: string kv = 23;\n */\n kv: string;\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmSubView sub_views = 24;\n */\n subViews: DmSubView[];\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.QoeInfo qoe = 25;\n */\n qoe?: QoeInfo | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmViewReply.\n * Use `create(DmViewReplySchema)` to create a new message.\n */\nexport const DmViewReplySchema: GenMessage<DmViewReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 37);\n\n/**\n * 客户端弹幕元数据-请求\n *\n * @generated from message bilibili.community.service.dm.v1.DmViewReq\n */\nexport type DmViewReq = Message<\"bilibili.community.service.dm.v1.DmViewReq\"> & {\n /**\n * 稿件avid/漫画epid\n *\n * @generated from field: int64 pid = 1;\n */\n pid: bigint;\n\n /**\n * 视频cid/漫画cid\n *\n * @generated from field: int64 oid = 2;\n */\n oid: bigint;\n\n /**\n * 弹幕类型\n * 1:视频 2:漫画\n *\n * @generated from field: int32 type = 3;\n */\n type: number;\n\n /**\n * 页面spm\n *\n * @generated from field: string spmid = 4;\n */\n spmid: string;\n\n /**\n * 是否冷启\n *\n * @generated from field: int32 is_hard_boot = 5;\n */\n isHardBoot: number;\n\n /**\n *\n *\n * @generated from field: string context_ext = 6;\n */\n contextExt: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmViewReq.\n * Use `create(DmViewReqSchema)` to create a new message.\n */\nexport const DmViewReqSchema: GenMessage<DmViewReq> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 38);\n\n/**\n * web端弹幕元数据-响应\n * https://api.bilibili.com/x/v2/dm/web/view\n *\n * @generated from message bilibili.community.service.dm.v1.DmWebViewReply\n */\nexport type DmWebViewReply = Message<\"bilibili.community.service.dm.v1.DmWebViewReply\"> & {\n /**\n * 是否已关闭弹幕\n * 0:未关闭 1:已关闭\n *\n * @generated from field: int32 state = 1;\n */\n state: number;\n\n /**\n * @generated from field: string text = 2;\n */\n text: string;\n\n /**\n * @generated from field: string text_side = 3;\n */\n textSide: string;\n\n /**\n * 分段弹幕配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DmSegConfig dm_sge = 4;\n */\n dmSge?: DmSegConfig | undefined;\n\n /**\n * 云屏蔽配置信息\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmakuFlagConfig flag = 5;\n */\n flag?: DanmakuFlagConfig | undefined;\n\n /**\n * 高级弹幕专包url(bfs)\n *\n * @generated from field: repeated string special_dms = 6;\n */\n specialDms: string[];\n\n /**\n * check box 是否展示\n *\n * @generated from field: bool check_box = 7;\n */\n checkBox: boolean;\n\n /**\n * 弹幕数\n *\n * @generated from field: int64 count = 8;\n */\n count: bigint;\n\n /**\n * 互动弹幕\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.CommandDm command_dms = 9;\n */\n commandDms: CommandDm[];\n\n /**\n * 用户弹幕配置\n *\n * @generated from field: bilibili.community.service.dm.v1.DanmuWebPlayerConfig player_config = 10;\n */\n playerConfig?: DanmuWebPlayerConfig | undefined;\n\n /**\n * 用户举报弹幕 cid维度屏蔽\n *\n * @generated from field: repeated string report_filter_content = 11;\n */\n reportFilterContent: string[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Expressions expressions = 12;\n */\n expressions: Expressions[];\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanel post_panel = 13;\n */\n postPanel: PostPanel[];\n\n /**\n * @generated from field: repeated string activity_meta = 14;\n */\n activityMeta: string[];\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.PostPanelV2 post_panel2 = 15;\n */\n postPanel2: PostPanelV2[];\n\n /**\n *\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.DmSubView sub_views = 16;\n */\n subViews: DmSubView[];\n\n /**\n *\n *\n * @generated from field: bilibili.community.service.dm.v1.QoeInfo qoe = 17;\n */\n qoe?: QoeInfo | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.DmWebViewReply.\n * Use `create(DmWebViewReplySchema)` to create a new message.\n */\nexport const DmWebViewReplySchema: GenMessage<DmWebViewReply> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 39);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ExpoReport\n */\nexport type ExpoReport = Message<\"bilibili.community.service.dm.v1.ExpoReport\"> & {\n /**\n * @generated from field: bool should_report_at_end = 1;\n */\n shouldReportAtEnd: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ExpoReport.\n * Use `create(ExpoReportSchema)` to create a new message.\n */\nexport const ExpoReportSchema: GenMessage<ExpoReport> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 40);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Expression\n */\nexport type Expression = Message<\"bilibili.community.service.dm.v1.Expression\"> & {\n /**\n * @generated from field: repeated string keyword = 1;\n */\n keyword: string[];\n\n /**\n * @generated from field: string url = 2;\n */\n url: string;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Period period = 3;\n */\n period: Period[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Expression.\n * Use `create(ExpressionSchema)` to create a new message.\n */\nexport const ExpressionSchema: GenMessage<Expression> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 41);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Expressions\n */\nexport type Expressions = Message<\"bilibili.community.service.dm.v1.Expressions\"> & {\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Expression data = 1;\n */\n data: Expression[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Expressions.\n * Use `create(ExpressionsSchema)` to create a new message.\n */\nexport const ExpressionsSchema: GenMessage<Expressions> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 42);\n\n/**\n * 是否开启弹幕\n *\n * @generated from message bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch\n */\nexport type InlinePlayerDanmakuSwitch = Message<\"bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.InlinePlayerDanmakuSwitch.\n * Use `create(InlinePlayerDanmakuSwitchSchema)` to create a new message.\n */\nexport const InlinePlayerDanmakuSwitchSchema: GenMessage<InlinePlayerDanmakuSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 43);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Label\n */\nexport type Label = Message<\"bilibili.community.service.dm.v1.Label\"> & {\n /**\n * @generated from field: string title = 1;\n */\n title: string;\n\n /**\n * @generated from field: repeated string content = 2;\n */\n content: string[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Label.\n * Use `create(LabelSchema)` to create a new message.\n */\nexport const LabelSchema: GenMessage<Label> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 44);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.LabelV2\n */\nexport type LabelV2 = Message<\"bilibili.community.service.dm.v1.LabelV2\"> & {\n /**\n * @generated from field: string title = 1;\n */\n title: string;\n\n /**\n * @generated from field: repeated string content = 2;\n */\n content: string[];\n\n /**\n * @generated from field: bool exposure_once = 3;\n */\n exposureOnce: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ExposureType exposure_type = 4;\n */\n exposureType: ExposureType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.LabelV2.\n * Use `create(LabelV2Schema)` to create a new message.\n */\nexport const LabelV2Schema: GenMessage<LabelV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 45);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Period\n */\nexport type Period = Message<\"bilibili.community.service.dm.v1.Period\"> & {\n /**\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Period.\n * Use `create(PeriodSchema)` to create a new message.\n */\nexport const PeriodSchema: GenMessage<Period> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 46);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel\n */\nexport type PlayerDanmakuAiRecommendedLevel = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevel.\n * Use `create(PlayerDanmakuAiRecommendedLevelSchema)` to create a new message.\n */\nexport const PlayerDanmakuAiRecommendedLevelSchema: GenMessage<PlayerDanmakuAiRecommendedLevel> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 47);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2\n */\nexport type PlayerDanmakuAiRecommendedLevelV2 = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedLevelV2.\n * Use `create(PlayerDanmakuAiRecommendedLevelV2Schema)` to create a new message.\n */\nexport const PlayerDanmakuAiRecommendedLevelV2Schema: GenMessage<PlayerDanmakuAiRecommendedLevelV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 48);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch\n */\nexport type PlayerDanmakuAiRecommendedSwitch = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuAiRecommendedSwitch.\n * Use `create(PlayerDanmakuAiRecommendedSwitchSchema)` to create a new message.\n */\nexport const PlayerDanmakuAiRecommendedSwitchSchema: GenMessage<PlayerDanmakuAiRecommendedSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 49);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom\n */\nexport type PlayerDanmakuBlockbottom = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockbottom.\n * Use `create(PlayerDanmakuBlockbottomSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockbottomSchema: GenMessage<PlayerDanmakuBlockbottom> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 50);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful\n */\nexport type PlayerDanmakuBlockcolorful = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockcolorful.\n * Use `create(PlayerDanmakuBlockcolorfulSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockcolorfulSchema: GenMessage<PlayerDanmakuBlockcolorful> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 51);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat\n */\nexport type PlayerDanmakuBlockrepeat = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockrepeat.\n * Use `create(PlayerDanmakuBlockrepeatSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockrepeatSchema: GenMessage<PlayerDanmakuBlockrepeat> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 52);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll\n */\nexport type PlayerDanmakuBlockscroll = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockscroll.\n * Use `create(PlayerDanmakuBlockscrollSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockscrollSchema: GenMessage<PlayerDanmakuBlockscroll> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 53);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial\n */\nexport type PlayerDanmakuBlockspecial = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlockspecial.\n * Use `create(PlayerDanmakuBlockspecialSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlockspecialSchema: GenMessage<PlayerDanmakuBlockspecial> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 54);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlocktop\n */\nexport type PlayerDanmakuBlocktop = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlocktop\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlocktop.\n * Use `create(PlayerDanmakuBlocktopSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlocktopSchema: GenMessage<PlayerDanmakuBlocktop> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 55);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom\n */\nexport type PlayerDanmakuBlocktopBottom = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuBlocktopBottom.\n * Use `create(PlayerDanmakuBlocktopBottomSchema)` to create a new message.\n */\nexport const PlayerDanmakuBlocktopBottomSchema: GenMessage<PlayerDanmakuBlocktopBottom> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 56);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuDensity\n */\nexport type PlayerDanmakuDensity = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuDensity\"> & {\n /**\n *\n *\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuDensity.\n * Use `create(PlayerDanmakuDensitySchema)` to create a new message.\n */\nexport const PlayerDanmakuDensitySchema: GenMessage<PlayerDanmakuDensity> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 57);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuDomain\n */\nexport type PlayerDanmakuDomain = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuDomain\"> & {\n /**\n * @generated from field: float value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuDomain.\n * Use `create(PlayerDanmakuDomainSchema)` to create a new message.\n */\nexport const PlayerDanmakuDomainSchema: GenMessage<PlayerDanmakuDomain> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 58);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuDomainV2\n */\nexport type PlayerDanmakuDomainV2 = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuDomainV2\"> & {\n /**\n *\n *\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuDomainV2.\n * Use `create(PlayerDanmakuDomainV2Schema)` to create a new message.\n */\nexport const PlayerDanmakuDomainV2Schema: GenMessage<PlayerDanmakuDomainV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 59);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm\n */\nexport type PlayerDanmakuEnableHerdDm = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuEnableHerdDm.\n * Use `create(PlayerDanmakuEnableHerdDmSchema)` to create a new message.\n */\nexport const PlayerDanmakuEnableHerdDmSchema: GenMessage<PlayerDanmakuEnableHerdDm> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 60);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist\n */\nexport type PlayerDanmakuEnableblocklist = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuEnableblocklist.\n * Use `create(PlayerDanmakuEnableblocklistSchema)` to create a new message.\n */\nexport const PlayerDanmakuEnableblocklistSchema: GenMessage<PlayerDanmakuEnableblocklist> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 61);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuOpacity\n */\nexport type PlayerDanmakuOpacity = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuOpacity\"> & {\n /**\n * @generated from field: float value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuOpacity.\n * Use `create(PlayerDanmakuOpacitySchema)` to create a new message.\n */\nexport const PlayerDanmakuOpacitySchema: GenMessage<PlayerDanmakuOpacity> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 62);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof\n */\nexport type PlayerDanmakuPeopleProof = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuPeopleProof.\n * Use `create(PlayerDanmakuPeopleProofSchema)` to create a new message.\n */\nexport const PlayerDanmakuPeopleProofSchema: GenMessage<PlayerDanmakuPeopleProof> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 63);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor\n */\nexport type PlayerDanmakuScalingfactor = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor\"> & {\n /**\n * @generated from field: float value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuScalingfactor.\n * Use `create(PlayerDanmakuScalingfactorSchema)` to create a new message.\n */\nexport const PlayerDanmakuScalingfactorSchema: GenMessage<PlayerDanmakuScalingfactor> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 64);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch\n */\nexport type PlayerDanmakuSeniorModeSwitch = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSeniorModeSwitch.\n * Use `create(PlayerDanmakuSeniorModeSwitchSchema)` to create a new message.\n */\nexport const PlayerDanmakuSeniorModeSwitchSchema: GenMessage<PlayerDanmakuSeniorModeSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 65);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSpeed\n */\nexport type PlayerDanmakuSpeed = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSpeed\"> & {\n /**\n * @generated from field: int32 value = 1;\n */\n value: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSpeed.\n * Use `create(PlayerDanmakuSpeedSchema)` to create a new message.\n */\nexport const PlayerDanmakuSpeedSchema: GenMessage<PlayerDanmakuSpeed> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 66);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof\n */\nexport type PlayerDanmakuSubtitleProof = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof\"> & {\n /**\n *\n *\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSubtitleProof.\n * Use `create(PlayerDanmakuSubtitleProofSchema)` to create a new message.\n */\nexport const PlayerDanmakuSubtitleProofSchema: GenMessage<PlayerDanmakuSubtitleProof> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 67);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSwitch\n */\nexport type PlayerDanmakuSwitch = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSwitch\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n\n /**\n * @generated from field: bool can_ignore = 2;\n */\n canIgnore: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSwitch.\n * Use `create(PlayerDanmakuSwitchSchema)` to create a new message.\n */\nexport const PlayerDanmakuSwitchSchema: GenMessage<PlayerDanmakuSwitch> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 68);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave\n */\nexport type PlayerDanmakuSwitchSave = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuSwitchSave.\n * Use `create(PlayerDanmakuSwitchSaveSchema)` to create a new message.\n */\nexport const PlayerDanmakuSwitchSaveSchema: GenMessage<PlayerDanmakuSwitchSave> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 69);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig\n */\nexport type PlayerDanmakuUseDefaultConfig = Message<\"bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig\"> & {\n /**\n * @generated from field: bool value = 1;\n */\n value: boolean;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PlayerDanmakuUseDefaultConfig.\n * Use `create(PlayerDanmakuUseDefaultConfigSchema)` to create a new message.\n */\nexport const PlayerDanmakuUseDefaultConfigSchema: GenMessage<PlayerDanmakuUseDefaultConfig> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 70);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PostPanel\n */\nexport type PostPanel = Message<\"bilibili.community.service.dm.v1.PostPanel\"> & {\n /**\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n\n /**\n * @generated from field: int64 priority = 3;\n */\n priority: bigint;\n\n /**\n * @generated from field: int64 biz_id = 4;\n */\n bizId: bigint;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostPanelBizType biz_type = 5;\n */\n bizType: PostPanelBizType;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ClickButton click_button = 6;\n */\n clickButton?: ClickButton | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.TextInput text_input = 7;\n */\n textInput?: TextInput | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckBox check_box = 8;\n */\n checkBox?: CheckBox | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Toast toast = 9;\n */\n toast?: Toast | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PostPanel.\n * Use `create(PostPanelSchema)` to create a new message.\n */\nexport const PostPanelSchema: GenMessage<PostPanel> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 71);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.PostPanelV2\n */\nexport type PostPanelV2 = Message<\"bilibili.community.service.dm.v1.PostPanelV2\"> & {\n /**\n * @generated from field: int64 start = 1;\n */\n start: bigint;\n\n /**\n * @generated from field: int64 end = 2;\n */\n end: bigint;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostPanelBizType biz_type = 3;\n */\n bizType: PostPanelBizType;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ClickButtonV2 click_button = 4;\n */\n clickButton?: ClickButtonV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.TextInputV2 text_input = 5;\n */\n textInput?: TextInputV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.CheckBoxV2 check_box = 6;\n */\n checkBox?: CheckBoxV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ToastV2 toast = 7;\n */\n toast?: ToastV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.BubbleV2 bubble = 8;\n */\n bubble?: BubbleV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.LabelV2 label = 9;\n */\n label?: LabelV2 | undefined;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostStatus post_status = 10;\n */\n postStatus: PostStatus;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.PostPanelV2.\n * Use `create(PostPanelV2Schema)` to create a new message.\n */\nexport const PostPanelV2Schema: GenMessage<PostPanelV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 72);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.QoeInfo\n */\nexport type QoeInfo = Message<\"bilibili.community.service.dm.v1.QoeInfo\"> & {\n /**\n *\n *\n * @generated from field: string info = 1;\n */\n info: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.QoeInfo.\n * Use `create(QoeInfoSchema)` to create a new message.\n */\nexport const QoeInfoSchema: GenMessage<QoeInfo> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 73);\n\n/**\n * 修改弹幕配置-响应\n *\n * @generated from message bilibili.community.service.dm.v1.Response\n */\nexport type Response = Message<\"bilibili.community.service.dm.v1.Response\"> & {\n /**\n * @generated from field: int32 code = 1;\n */\n code: number;\n\n /**\n * @generated from field: string message = 2;\n */\n message: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Response.\n * Use `create(ResponseSchema)` to create a new message.\n */\nexport const ResponseSchema: GenMessage<Response> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 74);\n\n/**\n * 单个字幕信息\n *\n * @generated from message bilibili.community.service.dm.v1.SubtitleItem\n */\nexport type SubtitleItem = Message<\"bilibili.community.service.dm.v1.SubtitleItem\"> & {\n /**\n * 字幕id\n *\n * @generated from field: int64 id = 1;\n */\n id: bigint;\n\n /**\n * 字幕id str\n *\n * @generated from field: string id_str = 2;\n */\n idStr: string;\n\n /**\n * 字幕语言代码\n *\n * @generated from field: string lan = 3;\n */\n lan: string;\n\n /**\n * 字幕语言\n *\n * @generated from field: string lan_doc = 4;\n */\n lanDoc: string;\n\n /**\n * 字幕文件url\n *\n * @generated from field: string subtitle_url = 5;\n */\n subtitleUrl: string;\n\n /**\n * 字幕作者信息\n *\n * @generated from field: bilibili.community.service.dm.v1.UserInfo author = 6;\n */\n author?: UserInfo | undefined;\n\n /**\n * 字幕类型\n *\n * @generated from field: bilibili.community.service.dm.v1.SubtitleType type = 7;\n */\n type: SubtitleType;\n\n /**\n * @generated from field: string lan_doc_brief = 8;\n */\n lanDocBrief: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.SubtitleAiType ai_type = 9;\n */\n aiType: SubtitleAiType;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.SubtitleAiStatus ai_status = 10;\n */\n aiStatus: SubtitleAiStatus;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.SubtitleItem.\n * Use `create(SubtitleItemSchema)` to create a new message.\n */\nexport const SubtitleItemSchema: GenMessage<SubtitleItem> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 75);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.TextInput\n */\nexport type TextInput = Message<\"bilibili.community.service.dm.v1.TextInput\"> & {\n /**\n * @generated from field: repeated string portrait_placeholder = 1;\n */\n portraitPlaceholder: string[];\n\n /**\n * @generated from field: repeated string landscape_placeholder = 2;\n */\n landscapePlaceholder: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 3;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool placeholder_post = 4;\n */\n placeholderPost: boolean;\n\n /**\n * @generated from field: bool show = 5;\n */\n show: boolean;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Avatar avatar = 6;\n */\n avatar: Avatar[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.PostStatus post_status = 7;\n */\n postStatus: PostStatus;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Label label = 8;\n */\n label?: Label | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.TextInput.\n * Use `create(TextInputSchema)` to create a new message.\n */\nexport const TextInputSchema: GenMessage<TextInput> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 76);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.TextInputV2\n */\nexport type TextInputV2 = Message<\"bilibili.community.service.dm.v1.TextInputV2\"> & {\n /**\n * @generated from field: repeated string portrait_placeholder = 1;\n */\n portraitPlaceholder: string[];\n\n /**\n * @generated from field: repeated string landscape_placeholder = 2;\n */\n landscapePlaceholder: string[];\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.RenderType render_type = 3;\n */\n renderType: RenderType;\n\n /**\n * @generated from field: bool placeholder_post = 4;\n */\n placeholderPost: boolean;\n\n /**\n * @generated from field: repeated bilibili.community.service.dm.v1.Avatar avatar = 5;\n */\n avatar: Avatar[];\n\n /**\n * @generated from field: int32 text_input_limit = 6;\n */\n textInputLimit: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.TextInputV2.\n * Use `create(TextInputV2Schema)` to create a new message.\n */\nexport const TextInputV2Schema: GenMessage<TextInputV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 77);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.Toast\n */\nexport type Toast = Message<\"bilibili.community.service.dm.v1.Toast\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: int32 duration = 2;\n */\n duration: number;\n\n /**\n * @generated from field: bool show = 3;\n */\n show: boolean;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.Button button = 4;\n */\n button?: Button | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.Toast.\n * Use `create(ToastSchema)` to create a new message.\n */\nexport const ToastSchema: GenMessage<Toast> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 78);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ToastButtonV2\n */\nexport type ToastButtonV2 = Message<\"bilibili.community.service.dm.v1.ToastButtonV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ToastFunctionType action = 2;\n */\n action: ToastFunctionType;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ToastButtonV2.\n * Use `create(ToastButtonV2Schema)` to create a new message.\n */\nexport const ToastButtonV2Schema: GenMessage<ToastButtonV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 79);\n\n/**\n * @generated from message bilibili.community.service.dm.v1.ToastV2\n */\nexport type ToastV2 = Message<\"bilibili.community.service.dm.v1.ToastV2\"> & {\n /**\n * @generated from field: string text = 1;\n */\n text: string;\n\n /**\n * @generated from field: int32 duration = 2;\n */\n duration: number;\n\n /**\n * @generated from field: bilibili.community.service.dm.v1.ToastButtonV2 toast_button_v2 = 3;\n */\n toastButtonV2?: ToastButtonV2 | undefined;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ToastV2.\n * Use `create(ToastV2Schema)` to create a new message.\n */\nexport const ToastV2Schema: GenMessage<ToastV2> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 80);\n\n/**\n * 字幕作者信息\n *\n * @generated from message bilibili.community.service.dm.v1.UserInfo\n */\nexport type UserInfo = Message<\"bilibili.community.service.dm.v1.UserInfo\"> & {\n /**\n * 用户mid\n *\n * @generated from field: int64 mid = 1;\n */\n mid: bigint;\n\n /**\n * 用户昵称\n *\n * @generated from field: string name = 2;\n */\n name: string;\n\n /**\n * 用户性别\n *\n * @generated from field: string sex = 3;\n */\n sex: string;\n\n /**\n * 用户头像url\n *\n * @generated from field: string face = 4;\n */\n face: string;\n\n /**\n * 用户签名\n *\n * @generated from field: string sign = 5;\n */\n sign: string;\n\n /**\n * 用户等级\n *\n * @generated from field: int32 rank = 6;\n */\n rank: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.UserInfo.\n * Use `create(UserInfoSchema)` to create a new message.\n */\nexport const UserInfoSchema: GenMessage<UserInfo> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 81);\n\n/**\n * 智能防挡弹幕蒙版信息\n *\n * @generated from message bilibili.community.service.dm.v1.VideoMask\n */\nexport type VideoMask = Message<\"bilibili.community.service.dm.v1.VideoMask\"> & {\n /**\n * 视频cid\n *\n * @generated from field: int64 cid = 1;\n */\n cid: bigint;\n\n /**\n * 平台\n * 0:web端 1:客户端\n *\n * @generated from field: int32 plat = 2;\n */\n plat: number;\n\n /**\n * 帧率\n *\n * @generated from field: int32 fps = 3;\n */\n fps: number;\n\n /**\n * 间隔时间\n *\n * @generated from field: int64 time = 4;\n */\n time: bigint;\n\n /**\n * 蒙版url\n *\n * @generated from field: string mask_url = 5;\n */\n maskUrl: string;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.VideoMask.\n * Use `create(VideoMaskSchema)` to create a new message.\n */\nexport const VideoMaskSchema: GenMessage<VideoMask> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 82);\n\n/**\n * 视频字幕信息\n *\n * @generated from message bilibili.community.service.dm.v1.VideoSubtitle\n */\nexport type VideoSubtitle = Message<\"bilibili.community.service.dm.v1.VideoSubtitle\"> & {\n /**\n * 视频原语言代码\n *\n * @generated from field: string lan = 1;\n */\n lan: string;\n\n /**\n * 视频原语言\n *\n * @generated from field: string lan_doc = 2;\n */\n lanDoc: string;\n\n /**\n * 视频字幕列表\n *\n * @generated from field: repeated bilibili.community.service.dm.v1.SubtitleItem subtitles = 3;\n */\n subtitles: SubtitleItem[];\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.VideoSubtitle.\n * Use `create(VideoSubtitleSchema)` to create a new message.\n */\nexport const VideoSubtitleSchema: GenMessage<VideoSubtitle> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 83);\n\n/**\n *\n *\n * @generated from message bilibili.community.service.dm.v1.ViewHerdDmElem\n */\nexport type ViewHerdDmElem = Message<\"bilibili.community.service.dm.v1.ViewHerdDmElem\"> & {\n /**\n *\n *\n * @generated from field: string herd_msg = 1;\n */\n herdMsg: string;\n\n /**\n *\n *\n * @generated from field: int32 herd_start_cnt = 2;\n */\n herdStartCnt: number;\n\n /**\n *\n *\n * @generated from field: int32 herd_end_cnt = 3;\n */\n herdEndCnt: number;\n\n /**\n *\n *\n * @generated from field: string regex_rule = 4;\n */\n regexRule: string;\n\n /**\n *\n *\n * @generated from field: int32 start_progress = 5;\n */\n startProgress: number;\n\n /**\n *\n *\n * @generated from field: int32 end_progress = 6;\n */\n endProgress: number;\n};\n\n/**\n * Describes the message bilibili.community.service.dm.v1.ViewHerdDmElem.\n * Use `create(ViewHerdDmElemSchema)` to create a new message.\n */\nexport const ViewHerdDmElemSchema: GenMessage<ViewHerdDmElem> = /*@__PURE__*/\n messageDesc(file_bilibili_community_service_dm_v1_dm, 84);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.AvatarType\n */\nexport enum AvatarType {\n /**\n * @generated from enum value: AvatarTypeNone = 0;\n */\n AvatarTypeNone = 0,\n\n /**\n * @generated from enum value: AvatarTypeNFT = 1;\n */\n AvatarTypeNFT = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.AvatarType.\n */\nexport const AvatarTypeSchema: GenEnum<AvatarType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 0);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.BubbleType\n */\nexport enum BubbleType {\n /**\n * @generated from enum value: BubbleTypeNone = 0;\n */\n BubbleTypeNone = 0,\n\n /**\n * @generated from enum value: BubbleTypeClickButton = 1;\n */\n BubbleTypeClickButton = 1,\n\n /**\n * @generated from enum value: BubbleTypeDmSettingPanel = 2;\n */\n BubbleTypeDmSettingPanel = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.BubbleType.\n */\nexport const BubbleTypeSchema: GenEnum<BubbleType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 1);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.CheckboxType\n */\nexport enum CheckboxType {\n /**\n * @generated from enum value: CheckboxTypeNone = 0;\n */\n CheckboxTypeNone = 0,\n\n /**\n * @generated from enum value: CheckboxTypeEncourage = 1;\n */\n CheckboxTypeEncourage = 1,\n\n /**\n * @generated from enum value: CheckboxTypeColorDM = 2;\n */\n CheckboxTypeColorDM = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.CheckboxType.\n */\nexport const CheckboxTypeSchema: GenEnum<CheckboxType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 2);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.DmColorfulType\n */\nexport enum DmColorfulType {\n /**\n * 无\n *\n * @generated from enum value: NoneType = 0;\n */\n NoneType = 0,\n\n /**\n * 渐变色\n *\n * @generated from enum value: VipGradualColor = 60001;\n */\n VipGradualColor = 60001,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.DmColorfulType.\n */\nexport const DmColorfulTypeSchema: GenEnum<DmColorfulType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 3);\n\n/**\n *\n *\n * @generated from enum bilibili.community.service.dm.v1.DmMaskWallBizType\n */\nexport enum DmMaskWallBizType {\n /**\n *\n *\n * @generated from enum value: Unknown = 0;\n */\n Unknown = 0,\n\n /**\n *\n *\n * @generated from enum value: OGV = 1;\n */\n OGV = 1,\n\n /**\n *\n *\n * @generated from enum value: BizPic = 2;\n */\n BizPic = 2,\n\n /**\n *\n *\n * @generated from enum value: Mute = 3;\n */\n Mute = 3,\n\n /**\n *\n *\n * @generated from enum value: Record = 4;\n */\n Record = 4,\n\n /**\n *\n *\n * @generated from enum value: Cloud = 5;\n */\n Cloud = 5,\n\n /**\n *\n *\n * @generated from enum value: AIGC = 6;\n */\n AIGC = 6,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.DmMaskWallBizType.\n */\nexport const DmMaskWallBizTypeSchema: GenEnum<DmMaskWallBizType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 4);\n\n/**\n *\n *\n * @generated from enum bilibili.community.service.dm.v1.DmMaskWallContentType\n */\nexport enum DmMaskWallContentType {\n /**\n *\n *\n * @generated from enum value: DmMaskWallContentTypeUnknown = 0;\n */\n DmMaskWallContentTypeUnknown = 0,\n\n /**\n *\n *\n * @generated from enum value: DmMaskWallContentTypeText = 1;\n */\n DmMaskWallContentTypeText = 1,\n\n /**\n *\n *\n * @generated from enum value: DmMaskWallContentTypePic = 2;\n */\n DmMaskWallContentTypePic = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.DmMaskWallContentType.\n */\nexport const DmMaskWallContentTypeSchema: GenEnum<DmMaskWallContentType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 5);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.ExposureType\n */\nexport enum ExposureType {\n /**\n * @generated from enum value: ExposureTypeNone = 0;\n */\n ExposureTypeNone = 0,\n\n /**\n * @generated from enum value: ExposureTypeDMSend = 1;\n */\n ExposureTypeDMSend = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.ExposureType.\n */\nexport const ExposureTypeSchema: GenEnum<ExposureType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 6);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.PostPanelBizType\n */\nexport enum PostPanelBizType {\n /**\n * @generated from enum value: PostPanelBizTypeNone = 0;\n */\n PostPanelBizTypeNone = 0,\n\n /**\n * @generated from enum value: PostPanelBizTypeEncourage = 1;\n */\n PostPanelBizTypeEncourage = 1,\n\n /**\n * @generated from enum value: PostPanelBizTypeColorDM = 2;\n */\n PostPanelBizTypeColorDM = 2,\n\n /**\n * @generated from enum value: PostPanelBizTypeNFTDM = 3;\n */\n PostPanelBizTypeNFTDM = 3,\n\n /**\n * @generated from enum value: PostPanelBizTypeFragClose = 4;\n */\n PostPanelBizTypeFragClose = 4,\n\n /**\n * @generated from enum value: PostPanelBizTypeRecommend = 5;\n */\n PostPanelBizTypeRecommend = 5,\n\n /**\n *\n *\n * @generated from enum value: PostPanelBizTypePlotLeak = 6;\n */\n PostPanelBizTypePlotLeak = 6,\n\n /**\n *\n *\n * @generated from enum value: PostPanelBizTypeAntiHarassment = 7;\n */\n PostPanelBizTypeAntiHarassment = 7,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.PostPanelBizType.\n */\nexport const PostPanelBizTypeSchema: GenEnum<PostPanelBizType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 7);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.PostStatus\n */\nexport enum PostStatus {\n /**\n * @generated from enum value: PostStatusNormal = 0;\n */\n PostStatusNormal = 0,\n\n /**\n * @generated from enum value: PostStatusClosed = 1;\n */\n PostStatusClosed = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.PostStatus.\n */\nexport const PostStatusSchema: GenEnum<PostStatus> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 8);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.RenderType\n */\nexport enum RenderType {\n /**\n * @generated from enum value: RenderTypeNone = 0;\n */\n RenderTypeNone = 0,\n\n /**\n * @generated from enum value: RenderTypeSingle = 1;\n */\n RenderTypeSingle = 1,\n\n /**\n * @generated from enum value: RenderTypeRotation = 2;\n */\n RenderTypeRotation = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.RenderType.\n */\nexport const RenderTypeSchema: GenEnum<RenderType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 9);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.SubtitleAiStatus\n */\nexport enum SubtitleAiStatus {\n /**\n * @generated from enum value: None = 0;\n */\n None = 0,\n\n /**\n * @generated from enum value: Exposure = 1;\n */\n Exposure = 1,\n\n /**\n * @generated from enum value: Assist = 2;\n */\n Assist = 2,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.SubtitleAiStatus.\n */\nexport const SubtitleAiStatusSchema: GenEnum<SubtitleAiStatus> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 10);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.SubtitleAiType\n */\nexport enum SubtitleAiType {\n /**\n * @generated from enum value: Normal = 0;\n */\n Normal = 0,\n\n /**\n * @generated from enum value: Translate = 1;\n */\n Translate = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.SubtitleAiType.\n */\nexport const SubtitleAiTypeSchema: GenEnum<SubtitleAiType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 11);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.SubtitleType\n */\nexport enum SubtitleType {\n /**\n * CC字幕\n *\n * @generated from enum value: CC = 0;\n */\n CC = 0,\n\n /**\n * AI生成字幕\n *\n * @generated from enum value: AI = 1;\n */\n AI = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.SubtitleType.\n */\nexport const SubtitleTypeSchema: GenEnum<SubtitleType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 12);\n\n/**\n * @generated from enum bilibili.community.service.dm.v1.ToastFunctionType\n */\nexport enum ToastFunctionType {\n /**\n * @generated from enum value: ToastFunctionTypeNone = 0;\n */\n ToastFunctionTypeNone = 0,\n\n /**\n * @generated from enum value: ToastFunctionTypePostPanel = 1;\n */\n ToastFunctionTypePostPanel = 1,\n}\n\n/**\n * Describes the enum bilibili.community.service.dm.v1.ToastFunctionType.\n */\nexport const ToastFunctionTypeSchema: GenEnum<ToastFunctionType> = /*@__PURE__*/\n enumDesc(file_bilibili_community_service_dm_v1_dm, 13);\n\n/**\n * 弹幕\n *\n * @generated from service bilibili.community.service.dm.v1.DM\n */\nexport const DM: GenService<{\n /**\n * 获取分段弹幕\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmSegMobile\n */\n dmSegMobile: {\n methodKind: \"unary\";\n input: typeof DmSegMobileReqSchema;\n output: typeof DmSegMobileReplySchema;\n },\n /**\n * 客户端弹幕元数据 字幕、分段、防挡蒙版等\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmView\n */\n dmView: {\n methodKind: \"unary\";\n input: typeof DmViewReqSchema;\n output: typeof DmViewReplySchema;\n },\n /**\n * 修改弹幕配置\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmPlayerConfig\n */\n dmPlayerConfig: {\n methodKind: \"unary\";\n input: typeof DmPlayerConfigReqSchema;\n output: typeof ResponseSchema;\n },\n /**\n * ott弹幕列表\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmSegOtt\n */\n dmSegOtt: {\n methodKind: \"unary\";\n input: typeof DmSegOttReqSchema;\n output: typeof DmSegOttReplySchema;\n },\n /**\n * SDK弹幕列表\n *\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmSegSDK\n */\n dmSegSDK: {\n methodKind: \"unary\";\n input: typeof DmSegSDKReqSchema;\n output: typeof DmSegSDKReplySchema;\n },\n /**\n * @generated from rpc bilibili.community.service.dm.v1.DM.DmExpoReport\n */\n dmExpoReport: {\n methodKind: \"unary\";\n input: typeof DmExpoReportReqSchema;\n output: typeof DmExpoReportResSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_bilibili_community_service_dm_v1_dm, 0);\n\n","import { defineAdapter } from \"../index.ts\";\n\nimport { defaultUniDM, DMAttr } from \"@/core/dm.ts\";\nimport { PlatformVideoSource } from \"@/core/platform.ts\";\nimport { fromBinary } from \"@bufbuild/protobuf\";\nimport { DmWebViewReplySchema } from \"@/utils/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\nexport const BiliCommandGrpcAdapter = defineAdapter((bin: Uint8Array | ArrayBuffer) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const data = fromBinary(DmWebViewReplySchema, new Uint8Array(bin));\n const json = data.commandDms;\n await chunk.upsertDanmakus(\n json.map((args) => {\n const SOID = `def_${PlatformVideoSource.Bilibili}+${UniID.fromBili({ cid: args.oid }).toString()}`;\n const senderID = UniID.fromBili({ mid: args.mid });\n const map_d = {\n SOID,\n progress: args.progress,\n mode: \"Ext\" as const,\n fontsize: defaultUniDM.fontsize,\n color: defaultUniDM.color,\n senderID: senderID.toString(),\n content: args.content,\n ctime: new Date(`${args.ctime} GMT+0800`), // 无视本地时区,按照B站的东8区计算时间\n weight: 11,\n pool: \"Adv\" as const,\n attr: [DMAttr.Protect],\n platform: PlatformVideoSource.Bilibili,\n extra: {\n bili: {\n dmid: args.idStr,\n attr: args.attr,\n mid: args.mid?.toString(),\n command: args,\n },\n },\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n});\n","type ctime = string | number | bigint | Date;\n\nfunction isMsTs(ts: number | bigint, tsUnit?: \"ms\" | \"s\") {\n if (tsUnit === \"ms\") return true;\n else if (tsUnit === \"s\") return false;\n else return ts < 100000000;\n}\n\n/**\n * 将各种类型的时间进行格式化\n * @param oriCtime\n * @param tsUnit 当`oriCtime`为数字类型表时间戳时的单位;\n * 为 毫秒(ms)/秒(s)\n * @returns {Date} Date格式时间\n */\nexport function transCtime(oriCtime: ctime, tsUnit?: \"ms\" | \"s\"): Date {\n if (typeof oriCtime === \"number\" || typeof oriCtime === \"bigint\")\n if (isMsTs(oriCtime, tsUnit)) return new Date(Number(oriCtime));\n else return new Date(Number(oriCtime) * 1000);\n else if (typeof oriCtime === \"string\") {\n if (/^\\d+n$/.test(oriCtime)) return new Date(Number(oriCtime.slice(0, -1)));\n else return new Date(oriCtime);\n } else return oriCtime;\n}\n","/**\n * 获得数字的二进制,每位以boolean(true/false)表示1/0,从低位向高位\n * @param number 任意进制数字\n */\nexport const toBits = (number: number) => {\n // 低速方案\n // return [...number.toString(2)].map(Number)\n // 高速方案,位运算允许范围内更快\n const bits: boolean[] = [];\n do {\n bits.unshift(!!(number & 1)); // boolean[]\n // bits.unshift(number & 1) // (0|1)[]\n number >>= 1;\n } while (number);\n return bits.toReversed();\n};\n\nexport class SetBin {\n constructor(public bin: number) {}\n set1(bit: number) {\n this.bin |= 1 << bit;\n }\n set0(bit: number) {\n this.bin &= ~(1 << bit);\n }\n}\n","import { defineAdapter } from \"../index.ts\";\n\nimport { DMAttr, Modes, Pools } from \"@/core/dm.ts\";\nimport { PlatformVideoSource, type PlatformDanmakuSource } from \"@/core/platform.ts\";\nimport { type DMIDGenerator } from \"@/core/id.ts\";\nimport { transCtime } from \"@/utils/transCtime.ts\";\nimport { enumModeCodec, enumPoolCodec } from \"../danuni/json.ts\";\nimport { fromBinary } from \"@bufbuild/protobuf\";\nimport { DmSegMobileReplySchema } from \"@/utils/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts\";\nimport { SetBin, toBits } from \"@/utils/bin.ts\";\nimport type { UniChunk } from \"@/core/index.ts\";\nimport type { z } from \"zod\";\nimport type { DanmakusSelect } from \"@/core/db/schema.ts\";\nimport type { Extra, ExtraBili } from \"@/core/dm-extra.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\ninterface DMBili {\n id: bigint; // xml 7\n progress: number; // xml 0 ; xml s, protobuf ms\n mode: number; // xml 1\n fontsize: number; // xml 2\n color: number; // xml 3\n mid?: bigint; // 仅创作中心源\n midHash: string; // xml 6\n /**\n * 特殊类型解析:\n * - [ohh] : /oh{2,}/gi\n * - [前方高能]\n * - [...] (JS数组) : 高级弹幕\n */\n content: string; // xml content\n ctime: bigint; // xml 4\n pool: number; // xml 5\n weight?: number; // xml 8\n action?: string;\n idStr?: string;\n attr?: number;\n animation?: string;\n extra?: string;\n colorful?: number;\n type?: number;\n oid?: bigint;\n}\n\nconst DMAttrUtils = {\n fromBin(bin: number = 0, format?: PlatformDanmakuSource) {\n const array = toBits(bin);\n const attr: DMAttr[] = [];\n if (format === \"bili\") {\n if (array[0]) attr.push(DMAttr.Protect);\n if (array[1]) attr.push(DMAttr.FromLive);\n if (array[2]) attr.push(DMAttr.HighLike);\n }\n return attr;\n },\n toBin(\n attr: DMAttr[] = [],\n /**\n * 对于二进制格式的读取,应该分别读取各位,\n * 但由于不知道B站及其它使用该参数程序的读取逻辑,\n * 所以单独提供 bili 格式\n */\n format?: PlatformDanmakuSource,\n ) {\n const bin = new SetBin(0);\n if (format === \"bili\") {\n if (attr.includes(DMAttr.Protect)) bin.set1(0);\n if (attr.includes(DMAttr.FromLive)) bin.set1(1);\n if (attr.includes(DMAttr.HighLike)) bin.set1(2);\n }\n return bin.bin;\n },\n};\n\nexport function BiliCommonParser(chunk: UniChunk, args: DMBili, cid?: bigint, recSOID?: string) {\n if (args.oid && !cid) cid = args.oid;\n const SOID =\n recSOID || `def_${PlatformVideoSource.Bilibili}+${UniID.fromBili({ cid }).toString()}`;\n const senderID = UniID.validateString(args.midHash)\n ? args.midHash\n : UniID.fromBili({ midHash: args.midHash }).toString();\n let mode: Modes;\n const pool = args.pool; //暂时不做处理,兼容bili的pool格式\n const extra: Extra = {\n bili: {\n mode: args.mode,\n pool: args.pool,\n dmid: args.idStr ?? args.id.toString(),\n attr: args.attr,\n mid: args.mid?.toString(),\n adv: undefined,\n code: undefined,\n bas: undefined,\n },\n };\n //重复 transMode ,但此处有关于extra的额外处理\n switch (args.mode) {\n case 4:\n mode = Modes.Bottom;\n break;\n case 5:\n mode = Modes.Top;\n break;\n case 6:\n mode = Modes.Reverse;\n break;\n case 7:\n mode = Modes.Ext;\n extra.bili!.adv = args.content;\n break;\n case 8:\n mode = Modes.Ext;\n extra.bili!.code = args.content;\n break;\n case 9:\n mode = Modes.Ext;\n extra.bili!.bas = args.content;\n break;\n\n default:\n mode = Modes.Normal;\n break;\n }\n const map_d = {\n ...args,\n SOID,\n mode,\n senderID,\n ctime: transCtime(args.ctime, \"s\"),\n weight: args.weight || (pool === Pools.Ix ? 1 : 0),\n pool,\n attr: DMAttrUtils.fromBin(args.attr, PlatformVideoSource.Bilibili),\n platform: PlatformVideoSource.Bilibili,\n // 需改进,7=>advanced 8=>code 9=>bas 互动=>command\n // 同时塞进无法/无需直接解析的数据\n // 另开一个解析器,为大部分播放器(无法解析该类dm)做文本类型降级处理\n extra,\n };\n return {\n ...map_d,\n mode: enumModeCodec.decode(mode),\n pool: enumPoolCodec.decode(pool),\n DMID: chunk.$UniDB.DMIDGenerator({\n ...map_d,\n mode: enumModeCodec.decode(mode),\n pool: enumPoolCodec.decode(pool),\n }),\n };\n}\n\ninterface BiliCommonBuilderOptions {\n skipBiliCommand?: boolean;\n /**\n * 见 ../index.ts UniPool.toBiliXML() 的 options,该option不宜手动调用,判断逻辑未封装\n */\n avoidSenderIDWithAt?: boolean;\n}\nexport const BiliCommonModeRec = (mode: z.infer<typeof enumModeCodec.out>, extra?: ExtraBili) => {\n switch (mode) {\n case \"Normal\":\n return 1;\n case \"Bottom\":\n return 4;\n case \"Top\":\n return 5;\n case \"Reverse\":\n return 6;\n case \"Ext\":\n if (!extra) return 1;\n else if (extra.adv) return 7;\n else if (extra.code) return 8;\n else if (extra.bas) return 9;\n else return 1;\n default:\n return 1;\n }\n};\nexport function BiliCommonBuilder(\n DMIDGenerator: DMIDGenerator,\n that: DanmakusSelect,\n options?: BiliCommonBuilderOptions,\n) {\n if (options?.skipBiliCommand && that.extra?.bili?.command) return null;\n const rMode = that.extra?.bili?.mode || BiliCommonModeRec(that.mode, that.extra?.bili);\n let content;\n switch (rMode) {\n case 7:\n content = that.extra?.bili?.adv;\n break;\n case 8:\n content = that.extra?.bili?.code;\n break;\n case 9:\n content = that.extra?.bili?.bas;\n break;\n default:\n content = that.content;\n break;\n }\n return {\n \"#text\": content ?? that.content,\n \"@_p\": [\n that.progress / 1000, // 当前该函数仅用于 bili xml ,故时间格式与其同步\n rMode,\n that.fontsize,\n that.color,\n that.ctime.getTime() / 1000, // 当前该函数仅用于 bili xml ,故时间格式与其同步\n that.extra?.bili?.pool || that.pool, // 目前pool与bili兼容\n options?.avoidSenderIDWithAt\n ? that.senderID.replaceAll(`@${PlatformVideoSource.Bilibili}`, \"\")\n : that.senderID,\n that.extra?.bili?.dmid || that.DMID || DMIDGenerator(that),\n that.weight,\n ].join(\",\"),\n };\n}\n\nexport const BiliGrpcAdapter = defineAdapter((bin: Uint8Array | ArrayBuffer) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({}));\n const data = fromBinary(DmSegMobileReplySchema, new Uint8Array(bin));\n const json = data.elems;\n await chunk.upsertDanmakus(json.map((d) => BiliCommonParser(chunk, d)));\n return chunk;\n };\n});\n","import { defineAdapter } from \"../index.ts\";\n\nimport { BiliCommonParser } from \"./grpc.ts\";\n\ninterface DM_JSON_BiliUp {\n /** 接口状态码,0 表示成功 */\n code: number;\n /** 文本形式的状态码,约定为字符串 \"0\" */\n message: string;\n /** TTL(time to live) 标识,本接口常量为 1 */\n ttl: number;\n data: {\n /** 分页元信息 */\n page: {\n /** 当前页序号,从 1 开始 */\n num: number;\n /** 每页返回的弹幕条数 */\n size: number;\n /** 总页数 */\n total: number;\n };\n result: {\n /** 弹幕 ID,int64 */\n id: bigint;\n /** 弹幕 ID 字符串形式 */\n id_str: string;\n /** 弹幕类型:1 表示视频弹幕(当前接口恒为 1) */\n type: number;\n aid: bigint;\n bvid: string;\n oid: bigint;\n mid: bigint;\n /** 发送者 mid 的 CRC 哈希(正常接口里用的是这个,保护隐私) */\n mid_hash: string;\n /** 弹幕池 */\n pool: number;\n /** 属性位字符串,逗号分隔的数字列表,对应 attr 二进制位 */\n attrs: string;\n /** 弹幕出现时间,单位毫秒(注意,此处与protobuf接口保持一致,但xml中progress是秒) */\n progress: number;\n mode: number;\n /** 弹幕内容, content */\n msg: string;\n state: number; // ?\n fontsize: number;\n /** 弹幕颜色,需将16进制转化为普通弹幕的10进制,示例:\"ffffff\" */\n color: string;\n /** 发送时间戳,单位秒 */\n ctime: number;\n /** 发送者昵称 */\n uname: string;\n /** 发送者头像链接 */\n uface: string;\n /** 视频主标题 */\n title: string;\n self_seen: boolean; // 尽自己可见?\n /** 弹幕点赞数 */\n like_count: number;\n user_like: number; // ?\n /** 分 P 标题 */\n p_title: string;\n /** 视频封面链接 */\n cover: string;\n is_charge: boolean; // 该up是否开通充电计划?\n is_charge_plus: boolean; // 该up是否开通高级充电计划?\n following: boolean; // 当前登录用户是否关注该发送者?\n extra_cps: null; // ?\n }[];\n };\n}\n\nexport const BiliUpAdapter = defineAdapter((json: DM_JSON_BiliUp) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({}));\n await chunk.upsertDanmakus(\n json.data.result.map((d) => {\n // 处理 attrs 字符串转换为 attr 二进制\n // attrs 格式如 \"1,13,21\",每个数字对应二进制位\n const attrBin = d.attrs\n ? d.attrs\n .split(\",\")\n .map(Number)\n .reduce((bin, bitPosition) => bin | (1 << (bitPosition - 1)), 0)\n : 0;\n return BiliCommonParser(chunk, {\n id: BigInt(d.id_str || d.id),\n idStr: d.id_str,\n progress: d.progress,\n mode: d.mode,\n fontsize: d.fontsize,\n color: Number.parseInt(d.color, 16),\n mid: d.mid,\n midHash: d.mid_hash,\n content: d.msg,\n ctime: BigInt(d.ctime),\n pool: d.pool,\n // idStr: d.id_str,\n attr: attrBin,\n oid: BigInt(d.oid),\n });\n }),\n );\n return chunk;\n };\n});\n","import { defineTransformer, defineAdapter } from \"../index.ts\";\n\nimport { XMLParser } from \"fast-xml-parser\";\nimport { DanUniConvertTipTemplate, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { BiliCommonBuilder, BiliCommonParser } from \"./grpc.ts\";\nimport { PlatformVideoSource } from \"@/core/platform.ts\";\nimport XMLBuilder from \"fast-xml-builder\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\ninterface DM_XML_Bili {\n i: {\n chatserver: string;\n chatid: bigint;\n mission: number;\n maxlimit: number;\n state: number;\n real_name: number;\n source: string;\n d: {\n \"#text\": string;\n \"@_p\": string;\n }[];\n };\n}\n\nconst parser = new XMLParser({\n ignoreAttributes: false,\n isArray: (_name, jpath, _isLeafNode, _isAttribute) => {\n if (jpath === \"i.d\") return true;\n return false;\n },\n});\nconst builder = new XMLBuilder({ ignoreAttributes: false });\n\nfunction parseBiliSingle(p: string, c: string) {\n const p_arr = p.split(\",\");\n return {\n content: c,\n progress: ~~(Number.parseFloat(p_arr[0]) * 1000),\n mode: Number.parseInt(p_arr[1]),\n fontsize: Number.parseInt(p_arr[2]),\n color: Number.parseInt(p_arr[3]),\n ctime: BigInt(p_arr[4]),\n pool: Number.parseInt(p_arr[5]),\n midHash: p_arr[6],\n id: BigInt(p_arr[7]),\n idStr: p_arr[7],\n weight: Number.parseInt(p_arr[8]),\n };\n}\n\nexport const BiliXmlAdapter = defineAdapter((xml: string) => {\n return async (udb, uchunk) => {\n const oriData: DM_XML_Bili & { i: { danuni?: DanUniConvertTip } } = parser.parse(xml);\n const dans = oriData.i.d;\n const fromConverted = !!oriData.i.danuni;\n const cid = BigInt(oriData.i.chatid);\n const recSOID = fromConverted ? oriData.i.danuni?.data : undefined;\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted }));\n await chunk.upsertDanmakus(\n dans.map((d) => BiliCommonParser(chunk, parseBiliSingle(d[\"@_p\"], d[\"#text\"]), cid, recSOID)),\n );\n return chunk;\n };\n});\n\ninterface BiliXmlTransformerOptions {\n /**\n * 当SOID非来源bili时,若此处指定则使用该值为cid,否则使用SOID\n */\n cid?: bigint;\n /**\n * 跳过command类型的特殊弹幕\n */\n skipBiliCommand?: boolean;\n /**\n * 当仅含有来自bili的弹幕时,启用将保持发送者标识不含`@`\n * @description\n * bili的弹幕含midHash(crc),不启用该处使用senderID填充,启用则去除`@bili`部分,提高兼容性\n */\n avoidSenderIDWithAt?: boolean;\n}\n\nconst genCID = (id?: string, options?: BiliXmlTransformerOptions) => {\n if (id) {\n const uniID = UniID.fromStringSafe(id);\n if (uniID.domain === PlatformVideoSource.Bilibili) {\n const cid = uniID.id.replaceAll(`def_${PlatformVideoSource.Bilibili}+`, \"\");\n if (cid) return cid;\n }\n return options?.cid || id;\n } else return options?.cid || UniID.fromNull().toString();\n};\n\nexport const BiliXmlTransformerConfigurator = (options?: BiliXmlTransformerOptions) =>\n defineTransformer(async (udanmakus, ctx) => {\n const dans = await udanmakus;\n if (options?.avoidSenderIDWithAt) {\n const ok = dans.every((d) => d.senderID.endsWith(`@${PlatformVideoSource.Bilibili}`));\n if (!ok) throw new Error(\"存在其他来源的senderID,请关闭该功能再试!\");\n }\n let ds = dans.map((dan) => BiliCommonBuilder(ctx.DMIDGenerator, dan, options));\n if (options?.skipBiliCommand) ds = ds.filter((d) => d !== null);\n return builder.build({\n \"?xml\": {\n \"@_version\": \"1.0\",\n \"@_encoding\": \"UTF-8\",\n },\n i: {\n chatserver: \"chat.bilibili.com\",\n chatid: genCID(dans[0]?.SOID),\n mission: 0,\n maxlimit: dans.length,\n state: 0,\n real_name: 0,\n source: \"k-v\",\n danuni: { ...DanUniConvertTipTemplate, data: [...new Set(dans.map((d) => d.SOID))][0] },\n d: ds,\n },\n });\n });\n","import type { enumModeCodec } from \"@/adapters/index.ts\";\nimport type { z } from \"zod\";\n\nexport function transMode(\n oriMode: number,\n fmt: \"bili\" | \"dplayer\" | \"artplayer\" | \"ddplay\",\n): z.infer<typeof enumModeCodec.out> {\n let mode: z.infer<typeof enumModeCodec.out> = \"Normal\";\n switch (fmt) {\n case \"bili\":\n // 类型 1 2 3:普通弹幕 4:底部弹幕 5:顶部弹幕 6:逆向弹幕 7:高级弹幕 8:代码弹幕 9:BAS弹幕(pool必须为2)\n switch (oriMode) {\n case 4:\n mode = \"Bottom\";\n break;\n case 5:\n mode = \"Top\";\n break;\n case 6:\n mode = \"Reverse\";\n break;\n case 7:\n mode = \"Ext\";\n break;\n case 8:\n mode = \"Ext\";\n break;\n case 9:\n mode = \"Ext\";\n break;\n }\n break;\n\n case \"dplayer\":\n if (oriMode === 1) mode = \"Top\";\n else if (oriMode === 2) mode = \"Bottom\";\n break;\n\n case \"artplayer\":\n if (oriMode === 1) mode = \"Top\";\n else if (oriMode === 2) mode = \"Bottom\";\n break;\n\n case \"ddplay\":\n // 弹幕模式:1-普通弹幕,4-底部弹幕,5-顶部弹幕\n // 其适配为bili格式子集\n mode = transMode(oriMode, \"bili\");\n break;\n\n default:\n mode = \"Normal\";\n break;\n }\n return mode;\n}\n","import type { Extra } from \"@/core/dm-extra.ts\";\nimport { defineAdapter, defineTransformer } from \"./index.ts\";\n\nimport { DanUniConvertTipTemplate, defaultUniDM, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\nimport { transMode } from \"@/utils/transMode.ts\";\n\ninterface DM_JSON_Artplayer {\n danmuku: {\n text: string; // 弹幕文本\n time?: number; // 弹幕时间,默认为当前播放器时间 - 秒\n mode?: number; // 弹幕模式:0: 滚动 (默认),1: 顶部,2: 底部\n color?: string; // 弹幕颜色,默认为白色\n border?: boolean; // 弹幕是否有描边,默认为 false\n style?: {}; // 弹幕自定义样式,默认为空对象\n }[];\n}\n\nexport const ArtplayerAdapter = defineAdapter(\n (json: DM_JSON_Artplayer & { danuni?: DanUniConvertTip }, playerID: string, domain = \"other\") => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted: !!json.danuni }));\n const SOID = UniID.fromUnknown(playerID, domain).toString();\n const senderID = UniID.fromNull(domain).toString();\n const now = new Date();\n await chunk.upsertDanmakus(\n json.danmuku.map((args) => {\n let extra = args.border\n ? ({ artplayer: { border: args.border, style: {} } } as Extra)\n : null;\n if (args.style) {\n if (extra)\n extra = {\n ...extra,\n artplayer: { ...extra.artplayer, border: args.border, style: args.style },\n };\n else extra = { artplayer: { border: args.border, style: args.style } };\n }\n const mode = transMode(args.mode ?? 0, \"artplayer\");\n const map_d = {\n attr: defaultUniDM.attr,\n fontsize: defaultUniDM.fontsize,\n ctime: now,\n weight: defaultUniDM.weight,\n pool: \"Def\" as const,\n content: args.text,\n progress: (args.time ?? 0) * 1000,\n mode,\n color: Number((args.color || \"FFFFFF\").replace(\"#\", \"0x\")),\n style: args.style,\n SOID,\n senderID,\n platform: domain,\n extra,\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\nexport const ArtplayerTransformer = defineTransformer(\n (udanmakus): Promise<DM_JSON_Artplayer & { danuni?: DanUniConvertTip }> => {\n return udanmakus.then((dans) => ({\n danuni: {\n ...DanUniConvertTipTemplate,\n data: dans[0]?.SOID.split(\"@\")[0],\n },\n danmuku: dans.map((d) => {\n let mode = 0;\n if (d.mode === \"Top\") mode = 1;\n else if (d.mode === \"Bottom\") mode = 2;\n return {\n text: d.content,\n time: d.progress / 1000,\n mode: mode as 0 | 1 | 2,\n color: `#${d.color.toString(16).toUpperCase() || \"FFFFFF\"}`,\n border: d.extra?.artplayer?.border,\n style: d.extra?.artplayer?.style,\n };\n }),\n }));\n },\n);\n","import { defineAdapter, defineTransformer } from \"./index.ts\";\n\nimport { DanUniConvertTipTemplate, defaultUniDM, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { transMode } from \"@/utils/transMode.ts\";\nimport { PlatformDanmakuOnlySource } from \"@/core/platform.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\n\ninterface DM_JSON_DDPlay {\n count: number | string;\n comments: {\n cid: number;\n p: string;\n m: string;\n }[];\n}\n\nexport const DdplayAdapter = defineAdapter(\n (\n json: DM_JSON_DDPlay & { danuni?: DanUniConvertTip },\n episodeId: string,\n domain = PlatformDanmakuOnlySource.DanDanPlay,\n ) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted: !!json.danuni }));\n const SOID = UniID.fromUnknown(\n `def_${PlatformDanmakuOnlySource.DanDanPlay}+${episodeId}`,\n domain,\n ).toString();\n const now = new Date();\n await chunk.upsertDanmakus(\n json.comments.map((d) => {\n const p_arr = d.p.split(\",\");\n const uid = p_arr[3];\n const senderID = UniID.fromUnknown(uid, domain).toString();\n const mode = transMode(Number.parseInt(p_arr[1]), \"ddplay\");\n const map_d = {\n SOID,\n color: Number.parseInt(p_arr[2]),\n progress: Number.parseFloat(p_arr[0]) * 1000,\n mode,\n senderID,\n content: d.m,\n platform: domain,\n extra: { ddplay: { cid: d.cid, uid } },\n attr: defaultUniDM.attr,\n fontsize: defaultUniDM.fontsize,\n ctime: now,\n weight: defaultUniDM.weight,\n pool: \"Def\" as const,\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\nexport const DdplayTransformer = defineTransformer(\n (udanmakus): Promise<DM_JSON_DDPlay & { danuni?: DanUniConvertTip }> => {\n return udanmakus.then((dans) => ({\n danuni: {\n ...DanUniConvertTipTemplate,\n data: dans[0]?.SOID.split(\"@\")[0].replaceAll(\n `def_${PlatformDanmakuOnlySource.DanDanPlay}+`,\n \"\",\n ),\n },\n count: dans.length,\n comments: dans.map((dan) => {\n let mode = 1;\n if (dan.mode === \"Top\") mode = 5;\n else if (dan.mode === \"Bottom\") mode = 4;\n return {\n cid:\n dan.extra?.ddplay?.cid ??\n Number.parseInt(`0x${Buffer.from(dan.DMID).toString(\"hex\")}`) ??\n 0,\n p: `${dan.progress / 1000},${mode},${dan.color},${dan.extra?.ddplay?.uid ?? dan.senderID}`,\n m: dan.content,\n };\n }),\n }));\n },\n);\n","import { defineAdapter, defineTransformer } from \"./index.ts\";\n\nimport { DanUniConvertTipTemplate, defaultUniDM, type DanUniConvertTip } from \"@/core/dm.ts\";\nimport { UniID } from \"@/core/uni-id.ts\";\nimport { transMode } from \"@/utils/transMode.ts\";\n\ninterface DM_JSON_Dplayer {\n code: number;\n /**\n * progress,mode,color,midHash,content\n */\n data: [number, number, number, string, string][];\n}\n\nexport const DplayerAdapter = defineAdapter(\n (\n json: DM_JSON_Dplayer & { danuni?: DanUniConvertTip },\n playerID: string,\n domain: string = \"other\",\n ) => {\n return async (udb, uchunk) => {\n const chunk = uchunk ?? (await udb.makeChunk({ fromConverted: !!json.danuni }));\n const SOID = UniID.fromUnknown(playerID, domain).toString();\n const now = new Date();\n await chunk.upsertDanmakus(\n json.data.map(([progress, ori_mode, color, midHash, content]) => {\n const mode = transMode(ori_mode, \"dplayer\");\n const map_d = {\n attr: defaultUniDM.attr,\n fontsize: defaultUniDM.fontsize,\n ctime: now,\n weight: defaultUniDM.weight,\n extra: defaultUniDM.extra,\n pool: \"Def\" as const,\n progress: progress * 1000,\n mode,\n color,\n midHash,\n content,\n SOID,\n senderID: UniID.fromUnknown(midHash, domain).toString(),\n platform: domain,\n };\n return {\n ...map_d,\n DMID: chunk.$UniDB.DMIDGenerator(map_d),\n };\n }),\n );\n return chunk;\n };\n },\n);\n\nexport const DplayerTransformer = defineTransformer(\n (udanmakus): Promise<DM_JSON_Dplayer & { danuni?: DanUniConvertTip }> => {\n return udanmakus.then((dans) => ({\n code: 0,\n danuni: {\n ...DanUniConvertTipTemplate,\n data: dans[0]?.SOID.split(\"@\")[0],\n },\n data: dans.map((dan) => {\n let mode = 0;\n if (dan.mode === \"Top\") mode = 1;\n else if (dan.mode === \"Bottom\") mode = 2;\n return [dan.progress / 1000, mode, dan.color, dan.senderID, dan.content];\n }),\n }));\n },\n);\n","import { UniChunk, type AdapterStore, type DMIDGenerator, type InitedUniDB } from \"@/core/index.ts\";\nimport type { Promisable } from \"type-fest\";\n\nexport type TransformerInput = InitedUniDB | UniChunk;\nexport function transformerInput2Danmakus(input: TransformerInput) {\n return input.$danmakus;\n}\n\nexport type UDanmaku = Awaited<ReturnType<typeof transformerInput2Danmakus>>[number];\n\nexport type Adapter<Args extends unknown[] = unknown[]> = (\n ...args: Args\n) => Promisable<AdapterStore>;\nexport type Transformer<T = unknown> = (\n udanmakus: ReturnType<typeof transformerInput2Danmakus>,\n ctx: {\n uchunk?: Awaited<ReturnType<typeof UniChunk.prototype.$chunk>>;\n DMIDGenerator: DMIDGenerator;\n },\n) => Promisable<T>;\nexport type Plugin<T = unknown> = (uchunk: UniChunk) => Promisable<T>;\n\nexport function defineAdapter<T extends (...args: any[]) => Promisable<AdapterStore>>(adapter: T) {\n return adapter;\n}\nexport function defineTransformer<T extends Transformer>(transformer: T) {\n return transformer;\n}\nexport function definePlugin<T extends Plugin>(plugin: T) {\n return plugin;\n}\n\nexport * from \"./danuni/json.ts\";\nexport * from \"./danuni/pb.ts\";\nexport * from \"./bili/command-grpc.ts\";\nexport * from \"./bili/grpc.ts\";\nexport * from \"./bili/up.ts\";\nexport * from \"./bili/xml.ts\";\nexport * from \"./artplayer.ts\";\nexport * from \"./ddplay.ts\";\nexport * from \"./dplayer.ts\";\n","import { sha3_256 } from \"@noble/hashes/sha3.js\";\nimport { z } from \"zod\";\nimport { JSON } from \"@/utils/bigint.ts\";\nimport { bytesToHex, utf8ToBytes } from \"@noble/hashes/utils.js\";\nimport { enumModeCodec, enumPoolCodec } from \"@/adapters/index.ts\";\nimport type { Extra } from \"./dm-extra.ts\";\n\ninterface DMIDGeneratorDanmaku {\n content: string;\n mode: z.infer<typeof enumModeCodec.out>;\n pool: z.infer<typeof enumPoolCodec.out>;\n platform?: string | null;\n extra: Extra | null;\n senderID: string;\n ctime: Date;\n}\nexport type DMIDGenerator = (dan: DMIDGeneratorDanmaku, slice?: number) => string;\n\nexport const createDMID: DMIDGenerator = (dan: DMIDGeneratorDanmaku, slice = 8) => {\n const raw = `${dan.content}|${dan.mode}|${dan.pool}|${dan.platform ?? null}|${JSON.stringify(dan.extra)}|${dan.senderID}|${dan.ctime.toISOString()}`;\n const data = utf8ToBytes(raw);\n const digest = sha3_256.create().update(data).digest();\n const str = bytesToHex(digest);\n return str.slice(0, slice);\n};\n","import type { Plugin, Transformer, TransformerInput } from \"@/adapters/index.ts\";\nimport { closeDb, db, dumpDb, initDb } from \"./db/index.ts\";\nimport {\n chunks as chunksTable,\n chunksZod,\n danmakus,\n chunk2danmakus,\n onConflictDoUpdate,\n type DanmakusInsert,\n} from \"./db/schema.ts\";\nimport { eq } from \"drizzle-orm\";\nimport type { Asyncify, Promisable, Simplify } from \"type-fest\";\nimport { createDMID, type DMIDGenerator } from \"./id.ts\";\nimport type { z } from \"zod\";\n\nexport type AdapterStore = (udb: InitedUniDB, uchunk?: UniChunk) => Promisable<UniChunk>;\n\nexport class UniDB {\n constructor(\n public $drizzle = db,\n public DMIDGenerator: DMIDGenerator = createDMID,\n ) {}\n async init(dump?: File) {\n return new InitedUniDB(await initDb(dump), this.DMIDGenerator);\n }\n async dump() {\n const dump = await dumpDb(this.$drizzle!);\n return dump;\n }\n async close() {\n this.$drizzle = null;\n await closeDb();\n }\n}\n\nexport class InitedUniDB extends UniDB {\n constructor(\n public $drizzle: NonNullable<UniDB[\"$drizzle\"]>,\n public DMIDGenerator: DMIDGenerator = createDMID,\n ) {\n super($drizzle, DMIDGenerator);\n }\n get $db() {\n return this.$drizzle;\n }\n get $chunks() {\n return this.$db.query.chunks.findMany();\n }\n get $danmakus() {\n return this.$db.query.chunks\n .findFirst({\n with: {\n danmakus: true,\n },\n })\n .then((data) => data?.danmakus ?? []);\n }\n async listChunks() {\n const cs = await this.$chunks;\n return cs.map((c) => new UniChunk(this, c.id));\n }\n async makeChunk(data: z.infer<typeof chunksZod>) {\n return UniChunk.makeChunk(this, data);\n }\n async upsertDanmakus(data: DanmakusInsert[]) {\n await this.$db.insert(danmakus).values(data).onConflictDoUpdate(onConflictDoUpdate.danmakus);\n }\n /**\n * 清理临时chunks\n */\n async shrink() {\n const uchunks = await this.$db.query.chunks.findMany({\n where: {\n tmp: true,\n },\n });\n for (const c of uchunks) await new UniChunk(this, c.id).delete();\n }\n async import(adapterStore: AdapterStore) {\n return adapterStore(this);\n }\n export<T extends Transformer>(transformer: T): ReturnType<T>;\n async export<T extends Asyncify<Transformer>>(transformer: T): Promise<ReturnType<T>>;\n export<T extends Transformer | Asyncify<Transformer>>(transformer: T): Promisable<ReturnType<T>> {\n return <ReturnType<T>>transformer(this.$danmakus, { DMIDGenerator: this.DMIDGenerator });\n }\n}\n\nexport class UniChunk {\n constructor(\n public $UniDB: InitedUniDB,\n public id: number,\n ) {}\n get $db() {\n return this.$UniDB.$drizzle;\n }\n static async makeChunk(u: TransformerInput, data: z.infer<typeof chunksZod>) {\n const chunk = await u.$db.insert(chunksTable).values(data).returning();\n return new UniChunk(u instanceof InitedUniDB ? u : u.$UniDB, chunk[0].id);\n }\n /**\n * 合并弹幕库\n * @description 将多个chunk的弹幕合并到base chunk中,合并后原chunk会被删除\n * @param base 目标chunk,合并后其他chunk的弹幕会被移到这个chunk中\n * @param chunks 待合并的chunk列表,这些chunk中的弹幕会被移到base chunk中,合并后这些chunk会被删除\n * @returns 合并后的目标chunk实例\n * @throws 如果chunks列表为空,函数会直接返回base chunk;如果目标chunk在数据库中未找到,会抛出错误;如果chunks中有来自不同数据库的chunk且options.allowDifferentDB为false,也会抛出错误\n */\n static async assign(base: UniChunk, chunks: UniChunk[]) {\n if (chunks.length < 1) return base;\n const baseDB = base.$UniDB;\n const drizzle = baseDB.$drizzle;\n const targetId = base.id;\n const targetRow = await base.$chunk();\n let newFromConverted = targetRow.fromConverted;\n for (const c of chunks) {\n const srcChunkRow = await c.$chunk();\n newFromConverted = newFromConverted && !!srcChunkRow.fromConverted;\n const srcDanmakus = await c.$danmakus;\n await base.upsertDanmakus(srcDanmakus, false);\n await c.delete();\n }\n await drizzle\n .update(chunksTable)\n .set({ fromConverted: newFromConverted })\n .where(eq(chunksTable.id, targetId));\n return new UniChunk(baseDB, targetId);\n }\n /**\n * 比较两个chunk的弹幕是否相同\n * @description 可用于跨DB比较\n */\n static async compare(u1: UniChunk, u2: UniChunk) {\n const dms1 = await u1.$danmakus;\n const dms2 = await u2.$danmakus;\n if (dms1.length !== dms2.length) return false;\n const dmidSet = new Set<string>();\n for (const dm of dms1) {\n dmidSet.add(dm.DMID);\n }\n for (const dm of dms2) {\n const target = dmidSet.has(dm.DMID);\n if (!target) return false;\n if (JSON.stringify(target) !== JSON.stringify(dm)) return false;\n }\n return true;\n }\n /**\n * 获取当前chunk的数据库记录\n * @description 虽然数组仅会包含一个值,但这里保持数据库原始返回\n */\n get $chunks() {\n return this.$db.select().from(chunksTable).where(eq(chunksTable.id, this.id));\n }\n async $chunk() {\n const c = await this.$chunks;\n return c[0];\n }\n get $danmakus() {\n return this.$db.query.chunks\n .findFirst({\n where: {\n id: this.id,\n },\n with: {\n danmakus: true,\n },\n })\n .then((data) => data?.danmakus ?? []);\n }\n async upsertDanmakus(\n data: Simplify<DanmakusInsert & { DMID: string }>[],\n autoSetDMID?: false,\n ): Promise<void>;\n async upsertDanmakus(\n data: Simplify<DanmakusInsert & { DMID?: undefined }>[],\n autoSetDMID: true,\n ): Promise<void>;\n async upsertDanmakus(data: (DanmakusInsert & { DMID?: string })[], autoSetDMID = false) {\n if (autoSetDMID) data = data.map((d) => ({ ...d, DMID: this.$UniDB.DMIDGenerator(d) }));\n // 写入/更新 danmakus 表\n await this.$UniDB.upsertDanmakus(data);\n await this.$db\n .insert(chunk2danmakus)\n .values(data.map((d) => ({ chunkID: this.id, DMID: d.DMID })))\n .onConflictDoNothing();\n }\n async import(adapterStore: AdapterStore) {\n const chunk = await adapterStore(this.$UniDB, this);\n return chunk;\n }\n async export<T extends Transformer | Asyncify<Transformer>>(\n transformer: T,\n ): Promise<ReturnType<T>> {\n // transformer 格式转换器 不应对数据库执行任何写操作\n return <ReturnType<T>>transformer(this.$danmakus, {\n DMIDGenerator: this.$UniDB.DMIDGenerator,\n uchunk: await this.$chunk(),\n });\n }\n plugin<T extends Plugin>(plugin: T): ReturnType<T>;\n async plugin<T extends Asyncify<Plugin>>(plugin: T): Promise<ReturnType<T>>;\n plugin<T extends Plugin | Asyncify<Plugin>>(plugin: T): Promisable<ReturnType<T>> {\n const output = <ReturnType<T>>plugin(this);\n return output;\n }\n async delete() {\n await this.$db.transaction(async (tx) => {\n // 1) 查询当前 chunk 对应的 DMID 列表\n const maps = await tx\n .select()\n .from(chunk2danmakus)\n .where(eq(chunk2danmakus.chunkID, this.id));\n const DMIDs = maps.map((m) => m.DMID);\n // 2) 删除映射关系\n await tx.delete(chunk2danmakus).where(eq(chunk2danmakus.chunkID, this.id));\n // 3) 对于不再被任何 chunk 引用的弹幕,删除它们\n for (const id of DMIDs) {\n const still = await tx.select().from(chunk2danmakus).where(eq(chunk2danmakus.DMID, id));\n if (still.length === 0) {\n await tx.delete(danmakus).where(eq(danmakus.DMID, id));\n }\n }\n // 4) 删除 chunk 本身\n await tx.delete(chunksTable).where(eq(chunksTable.id, this.id));\n });\n }\n}\n\nexport * from \"./dm.ts\";\nexport * from \"./id.ts\";\nexport * from \"./platform.ts\";\n"],"mappings":"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"}