From b22cd1f8a855673428d730118d26f039774c9d05 Mon Sep 17 00:00:00 2001 From: giuseppecastaldo Date: Wed, 18 Jan 2023 21:34:22 +0100 Subject: [PATCH] Release 1.3.0 --- .DS_Store | Bin 8196 -> 10244 bytes whatsapp_addon/.DS_Store | Bin 6148 -> 6148 bytes whatsapp_addon/Baileys/.eslintignore | 7 + whatsapp_addon/Baileys/.eslintrc.json | 3 + whatsapp_addon/Baileys/.gitattributes | 2 + whatsapp_addon/Baileys/.gitignore | 17 + whatsapp_addon/Baileys/Example/example.ts | 169 + whatsapp_addon/Baileys/Media/.gitignore | 2 + whatsapp_addon/Baileys/Media/cat.jpeg | Bin 0 -> 25241 bytes whatsapp_addon/Baileys/Media/icon.png | Bin 0 -> 955727 bytes whatsapp_addon/Baileys/Media/ma_gif.mp4 | Bin 0 -> 40240 bytes whatsapp_addon/Baileys/Media/meme.jpeg | Bin 0 -> 57782 bytes whatsapp_addon/Baileys/Media/octopus.webp | Bin 0 -> 65976 bytes whatsapp_addon/Baileys/Media/sonata.mp3 | Bin 0 -> 683781 bytes whatsapp_addon/Baileys/README.md | 887 + .../Baileys/WAProto/GenerateStatics.sh | 4 + whatsapp_addon/Baileys/WAProto/WAProto.proto | 2463 + whatsapp_addon/Baileys/WAProto/index.d.ts | 27603 ++++++ whatsapp_addon/Baileys/WAProto/index.js | 75638 ++++++++++++++++ .../Baileys/WASignalGroup/GroupProtocol.js | 1697 + .../WASignalGroup/ciphertext_message.js | 16 + .../Baileys/WASignalGroup/generate-proto.sh | 1 + .../Baileys/WASignalGroup/group.proto | 42 + .../Baileys/WASignalGroup/group_cipher.js | 106 + .../WASignalGroup/group_session_builder.js | 46 + whatsapp_addon/Baileys/WASignalGroup/index.js | 5 + .../Baileys/WASignalGroup/keyhelper.js | 21 + .../Baileys/WASignalGroup/protobufs.js | 3 + .../Baileys/WASignalGroup/readme.md | 6 + .../Baileys/WASignalGroup/sender_chain_key.js | 50 + .../sender_key_distribution_message.js | 78 + .../WASignalGroup/sender_key_message.js | 92 + .../Baileys/WASignalGroup/sender_key_name.js | 70 + .../WASignalGroup/sender_key_record.js | 54 + .../Baileys/WASignalGroup/sender_key_state.js | 129 + .../WASignalGroup/sender_message_key.js | 39 + whatsapp_addon/Baileys/jest.config.js | 11 + whatsapp_addon/Baileys/package.json | 94 + .../Baileys/proto-extract/.gitignore | 2 + .../Baileys/proto-extract/README.md | 8 + whatsapp_addon/Baileys/proto-extract/index.js | 368 + .../Baileys/proto-extract/package.json | 15 + .../Baileys/proto-extract/yarn.lock | 357 + .../Baileys/src/Defaults/baileys-version.json | 3 + whatsapp_addon/Baileys/src/Defaults/index.ts | 102 + whatsapp_addon/Baileys/src/Socket/business.ts | 280 + whatsapp_addon/Baileys/src/Socket/chats.ts | 864 + whatsapp_addon/Baileys/src/Socket/groups.ts | 288 + whatsapp_addon/Baileys/src/Socket/index.ts | 13 + .../Baileys/src/Socket/messages-recv.ts | 734 + .../Baileys/src/Socket/messages-send.ts | 667 + whatsapp_addon/Baileys/src/Socket/socket.ts | 607 + whatsapp_addon/Baileys/src/Store/index.ts | 2 + .../Baileys/src/Store/make-in-memory-store.ts | 358 + .../src/Store/make-ordered-dictionary.ts | 86 + .../Baileys/src/Tests/test.app-state-sync.ts | 207 + .../Baileys/src/Tests/test.event-buffer.ts | 319 + .../Baileys/src/Tests/test.media-download.ts | 76 + .../Baileys/src/Tests/test.messages.ts | 37 + whatsapp_addon/Baileys/src/Tests/utils.ts | 6 + whatsapp_addon/Baileys/src/Types/Auth.ts | 96 + whatsapp_addon/Baileys/src/Types/Call.ts | 14 + whatsapp_addon/Baileys/src/Types/Chat.ts | 98 + whatsapp_addon/Baileys/src/Types/Contact.ts | 19 + whatsapp_addon/Baileys/src/Types/Events.ts | 87 + .../Baileys/src/Types/GroupMetadata.ts | 41 + whatsapp_addon/Baileys/src/Types/Message.ts | 234 + whatsapp_addon/Baileys/src/Types/Product.ts | 84 + whatsapp_addon/Baileys/src/Types/Socket.ts | 101 + whatsapp_addon/Baileys/src/Types/State.ts | 29 + whatsapp_addon/Baileys/src/Types/index.ts | 55 + .../Baileys/src/Utils/auth-utils.ts | 199 + .../Baileys/src/Utils/baileys-event-stream.ts | 66 + whatsapp_addon/Baileys/src/Utils/business.ts | 275 + .../Baileys/src/Utils/chat-utils.ts | 754 + whatsapp_addon/Baileys/src/Utils/crypto.ts | 113 + .../Baileys/src/Utils/decode-wa-message.ts | 151 + .../Baileys/src/Utils/event-buffer.ts | 613 + whatsapp_addon/Baileys/src/Utils/generics.ts | 379 + whatsapp_addon/Baileys/src/Utils/history.ts | 112 + whatsapp_addon/Baileys/src/Utils/index.ts | 18 + .../Baileys/src/Utils/link-preview.ts | 91 + whatsapp_addon/Baileys/src/Utils/logger.ts | 3 + whatsapp_addon/Baileys/src/Utils/lt-hash.ts | 61 + .../Baileys/src/Utils/make-mutex.ts | 44 + .../Baileys/src/Utils/messages-media.ts | 708 + whatsapp_addon/Baileys/src/Utils/messages.ts | 792 + .../Baileys/src/Utils/noise-handler.ts | 169 + .../Baileys/src/Utils/process-message.ts | 267 + whatsapp_addon/Baileys/src/Utils/signal.ts | 307 + .../src/Utils/use-multi-file-auth-state.ts | 90 + .../src/Utils/use-single-file-auth-state.ts | 85 + .../Baileys/src/Utils/validate-connection.ts | 208 + .../Baileys/src/WABinary/constants.ts | 42 + whatsapp_addon/Baileys/src/WABinary/decode.ts | 265 + whatsapp_addon/Baileys/src/WABinary/encode.ts | 236 + .../Baileys/src/WABinary/generic-utils.ts | 90 + whatsapp_addon/Baileys/src/WABinary/index.ts | 5 + .../Baileys/src/WABinary/jid-utils.ts | 64 + whatsapp_addon/Baileys/src/WABinary/types.ts | 17 + whatsapp_addon/Baileys/src/index.ts | 12 + whatsapp_addon/Baileys/tsconfig.json | 21 + whatsapp_addon/Baileys/typedoc.json | 8 + whatsapp_addon/Baileys/yarn.lock | 5181 ++ whatsapp_addon/CHANGELOG.md | 4 + whatsapp_addon/Dockerfile | 2 +- whatsapp_addon/config.yaml | 2 +- whatsapp_addon/package.json | 7 +- whatsapp_addon/utils/useFileAuthState.js | 73 - whatsapp_addon/whatsapp.js | 10 +- 110 files changed, 127072 insertions(+), 84 deletions(-) create mode 100644 whatsapp_addon/Baileys/.eslintignore create mode 100644 whatsapp_addon/Baileys/.eslintrc.json create mode 100644 whatsapp_addon/Baileys/.gitattributes create mode 100644 whatsapp_addon/Baileys/.gitignore create mode 100644 whatsapp_addon/Baileys/Example/example.ts create mode 100644 whatsapp_addon/Baileys/Media/.gitignore create mode 100644 whatsapp_addon/Baileys/Media/cat.jpeg create mode 100644 whatsapp_addon/Baileys/Media/icon.png create mode 100644 whatsapp_addon/Baileys/Media/ma_gif.mp4 create mode 100644 whatsapp_addon/Baileys/Media/meme.jpeg create mode 100644 whatsapp_addon/Baileys/Media/octopus.webp create mode 100644 whatsapp_addon/Baileys/Media/sonata.mp3 create mode 100644 whatsapp_addon/Baileys/README.md create mode 100644 whatsapp_addon/Baileys/WAProto/GenerateStatics.sh create mode 100644 whatsapp_addon/Baileys/WAProto/WAProto.proto create mode 100644 whatsapp_addon/Baileys/WAProto/index.d.ts create mode 100644 whatsapp_addon/Baileys/WAProto/index.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/GroupProtocol.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/ciphertext_message.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/generate-proto.sh create mode 100644 whatsapp_addon/Baileys/WASignalGroup/group.proto create mode 100644 whatsapp_addon/Baileys/WASignalGroup/group_cipher.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/group_session_builder.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/index.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/keyhelper.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/protobufs.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/readme.md create mode 100644 whatsapp_addon/Baileys/WASignalGroup/sender_chain_key.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/sender_key_distribution_message.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/sender_key_message.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/sender_key_name.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/sender_key_record.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/sender_key_state.js create mode 100644 whatsapp_addon/Baileys/WASignalGroup/sender_message_key.js create mode 100644 whatsapp_addon/Baileys/jest.config.js create mode 100644 whatsapp_addon/Baileys/package.json create mode 100644 whatsapp_addon/Baileys/proto-extract/.gitignore create mode 100644 whatsapp_addon/Baileys/proto-extract/README.md create mode 100644 whatsapp_addon/Baileys/proto-extract/index.js create mode 100644 whatsapp_addon/Baileys/proto-extract/package.json create mode 100644 whatsapp_addon/Baileys/proto-extract/yarn.lock create mode 100644 whatsapp_addon/Baileys/src/Defaults/baileys-version.json create mode 100644 whatsapp_addon/Baileys/src/Defaults/index.ts create mode 100644 whatsapp_addon/Baileys/src/Socket/business.ts create mode 100644 whatsapp_addon/Baileys/src/Socket/chats.ts create mode 100644 whatsapp_addon/Baileys/src/Socket/groups.ts create mode 100644 whatsapp_addon/Baileys/src/Socket/index.ts create mode 100644 whatsapp_addon/Baileys/src/Socket/messages-recv.ts create mode 100644 whatsapp_addon/Baileys/src/Socket/messages-send.ts create mode 100644 whatsapp_addon/Baileys/src/Socket/socket.ts create mode 100644 whatsapp_addon/Baileys/src/Store/index.ts create mode 100644 whatsapp_addon/Baileys/src/Store/make-in-memory-store.ts create mode 100644 whatsapp_addon/Baileys/src/Store/make-ordered-dictionary.ts create mode 100644 whatsapp_addon/Baileys/src/Tests/test.app-state-sync.ts create mode 100644 whatsapp_addon/Baileys/src/Tests/test.event-buffer.ts create mode 100644 whatsapp_addon/Baileys/src/Tests/test.media-download.ts create mode 100644 whatsapp_addon/Baileys/src/Tests/test.messages.ts create mode 100644 whatsapp_addon/Baileys/src/Tests/utils.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Auth.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Call.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Chat.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Contact.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Events.ts create mode 100644 whatsapp_addon/Baileys/src/Types/GroupMetadata.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Message.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Product.ts create mode 100644 whatsapp_addon/Baileys/src/Types/Socket.ts create mode 100644 whatsapp_addon/Baileys/src/Types/State.ts create mode 100644 whatsapp_addon/Baileys/src/Types/index.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/auth-utils.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/baileys-event-stream.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/business.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/chat-utils.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/crypto.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/decode-wa-message.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/event-buffer.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/generics.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/history.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/index.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/link-preview.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/logger.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/lt-hash.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/make-mutex.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/messages-media.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/messages.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/noise-handler.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/process-message.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/signal.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/use-multi-file-auth-state.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/use-single-file-auth-state.ts create mode 100644 whatsapp_addon/Baileys/src/Utils/validate-connection.ts create mode 100644 whatsapp_addon/Baileys/src/WABinary/constants.ts create mode 100644 whatsapp_addon/Baileys/src/WABinary/decode.ts create mode 100644 whatsapp_addon/Baileys/src/WABinary/encode.ts create mode 100644 whatsapp_addon/Baileys/src/WABinary/generic-utils.ts create mode 100644 whatsapp_addon/Baileys/src/WABinary/index.ts create mode 100644 whatsapp_addon/Baileys/src/WABinary/jid-utils.ts create mode 100644 whatsapp_addon/Baileys/src/WABinary/types.ts create mode 100644 whatsapp_addon/Baileys/src/index.ts create mode 100644 whatsapp_addon/Baileys/tsconfig.json create mode 100644 whatsapp_addon/Baileys/typedoc.json create mode 100644 whatsapp_addon/Baileys/yarn.lock delete mode 100644 whatsapp_addon/utils/useFileAuthState.js diff --git a/.DS_Store b/.DS_Store index 3fb39128cf8645c5b88c622fd85d8af9b754fc7a..1a8b191f7e3399c059271954a5b4f0fdc178455c 100644 GIT binary patch delta 387 zcmZp1XbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~50D98)sFar4uIq8PM$@#ej8w;ng zPizp}%+A5WQ4f-3VbEhpXUJqIfvEtBF)%9Ru1A*3&3AE0%E?axigDyL6dZam`-mf| zdHvy^1Is&qc?329&qWL*E;{_zDtBnoKbrg&(j3;jq zXyb>v8mxo4tYh*A0fo($f~ssH$S!&)Q+~j?|A-?<7AS#m3bKR%vKts!8W=#TC&!7e z+}Ln{O^_LE1A_uLkah)y-^Rl4%#-t xDaZ^o3kW2*frKl_j*W@mnJ4qB1abgv0NKniIi6?gWPhQQ&75L?8G(A10RW6lA(;RG diff --git a/whatsapp_addon/.DS_Store b/whatsapp_addon/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..d986b0ecd4088233561bd3d44fe4daf0c35cdb53 100644 GIT binary patch delta 355 zcmZoMXfc=|#>B)qF;Q%yo}wr-0|Nsi1A_nqLn=chLvd1haY0hf#>C}}^&lB`1}BC@ zhD?SWWZC>Apv;b>f}G6a5(9&4j7-cdtZeKY>>S)2vB4Sn<-sM1C8fnqiAB*MUPyj^ zP7;irm=ucQXE~6B*VeU!5J?g zQC)3pXs)ARY++ohqfl*WWT2y9Vr*7h%gG_CtZy9@pPiGNm)`|+91t)9Jp~55P#Q*c z0~u)EN-0jxNdh_(qy#P{1o3iNa8X`PeqK6Iig9D&8(8MWiAjHu~2NHo+1YW5HK<@2y9kle#WxdfcX^DW_AvK4xj>{$am(+{342+ UKzW7)kiy9(Jj$D6L{=~Z02rPQkN^Mx diff --git a/whatsapp_addon/Baileys/.eslintignore b/whatsapp_addon/Baileys/.eslintignore new file mode 100644 index 0000000..aa07640 --- /dev/null +++ b/whatsapp_addon/Baileys/.eslintignore @@ -0,0 +1,7 @@ +# Ignore artifacts: +lib +coverage +*.lock +.eslintrc.json +src/WABinary/index.ts +WAProto \ No newline at end of file diff --git a/whatsapp_addon/Baileys/.eslintrc.json b/whatsapp_addon/Baileys/.eslintrc.json new file mode 100644 index 0000000..7d37e83 --- /dev/null +++ b/whatsapp_addon/Baileys/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "@adiwajshing" +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/.gitattributes b/whatsapp_addon/Baileys/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/whatsapp_addon/Baileys/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/whatsapp_addon/Baileys/.gitignore b/whatsapp_addon/Baileys/.gitignore new file mode 100644 index 0000000..05fa43d --- /dev/null +++ b/whatsapp_addon/Baileys/.gitignore @@ -0,0 +1,17 @@ +node_modules +auth_info*.json +baileys_auth_info* +baileys_store*.json +output.csv +*/.DS_Store +.DS_Store +.env +browser-messages.json +decoded-ws.json +lib +docs +browser-token.json +Proxy +messages*.json +test.ts +TestData \ No newline at end of file diff --git a/whatsapp_addon/Baileys/Example/example.ts b/whatsapp_addon/Baileys/Example/example.ts new file mode 100644 index 0000000..9cb0ee3 --- /dev/null +++ b/whatsapp_addon/Baileys/Example/example.ts @@ -0,0 +1,169 @@ +import { Boom } from '@hapi/boom' +import makeWASocket, { AnyMessageContent, delay, DisconnectReason, fetchLatestBaileysVersion, isJidBroadcast, makeCacheableSignalKeyStore, makeInMemoryStore, MessageRetryMap, useMultiFileAuthState } from '../src' +import MAIN_LOGGER from '../src/Utils/logger' + +const logger = MAIN_LOGGER.child({ }) +logger.level = 'trace' + +const useStore = !process.argv.includes('--no-store') +const doReplies = !process.argv.includes('--no-reply') + +// external map to store retry counts of messages when decryption/encryption fails +// keep this out of the socket itself, so as to prevent a message decryption/encryption loop across socket restarts +const msgRetryCounterMap: MessageRetryMap = { } + +// the store maintains the data of the WA connection in memory +// can be written out to a file & read from it +const store = useStore ? makeInMemoryStore({ logger }) : undefined +store?.readFromFile('./baileys_store_multi.json') +// save every 10s +setInterval(() => { + store?.writeToFile('./baileys_store_multi.json') +}, 10_000) + +// start a connection +const startSock = async() => { + const { state, saveCreds } = await useMultiFileAuthState('baileys_auth_info') + // fetch latest version of WA Web + const { version, isLatest } = await fetchLatestBaileysVersion() + console.log(`using WA v${version.join('.')}, isLatest: ${isLatest}`) + + const sock = makeWASocket({ + version, + logger, + printQRInTerminal: true, + auth: { + creds: state.creds, + /** caching makes the store faster to send/recv messages */ + keys: makeCacheableSignalKeyStore(state.keys, logger), + }, + msgRetryCounterMap, + generateHighQualityLinkPreview: true, + // ignore all broadcast messages -- to receive the same + // comment the line below out + shouldIgnoreJid: jid => isJidBroadcast(jid), + // implement to handle retries + getMessage: async key => { + if(store) { + const msg = await store.loadMessage(key.remoteJid!, key.id!) + return msg?.message || undefined + } + + // only if store is present + return { + conversation: 'hello' + } + } + }) + + store?.bind(sock.ev) + + const sendMessageWTyping = async(msg: AnyMessageContent, jid: string) => { + await sock.presenceSubscribe(jid) + await delay(500) + + await sock.sendPresenceUpdate('composing', jid) + await delay(2000) + + await sock.sendPresenceUpdate('paused', jid) + + await sock.sendMessage(jid, msg) + } + + // the process function lets you process all events that just occurred + // efficiently in a batch + sock.ev.process( + // events is a map for event name => event data + async(events) => { + // something about the connection changed + // maybe it closed, or we received all offline message or connection opened + if(events['connection.update']) { + const update = events['connection.update'] + const { connection, lastDisconnect } = update + if(connection === 'close') { + // reconnect if not logged out + if((lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut) { + startSock() + } else { + console.log('Connection closed. You are logged out.') + } + } + + console.log('connection update', update) + } + + // credentials updated -- save them + if(events['creds.update']) { + await saveCreds() + } + + if(events.call) { + console.log('recv call event', events.call) + } + + // history received + if(events['messaging-history.set']) { + const { chats, contacts, messages, isLatest } = events['messaging-history.set'] + console.log(`recv ${chats.length} chats, ${contacts.length} contacts, ${messages.length} msgs (is latest: ${isLatest})`) + } + + // received a new message + if(events['messages.upsert']) { + const upsert = events['messages.upsert'] + console.log('recv messages ', JSON.stringify(upsert, undefined, 2)) + + if(upsert.type === 'notify') { + for(const msg of upsert.messages) { + if(!msg.key.fromMe && doReplies) { + console.log('replying to', msg.key.remoteJid) + await sock!.readMessages([msg.key]) + await sendMessageWTyping({ text: 'Hello there!' }, msg.key.remoteJid!) + } + } + } + } + + // messages updated like status delivered, message deleted etc. + if(events['messages.update']) { + console.log(events['messages.update']) + } + + if(events['message-receipt.update']) { + console.log(events['message-receipt.update']) + } + + if(events['messages.reaction']) { + console.log(events['messages.reaction']) + } + + if(events['presence.update']) { + console.log(events['presence.update']) + } + + if(events['chats.update']) { + console.log(events['chats.update']) + } + + if(events['contacts.update']) { + for(const contact of events['contacts.update']) { + if(typeof contact.imgUrl !== 'undefined') { + const newUrl = contact.imgUrl === null + ? null + : await sock!.profilePictureUrl(contact.id!).catch(() => null) + console.log( + `contact ${contact.id} has a new profile pic: ${newUrl}`, + ) + } + } + } + + if(events['chats.delete']) { + console.log('chats deleted ', events['chats.delete']) + } + } + ) + + return sock +} + +startSock() \ No newline at end of file diff --git a/whatsapp_addon/Baileys/Media/.gitignore b/whatsapp_addon/Baileys/Media/.gitignore new file mode 100644 index 0000000..77d2a2d --- /dev/null +++ b/whatsapp_addon/Baileys/Media/.gitignore @@ -0,0 +1,2 @@ +received_* +media_* \ No newline at end of file diff --git a/whatsapp_addon/Baileys/Media/cat.jpeg b/whatsapp_addon/Baileys/Media/cat.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5063d0996fed304369a8079f047d566226225b4b GIT binary patch literal 25241 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 literal 0 HcmV?d00001 diff --git a/whatsapp_addon/Baileys/Media/icon.png b/whatsapp_addon/Baileys/Media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e54d8fb06cd022772bd2889423eab7ac32eced3b GIT binary patch literal 955727 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

c(swuRbd)C`W>|-GdZU^*GGwb`%(t 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%0A@JGJ-T6W#Romy%#u(3T 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

GcBeF9Uwhjd? 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%0D$^WV78~nl4zkq+QA>Y2WA6YsyfC!jdv& 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�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�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�= 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

t2AN55!W!Q*Z3kWyX&a5I2Aas#$FAIDIU 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

@6AF@4I^;|=9PjU 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

X?rg4#pb&^Sd6n~R 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�)|CSV9zUGgpC-TS5p1^1zJQANPiZ-oAD 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 VrHn6&h}*?44$p8Y7ytX%{x3VZ-=Y8j literal 0 HcmV?d00001 diff --git a/whatsapp_addon/Baileys/Media/meme.jpeg b/whatsapp_addon/Baileys/Media/meme.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e09535bcd05a6ae420a1099707931c4ba6566c9a GIT binary patch literal 57782 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 XoRnR@SmEw^9%L1DAQJPS9nk&{&^rEI literal 0 HcmV?d00001 diff --git a/whatsapp_addon/Baileys/Media/octopus.webp b/whatsapp_addon/Baileys/Media/octopus.webp new file mode 100644 index 0000000000000000000000000000000000000000..ddb9ac0a5873025a424058e756a9358800655981 GIT binary patch literal 65976 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 literal 0 HcmV?d00001 diff --git a/whatsapp_addon/Baileys/Media/sonata.mp3 b/whatsapp_addon/Baileys/Media/sonata.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4bb36616bf3f464af3c10e80972bdade16beae65 GIT binary patch literal 683781 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

%G#}de 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

lwtli4V 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⩔TI(YYu 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�VwF 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%0D@<9T-VPv%!!v$lg9l)YH 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

Art&$VSurT6{S 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

M*r|)cY~P~Lkz0*h=kH0b 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 z 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ÊhhT@ z*W$HOjY&RX52>+2qp)Tst~oY}J3 zbjBcF)1$(iHLs*iF3GFVN->9bqq%apU_@ZJW*}Asg^Iy+&AM&aIcup3CY{~cSUAzH z@~Lx@7Ju!|M03r8TBxD~ZpOJ%!!ydaQsXfAoB^4;4GpLcW5;w&(7l|RySr)n%2 z4iAEoVG`F|evgaDg11P9&Lrzmee%4;5Xe7hEPL(aD zgv(kYapLn2`dN$yP|FIRaR{J@pHqTk*o6BmP;!+aVN8%_zAsxmz=SsWAH8(Rlc&aj zCv>gv{=+_O!*_s`q5q=0#1D*N9C#i7TZcq~{UpZ=&7FcZQ^6j9+s`XsWHHQN{u_-JDlAgy^ZK7oEJMUWiEkAIjb{stLaN z7EMBc00BY|ReA@LPy_@Ggih#1I-v>(NLNrFLvI1;1Vp5FlqQ0W-UCtv1Qn!6Q4lGL zBAodA)%QJjoptZIYw;nAZ&^DtznMKVdka&Esu1}hOVR6bY0#>8ydD5RsHZ7sa09pv z*u=7Wf}K;a%R|7ljT~BVG=`pw4Yz>*=i{~W3v_?LQ`=?f}{dBsmh}ER$zD?R*lQN)pe8~ z{jC)KXFddkI8ooP<=G7OW8Hnhb=jzfla3*+;>kFiMQARr0mwCt_xPM}H!{|qJN}aB zO?|kf<3ASuG?Jd(38BynQV1obfz>atP0?7e3G*a6G6N!oY4D<=q|O23!OhI7Fn8U3 zz6c0jWE{I1E-8S70BJmb#n4xVgLb*WjJChbDSK+Kv~iFw{&zpr($kceq&hq|{~RzZ zw&>|02N*Fk3so~pNu!au=g_o2zHP2wJvsFTd+mE)`^lLbx$orYvk)3(GW&cV-7IOd z4hWWkdS;+_8hJ+um5vLu3l1P@O$wqOu?G>BFG6n%kbJnYgMOqo781?sh?NW!rbh^& z1ua&lLUH83N+@n!-&slD3%24r0P3bw*1>r;Y>)N4W>A)7-JoV-l%CqYNYLOc<<*AO z9o^oX>aC!q*R9D}J<=2tGL+YxP7k0`IG4M@4eE|+`Fc|JM95(~*eCcM$}p3dd9zjk z2(M1n19;YKTMK%roIQuRblz}>LWEY&rPi*{3gxe4_?H`?3a`TqcAQdw zA@mJ;$RjtHRIv1C#>(b7kMi5NivEqzN5|&g#N#Iw`i;*OM3v?r2Ht4H9#$fFV637v z%EdHVIX7=ay7IVdHXP;#d&CHiN6k)|g!QpW(nh?_c65#+A8tm$iLsoCx)Al*m)93jSD9?old3D`tSDaAkx(9=x*o|n_4 zf3v7&=JJN~*1K>QF^(5MkoH%s-^e&jR-zYu!gM#)4FkXeU`69KhmQ|knjG6pS{`gi zU!4yMDml6~e|X$o>9Kd`NbtX6h-@E8o$8460CYqB*OA{q7>ZO*#1Rt;m+BGnxBu?l;Qmfx-nA4Mc(+my`~k+_=Bc5w)ZQv z9-hu*IEDI#=hcaP93Z3*3WxW*wsr=yE(GwrX4UNNRvH{54SRwIn-+Hcp!@8luV6gg zNPAgoqOC63iP(l!Tbv+>jDH0>UQ1K_VK`exf#@RWzKWxPXb;9m%fTdJ=hhBdE)Uk0 zW82O}nVvV>u>H6^RWICEqv^b1fJrfM-eR_EZnLjQu*!C<=%$@Q+zXt>UV8w>)obf$ zdDW%}3zfiVUS0Oi+$OyFYUQ-ybo?C^79Q@vTX#)7kpF3o5NoHw60(CB|G(Yp|Mwgm zK$`(9Vv;lE+Jl0s5XQ92phX{KK4Ujknk*v17{l9n9?2!JN8KTbI18Ahz(q*n$MK%J zM2F~zi0cyYXOZ^yva`&D&SY9z$|z2#up7V1hqEZl^eTo|58y-Y56>CVi{N;@K3&a; z{SUTK|g>1%Dlr_*pBjx5e?gWuHKanAh252jy;dJ=pg` z8q<__$o_d%l%&y69fK-YSDmKfuO(@)mXn>+{gdep&CuW)k&FX(k0&Df+s%Cfos_Q} zJSXWEXWaHjKY-VQq({|DN7)dgOTx2e_*aSK*B|bw0B4|$@9i|~(;(b}mT5H^##5zn z^KT@A0FkNLaMhP~2zy|!V^ux76ql8TfjHs94kif3LBny8@mOgWvz@13ma!*$=WQWb zyAjq|3{~EYH87lx6I2_zc$ab-X(@kjx-MD9K7hEE@~XY>c3KEsThx1X+I#3n)$_uV zsAR484^-J~bRyVAsAK;7M)Eg6<05Ow^FW?p3U#zay&@8W zjXC)@l`3Zg4;f(A1Ds*V4JISWu6Hd@{%wc$QV#lEhFM-qE>Y*a%-`{r+Q|;xO+q z>iSf$&6>!gUE5Bb$apXKEBDi@rg^%@j4l~c@4N#mKIrA|EQEEQk470IZfVYYNBCXM z7LN@H!Ww}kBi4fw?$dGK2l3(}dZM?Ht$IaEsKI<&WchoWd{>(Wv)rgkBym+3ndH9* z*N0cVOUfJcmw+uy8A&5{q#2k#pKSI}7e*B`19}0CkS2;_4v2;|7=ArKDVENv&4VqO zX8k0eRI8DHhn6p^?2A1KStl(%e!g<)32Z+8UBjcgvn3U=&bf}L!MW<}wd${*-c((q zzih5H)xVLcdVyD%K^~>*>Rc|S)qZ=FZg$fSlaY6$1nn2dlU)d6y!-Dn1OT}cCS6O6 z0LgdlQAv=OCEbdq$tfDDH|vM%U6r_?RQ?c?C);T8Imosai0~doB zx^STyGOs_N{XkFfXDqK6?*J1~RLB-XbC)m^IbCh1cFEHJ9z-yr%;J6M5$yxBqZ|3< zJ}F(9D< zvP%?@kEU$aU#XdXR?>`u53~sAkmQA}mkdtCE%iCWDWJkZSGnD-h)HQ&Zx|St69k)Z zTK>lvngsd@I0Lo%$9PxPBH2h_Nh*;;vR6Neg)#OlifQY#G%0y)eCzc7o#nc)&F2@2 zmDXfsz2CdH*0iNmhp}c|7M}WP(HX^m{po#4a>U3A%5AMSv09hd=0q7oqO3o|3Pl4$ zV7NO_H@nv^8`-$)a9q3(n0$f6pA1*f#w@ezO7xug+^ zm4`v1zZthQCZ=gsvqN|rrf}&k&-!O`Z)qnf1*HvnVT<`;s)IbAGA5h8tx>71`}G+7 zdWL>N_q*juck@txk{l1Pgr6~hzT4PwAeiL71F-lo-=WGPBUtVvB$M%bgi>bNp~ zwnn^#>@kmRBFJ4QLML`HN75jUdvv^f@AT{_EW2hIb)ROjc8(VpUQytF}qZ(T@4c^RTla_YK#z z3`96h72KO`ORF41TzfX&{8ypy-_Ov0K9kD_tua?Q;vV*$ocZJ)5U?jD7^Tshp?1yu zDnE-DdkGJvE1Xh}UQ|wVQWl|t!Pr6>Igzj^Zy-wDrP3LnlqQ}tZmo;9G#tlkYF1UJ z_}R(EP9>cM$7awz8Mo^Ag%Ej>BpX3iXmlO>o#i+k$drQ5!$0j%*S*0?Sm6Z;b*`y{ z;mG&VOY(P&jXrsMmbZx4sX)~S=2n0q39rA2(id7di0rLeX=j^cBwc~mSqTj&8TmNW z&F)&lE#{glh2`h&q4LV*PI8q9V)9rzxeE}v!Z8)}iNZq_xezhA_*}$_AF~8Xq=}ev zG2EoS=uRPlmdiS#B$Gfx)Mcunq-Jlnx-Gy1y#|FmH(-|O(sjG6S+z$cCl0n9l~hoa zu(t_iqI?s3|I!!Vax_IlWEB1tuRxhtNydSXoz*jog9dlb7Kf+fME5*v_8kWDt+$iq>-GH%U#PgV*#p$(P1Cw8Vf~tVUN- zfzuz0g`i5Gd3VQTpdZ82L(Ri}A+*DAaDhC0c&h&=hS*CVlkdBd{vb5#yZb2cxol9d z=aLtP`KoMGjt6&@(Y=QQ%I(Y7Ms}VeYBFBFayc#eAjjKe)W|mXA!KsR_|aKCmY*Z% zD+j+kHk-4E-NvSvXgu&Bn}0^002BD z1B&0{i0k(3=0wXCrx(VnDB+>9U^vzTSKN1{tZtai^&HPxE9UX0MUyS!cDc?S3GrqNI4k2zSZmkxZK+J$l)k*R^vu|MaJKS+P%9%-+Wsw9(9c2KR>X2#)a0HQ1&)`2Pn&5tr+|<*=<)x|MKG zf&5HbD&FXYMky8PEDCGdac>IDz07`n@TQ`9oyB*Rokp@aSlp-R&u+#Ul;@sly5Gv9 zVJOOxaZNmb*C}&iGw33>{We#CM#{gI0_%kR4Y!fIvF!D~V~E|MNK*ErAvvVv@npRV z0cTH#i=t>(~5!8N#ZaTZ(`ia2os@LQem4^k=Qxi_J_A%Y4VyGBXj zVG-NsMpNkWxoc5(22SmP5(Z;P_cEvu!Df`@1BIrmE(n2u`fm_HEkVF%Fi_IJ@bl7$ zhPu))SBT0J9O;fP-j=0zz?9AM(y zn+D)_uQ4yoYm6nUG30dyHxWiXYb zl5>~jt`UPIlg(w^CoQ+lbsY9wGK3r`y15306cRApTIN7aQ|D)4FA)n2a^jB>voK_; z2ZAR`yR%EQ6F|^lEo17_q+)IZy*C9)F+ut-7_QUPKwx|qnxaLV-Crd(=p-DJ3fCn4*009@Mo4kPQ*vZmT{da@ zRhznj->0o7pVah*iMMv99a5_{u6q$9WDD=UV>t9OCbh$a7J8;D zz5~vNRe*SQHd7HaBJmyZtWc(o_)IW?S>3*qUmMs_$$A!X(q zO8MCF(HqM*3ZJ$gLDyKHPa7?_=aWj2;1cA})#Lo1#dc~-=H{nmFHetCX4fk3_q4C( zD4G{RI~U(6igbf332DSo07nLUimO|)zi`UsX6XRVO4nzzm;Y(;xW$j7J#=OobzWp} z9kXz9^?sQeoaz?er@{~)Ng?d>gLvU*H#*CT=9U6_*bf)Uqb+b~~*K`Sa2>$mHJd@7Gcq+1|NNWJ!%sDt?9OLph@!cceuJ|Jem z9~d#vvm}W%#O!y}$^q4bofo02W|P}k)eSj27NmT)?^*RIFa!mVGfhE!#`*IvCIZGZ z3)k{n-Ebg)RVpRo@+X{l&-2U;m2G6SKw=sz(k9!>Yd5Ndk!9eCKqb>?safFdH{gG2 z?~AWq;5bpRnnlJCLZD1=@ghG{{Y)8xtJI~fC(oLVZQZpWJvIGjLvQ2fWtA@v%HD{7 z>@g)FQJ3D=000g?n$&bz9iXOXMactaP&au7h_0MJMv8OfY;)~n5_P|nj_itkDLg%Ej> zBp*4H@n5#>|0kGsfMBX`6!X!LmW+7PW}S z_NIwC5_f!Q$~w}LOLkL0O9Kt~8I8;2`$~kF>vfXrN_nxQZ~dAk09Wh`!SXhCi!0%Z z*Qh`)7@q<}vInG(flf9olmu2*Vu7Z*&*B#!1;8B!X_(Wk`jE_IO>LyNeoI;UYboU+ z_o;=%;fnJ=Pv2gRpN+85##DZb9>evbo=Iw7ilrBoxOM0Zy4#E z6TFZe9P_rz#hn4>Z`j%c`w#i^|6MTv+GMBIc+B`9x-V|@@#>#y+v+Oeh0*ca>DbAGa$dbE1+fQ{saFU0ZWH6KXU(4M zu+7a?zDbL*J|-%}<;KFoI4`j)r_B1o%?RTOl7YEVNY2C!V?9nNG{@|w^|yX{*0*3QY<`?}Tftp$SbdA&K!ceu;u zyE12}o~cgype$3ye1T9d%G8chLFmoCg~4xegt$)eu7wX+eOBQi#0*t*aLHpMn#m3M^>7P#~W&)93trr_UMQGsiA@NK5vxQ3H0j{rl*o0Mvr5|0m!L@Gv z6pBpN@Nmhv|C8Cu!*6D1C#CJ_>DJDVr|-jFZ<38qHebIk{-@*~Z-48Q&y~uDqR6-& zU_zl+{H|U#Clj$_;|}dce3H#t$Wl^$TC}@f98mdAY`wp5;LR2v|9ubi8jzYQJL*F1 zS~YElqH8ZRFU$o%iB4()y-CvEObh!Md~bZx~wI`&$fcQEajRIx(E}vX(VWh zCCiqc7SdI_w`+2=ao;K4D#VXvQ0D>{G_ierpcMY6Qx$rd1eKiN)HZX?)d0$1nH2XB zHOV!z+>-~k4w5yPqEAh>Wwz(E?5oQzSLUIlXzw*l^|O&I^1(Ib8!hE=jBB(b0(nEWVsw*i#zP@a$R?M(iNO*_oNJ(J&G-1^p*uTc9D)8Nni+ zRj5fWF&oOI)q=0ttpu&7JZV1hM$|fsfBgQX2VPr7c+b9{;Y{5766Pi(RU^SV=swJD4BK z7zrD6=Y|G>@Li?q=#DSA4mwd3UqD&;T@yh#0%H=#+F}wDC5}J~X*f_$lkk8}+r&aW z7BQ`FUbPB>^Z(iueq%Vqdgx`m{%a4#p_NP?;Qbwfd%rH08Wih}VEc&p;+JmYcS$sB z0@M7a&%r~duD4R;a2b`S|Fdlfy+qkC8Um?6^+c&u@qI}@HQFk@zY9OrdNO*Z=R_=s*I z8%7f=0ppQmPYkK!ObKKoJ4C(kI&9;;Z8dZ44OjL{iYaz&~6g;M47-&NVyQ0Vk|;fc|^E4V?^bKy_*BoktWOmu_F{%ma|5MiH6f) zdQ~p0DS&j9mS6;e)&fZX03tzqVL-FKL}sv3;T2D6v^QN7;#UkEFdniv4JOV1wYGr= zWQj8R)cwhFE>hyER{{ zN#V+O@dQJMS8X>G%qBx0g?`3(yYI|w@7ykuONuGxMAY4C(Y|?)v!7f0~7b` z8k4N-q8vgTu`GgCUcto`UB=QC*Se*(UtlL|x5Ztce(s97zV8d)Q6@Eq%S2&tPXlQdsT6-* zCv2_mQvB$}(REJa_A53#!kToZQe*X&O-nFf%!NFzxQyE#S+S{F=5C2)UVLhzg9(V6 zVQl|T5dK5={2x963DqUgLKQ;_N|K3NvJwaOWsxD(eTEpEk(D-fo4*IwmcGaogKn7p zI5((1m>%0;-Q)W0m1}N6fOdu6KTturKz=1SSxyvy%wQI<5>Sm-feQRWXajn%te}_F z_KPZ|=O-%#Ge-hA$S#k)7}-ew15 zrbB*skH(+u;khXUA*%8-D^&83$|)xH_Fa(p^HJ&U4CpZ1%8Stgv4R4?t+Fudg_)6_ zN61);^KItOqIF9J=vg1E1YD90Lxy0{0x~xYL}R|>G=3zxp6Wb4K7H)qYx~`_b|^-O zjSi*!Ib}?T3LbAN4xn}gCr^rU2U$r@BCfJ9MmO>9Vw9bt@)TV$E|YK?78><#_2DRJ z%yQ$ik_1eUg5ENH$KDwLu48NvfbB{Rp)jxK=weNjW);^9?Rwa?l!Ha!0@m`if%KLs zAc$`cqRJpescH5Rx41KXpy;+D)r8J@m@z;J04;YC{px; z+IIX#D1+&^e4}o&{G7*GC+T*ApJ-jL!v&%1qzx2w-+s`cp(It2Lrv#x&l1*S@%)xUUybW@wKkJ{&(lW>apD%?+pz}H?Hj~;?mwj zL_g;*KIr@q=5^0K2A3phUsFkE;z`)mMgIxuP)WfIh9_w~?%!VO4 z)^k&+N{CAQtU@pgKmIP;q9nL39E|UY$;I0P-8+UqAz^vL-+CR(L-oO#XS=P%1p?Y!q^LinitAAj)4qgFyF{gld{Y)&&COG}6EHDTbL!O_ zGIi~?<(sEFe0x?+w=GMi|*Fuzx8mz#o<#Dn{+ zTpT2dm}e@zq=dBScS`ORf(EB|GXAaSJ>!3rrP^M!>u`ce~_L z6ob@@3qxfyUmxzbkKXwB^{D;y$HSlJIQD-$r?TjDWWYX1gudVU|)gj?n~Jm63Mih*mpFfa!CSI1p15v%TJyBLJSI`B?y2b z(9SW1o)Q#HNz{2B8q#1iz<>QSTbW9Ck_f74AQv7 z8Wj;SJ3%hmUkH&UNxn<#vn&iV|3-)-ctqT2mE}*CtG=SFckYvn0cBbJ%4xV19?#E6?0wj0}nb?tY#ytY~M^9kMG-U#77lcT5)?_>NE5#E|uoz3VN4!UJ?rQEB5GVZ8 zq1$C5fCcx@_PH^UjDgKvnrEOCode(`m&wZ)X9a0O&7KVvkf5z@9lF!E<$B&4TKVw& z^BRtiJl9YaL{ z;)1WNJE{AD1QGSwK5(+BIN>Z!CrabO?3xFOb>_Qzv!o|d$4?+e?;gxKwM-PTPDihUub=&FEi3}XN?-ql z5SiPqlO-ET{`KX6e<~3_>vQ!FbE;%R$M@kQ4A5`$QLphulz^N5NGG{u!oe-Z0&8oYDSViozVJD`JB z8=#&V4esg$cTl7bxFC8Ea3kc~4qHk(<$MS|WObMn-s|B?dgSi${kdTmx3TqcIaQpU zezV-{60phJF2~2QCcIj>L;u37qEAX6Y#rav38w;0gR9Zi>S;@jLPmnlx|Wc@3HIuP zYR%d`!L>_uWuS=t67+Xt9^|iL;n%hgnn{TmLfsI9yFm0-)mRqNkmDxx_K9(GBuEIH?48cu~yYcfQx;qnt|00xfX#cC0llt`|H|9*!`P*yJU&gahC(b_BcohWWxt6NR6S^j7H_R}|Q@t&Puc`_KOX=S({zJD16 z-U>XZQfZ7IAIkJ9wq6_(v2fP5>f?10ck!gqwiChQ#;81C?=}7Pu~dxCmHtr;iBO#? z+C0K{uaUI&7v-C$FYE2- z^Bb3TLbp-LuA~3h%=eIIn~YJiGs`{_cRx)`{>(|JxP97AI*hq;d*|e3j;KJ(0xN^W z?7{z4Ee8PH^XX^l>HE;pEkGEczzq~W{DvW})#tjnVp!)wd-p>_7xavwf2Os4cV z`p}=mccmru^`&p;rtH_QU;5eZ^!@hW&d-FG7$;AngR=jQ}-u>MIZg5 z9?FkI233qI^I>3W{3`?KB*Inm8GRl&na|U?88&gM35w*2zUq5U00X|?KzgL+pSS3 zuc#-i=JqfHvJd(nX)J~V7!rH;iJZ%CgxJUW#f^Rbs%`TeZK}b*bGGp)Hf?N(py8v* z@I8vTnUVwFin!dMa9iF6?=@MO)xMf1H?CNe)m+(>mD-XBz%bGl$MK%GLe!<_C3CW9 zu}(Ni#>@pJs)l(r6iyXmhn`qZm-Ej`kbP}*Q-$S4jO3um7w2g5r$tLJCG?S(IcxIw z3f%B*_i446wC)OD#{nfuN$c^SDAgl-OC%%kMVj5u8t!M_qXyp%`&*aW@}o!LW;Mw{Rq@^bJ2r8ejR?(>%8Hc={`H#=@F}T1AkR+F0?Q;*)U8o zhx4w@G*iHHFwC&sojW!Ba>HYs4tR#0F)2?2KwSdLik2rTHNn-tBK*z>!N)EmhQ!Sc zwHA;OkS5;64+tV73pZJO01Bi4bZ#IwA>>j{2w^oz|4s~wirOQlqtfeJ)7;P%6;#3q ztQ&6iD+3n-5o+|fyG9sJ_s%YnaQ zXq(~SrovFtLfHOqgxK85B#nMV|EUz7Z5vG(luZ24O2g=DqGljmnf$)`i{Ec4|1@wF zG(0lu*DrRmL){KNe=^v6^PS1FpA!S8*RDN2{r;|fv}NVO?K%#Novm@JvDtLYbeY(l zjEYCd`k~~!hu8DOFLK8IlQ-rM_dX9d(ctMHBi{TckLm_oQVmY<$kpb{W)A{oxl*B* zC9GJ_sV=$|BI8&o*l%`&NJ<1<2Pg$7%`~(~FThOTqL6GIH0{K&w^#L*je%m>HAp1C z7gqnAVBEqvJ`C8%Ri^arr+KzAyZ|*=FkSFfIP=rH#fK~zHjeZ6M_FASk}iBc>clfq{4>xo!}E&d~sg$WGJrj=UhC{}q)Mib~c&d}3|Y z>j_$&`J`RiP!=<9E^ABwAwG`XW%Z0l*3t}Tt%XI86YrZ|>}?&RI}dB`8fOOQ@NNe)0->6Qx}DExuqgHD zj^ImB8NhxoSP`08(A?uG3bl{IbwZ7>>{|Ff9w96=p}AA@8deRB+rnVmXD9AqTiv>W zB$H-oeOy-`yw6`fqC3J_@pUdjOT$_jh=5R$C6yUKrlEOHGx~Q6Fo=4=R7L2zGYl? zSm*1E+xl_3dHd+(;z@hrgKzN( z$+~tX)N;Z*hPNnC#ox12i70R6<6G6;0o7tOU;eeWIfNd}dSba-G346qUrK??=C1JB z|4`dB!3}Dego~{Uy)TmtuFRBwGO(&|aBcE;V^c4Pi2)bcqGMu;1%%#g^n#(E{oK~_ z4nIm?y-IddyS+avtorV(T4G(UKtaO(O6Ci-Yv-OcKM3eu`Bv!o6bRHNRhdHFq@eXE z0*oGtVS^@$r!?=AY%x$Vk$yerF4n;@)$WMW@qjUeh_cYs!bt)qPmI`c6(3ELB+i@p zg2Dbhtg4K*$T4fWq5p2_<>8puw=VPO9BBzZxalVYH5#>jvr%VVM+&Jkv!%g}db{dS zer=H-$UIuH9JmwovTQ<@^F@Gh1*m;y+kf&s2kNwGBiqpc(pIi%&}^OM#sp;85=InX z;&iPBLS>WkJ4x(VWUT*CYBLs(KJFkpgtS{j25T=ujj7l9)d+PR>)qlESaBes-y#`H z-6`BHeU<>xVC~@n628g3ZC#LMEaO1#F`BWcTpvh-n&pX1@uJX>=pYqjA&gSoT+`Gd zp*W`meMxn|f`6QSb8v;!GWqYi968B7bsOe>!u|eFl2ay|v9A06q2=l)XxzN^LkraO zU3lvxlfZ?kIIdJ72+lu}FTVc{qTvI?d1FPxMsnHxo%rM6#f+*|M(+;~!sFZ5MB7qa zmagV*wr~F^CnoNkEKgo}z^?7Y5t5Q~^(NN^?q9El->v;>GVTo=;$ z7*|SUO|eOccP0wZ&BfwP;ZG8)VrI4AZV?iZ0}Sxk!O*b$2Cc95pEa@09 z!4VBu92Z_rVx$#7qvyk&y9Dt70n{;KtUz+T_W(Q9!<0_$CXE z8B$edpzMt+u8j1YhIPB@@IT`%gW6R*P8xq$^Zx3O2R|sie+GD2#S>hW2CQK^xoN=g$h8(3)n^4gEIz6b9b*3b@63Rhr_ z;{N7WC#+Vm;pxui`xBlT55f;65^cd373-49XOnEd;YvE{MOym z(|101o_=|lna(ufxlr<<&r!Hd4$rAvs*g~iL^>!Vc!bXDOI_r5kauA~tnwg8smT3g z#iCOLCqNFWjwroAOXDUa&~2!snzmYwa}@MnLYpmpSu_zEd^aU3ym|I19Td*m?qVf6 zyBS<#_YX`hw>_*m@+d0KGKBZ*8l}g}*Z`lh$wvz6jwyL3!IQl0SH84;+q{1VYY7YE z%iMgQItOm3l{*r&f93UI>yY!^*Y?xf?FKh4e%ZLU9iDG{s3M%`RPH>Q|0ah_^ngE? zB0hsMSeM9JmmD|~dbn({dQF=;F*#W;%H#%7Em9(}H32T25fDj}78{XD!+{i+Mm%FV zU+Rb`R7XMaU|`j8mbO|1zY8ZLodYF88~$K2`f()?LJR2dPCENdMZ%rsM4oE&CAxqjwR!n2IceX1QxidGP?J=%S+QR z*NM7=YsxQW&NJ5vo-yH>u#2RQ!StBbC2572ze?xmai6O^=DaSfzO?6xUNOM6ULiir zvWeg?g@1^eBf#i#Q;X7`n+(8J6RIM|bm5n%l#}o-aGz{1e0&vLC@unD$qJ_f3`W4@ zh)2}BMYZ=`#Qj~g8N@PXBI|~_p-=}~tZHgJKU6@FHdaleycbLsZ_lk(b?9o~*wxQM z<#ODz<;WNsxb#t(fLhY5Ix{O8& zhO{J4%pRXGn@?{tY+8w;iyKPiusG&Yn)*hst~F08vG%*@3?oj@vxqOR>fgZBTnl{5 zR`2GIy9a$?aOHJF{LI1gF9o+RR~$K^&Z^e7ea+Bs@wlVAdbFyS_;Z6<)8(pSaqovT z8>LP6xdJxVGcOQLb)L9c^T7-Fyn;!Qa_E?n4%`zb~1rUoM1W8?4 zo>?dIc1LtE2G}vM`C#$A)}FBzc!R8dT9^WT5Se!7v^ zY8uzajuX}A{blqiDqw*^&@3|rz!AC}Q6d3mNInBsCG)4qSoS?iQxJla&YZdaJ<^T4 z8}hjosmoOY?NCFgQXwGe#8O~sarm-@cB zWt{8V3V)l`yYy0O=kCrK+x_O;7s&e(SD0jMI&=0*Y`2;-@0R3?KW8m{J?D)cSMDRr zUYPTd^>-)vNrY?R?2U5$1W+TgI*s+GOPh5sf^+)|h=K}TIr*wvowz9+xU{zu#?r9!6`7gez z7Oxul7X73wVv2AY;RZF(W(q5mpF?!Hol6ixeOr?I0cB9kzlinF)FY zy_7mE5NKg~as1PyH%V{YQn7SfNzTwa;_${&E-UBd7K!@INvo$;-k+ZMJig~t+H@xx zVu6Eg)27$fRr5R*dGKSs^5EUudlDz_e!d;tzy0&xlcqA+Kr7bt8igxvCbXhd@5`ONGpil~1=8j;G+rfy>27ilG!(j3ttylVPtC@us&&fNHgw)_`D z-%<`eaAbu3#t^$HdDZ7X*F#dUP@8$(q;{k8`VlK~`+*x!+jHQF==$hbR@y8!9p!KS zmqkzoFO_eWk~L_{E#FRFyY{vHL(A#U+w)hN+CR>{`*`ee>N|JRy?r_#V&`-+-a?u- zdeiXZ#f30++tCo1yt`%zMVy=*m+&$(N)4e2>lTjY!0h=0D|`h1NUrNuIVdVBK&^?I9p>9d(o%yd zO1al7pry2YL)n}bR-43X%K*yKd6`h2?8m(EO@nilF?u}1W&F`|EJgVcAVp9#8_NH2 z-nG_eTbB9N=ic4bpSLeGy&ON)?QI!8{fOs|w^f7ae2;l?*(!zlIWSE%`8GllJt8N| zL?Nv~kAyJvS|ZX=L3a3uh|l~%_a0K+_mHu@*Cp$b!}%mzjDjisjwZz1gCT+S4Ch*~ zsdyk2IvhM7ODhzqB^&ZuSo(VSZmc#$=qPA7e6^N2<-r`qFND6P9L8TBr2DUiwRKvU z(f9117&>qNP{`UgX>TCzf-_g5M3 z_C311cVV$VPG5MBiuiSlM0yAfp~7v9?5^&ryJ~KewH2D25l55iI$Y}VcqTLL%gtfc zuRLtda5~`K_>tLnFDFTH!Ds1diEv?TI_mmoGzF3tU;-l|VTJaR6o^?S(aZgSq&m?8 zIvAa6>=i+JRzz@?XsY6Q%EGruu&G94IR0*)C8xHXm9)9#bDoFJFa8ON%-P%wynl2Q z;<&y^ZL8*`*zWTBjum^DIV8S6EAcdK^3u`~c5!o%K~T%{Zk7$teT~xfG&Yf*YACxa znEn5bJpJEjJ2I16J2%bW*t0s?Nd|@vJT!?@e>Y7 z{atPIa-6R=mEh1T(gQ+M1XJjYiD+(v=70~ohPRi8hU0Yt-M%dJNHHav%dA}d@ie_5 z(&>V2SXOp?nD)(YL4J@8gVWPP0qFt{FY|4?QRB^OGmO$Jm9zvZA%4>)dRa{2WRN6H z1}e>*E2>-6A&UHC=6=~kryhug^#KSyLAo9Munu{9&n?7f2tu5JJ&00U@f|WoH?tp@ zojcmKlwHAvxHvL*-=xa?Dyx@t3-^N_-u|PX;bp8Z-?_Jr?lBd2m@3EE_n;6xFqoDz zXD%BRuSed~c30J8v!~BigeGfBOvO(&9I~wLAMA(Be7#&PYZR)9Ds|&2Vqz7H{Y!2C zzb-NYIF=a)N_>qlYQu79Lv!Z1CY3R{_jjTMhg>NDEZ{DRGkudxX-pA-&a7F)MR~9s zORPL6tabcZ4gj5-x^x{5=3#g#A}-%E9U0~g0~pq^zPu84@b<1_`oFjOD=7ye?j&vk zZ}IPrmDMW_;kWYe54Ekh{X7NqFw;GuJ>g4n=dHYAz^pBTMhvXnL7Z)~JuAEm;?vp%>Vu|n!ddyQI z5n=9=G0D*_rzkAXw_(@7Fv^dyHsnv^+EYI#o zZd^tK>iwD2DFBnJ`C`@dVjy%>9Br&jld{X%nhRbJSG39=DsAmQE+e?_d+j_uQfHWZ z9OyDq-JE{n59`7t6t6)d^RMH(EcvagQ|1&)?N2}EA0;i`yfWb#-JN?njB05x;&LuU z7ghn!_iRO0%fVgDl>#&oK};FvQ~Qw-TqP13>BzUYFcdC~2m-?%Q`%!B0YE|5B|=Ld z5m&W9v;^tJq{w<{bQ*eb z18-KXNkh7QUbMNy=)7XSi;mcI)NLdPi|HmsV$^Si8 zeYhAArJ_xnm^)4(4belZlYOJ$jpbBE3Hm(JkOUtGkukxTfUZN;ntR%?k2QP;WBqd( zDt9pQDbi(4?c2Qr&5nT?DlNi~eMlxwS>xkx2@^A;4o{I@^W1OQw@-Lq-d?y?D>vio zeB(>ascqW#S5KxKg)DQ@u+#$EG0(q_}hAfU2=5B+N@(kuK z{TRTN5()waMyu{#`QBu)KN#Cj;n{nL??>!UrcQNrgNFiVaga&d6n+c5$W5>zk>8WR zs-(a)E>j@7&e>WhZNcV#USz`USC%6ar~71Un|aKiY8#%qA!>Zh8T~uU)j+;YrqU@J z8%ma@3f6oAbTkn6=fBMxXpvs)?}rXg)Uln}c~pDv>#ONag=s=%Dvxx!*g|KBjCg-5Reo0axagWbz|61o{J^7) znb)gF!RN&u$2|ADwmN;4{A&4qU1&;q^!@nrF#U&uZAMUrY`k^j3ZBtfGtuBXHLZ=g zYzQ&{y=)-biWY##Bgv;n(UnN_XH01|Dqsa8xE zY^~*^{88Syqw=w5(H*Og-Q~>pU&;2aw0&V%2)wUic&W|+sLg8qe%uw(S{z?Lt{o)N zlb+>MaQgk+-H>aR8&BKlX78W>9!4w=33U-G=_95{dq}}ZyCh_Th#VWT8c9;b^`s+Q zkjtUCRFo|b3w)PPVK#FNDfFeDWK}A6J$UgR#vl=!wT}9>|NaX;0Nv{rKvy3h?VB9A zO#=j%aw*j%ledCbf;9Q&4|Pq=We&Az+1RY)z^w86Y2VT`#*;Ce(F&aZa0R(` zp#W2R!T_if@b%ZJtI*;kvViS>QT5evP5dJGRj&FhIJIFo@BhQW6&3 z1L-tqrIZj9P#ImLI}Ah`=@1e4?frh}`}6(%2Y;X4=RL1`&pCHrw$KTk3N@$H+CfJ_ zB2>pq0pyJdUmLR>DQr?>Um$p*C_=fo5Qs?i(3fyT4UIxXJ`W2ukRmERj}lY&jg0n*jgO!3<|Eq?YFLznX z_ljS_HB>5}D&F<5yc#qZ2(fxCzTte)9a1un9qK>6c&;F(pO`9IVs&4?ypApdJWb9p zC|c%)s-#9CGLW0K=zKm@CtBtAob=DjFbe~gVZ6ODS15ZSmajBJ0_-i7-p&D+JxI>y zjw7WJtEmZfk%fcsx%%5A@;?}2!w#PM^CmCBINiv?khyLtd<%=EVtNxt+2}&sDV0wT zuH8R%+Sa}l=(WByZ?IkeLzg_6aro-n3JeFczBocxA|6T~3)fhke)3XBK=Wj&RXP<2 z9U;MuWq@sN2(hs^w?4H}sZ} zO%Nx%-}twNl8)k(d+F!&|4vTnmB(an|8T|ssUd}rSRe8UqtC9lgFk1e?Hn|y2;|)7 z&oN%PYOZDGXlJgxxgehI`;lI5eWU=SIjkV$_q@J=^yrkthUL8fWB0wu`^1#fWQ0Hd=9699ub=rrVhY*Q*zBA1Z1KPxJ^(`6 zGW(kqSv&UTm3=_8lzVu`B@}}ZNu~=tyi1X10sH_$V!*`#?@0q!3lt-=22kqBHkjEl z;eab_?%S4Gx2oRWYH&@RP`dm5@X1119zET=^B^l-Z-*$+$@^jzmNRoa_l6WW{((r3~B4nk&gLpeymRA8LjtHQR35Yv^lf1 z>;)$(L=)@W{XuI67|EY9bR=zB?P0G>HPuPNn)nF&owu|w=_Rt0LuiAhxAo3jKU|t8 z12(>GoQF)Et}F{a|A_ta&gJyyisvtbHQn`5a$}g>b^K_Ni#HV*L*Y``C?G=dE!llv zU$>hoC4+Z2f;TQv!=V&lnm}p|PeFQ9K@@S^+y-n!#RD@vUg?GTW7?Xh;3P^HX|mWN zuhlEsdTZ5LId!k(xM$L}z&fAJE)V}uGX21wJYE=6GiX{K{BY}9qo=J=yD6E&S(m#Ne$CuC!n%p!kq=MA1b|_CyzTq@ zwy58&9wvQKm0jvPr{MHKI0HWUcb6KZ)l{vUmJnqP5O5OgVpnz*PQ-7=(7B7WQCPs! z;ci;u3^LOVQ_E>SwzD0zq6P!ObRnD9zBHtQs^9dQeoDi7AnS69oJgtg>N#eRLuQ3taoAIN@_O#+*M`i7 z`@bqrf|_{apFY1$pJV+xI%qBPiXS9HSU-eDnoz{KeXY^J+Pkl&U5#n=+lR`Taf7wA z`OdG!Jznol+X2IJ`F){oJ+;ZiDG0S4F1b_$=H;B9>SvUNlx@d62ax3j`Ml19km(i1 zD?Wkt;6tw_G;A_zfx@2)f{W`jKEO^Byqu^DuJ9ka-Z&~T)^&8Lvd?%1yry`MdXOYv zv(4L@E`LurlhB#J1eBqdEwFxZpv5BvBcz{q8P44O__6OTo;e_D!Vr7;2PY~o;PTM+ zVnegly*sl3e%z}wSksk^y#8zaWX$}Vf~f$K$^E*rV$ZwjV>T4IJ|g9<3wIZ|R-h;~^_9 z>ig8?&1uW0ChF`qb6-w^p{My>Rb?K*h#c9>=veUV@XCH3X zFZUmx&*U^$Eu05Vw47G|E`Pq!uvgn6@Msd}&?PRA?EMPuG)O+m$rw*b3eN(|jzNsEt&5+*HVsfSi z(=vwHh(R|Rhj68|hA3lp-&gHBSsMzoiq=utw>z8B8zWwC9|dmDG#~pf3B$Os)h1mo zzJ$PliHqM=A3mmEkV%1MBKk(tV7&kyDNdMQEK!LLTtK4JTz{mfBTR;<(`p(eu@(f z%sA8bTMb?4D*jwTSHMU-7M592kNX`$l`_l1NUg`>g=sZl2wIFWD&Zc4VAA6(`h@g5 zWAwURX12OFED8|Yceds}Se0I+G}n81NPWIVcZMiRw1Jmea3cl_buf&DVMs4>b3Wch zlni+h`}iev6q;9*&HzOXz}RsaG8il6SoHKsaqvN{KOohR1Q?b+!l>3vz?+?-o=b*% za*!;Ioeq&q0uR%!0k{`qUr31u3=6B9iI_Bm{n&Vg@5Q zfMY{rJ$$ygHIg-k}7p z^wfHeFR)Q{$=O<=l_FR0-beGnkQA>QZyt+0Fk3k;jtQ5vhcFKyw2|ZNA%s(UgR9)Q8*LGJ{w?oVJTaYl@g|Z$+i)g2i8%HOZ&=2n_Ys`gl4fn(=QR z!W~`0>e0{sw|!t-Bi`ls{@+Xi>9Mt6MVVsI{4`$9(A@MgG8XLnf!;pLbfEv^gy&^P z%Mi+tibnxy${rJ+HYVE)$etN+U(CHuj&54J{EPqG^=HdP-Qf(!-s$oaV{C1o<3nN1 zQJP{Il#^xzYK#xbAiW5ywn3KY^IE8Vl(OU;qgK0%EMY4mHHl@C#KMw0ky<450ye|a!2pAImx5WV>$*yF9N zEE#8Z;@wxTWOQCv$WzJQ+}8T!O7Ww)+ejVu$PPSwqh2fX)%E!$gDtD+VeWPHP6M^+ zs&WnZv!QDnAv@>-Dq#Qf)CW#S&zJTp(>D859*G4rPd&Sp9mT4|Fuf{4394qZ{AY3p zAYZh)P5-qOb1eZ_V$gas`RfVS91lacw^Q3FsAE@*z~$Df4lyxB;=PdXI2kyh>{PgX zPQq&=kU>Evb#Aoajb|@uO|Irv4MBFPjaXuJKbMvh9N!M}3>W@`&_U7>Sdz%)dd>cF zImV|%v;Kcu@YMB3?@`i4)wyXuSL6zv&Y1-B~KMCBGTz8(T2(S~IlZIb#*lN@v%@&AC9x_Ovv*EN zyjw$v`EsgWnUN#UxS-QEloU0uRe2#NM@zeZc-BWa`Y_Q|dp`ESzv6-BXY+Y)+0}9^ z)g&rIMu|oWQ0Ob=V^l{!3P7!4(u(SvQAjxql&cQqN{yv%bwhbV&<^jB%oO|7_Qu2z z(;`ammq<<+J#@iI+QaC?yp_}1btt>ck#1StTM_At6$lo^$KcfYC=hTLWrv5UC{@h_ zScFm9CAfT_HrIZ`uL1#~PDb@tJ!{V!;wS$>XcKp6?AA};$oBOQLX1^e=-WRi{^}GQ z8MfyJH`FrN75F*==2g&}4@hz4zON_a;z_+XLD~=r;y#8cUbk{fF$Su+dVdgO^-J*b z{^V=Lz>EE%zz|9=&8nDf9@| z;*oPyajzF)A1TCjor#^=A%{^>B2)ngEUd05hFZKdc-!A;Fh&d9%XG=y z0;1*hYQ;3Q;Bm%~KZ3@7XC2bn|K@Vc57UH*HT0KlH;;a=5fD~_>OXnMM4o`JHn=R) z`#`EGee57`DZ^QI`>6Ev=?_Z?xgKRfMAfUiDoG3%TQ#xGdH#dur)ztUf-lYkPpPV& zi+(Jj&R*~L$We6_PAa%*5>73YL9+R&_``+ZNSvtg%)gXz)TV|3B& zzzBHcyd+^iP!)#fpyu_aA!S!KqJ7T=q9X>zrSUo0+|vNO=0fhB^QCb|6mG&>5@@@_ znAb^J*>z{bk%9bXr62S`I;(2l3#~B#M+c8Wx1y0JLE$sl@7ys3jK!{AgOT|ybQns@ z+R5wNuXB%ACg0lazYyW&MJ~Q7ex2%nYrKS~P7|G)-MS7SDSgvr(a{NHZyyisGkH10 zQ+)<`BgTn1*J1I3Amk+xrLgRG)Jfq0Gf3x7Xsa4StG!!qeg~V$ue^ItpbR$d4M!~= zBt`LFTL^r51rXf2!FbxjVPDDnDQ3%E!e@tn0;vVuA3_``Ek~!Kx#gqgy9EXVeeM z4=T4aztrC@cz)(}A;D6?DpUQgj7x+rI8TyJWcbZ}1MVr!O2ji806^l6o5>SLldq2V zy}Td?_Fa6$R265Pt1fFA_BF8%t49uQUQQ5i`vvg%xDOsYi6j$Ho$%unB&R6^t-p*0 zOMQn#g*uApu{~^$OGU(T+mnad_-bQ}e)ty$n&+G+HUCIr%TEYEWc^B0*X9z_0~baK ztAbjmTnQ(JpfW-;iZSD2D;3pDcCcISW0*5Bf~I}SoVyh^hwk6FxO;JyCDU@YbT*V@ zr?laDvGK`b%<6}AB>Kolam6O}z!KT4u_)kpgshWnm)5v}BzK8WmD)i`$zVtdWRQVO zW0av!Q3k*?hWrvFkbDs`vW=vr^n(J}kvdR6*oZW`6W9T}?u}u$ zh3lE$lvc92(=WgT?a>XZXvOy(MM`j7%a{%4f@bR%7ik@O{)5mj+~JxFf$iOYWShA) zkEjXm|4X(jAoT*AWydb5;WGTuf@NO?m+SA#l)1a2OUgX22CKO$k*B*=FL3ijLKHEg z%A0(5QN8}owMJ#97glGIW5HX4b2n05ZD+i+Wzv&s_&aliYCsH{LWPL7NPQd{AKCHV z7pEB?*~OQh_(m7hqa%RhB7;xsVi6*V>}+V=)izS3ZZg5GNGZLGbmcoVe2B$=8Pl@^ zU&Xp;P(5a)1d>6uzN=mF;nDMY-5XURKV0(NZkLOKa&T>A;a;1tx!&UCtNetqxso2r zdv<_N*k6UOs7oWam3jf+jOA%Y_@H68IXI9d3;4PxZ#rN~o zyXu!+zrB%0tmr18d^29jP&lfLt7*J2rK8jpv5whnLS&vCj}E*J@yKlM|9p?<%b@b= z>ZQjt(>6Li4$=(dj8`>0066J!_Wt+J4WwcZdM!+$mZ{&n%4`yub)_F#cg#ho!Kn!- zxC(*JTV~XPA%gWe9hotJ4hBC1HgWJ~wM5BW~3jX`bB^{m+sM5dR$=Lx%tKMukrc3 z!72YcL*b<5=0<2q4=O8wV3&nAi?srl+% zONo)-R!qNrl)7nA{O8zfyZc*#B|hnHFF1z1r$3AM-iMi@>4zZmaom zf}iP^eyb2>kCybTki6>>$}b=OOSl0H1{K*)8@LdhnykL*j{)5cG6H!>N5kcpkKFVG z3j6e$o`XMn+iP|yQj(F&`|$z7$-=ldAG*~>dm~{=5wV%c&X8A-?8h&LYxtzOm?LFG zqTZYRD>*%Y9sZK)rJC>6_)E5{9`hLgPgrkU-{wEsIKRtPUyZyeVdt?UBf&+%tM%(I8dSO97;}Hp<&uDqPAahqf>(2^#d~3pKDa8bJqCv?hN3 zkv)*>Rm@IabPizPuR^{MmY?wS_>8$bpaq6Ls2Y6@pg^MluV=(Fudc(% zppc$@-G`4!uW1^8prV@@a?n+xMa#i!IDTV0P}#}M>S9Y((f0Ammg9x~5ch=GJa|DgpjroKGL1d07$9Y)iFK&Ftz~w#dh0M{ zd%_Kh5OxMD2cHJrt053fi+HU0zvrRWlMY6B2yD&4f0y9QDnxI}|B`}@iw-4%-T6oR zg3|4TImoV|`x)2Km7~=BZCV^9qdj!d^!17f+qZ=)@lS+UIDHvTBm@LY{VRMtuN!Z- ze6M2)$asBfblX#wv8D4k;@YR+Yg-LtKgLlFADTWyOXj&q@AInxh5NY^jl;UkAz;FF zJ>)OMVo@CfIRV0r#8Y(Y;knGT9ev={CUr);$XT#ofAUxoLPIsQEuxc}mWzw)4J38# zv4llLp0f5}K~icQNY5=P*)*vj)>O-@0#V@Tn5s~HcLm272zrW`8p882Y~qckulv1P zA;u9jVWgIfPNrWp`_~Sp?9xe_4eLn>-zr?EjuDY$7^Ehiwkb(&hg%q6fyx~Q0R&H= zy+6O9u`Z#*!pwj&EW7Rs;`lb9o-*xbDOn{Um?5bx)P(I9CT}&-{%^$s7U(nSe8jIgEwGL{G>f=@u@rtt& z3-DU3954L%&nveLJz{q0BRcT@4o>OCi&Ss(`N03Ya=uAumpe{dTF%6yHIBuSnwL@1 zU-P_;L(Z3Y@>EXuW!cm2e|=BwqOo2ps^NW{;=Eh6b1&{~&Z$tds$Q#6ZI7?S>e3_Y zUg`cyv+wRywuK~M*0uo7;va|?8F{6bb8V8I&*`$ZIkBpOSgLR2QraM5{aE1l5U(g% z<;}8jk}NJf*-kVpLF(CxY`{?a{8UXgD59lpnLee6cNkOa6mA5WqtP{i_Gi*m+K?e;n@snlg4S)RXCh}tYo>qa`;vRFtF#zvk~bXS zu7m($>eWew@EMujpT?ccs*=t=pA8jX7$1s`%-rG~UrpCux@yQlK@Howre-68e5+k2 zQfP;w6WT>oWOEAIgqK?p6T({~ggTPR3!-!qvV#B%(U5!D;-tG_tH}sT5^Fv&9BJz` z$Z#1kQ-Jir!g|34a*O0q*=azZ)naT+G{QnBzCAotC%m!j6&Mzuu=J6f+|tQe()=HU zh%$wAH$Aqw|76<;vM4@@um7d`++IYh!vj2lI&&nwe%}x76jL+1(H`H9rUi8JWOB(9 zE-7Fs-=Np$@fHXnm;CY5@k3Ky5|HInl7M{eFhrt>0W>Cq;> z(wj*S{Y(tLqmcNvA7MB2xFB1ZYO`^i5BMPRB=2>KPs|bP!Q2#TVPDtXMzi)z2>r9a za+}f~YnX< zmr^8Tv_|!pZ9jQoi-2ep-LE589;%4`w1|5qP53m8HV5@DrqQiWcjepe?@fPD-h7p1 zk#T#>e7(v&;NFMdRfNW;1lC9RqR4WT1L#}tw=bIqjUA39gPGo(nFtz^HAhmS3-fI; zGCfrFhcPlm7VRa6{GBQX_mDaZk#-A2Lb=fCO@Op61yC0RvC>=7+QSG;LB(_caz^lAgRgz^ylxEw{xKq zWzwuPw3_$fQ3leEnLaY=>oKU?ttU|mKQ`rS^CTsl8p7+}HV$-$0Dt;1^s)-yyLrb} zY9cYuru_W##@yp(?RAfCpN^gTX~<$xKWs2UB*9&ixu<%TxOAY&k0`R@l{8qCox@0S zwtJ6bm9x!x)p)5Q%o#tAIgt_#uo$pf9gHyS=Zm$zXMcirj#Y*`(I^ix0_ou}AV9?{ zoT^$Qe4x%4@#5PeEf7YP}+(OQI3y zXB@pJyBccI;P5cvusDFSwkA;ME>HXQ2)$jv`{>ZH+rqyZZE^E3p0iAbZ~vsXP>J-- z?@J*pVw`QZn^gi_f{y?8A=u#v@x)pa+tFWy?xu+td;Mp@qbegY>n^>cjtaJfNd+o2 z-JJc(Uaqkm?=v6UWODJlPw29oBRzFIvy7y?>xF!X=gq_v}QK%KM1kLW%1DbFAp6FE!K2^bFDdi9slGm1pcT@DJgOe0)zwg*6zvo zZm@f9DgF9gChNGSNA*$$_2--(;chN@++@yNv@xkZ8_dkwhf*}C2{cb z@Cl#?nRvmeTBs~u-mJo26hO2Nj(mqCqr(b$GoZvlMReXeWPsh6m+&0H7+}N>Cjj8x zy~$0|?|Rnd<<@G-%d3M9^ILZkV8M{ga`!-2vnVAh+khBG74W~QKAX6s82g@x`TzP5 zL&pH}_8Rry!711M%H({9QtxPP08A&@ap2y#<*KJwJR((nt7-;hGZd2JQgplccQi_< zG;iCX*J4OSvviGr@%!-bYNBtsprejqPRvt8(6W}y$PLTcS5BRQ&1V%q=9}aONKf{Wk{LZ&?bJ7bC`W=MoZKTF@HpBk?o{VS(I{0$_o#R& z7oDD&_;RU=ijs48uceN+j^S1Uq4M*OVH~CpnbZ=KR1`H5<|fB){eJe@#7_$SR+SJE zm1?85F%Z?&l*wIWJ)6h2=|O=M@!glT4bn6)aHFpR02Bdib#OGjG?1PraxpWdPNgJG zOSedruSiIDjI>9}vmnnxUUBuDqNmTkV znLtx!XDNGYAqLa*vIwiIpir;jx!mQVu@v@yYG?;`l2WX*gIWEn&+)9u{+v8xeHq@;pk}lXA1OW8JERunqQGz* z%7T*qT8b&Mg_jqh_J{*S%8q70$^fKDxonUW#Ip(250F6|BP3(yPG=$v?DwWYSADfG zu|=#7YGFN*+!Uld;nI>l?%pJ1ue5NjxvYlOGUTq6C)_su`1PhFnI`gOTIxZ|E!l;} z2ag_=aJZ0}ns|KLLqD^5(5bQSC_Zyg@2Ot4RnMMVD&26WvT3`%W${kKoogF!yIsDt z+}Ln`ei|dW?eh7|#DppNN#GDgS!!&PUm7Y=uwJx@$QC3_SdkwfytJ)>Qt?nM1jH(P z7a>Jf!$?&9wUZAAAWPJw7?R&3)hQxG$Oy6u(K! z#RP4(H0p=BBFmBJ8F8uWPWJME&O}-e2vck##+A&VtbnF6`QelijOtx&_>$cmY&iJJ zsNtz?m3;d4>9dx1W1i{Rzn(uno?1MuI&JYha$XK;Iv!Ls`6-f5HwB_Fu!t@06yt;% zz{c^bt_J++)_r_ep?do1ZSQmlA|&6tgrHEKFye{`iEkCNKcE70W52lpT(AtcjTTZ? zRAsTtL-xtEk-)r}T25j8XIEL@jgVN6Q2EC6HY6p_TI!h*Es{S14rp;^ots&-=0%B%N)n9}d^O23d>Hhf?eNAzXO>iW_B!iQ8*t?w8 z^$KJJF1g=e0N(7#4u-&iC0uT5ir(1^rtsmt@^~1Xc|{g~L{Kfb&E zQem0B{Z{`=xk05LTO)e};#Hrk2tuIHKrEY!K_WQgmZu(wY=wFn}zo zgcJkH=SBAO`C%)yq01na+^BNzdqGHLhuz?JZDjV`=5Yz6i6-@(COIh@_FRZzPJu;y zAs6W~7*KiujY;e4dOut?kX6NZ7Dz>g+{NF%K@&?hCP!J##A5rAqGnTn5~H1^MfUB- zg-fW3O_65dl@c))&Zv^B?>AnI@-TWYl1aNCysB-BehQ>_s3Vd3fgPeuMw=k$+0CY; z9C&zDhCNvxn`6V3ko?+3@Z@eJHK<*nAOr1AA3=h=j#MKpqTymkwNV#|Vo2IRh*d?a6YMDi#|Xn_A_Xs#z6{&eY0 zXcqlDQ((lu5Ha?N`->2!Db!+`GF1DybMfTrP3Bugx)UA5`yM@O?q78KuPy=R(adD4 zyt$mzjNmr4-Tp9jebxov&egCw7c_0Nr;zfNuAKAwLpn*4Q8etSLS zS)uB3!@JqLaU2Abqn9NUqJRY2~F4sfqb%0-AHTN zY5K-k+p)B8UTiBpKN{YjQ%#!^i73cdwcj$!sh1uNwA%13eMh(y6d8Atc*gF?tCW#6av^C`FIk#-wSVt-ZC=}*HBpaG zmB-#JJWKrI5F@HEr^oNYwLE92E{>V?=jwz~!vStDy<|z;DT&tOK0SIDTR%a2((4oE z4_hL3yRayo2#<(%+E}Su*QGF&X_P&rtl?5X?X;V5`xI~~{ntau&enXO~)uVYJ>aw!PY-DMBLzI61NX?n7>?(@m-^k zWT1n|pFT9UGlxk8t_J23Y{{C=TT$J6;Xnjsf#-k%=+n=b?$M# zyw><_B@s=X-eM6|@o<}%klr-w`uy9k*X1GW<%>@jZ=GZ$3g$fVe_J)Cv4QDMyvL(2 zGTm1+$zc!!dC-;a3xyNkvg!bwU@m0vjRpZhrP&UrA~1!)JK%N(;dn3nZ@2-dRSdtw zVBpjaXm$bNgB(IhqpeN9-gah-jVRs?2j6C)i+M!1J46Q+GZo2>umwsP3cwP3Gs7w} zHmr6|kvF}?*M}K-!z9x+3r7vgoKa0~M3Smm_(NQLZvJiLVgHTdUYp)$2)+&&K{+Kw zujTuhl95AUj}ZQCh4Fb7)y4UV-OyzTj=>9=XIpk3eo?0wU~P_EmWbVm9=?rw$3{;Z zCWGvPrqNp9kSmnt5IPRz0H_W$LWV?eV<>kvk)@EYU*nJhL@#oyxsrF=*<)0S^9$UX zNq$c|5{^JFGn+>Gc_c=0vU>3Un=ZGTbY$YHo7Vha+BU*6;h!b=-~A9>mAM$NPQU1?`oN_+a6J?B^DQw>>8dYjze&8z@a zPVJNIM|yd_jZc&LbK3f{eaR!`wJ&!LsCCdmhP(|KV39=u3=EZkot-A-HPa3dP&fu4 z9pK9ZZDdgEV+D$-Tf`dkQc}def5n^oZtMr#fu+T0%-?e$Nlq+X(@9=d&yAhnV?(DTAh<}_q-;?bC`mE;30vEBVk$Bff+aj~Z> z&*p61)@KSWi=#e>2$PrpH~A(S^ng$+azraW1g8cv>Cfjk(7EZ~F|C6WGO+Gse*{%& z~Oahxy){O}-T)?n?hry|Vt(`@jiDVk9e6H&F4*ATI zfm>$()X+NYFw(A%c&700D~BK};*(gT3H?(;OY&pX3+|iz&81PtGM=v(-i@&ZOy^nV zJ8W`VM6=L@tLGq(uT~kY)6NJ;HE)y+PpQuyD&1IlbSB>*2=%?P^!buqw62s~{+yp( z`DME=7q5PweR=d`O!MR{<7*i`3xx&=9;kAN(ve?irH9idnR6ni{P9atG&0agYN{v# z;60fVPJ;i+J{W`(ilhm$S~e$Xy5!37-c?LEv{ncvC=%I1xN3aK#k_`Ulr_credawz zk!G_C)RU>1P`8ddj}T^R8oi@$14Ux{-Y7j0*yDDgoxbBqb+BGits5}9z{cL+mpd4; z?P}-0y^`r-w{zi=#d#h;n_+KGC$5dIbzY=FDI@s=7Mbwxq#rS)(VOU_u2I#A6pdUh|ZxJSqrKIdeG#R}j12S_MFp?;qM@qXL0RTm7 z_xCN6CYcz(6>ls6bmO9^co7JcHOoC8SVmHn;QbXeUG^2|6tD2L|6EgFkNb4*AB2dr?JcMOYr$i-?i7%`m6-ge zhB$w^CmHLoTVYPZ}i#H!TtGZTkhrK@Iv)#nN+0dj+ z3y>v0&g#NlWy2!yX#2F05d3TZ_x84Rgmde|VLq9MOVhV!JC=;(1JoV1sa}MK9*{MJzg#k)jDY_&z~&^bU#s^8pr@F+RIK*;s@XD&4YL|31z|Eg;kjczG*M>TZC%( zrW-YcXA_LRZB;H7&~<#lmiRd^^evyz@}7JC+&&X2InG@!UA}+Pm}Gluyb{mzi--G{ zocQ(1F1px)4P@j=cof9|_kWMu|JmgI`4foKdYs&AQbdpeAN0O?kCV1wZ>z)@s1A6y zTfD;=YdmN>SRjZ1G~2zYpnx#twsd`hfg0b!A@oe>l8aO73ojhA25mS?sBmv&Zpuh} z*uOJ{J=oz6x;J6I5B+zxt@2##w)=lGh44tuL~u#r%fe(eVRr+eTfa!cN{XyC*KCd6 z##bgKZZ2YcZftwdoXR>Gtxsir*(lIwPQ01y$PXa_{BSgki)=`ui!$djb~u%49j)^& zDR|2TtDLXV5^f9x7FGpRw5g9@ZLp_HOUbFs zS45J86J8=wPSBBpFbnCI@e#8;F8bpQQ0D=@F9Jr&qfR366(3*e_hc!_Iz9{Uwk01C z=FbV&r$6w?sAzgKZ58OtX4Ba4sb01<#IW}9#Nov`_ey_0xp@7riI20NB&V#$<_tgk zFK3F%x@VaWoYI{w-`{+4Ju_ee2*oGk`Xezo(@y9Z$lG8NP8iqZ#3=%L`Vm3+R!zrO z23;Hu8Vkp#fH&MvVpi_z-HH8guD!&a;n>-%1ydVJp!F)@wc_{ zdbZmM&lv-+YlVFLcDd!FK=A4Fg-`p(mzvMnKYcj7bH41N;3eG7_N>?|+2e$L#ay#9 zD5y)bW5QW_?$+>>$$X#9_nBTqSKakK_Q+vm{@7?wPpfy|&hTJlWCsbN_1k7=esz15 z)Cz8w2Odp^XD{3IjxCke6MC$PvY*ZsMVM)QG>oj#lks%eaQ7}C5yS}DMjmwBNYHBP z9QLW|a-XHweGzpnKwPz^N7nSZ0IY*ex+A(^VT}hFs}n9ARQp($HRf8WZ#UmD!E)e} z#lOTxIz76^P@JpL9o9)Gf0rlK$^Y~tjVfLvK!66UV`B?>Gm{~uAf zA-F8vJ_)AU0?x#?TKkI|QJhzdUZ zc$Rj$RnN?{d3nCk=J0*X)0R(fQXeZ087tgYed#vKg4?DU@>Iluxd|b4u#DozN6I(_ zw4q;wL54WNGcu8fgW$tL8j5A0!qS-R(*br&gGd|=^@^D0=i}wnaJsy;_KDMQ-u(A+XfgSeh?l=aDxX3Fyu>x>FK3qV#gUYFS zl*7{W#*$5J3N9Qx!-_R-Jj?fqRosN@mVQU8%`o6QetZ#sF|JgDQ+ zsU4E3!Zf=N z4;3HHPQB8unDKfQrLCxRg|Y)|XX-kqUGgsa4O^*dhRbAYw5i|nVQs1253pAz*b53C zf|U9`?vlyrg2y;AUhmm4XyqPnt*&-cL;>Z?NeijwyWh;lc57P7yo>J~rHgfALR`G! zlQESkM6#*k`fmN&3$Ve|-JoZpo9#3D74q}{`X#JuYdLz2ySRxnPi3Gax{|Og_N?(lT?70x{Dj+ zA{D8v5pM77LaH0fht=i+#I60XsEE4)h()ONh04qOaKDsg!tV)dP-1R%{`O}bmz~dE zWc8{B6ZMBt7Izt+lElj1z_L*L&#!K3LE`I_ta;mVMVEbW>WU$vL%DB zj=HL$^alpZ?^n|>cR@fy^~0rOy1>)y6SwdFQ@Eb2Z1b!m<)NV6?Pb-seOa5Hw!zP{ zYD!!zja0ffkN%Sq(+d2#F>zwdCc3e3OL*xE-M(Ha~t zWK-J866IzZ$#oLi?h{&U)4&SplM|YelIJtrgPS_gwnN?|b91SOhM73F`f56x1wU{B`}17uJo6G)YgInKayywWAXgGeg13Ny^VQVrjcP3PrG+x z7Zq?$Hld`|BYchsE~k87do2!bfLlJclp4~X>f}=9XAZv^p88&OclSL1)%dtlhltmBM(a0q@F0xLKviU^}mco&txs#Q|3 z*cIdG=c(9o@h#|a^fUQuffpMe<@1shT&iBFjxJ>|tY_5}Y0DA!afZolVJ~~WTIUdh zKAi*%p-XTB6?&XcL?3lK=n9DMg=v^QH&^NazA#pZi|7#aGR#NGxdVGTN(WvQA7Xig z6F;r9fadJCFi>bvaRRu2FXmbCs8Hagl7I96&S8gj&ibT{|M|N(#Ph_AmT3PDeZ<;p zr^?OEI6nkJ7m^m|UzCYT@$Gb9T%3~vVC|c0W;l#w+6T)g z;Q(LOq$kv5ws+EBp#*aprG!E{>`5ZXHd`)iN_9BUVM3R)6(Pp*N2YwXFscF4zL~bJ z$Lr5mZCWnQ&VJcU-R|04DYBTfDjZZEyX22$)MLwJRDo8jr=I=;>Wh6^NV%PYu&-iIp#}lsr16Cp^)sCz0 ze_bA{Ut7y^Dhl-DhkDajorD(jL{vGx?7yX3Y6vs&&eE9Wh3unmv{cre5ks*q_K(wF zR~ucrkMbp$zhav(6O~+XcA}Hv9oksX%_@_$uVCHE2T-8wgj>1jk#4+2oG3hskw-18 z4%NUsrafhf5~DSzu_vJDD0ra&3)ENt!GXF<&l2NzP-W@=kFNLrr}~fI$IrsS!NI{H zbgW~>IgYGU$6m+YB8Ov-vXZopy$;!1*(;TiqNu~M9kQcTc9BY?E#Fh`dcEI2e7^sI z@AvEK)2l3vp`^%Tl^boD`2~|=`uSLrnfha7RZ5A}?idLJ4rmQV(%c=u ziZV-;H%@XaPe#mIQK`qj_`!!j{ii^ct1VU@MTOB!*OE10yi5EDEF2!m0;_4MAmu60 zh{nWQhLsLyL_Fl?iCO)64Spp?{S^})DEqgk4(@-yb}(^CPs9?kHFZaYlS$q*x!n>a z$8A+D1psFwN+u~uW93!P#kQwg^_UM8vTDgm#>iV8=+0uUa#+yLuqO%f2*9}23XD_G~i#A zYr>{)Assh$D2Q8jms;`=BMs9WpMsMUmcA*+P+(l9(v9VV*F!H=4(gOaONdP4_io^y!?61k5%{M5V{ANgAJ@!ohf*31~}0boDf zRGBOown@rD_)>j6k|TX0JKY~B`Z`9qdk{R7EJ==9M8_5qQv4Ni&AT)s1n|^I%RBpq zHCcPz_CfiPB?JAj9>3)RI-dh5{+N-JiyHuE-Lup5X&3kOMWIJG$Ds=Wx>^I!_BUFF z73WHEysdUsMZTB@<%4YDhRVb#!ubNJ9|$vpa8A^1q&msjQn_6;|z3ralFyA zxRLmCNwTrSn57hAs?-{dO8Sk^8s}aUj^T_&ApTPdml@A;8#n(U1OOSzqAMX_ZKi0U zJ{S5J4D+%5)(I+=oUn7mygwUKCnyS4kl(j}HI%SP3g;O*wa&mAAzCKvGFbhNA3wK4 z;zQr^aU~ekvC7<)-q$zG7A+%5Y@FPy{;raJ;8T9SC8t3o%62-9t+9d4b))6>!;a>M z1x3|1Dw|XFM(Fbd$9_yNJtKCJ<~s|s8&K%;O(010!D*5XqhLXWp}R+@x&)F6bB!SN zgnNa1E7)5>@9>rH9wAumEvX11QLNND2Cm+ewCIiadwtaSA4usf*()Wx5U^U z?VBUz(lA1s_(fS&aRqLJyqej5V=%qmR3px3p!_`fLO&s1DaVMrP+738E+0L2j<0O* zcIy%MtO5xQEo&vNnDEZKF4W#{xukEwv#}b9ziPfTAM8K9`E;Kzu*RUR{)YF9{k)lm z>auFp&9Ng#UDgn6D^e3Xxbx;X*2SwBbyx;Z2~zJ`M>*-3AS^~U4iH&zADSEsJ&8O@ z!8fV=aZ}jk{G!cRQ&hpRCRL;hftk$wq%0-^C|ac+V-!dX zUV;ZYsuD5Ujxs`{iEC_l0o=6S1gVhFOUkhS~8L?S9( zLLp7Uu8(RdM^y-?lcnG=>Jw$h&$(b)vZH69qwPXZ+@I&tvP#O z|M(Y-hglS@b=N#ZpWpC0N*)e46UHU{YP|RAyFJr`@0aggod5B(`murGx^UxFLwl7hP**^mMvLxEt?2J$rCL`&WZG zBk$+ntxsdq9pfhhxjz!$J}kR)TIKbZ8&6u3B#+`X%O0EFfBntmP^Y%EW-~apDdQb0le$-v9LTj;k93lwqT5SVO)7~Y;Uv-)c>P5u?&So z3r27u;k?KsL~L9+b$eiZ3`l4pitlPf8tN>q6rKQ-InzTBZLgS@`#NzQw(lqu0)K@}~94gT!y; zS`xbIuEPho!LI|8gJU9Jq$_J-J0rLdMFUF}R&9kO3Q4^I0DxvqXW_L)V&(XD!(kdI zjz(<*{N|G(*+t;ml7g>I6Tj`9qxjB^l#sO=}4zpLCd=U$EK2=AjMz~3r|)L^Wf z-n~TrtG0W0Of=`#I=?0*@V)T2k?nCsnDhAFK4w|5(5ZAaI>e>04gqg0wl`}XpQCH!2&!bZvhu0 zYF>>(i#ZgyVeBPE@}PB{scBfeV&jl=^^GtdXVJV%9qG>t(zw}99~|u06_0#5GZEo* z+`IR>^g`W35k4VmHRV9(=epgq8TGaKAI0yUygO&AFc5I+>cfYlC_Bm8fKo+f?5Xv|D;m@EE8=ulyyq(zX`KMomi13=_5 zRA^xV0SfBlWiyEppWwHIfdqj_R|Pl|;cl&I#7R(>4v$q5UcvQ-&YR^ss6}CZ2(^{1 zSLM^R!<6_&4k5XP`Z{Lu%apXKg<`&lY-W*PDNgS(#&$`(X6D|ePt~2%gHi7jp1psL zt9bLm=&`FDtn129l)s(dEwpp?13N)haHg)*H%03pP-BJSD{B2+f{P{J!`geOarQfbIq4te)wAf z`Gl5qordlrCVAC?Bphe9-F_=cn!xr;C9|=& zZ$&19E|-e^AEofQ%9Am`OZivj1SOwHa)tRYD5b*S5d^!qKE3Xk2l|qRm1sJc32d^@{l7}5v1j%MeUm<}jPv}<)8%{~} zW{T0NKv?(orJg3tOw*taOMEPOtxgXZp8#d~~LBTJ^BS4AKFmK&-8Tnl$ zU?dJchHrXFMbQk9qYHp;EVM_=r59UAEgPqjn>_uY7!DOgj#0NeY9s@K;>R@FDP;ae zXohpIN5z!4bAtMpL;Qldiso;cll~%9_ZNR z*m+oRZY4!|%k#a#u{cWk1zR6SAJgsQ&x-ksjgf~XFj;BwRu~gWtiG{_an`r{edg-OjF4t>5rJ7Z1#sWs9*X|e*^m-of0(cIbkUyK%2DLcbEn%<9nv>76#a(zw_PBA|=fdhG*?XkG8sFoRM8`Mo)L%h$n1HX_#BFP0K@w3A z=8anxhfrJvIV6A_0vrTIacz9NW_PT!|AfTSl_?R-Y;an6DWrNaqhA>Q=?l|^B)>ER z2P08>^=NW>MwQ}oai8rOM}84AeE-dgqbCpL+YAfn`5(s(_C8WvtZ;Fjt`W0&NY;xVbt7{B&fVAz8QN0S-H#ll;n!u;O%o0IxtFaXShO+QB_??@0H6qk z=BpcgI8FZpMxD6iMe4r}^SGt9NqG{7UF^O_>$m1Bkf|UmTgpDPh#{kVspE^hP-d9A zf@Qy!ewCh?{%NG&8=|aE+5^@%-?Qbf)uRpaIW$y@O71CZLjOdpeN5lm!w&x+4k0tX zq0KkA85QmiLXBG=Wbf`NIhS-<*ymgS3~R2a8Z2rke>iNRHNTa;2HE>Esd?{q%ha{` zKBXT_Ij5=H;hhJ5&wh+OJ^AQZ!HUcM1M>r$U$0>&xeqdi-AO$GAVuF-KhHXN`gZjA zb!50VBfOVpiN0GNzA?UKp&o@QB!DN7hps7-vOt4Hk2n34+{=`$5lWHh)(I85j zy{f9lv&pP{OTeIC#vH4&_172ud~<15;MaIc`$VgLKRE%($+ z@w{=z%6c;^gW!&97dx8)&=i}TTOCO^_0Ea7ybF7+<}of5zVl@&`@@}IgAdzoJIptn z{k%|xY?Ksjj>si2YE|ICT1o%*rGW<}Gm~GZ(ZY`PeD*LSP1rGzE~Ju$rB#w$H63{j z86zUNPKb_mpOB$r2m{=nWhw~+f+uy1q?SvLNOcEDW^jG(vw6wt0YBsxo&41AO*A4x zGE@gBc>(^};<>q^hRW{^UwunDwd$?$?E|V_6LAo~6@Q*UU1dFSl51 zg+&l9p!ZX5 z(257v8Hl6#z9sN=Lq^nvVUl`;o;nXYo6cbOv^f2+_99gVqaPDVbwtvcwH;{y z2U<)9HBy;tA?MpQCXb$~1VluH4nRCu#>i4kI|-k!?h;&iNmynYQ0BFCIt3x7%4r|{ z8=;@+dyQU94bp_iD%8m4My+(ZTyykwH^u$E=lCq6+pav*b|!t9|`eOh*95`JA0 zEwmc!A?8R9mlR-&2hi;ljy$`s{8gF%LxSXd@ee)C^6Q2nZ%ZnjbpR1T&uL;)3@Sh5N|D)>o$c*|GhpMQ9k@ptYukh1ozb zpE)$9pIxvY$<)t^Km%f!3ktoZqP;mX6B`n|)AcN4s-=3Qy@mLBn0;jcVj$z?{cK%v zZh*%bj_2z+VMQbBj2wi<=&=go!qaWVy>Is z@64x|LJM^r!Y{COc;s-W+ToO4XE)~d>%4>bUkJE{*{S@fd4*G;)RHJsDk=}DNu6b@^amsVOQ%wXei{BjD=iFO5GL-tj^Pf@>D7_(PzGd<6d+1C=|54w=7jA|* zKQud2*fnzRom>BPqELsAk}oNjdyXzUk&M5LeC;xu8E#_q_Wl?9sjDr%dC$7C(ueZz zi|2x%`j|N_WbbWYytm-+OmcUJ;9b+g+3L)qfsb_#nMrl!sd(0UyjV8GDo(0w{0a%K z=>vKuY>gB*5)wxv-^&%`N!J;vIz6+^+dSnr@iH5=gZrwS%!Am-K*7X8uFyzr8B}dnI!v*9C~$ z$+@A)U6yBked|cK!cROTi3>T?37$NKml9BXg{VL;%a058BbR!lBpk@}XZ%>qpph_{ z$Ga{L(d z#BSDTK>bZIjjV1<%tb5!j#cqcBLcuMvgvFa*)nf<`P=1OGhGt}jJcVY2 zz5}1EouhC=lgO|7@M2v2#$k>l;4@k4Rd?Wr0H&he`3jf4Zh>@R-Jw1$M^6I=tcO`) zwJn`h$A6svuw;wZfv1Z<8$6sjY6Gu57smS5b*OdE%~e)u=0mGg>Yv+}PtIHrW z@`T)ph2&e^#(hFypo?5il1ZMbpe;_(GmC}iH$tD&_xu>{a>@J|f0cs3XsnF+)}4PG zlET4Ezj-*p=5tS#BtOgV)^K{)WwHN5tQ(H%m|L0y`e!?z4%JuPtb)n}) zvsa%_xqUzR@?Aq3e$ic+ACQsoW`J2T+xtNudf7PvUXkd;*Y6=?2x{stVe`fa_P4Y2 zUt}eh(WyCc~u}OU}*lA}S zW@beCqd*~VLq>kY6_xMv5h4>ALW(XA-qEDt6bZD)mt%Zbj+3}or89v&J14g#)ssg{ zigm{eQ+Fb&UxnsSx<(rQCiKefFeelXH;`C!;s!|(Lr z`<v(`_qIgl{+aqd^U$r*^Mo!N) z`b$ft&Za$9YRr9pWw-o}QoZ*v(URikFB>GvKQHy17}**eb%Oq-@cG{ z`_KS$lfa2| zjxmAxV@G>kRDgt@)mD%Y{ko2tNq9M$Sdm%J@Q9j-j&7h6$<*;6)(xFoZ-6#&`21v0 z6@;88nUTJ#yr2vEFhaOHt)QF4p8=N^P5w}t(8F}CxVLE4_Dus_^UcQY%|=W5YVGL5 zS592#ZPTn@=DO+0wQ4%meReu_D_rT#{;SJ-^^NBZT6J2GgrztmX6qOpW5-nqHX!qV zZRmf)hZqHqoU`kDh?iZS_k0Y_eQ5WRAul>JTcse(o<oeMHqu2F}oZ?tuQ9s ziBiUbV=G5|EFN!ZIY&h0z)|r@C3{I*c{=4Lye%`0lW9rJl2Bz@Y(b@RNEQ<2U2= zqF7d)ZHxDC1Ns_OSh?Yg?k>}}Ds0SOPr36-ZQy!jpy1Q|!C!3~!!6e>>_7kf zh2Qjy5P9|Xi|*X6P-)QRcRw%xnkBs)JFbudUUDGO$oIaw_wG~uZktll)QBhi zPaERgdx;s!en8OqixA)9eHrt2^8eb9r<`*S<|sz_1Q!oy%H#VK9F>0 zSlRh{fqLuSe&f*7p%VRcb&fa%^g!uI1P|0LrVJe6y4aJr^sr(5eOI~V+~TQb_n%3# z#hnZGKVOCx7UiO)tOF4DB|;iMJc)41xt(=NLzX#so!QO?QErzjeZ4pAZ0kk4smd#l zYP=idE1guIrJA~asOEBbsG2m_^U-b8vaX1rje@0h!6;AP60o780A-GFzcJ{`H25|} zMsAd?lH#vKNY#Q#vJirqDS~nw8_a}AQG%F4nxGJY$n4e%Wvu_}ZD*=h=?wOj%M%?h zh>k? zK1uKE>paz>9{2&Kd6~VTn#*kqkuD<#$ROIql3&M<9UQzCkr>(xn6EZIMp-pH5xkq* zuHRN4?3)H)CPq|wH}Qx0!#u}1{f!s>jQ!7>5q;Wpd^DYX%qBsq6g_z|Z6nz$(t`)) zG^)fxQR0F<1kj~;2v%HlI13&tG*S=;N<$laphd(8X2-Ig;P!Qu9H zH7|sQEKex*b$+|=M;ah3NLkg}}J+CR#eFaEZW z`SUFIsokXGI-j?a>x*zvDWrBt-3RMR^(AoGEW*pnx@1Q7yVaqZyOXmW??)bwoObn{ zk-i#oC^?NAeMc1A-!GohGd6EUlLM`&8D*=aFy6W=(c==Hcv6=LFZ&G|n|`Y$6pUrk zh4+W4`W|(V;KU!lAFH9meF$)C6hftuGel+1z#qtPM*E``)H{Iq(O}055?;nEyqt)P zvUVcDY~PDhIC|Fb{>E*BQ_}NkvQP{NdXy!$X)PthJ-Ym}W4}?NZRVtcm6U{c7on13 z)TU`$C@!~`QjlI|d%5c1g!a)5=dXib-&Q~T_4-3poNu;A_-zXjJ(^C#VCM@Nf+n!~ z+Cz-II4bEl0CFp*--fhFPG>e$FCIrUtIg?chmg+38Kx&(E@f4K-4()w4E8L$11u*X zVUkSb7(9?@c1Kkjl}L3bz@JeV|Y*Q6#L zx!by~tSoo9=kt&J)^As@pW34z+%qa%o$aE1Z_Z9w+Z+yDHlI(V|G;t*Gq+tIIX*o)QFxsx9Ue7bL0l=Qk7lspJ<~`C! zIu^96$A!~Kk@#$uZE!<^j{_XYA7-yl5(CAuFvSW0LI9zDVswu=P5>J$7eF_I(3v24 z+Ao;qIJ;#DMq0@UsO4Fq!n%f9F+$%@4rtYs#-jD6uC0@W^4qbU{ZpBEblxXs821yDH@}E*%-nynS zy!4S9=#x^gBOGJq^dlwWOXF=lyMNuSvGl1$-%Nmjn0xS>+0p+mb@#tIuK~bn zb1L6Pqi4n3OIMT6MpF-Wjcl`cc31R5D-Js4H-`(&$OcEpLYSt|OjAferQ$G2NT0;Q zw1VypS*NP^!pWqrxEdp9x{cBK=v+a0uHOj#efUpo14Nqe zbQO$by$+Gsm#BBs$cx#I>17Jv%eJHK_edY@ZH_ucw2f-n!V6taDkab6#z$9h!FBKV zaSy{6^`z;fddJtb{{3wAbGuv!>oa9OOx>eyYPDkrk8$j7u4nh3UJBzoFOS=!?O%Ps z9iDB4F4dBG7ENDI$JJA1JA&AT#(+AzLU>m>uRZzc1g&SL zYp|DRNlZpEdF8o{M7#g6{{W%Ds=8wS(We;08#`)_o5kdKCA|@4!fn_1J&yY$3G02V z(k2HNcB{PdTMGsA-qk+7`rbzN#Pw!ECg&<4GY%CSRb~K-=G7}#Jq>`YWzgC(KV|4EgOCc$=9l~-d`<4`c={VJr>Xn2HpYm2|#y(+`jL<_<7JK zyKO7CxXwb-22*GDo8JgA?z^1-D20Cr!L5o7f{-Eq?z^hEe8ateo^>u4R4lgYA9TKY z5BKXi*X4tU7dtPVJ^1j$=hD6Ys`IV;UtblLravl`{(RLbXhdqOTTDm2}*n9=GqGKn9GhC=6vNIS{iVA2&J+KiEA)56-%E*3$gbD@RF9v;HT{zGLI zaOl99bU_&pVoic0s{?Ma*B5V{d0Hoyn!%jnvBCsIO^Bh^Uar=+lYPrveeS(MIi)&T z4fF3Q@EL4(@Rh0G3r%)yZ-d=S!P>M8=SitVC~w`j?O2LD!jlr+gbLjJ(p`Bo_r%!a z&YdDn=o$W#rb$7CSvm1*?=laDV2!ow1eYP(cK5tiEGVXQ{3ph?mIcUh*!j|AXA#{u zwwLA^OxFWmD%hY4a7_E=rDGm$* z0|5rtfhYjh(uwCXA@7z-K()9ePTvvO2!c%<3h0%c_lJMV>R!%L=t`3vtqICF{HG65 z_CENI6c;OR|EqFqm68^LXQ_Xy99TUFyV^dyX8S&{Ve-ob_xmroCHq79(1{*j);>l( z^>?KSZ=UIj64{@>`J&^&+|q3nRmYfiKlEZr{Ws-a#oQm;JEyO{(t14l;mg>K$3D$3 zLLtd_?R0hZbZsGHY==0{=ZX6XAw1^UJhzs8<#jweZU+S+NsuIuj3R&Aq!7n&4;gjh zuGp*r=ZUl8hPPF`$`e}xJ>6^Ym{J3XBX>Gcj5XZ^ro#Ec)(Nu2qE}Yuv6jgsV~P=h zS>6vhS?n2kWwGJreAeRf<84!yJkT%)Gk`S2W|8cST@p7K>Jz(L+j}U0bh|K3XQrX} z-28*lQn$xK-!3|J1j(8YSxdV(2QEk5tn%VK90}TqZhAYw9#aF7<!yb8V9?qs?tO{KNv*{Rhs0{f%^B6E`^umc zPChOcgl(p@`m~`SB1vAHd(!&I#QN$BnUS-f1NP5ZJUym~ou3$TaE4cDIP0!ygV0-- z&XxgW=Q&Ngq$PyX5FwQlh2u5;;v()jNae%$-Pf@cl`J*cdiZ-S%*P3Pm`r{s2gR_StxS|7}C9hs?D>IuMZ%O zM?7+0g7sYX`%FepoErw7r6<-Fy&;tdjGnDkYshkd8QTqu7_23`JEg>EHJ&BdKuJi@iDm~(&Ip7KTk=Lr8B%R z@r3f+V$lUp)x8O$rA?==XWZmhzxdlMymn8fH;>%EaZB5ZmOX) zGvz?#mhHj5^}|}_nfK{Y#`1QhNhA^bZh=6(p#}i2(%d)}EcqT9D;G-)az*OQ_ z+&`)?H<#^5;!$FFn=oTAucKCv?x>xsxGRgVuko}F>dn*G?L3SF8VO08aO z4OHfpd=WqPdgk>*r|TnUXT}CvMK`f0KIN?SQ9=j_nUO%Jx;!#iEINgE1jR|-aA zhQ}U)?cye<68R-iu&MP=q_7~8V){q--o9>X?>M5rd78?DA3<*|!>Gdvz(5sG!;~yO z7NW2+tO{gKiKZ567Dq>m+pI%%PD{zz%I4i-D;#lN21yVLMgq2ZPX~)^*L4SlHu+LQ zO*wvZ=pF1+pZAkPk&JMi|9O`~?%hy0>wAa%x5{y2Wc)5aD!UR?;v7B2rsqk!t3qd{A*ldZFL_%|s76p19st)tA6aBfQ7eIq zmYkqiaUKl-YKfQQv}#k884DO}WTnqdi_gjdMX88pkcr$#y88;6=ST)%kR#!alR~c0 z%C72&T8E~G;#F5hg8PI2yBC#7{_`6 zcUhtxFbeQ6)}}icKM0srXAm2JpqU#!!Ys>V^9Gk;qJUJCEH`9`9LZMT6bDRnj1}@s z7pyX3O82*ow_br=dPh)GACH;-iHG`;zL$kD;eBAr zXgq&jPKES~CAk9sTRB}QJarf4DWWOw{^c^}oYTCm6R%8?G#e|VM@J5r2D8EfV`#Co z-aZLRc{Hs+pXphOjqKdkVC~VT3%9%GmhZh2Bj_K=-Hh7s+5h6!FjjTUjxFFQ_ecRn zuRVs6{@DNkczB5Ol$o6^y_t*PjsXsS%mpsRvLq+cXMZR@nWR02gxf2 zM@KFX6i59x9>V<3h!p^GP3qRdMaONqw+Q#MlWg4`VFn^(4|fxd1ZM3BAI$X{7}?vs zju{OhGmJ+~n7NF|BsRlrIG8jWA12ll1_Xrx$g-zo#Cfw_YqPnGJ<}Cwa@n==>GTh4 z;zaq|@UhbIb`faGar2+6a-xI5z(0M6@>!EHVtpq6k3+oVr^<|oHT+)=U678g&~{(e z)?GxT%tf4bX<&w3k+^H#3dgh0q{u} zBp{;>BtX?Qrn8|1DMjnvY+}N2vbx985O;%gpH8gSWwDD zZPI{0wLsl5a>^+mRabzC-#FS-@R5y`f^lUBWyTCbQ$b`15B;#to9@9AW|DF3AE{}* ztFQ!Ob)yVo5`;5ES%(4xO)?sjjNj^cVK@a%4Zhu1?DRU*9BpOCL}1O`2bj33g{o?? zvR&EE*FZd zn%PCf>&@29DKtmAG-MRlsZ)!zY1+gt~9_<}h2yh;vHHsVhW^ zWQ+@|N!kkLRb(cM+no^LoP;`v8kszZ@c(T;sXe{6%$5(%+72Dpa*sbgopYQEsNE(cj-kac%T< zK%0aG`r^#v4_6O%_pe^~vH#)mgGCiBQ2~TIlguH3SDj8q$uF_aFDn!-$#`};8Xa<7 zW1JHA3aVsJWR$TKpt#E8kcvp#XsdK;5YjA3BmPinfkc6J;+zzcH<}9I(Pg4g-*8iy zqxDb@l$CD44(!m_j$z^vBn3*t z6fAr{B>hE*xm<|W=q))+h~)8m%Xb+QX?9ca@i@Cp+SOmHr;4hLp3S}qdC~dfv)t@! zwS}-XLU7`F>u{50Pq^86?T7gC^7ARE^AoOgt=LIdhk9y3y|=yRSAwK%VZBF`h-`Es zbM_VFv!Zk0Z%e}c!HPn}Ol%$_Ho+g_6o=ABN&p6fU9UkhOa^8XxEaJduGx)%r39^$rT*}A9JRA zZ3fkN@cjI`_F&%e;6?K0WOeiNi(~JOsQqf3fBp7qf_-S$iKE&pG0Sw=%V?jtHl##U zsTY@|70&hP%hqP?tq>B=YRrR80NWIdXp4P|U>IU1VWzop?2NlC9Y7`L&M{E3ahCY2 zf(16K7=T^@XS9qXj3R^|r_v!XZtV;Z(!fHjhv>rUjb3&nG6UZ($q*_{9c>{(mb>^m zz}G4{(1>GpST)#mQTZ$MNMw_rS@-up30`~Yp9L67;n5O9y!}xM0uH%Bq!wzQ+XM*#Fijib}sG&T}%^)IX%6Zljf zOb>$1R3AdokZhDD1Lf4-Z`c(eCs*%7jHP4`^<#N-EMQqX!xEwn<|s27MyW{XioZfn zIXNenEvg$>a7mV&%WS-#h z+|F)|Um*{*iW|hTTj02|Nhn?1;Tt%VUh9V|Hm+eGC$@S&Qu-PHTYh$AKVPP|K+Nk@ zAlfn}=A~8gA{hf?Vn~dKPSsfG zutdi9fK%=6!!8~sCZ0&T2gB%Pj?J6>tNX_6m9^`UxF#=TCkYQB`628v?67`VOahl^ zzmm+lT#|Pl2Qw?nVww6B3zy0U0N5gu4AC#q5KMr!v z={2rV@JVpeh0(a7cZMggC`Bb)3sYg2DQHO)?w&5trb*u%ZzLuYZkKxVXdcDYK5ShR zev$F+=!(M3fro3?Zd6e7{luRat9G~}?@=y6{rmxdQc6$o;AnJbH@2kD3)+txhlC0y zxfB|e34VDZlt%|;bY~)TgpoXA0DLS2I0cT)cJHBCLymQZF)M;Wrj%{>0nf~WqHREQ z-q<;f7%FEgldBm=Wx-e7{#@3b!H_GJp$qc?A4>=F9;5fHnkGJ+lR_>JKd78QTajg3 z6MrN0gL7}qXE?iFfaf1Vdxsb~h0R8PIV2Zh(lHiUoU?k~X6n?Z<~T%HNXfB>QH


FhOz8Tr5GNAQOpoCki93eN1q-Ewp{u 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 literal 0 HcmV?d00001 diff --git a/whatsapp_addon/Baileys/README.md b/whatsapp_addon/Baileys/README.md new file mode 100644 index 0000000..49939e2 --- /dev/null +++ b/whatsapp_addon/Baileys/README.md @@ -0,0 +1,887 @@ +# Baileys - Typescript/Javascript WhatsApp Web API + + Baileys does not require Selenium or any other browser to be interface with WhatsApp Web, it does so directly using a **WebSocket**. Not running Selenium or Chromimum saves you like **half a gig** of ram :/ + + Baileys supports interacting with the multi-device & web versions of WhatsApp. + + Thank you to [@pokearaujo](https://github.com/pokearaujo/multidevice) for writing his observations on the workings of WhatsApp Multi-Device. Also, thank you to [@Sigalor](https://github.com/sigalor/whatsapp-web-reveng) for writing his observations on the workings of WhatsApp Web and thanks to [@Rhymen](https://github.com/Rhymen/go-whatsapp/) for the __go__ implementation. + + Baileys is type-safe, extensible and simple to use. If you require more functionality than provided, it's super easy to write an extension. More on this [here](#WritingCustomFunctionality). + + If you're interested in building a WhatsApp bot, you may wanna check out [WhatsAppInfoBot](https://github.com/adiwajshing/WhatsappInfoBot) and an actual bot built with it, [Messcat](https://github.com/ashokatechmin/Messcat). + + **Read the docs [here](https://adiwajshing.github.io/Baileys)** + **Join the Discord [here](https://discord.gg/WeJM5FP9GG)** + +## Example + +Do check out & run [example.ts](https://github.com/adiwajshing/Baileys/blob/master/Example/example.ts) to see an example usage of the library. +The script covers most common use cases. +To run the example script, download or clone the repo and then type the following in a terminal: +1. ``` cd path/to/Baileys ``` +2. ``` yarn ``` +3. ``` yarn example ``` + +## Install + +Use the stable version: +``` +yarn add @adiwajshing/baileys +``` + +Use the edge version (no guarantee of stability, but latest fixes + features) +``` +yarn add github:adiwajshing/baileys +``` + +Then import your code using: +``` ts +import makeWASocket from '@adiwajshing/baileys' +``` + +## Unit Tests + +TODO + +## Connecting + +``` ts +import makeWASocket, { DisconnectReason } from '@adiwajshing/baileys' +import { Boom } from '@hapi/boom' + +async function connectToWhatsApp () { + const sock = makeWASocket({ + // can provide additional config here + printQRInTerminal: true + }) + sock.ev.on('connection.update', (update) => { + const { connection, lastDisconnect } = update + if(connection === 'close') { + const shouldReconnect = (lastDisconnect.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut + console.log('connection closed due to ', lastDisconnect.error, ', reconnecting ', shouldReconnect) + // reconnect if not logged out + if(shouldReconnect) { + connectToWhatsApp() + } + } else if(connection === 'open') { + console.log('opened connection') + } + }) + sock.ev.on('messages.upsert', m => { + console.log(JSON.stringify(m, undefined, 2)) + + console.log('replying to', m.messages[0].key.remoteJid) + await sock.sendMessage(m.messages[0].key.remoteJid!, { text: 'Hello there!' }) + }) +} +// run in main file +connectToWhatsApp() +``` + +If the connection is successful, you will see a QR code printed on your terminal screen, scan it with WhatsApp on your phone and you'll be logged in! + +**Note:** install `qrcode-terminal` using `yarn add qrcode-terminal` to auto-print the QR to the terminal. + +**Note:** the code to support the legacy version of WA Web (pre multi-device) has been removed in v5. Only the standard multi-device connection is now supported. This is done as WA seems to have completely dropped support for the legacy version. + +## Configuring the Connection + +You can configure the connection by passing a `SocketConfig` object. + +The entire `SocketConfig` structure is mentioned here with default values: +``` ts +type SocketConfig = { + /** the WS url to connect to WA */ + waWebSocketUrl: string | URL + /** Fails the connection if the socket times out in this interval */ + connectTimeoutMs: number + /** Default timeout for queries, undefined for no timeout */ + defaultQueryTimeoutMs: number | undefined + /** ping-pong interval for WS connection */ + keepAliveIntervalMs: number + /** proxy agent */ + agent?: Agent + /** pino logger */ + logger: Logger + /** version to connect with */ + version: WAVersion + /** override browser config */ + browser: WABrowserDescription + /** agent used for fetch requests -- uploading/downloading media */ + fetchAgent?: Agent + /** should the QR be printed in the terminal */ + printQRInTerminal: boolean + /** should events be emitted for actions done by this socket connection */ + emitOwnEvents: boolean + /** provide a cache to store media, so does not have to be re-uploaded */ + mediaCache?: NodeCache + /** custom upload hosts to upload media to */ + customUploadHosts: MediaConnInfo['hosts'] + /** time to wait between sending new retry requests */ + retryRequestDelayMs: number + /** time to wait for the generation of the next QR in ms */ + qrTimeout?: number; + /** provide an auth state object to maintain the auth state */ + auth: AuthenticationState + /** manage history processing with this control; by default will sync up everything */ + shouldSyncHistoryMessage: (msg: proto.Message.IHistorySyncNotification) => boolean + /** transaction capability options for SignalKeyStore */ + transactionOpts: TransactionCapabilityOptions + /** provide a cache to store a user's device list */ + userDevicesCache?: NodeCache + /** marks the client as online whenever the socket successfully connects */ + markOnlineOnConnect: boolean + /** + * map to store the retry counts for failed messages; + * used to determine whether to retry a message or not */ + msgRetryCounterMap?: MessageRetryMap + /** width for link preview images */ + linkPreviewImageThumbnailWidth: number + /** Should Baileys ask the phone for full history, will be received async */ + syncFullHistory: boolean + /** Should baileys fire init queries automatically, default true */ + fireInitQueries: boolean + /** + * generate a high quality link preview, + * entails uploading the jpegThumbnail to WA + * */ + generateHighQualityLinkPreview: boolean + + /** options for axios */ + options: AxiosRequestConfig + /** + * fetch a message from your store + * implement this so that messages failed to send (solves the "this message can take a while" issue) can be retried + * */ + getMessage: (key: proto.IMessageKey) => Promise +} +``` + +### Emulating the Desktop app instead of the web + +1. Baileys, by default, emulates a chrome web session +2. If you'd like to emulate a desktop connection (and receive more message history), add this to your Socket config: + ``` ts + const conn = makeWASocket({ + ...otherOpts, + // can use Windows, Ubuntu here too + browser: Browsers.macOS('Desktop'), + syncFullHistory: true + }) + ``` + +## Saving & Restoring Sessions + +You obviously don't want to keep scanning the QR code every time you want to connect. + +So, you can load the credentials to log back in: +``` ts +import makeWASocket, { BufferJSON, useMultiFileAuthState } from '@adiwajshing/baileys' +import * as fs from 'fs' + +// utility function to help save the auth state in a single folder +// this function serves as a good guide to help write auth & key states for SQL/no-SQL databases, which I would recommend in any production grade system +const { state, saveCreds } = await useMultiFileAuthState('auth_info_baileys') +// will use the given state to connect +// so if valid credentials are available -- it'll connect without QR +const conn = makeWASocket({ auth: state }) +// this will be called as soon as the credentials are updated +conn.ev.on ('creds.update', saveCreds) +``` + +**Note:** When a message is received/sent, due to signal sessions needing updating, the auth keys (`authState.keys`) will update. Whenever that happens, you must save the updated keys (`authState.keys.set()` is called). Not doing so will prevent your messages from reaching the recipient & cause other unexpected consequences. The `useMultiFileAuthState` function automatically takes care of that, but for any other serious implementation -- you will need to be very careful with the key state management. + +## Listening to Connection Updates + +Baileys now fires the `connection.update` event to let you know something has updated in the connection. This data has the following structure: +``` ts +type ConnectionState = { + /** connection is now open, connecting or closed */ + connection: WAConnectionState + /** the error that caused the connection to close */ + lastDisconnect?: { + error: Error + date: Date + } + /** is this a new login */ + isNewLogin?: boolean + /** the current QR code */ + qr?: string + /** has the device received all pending notifications while it was offline */ + receivedPendingNotifications?: boolean +} +``` + +**Note:** this also offers any updates to the QR + +## Handling Events + +Baileys uses the EventEmitter syntax for events. +They're all nicely typed up, so you shouldn't have any issues with an Intellisense editor like VS Code. + +The events are typed as mentioned here: + +``` ts + +export type BaileysEventMap = { + /** connection state has been updated -- WS closed, opened, connecting etc. */ + 'connection.update': Partial + /** credentials updated -- some metadata, keys or something */ + 'creds.update': Partial + /** history sync, everything is reverse chronologically sorted */ + 'messaging-history.set': { + chats: Chat[] + contacts: Contact[] + messages: WAMessage[] + isLatest: boolean + } + /** upsert chats */ + 'chats.upsert': Chat[] + /** update the given chats */ + 'chats.update': Partial[] + /** delete chats with given ID */ + 'chats.delete': string[] + /** presence of contact in a chat updated */ + 'presence.update': { id: string, presences: { [participant: string]: PresenceData } } + + 'contacts.upsert': Contact[] + 'contacts.update': Partial[] + + 'messages.delete': { keys: WAMessageKey[] } | { jid: string, all: true } + 'messages.update': WAMessageUpdate[] + 'messages.media-update': { key: WAMessageKey, media?: { ciphertext: Uint8Array, iv: Uint8Array }, error?: Boom }[] + /** + * add/update the given messages. If they were received while the connection was online, + * the update will have type: "notify" + * */ + 'messages.upsert': { messages: WAMessage[], type: MessageUpsertType } + /** message was reacted to. If reaction was removed -- then "reaction.text" will be falsey */ + 'messages.reaction': { key: WAMessageKey, reaction: proto.IReaction }[] + + 'message-receipt.update': MessageUserReceiptUpdate[] + + 'groups.upsert': GroupMetadata[] + 'groups.update': Partial[] + /** apply an action to participants in a group */ + 'group-participants.update': { id: string, participants: string[], action: ParticipantAction } + + 'blocklist.set': { blocklist: string[] } + 'blocklist.update': { blocklist: string[], type: 'add' | 'remove' } + /** Receive an update on a call, including when the call was received, rejected, accepted */ + 'call': WACallEvent[] +} +``` + +You can listen to these events like this: +``` ts + +const sock = makeWASocket() +sock.ev.on('messages.upsert', ({ messages }) => { + console.log('got messages', messages) +}) + +``` + +## Implementing a Data Store + +Baileys does not come with a defacto storage for chats, contacts, or messages. However, a simple in-memory implementation has been provided. The store listens for chat updates, new messages, message updates, etc., to always have an up-to-date version of the data. + +It can be used as follows: + +``` ts +import makeWASocket, { makeInMemoryStore } from '@adiwajshing/baileys' +// the store maintains the data of the WA connection in memory +// can be written out to a file & read from it +const store = makeInMemoryStore({ }) +// can be read from a file +store.readFromFile('./baileys_store.json') +// saves the state to a file every 10s +setInterval(() => { + store.writeToFile('./baileys_store.json') +}, 10_000) + +const sock = makeWASocket({ }) +// will listen from this socket +// the store can listen from a new socket once the current socket outlives its lifetime +store.bind(sock.ev) + +sock.ev.on('chats.set', () => { + // can use "store.chats" however you want, even after the socket dies out + // "chats" => a KeyedDB instance + console.log('got chats', store.chats.all()) +}) + +sock.ev.on('contacts.set', () => { + console.log('got contacts', Object.values(store.contacts)) +}) + +``` + +The store also provides some simple functions such as `loadMessages` that utilize the store to speed up data retrieval. + +**Note:** I highly recommend building your own data store especially for MD connections, as storing someone's entire chat history in memory is a terrible waste of RAM. + +## Sending Messages + +**Send all types of messages with a single function:** + +### Non-Media Messages + +``` ts +import { MessageType, MessageOptions, Mimetype } from '@adiwajshing/baileys' + +const id = 'abcd@s.whatsapp.net' // the WhatsApp ID +// send a simple text! +const sentMsg = await sock.sendMessage(id, { text: 'oh hello there' }) +// send a reply messagge +const sentMsg = await sock.sendMessage(id, { text: 'oh hello there' }, { quoted: message }) +// send a mentions message +const sentMsg = await sock.sendMessage(id, { text: '@12345678901', mentions: ['12345678901@s.whatsapp.net'] }) +// send a location! +const sentMsg = await sock.sendMessage( + id, + { location: { degreesLatitude: 24.121231, degreesLongitude: 55.1121221 } } +) +// send a contact! +const vcard = 'BEGIN:VCARD\n' // metadata of the contact card + + 'VERSION:3.0\n' + + 'FN:Jeff Singh\n' // full name + + 'ORG:Ashoka Uni;\n' // the organization of the contact + + 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n' // WhatsApp ID + phone number + + 'END:VCARD' +const sentMsg = await sock.sendMessage( + id, + { + contacts: { + displayName: 'Jeff', + contacts: [{ vcard }] + } + } +) + +// send a buttons message! +const buttons = [ + {buttonId: 'id1', buttonText: {displayText: 'Button 1'}, type: 1}, + {buttonId: 'id2', buttonText: {displayText: 'Button 2'}, type: 1}, + {buttonId: 'id3', buttonText: {displayText: 'Button 3'}, type: 1} +] + +const buttonMessage = { + text: "Hi it's button message", + footer: 'Hello World', + buttons: buttons, + headerType: 1 +} + +const sendMsg = await sock.sendMessage(id, buttonMessage) + +//send a template message! +const templateButtons = [ + {index: 1, urlButton: {displayText: '⭐ Star Baileys on GitHub!', url: 'https://github.com/adiwajshing/Baileys'}}, + {index: 2, callButton: {displayText: 'Call me!', phoneNumber: '+1 (234) 5678-901'}}, + {index: 3, quickReplyButton: {displayText: 'This is a reply, just like normal buttons!', id: 'id-like-buttons-message'}}, +] + +const templateMessage = { + text: "Hi it's a template message", + footer: 'Hello World', + templateButtons: templateButtons +} + +const sendMsg = await sock.sendMessage(id, templateMessage) + +// send a list message! +const sections = [ + { + title: "Section 1", + rows: [ + {title: "Option 1", rowId: "option1"}, + {title: "Option 2", rowId: "option2", description: "This is a description"} + ] + }, + { + title: "Section 2", + rows: [ + {title: "Option 3", rowId: "option3"}, + {title: "Option 4", rowId: "option4", description: "This is a description V2"} + ] + }, +] + +const listMessage = { + text: "This is a list", + footer: "nice footer, link: https://google.com", + title: "Amazing boldfaced list title", + buttonText: "Required, text on the button to view the list", + sections +} + +const sendMsg = await sock.sendMessage(id, listMessage) + +const reactionMessage = { + react: { + text: "💖", // use an empty string to remove the reaction + key: message.key + } +} + +const sendMsg = await sock.sendMessage(id, reactionMessage) +``` + +### Sending messages with link previews + +1. By default, WA MD does not have link generation when sent from the web +2. Baileys has a function to generate the content for these link previews +3. To enable this function's usage, add `link-preview-js` as a dependency to your project with `yarn add link-preview-js` +4. Send a link: +``` ts +// send a link +const sentMsg = await sock.sendMessage(id, { text: 'Hi, this was sent using https://github.com/adiwajshing/baileys' }) +``` + +### Media Messages + +Sending media (video, stickers, images) is easier & more efficient than ever. +- You can specify a buffer, a local url or even a remote url. +- When specifying a media url, Baileys never loads the entire buffer into memory; it even encrypts the media as a readable stream. + +``` ts +import { MessageType, MessageOptions, Mimetype } from '@adiwajshing/baileys' +// Sending gifs +await sock.sendMessage( + id, + { + video: fs.readFileSync("Media/ma_gif.mp4"), + caption: "hello!", + gifPlayback: true + } +) + +await sock.sendMessage( + id, + { + video: "./Media/ma_gif.mp4", + caption: "hello!", + gifPlayback: true + } +) + +// send an audio file +await sock.sendMessage( + id, + { audio: { url: "./Media/audio.mp3" }, mimetype: 'audio/mp4' } + { url: "Media/audio.mp3" }, // can send mp3, mp4, & ogg +) + +// send a buttons message with image header! +const buttons = [ + {buttonId: 'id1', buttonText: {displayText: 'Button 1'}, type: 1}, + {buttonId: 'id2', buttonText: {displayText: 'Button 2'}, type: 1}, + {buttonId: 'id3', buttonText: {displayText: 'Button 3'}, type: 1} +] + +const buttonMessage = { + image: {url: 'https://example.com/image.jpeg'}, + caption: "Hi it's button message", + footer: 'Hello World', + buttons: buttons, + headerType: 4 +} + +const sendMsg = await sock.sendMessage(id, buttonMessage) + +//send a template message with an image **attached**! +const templateButtons = [ + {index: 1, urlButton: {displayText: '⭐ Star Baileys on GitHub!', url: 'https://github.com/adiwajshing/Baileys'}}, + {index: 2, callButton: {displayText: 'Call me!', phoneNumber: '+1 (234) 5678-901'}}, + {index: 3, quickReplyButton: {displayText: 'This is a reply, just like normal buttons!', id: 'id-like-buttons-message'}}, +] + +const buttonMessage = { + text: "Hi it's a template message", + footer: 'Hello World', + templateButtons: templateButtons, + image: {url: 'https://example.com/image.jpeg'} +} + +const sendMsg = await sock.sendMessage(id, templateMessage) +``` + +### Notes + +- `id` is the WhatsApp ID of the person or group you're sending the message to. + - It must be in the format ```[country code][phone number]@s.whatsapp.net``` + - Example for people: ```+19999999999@s.whatsapp.net```. + - For groups, it must be in the format ``` 123456789-123345@g.us ```. + - For broadcast lists, it's `[timestamp of creation]@broadcast`. + - For stories, the ID is `status@broadcast`. +- For media messages, the thumbnail can be generated automatically for images & stickers provided you add `jimp` or `sharp` as a dependency in your project using `yarn add jimp` or `yarn add sharp`. Thumbnails for videos can also be generated automatically, though, you need to have `ffmpeg` installed on your system. +- **MiscGenerationOptions**: some extra info about the message. It can have the following __optional__ values: + ``` ts + const info: MessageOptions = { + quoted: quotedMessage, // the message you want to quote + contextInfo: { forwardingScore: 2, isForwarded: true }, // some random context info (can show a forwarded message with this too) + timestamp: Date(), // optional, if you want to manually set the timestamp of the message + caption: "hello there!", // (for media messages) the caption to send with the media (cannot be sent with stickers though) + jpegThumbnail: "23GD#4/==", /* (for location & media messages) has to be a base 64 encoded JPEG if you want to send a custom thumb, + or set to null if you don't want to send a thumbnail. + Do not enter this field if you want to automatically generate a thumb + */ + mimetype: Mimetype.pdf, /* (for media messages) specify the type of media (optional for all media types except documents), + import {Mimetype} from '@adiwajshing/baileys' + */ + fileName: 'somefile.pdf', // (for media messages) file name for the media + /* will send audio messages as voice notes, if set to true */ + ptt: true, + /** Should it send as a disappearing messages. + * By default 'chat' -- which follows the setting of the chat */ + ephemeralExpiration: WA_DEFAULT_EPHEMERAL + } + ``` +## Forwarding Messages + +``` ts +const msg = getMessageFromStore('455@s.whatsapp.net', 'HSJHJWH7323HSJSJ') // implement this on your end +await sock.sendMessage('1234@s.whatsapp.net', { forward: msg }) // WA forward the message! +``` + +## Reading Messages + +A set of message keys must be explicitly marked read now. +In multi-device, you cannot mark an entire "chat" read as it were with Baileys Web. +This means you have to keep track of unread messages. + +``` ts +const key = { + remoteJid: '1234-123@g.us', + id: 'AHASHH123123AHGA', // id of the message you want to read + participant: '912121232@s.whatsapp.net' // the ID of the user that sent the message (undefined for individual chats) +} +// pass to readMessages function +// can pass multiple keys to read multiple messages as well +await sock.readMessages([key]) +``` + +The message ID is the unique identifier of the message that you are marking as read. +On a `WAMessage`, the `messageID` can be accessed using ```messageID = message.key.id```. + +## Update Presence + +``` ts +await sock.sendPresenceUpdate('available', id) + +``` +This lets the person/group with ``` id ``` know whether you're online, offline, typing etc. + +``` presence ``` can be one of the following: +``` ts +type WAPresence = 'unavailable' | 'available' | 'composing' | 'recording' | 'paused' +``` + +The presence expires after about 10 seconds. + +**Note:** In the multi-device version of WhatsApp -- if a desktop client is active, WA doesn't send push notifications to the device. If you would like to receive said notifications -- mark your Baileys client offline using `sock.sendPresenceUpdate('unavailable')` + +## Downloading Media Messages + +If you want to save the media you received +``` ts +import { writeFile } from 'fs/promises' +import { downloadMediaMessage } from '@adiwajshing/baileys' + +sock.ev.on('messages.upsert', async ({ messages }) => { + const m = messages[0] + + if (!m.message) return // if there is no text or media message + const messageType = Object.keys (m.message)[0]// get what type of message it is -- text, image, video + // if the message is an image + if (messageType === 'imageMessage') { + // download the message + const buffer = await downloadMediaMessage( + m, + 'buffer', + { }, + { + logger, + // pass this so that baileys can request a reupload of media + // that has been deleted + reuploadRequest: sock.updateMediaMessage + } + ) + // save to file + await writeFile('./my-download.jpeg', buffer) + } +} +``` + +**Note:** WhatsApp automatically removes old media from their servers. For the device to access said media -- a re-upload is required by another device that has it. This can be accomplished using: +``` ts +const updatedMediaMsg = await sock.updateMediaMessage(msg) +``` + +## Deleting Messages + +``` ts +const jid = '1234@s.whatsapp.net' // can also be a group +const response = await sock.sendMessage(jid, { text: 'hello!' }) // send a message +// sends a message to delete the given message +// this deletes the message for everyone +await sock.sendMessage(jid, { delete: response.key }) +``` + +**Note:** deleting for oneself is supported via `chatModify` (next section) + +## Modifying Chats + +WA uses an encrypted form of communication to send chat/app updates. This has been implemented mostly and you can send the following updates: + +- Archive a chat + ``` ts + const lastMsgInChat = await getLastMessageInChat('123456@s.whatsapp.net') // implement this on your end + await sock.chatModify({ archive: true, lastMessages: [lastMsgInChat] }, '123456@s.whatsapp.net') + ``` +- Mute/unmute a chat + ``` ts + // mute for 8 hours + await sock.chatModify({ mute: 8*60*60*1000 }, '123456@s.whatsapp.net', []) + // unmute + await sock.chatModify({ mute: null }, '123456@s.whatsapp.net', []) + ``` +- Mark a chat read/unread + ``` ts + const lastMsgInChat = await getLastMessageInChat('123456@s.whatsapp.net') // implement this on your end + // mark it unread + await sock.chatModify({ markRead: false, lastMessages: [lastMsgInChat] }, '123456@s.whatsapp.net') + ``` + +- Delete a message for me + ``` ts + await sock.chatModify( + { clear: { messages: [{ id: 'ATWYHDNNWU81732J', fromMe: true, timestamp: "1654823909" }] } }, + '123456@s.whatsapp.net', + [] + ) + + ``` + +- Delete a chat + ``` ts + const lastMsgInChat = await getLastMessageInChat('123456@s.whatsapp.net') // implement this on your end + await sock.chatModify({ + delete: true, + lastMessages: [{ key: lastMsgInChat.key, messageTimestamp: lastMsgInChat.messageTimestamp }] + }, + '123456@s.whatsapp.net') + ``` + +- Pin/unpin a chat + ``` ts + await sock.chatModify({ + pin: true // or `false` to unpin + }, + '123456@s.whatsapp.net') + ``` + +**Note:** if you mess up one of your updates, WA can log you out of all your devices and you'll have to log in again. + +## Disappearing Messages + +``` ts +const jid = '1234@s.whatsapp.net' // can also be a group +// turn on disappearing messages +await sock.sendMessage( + jid, + // this is 1 week in seconds -- how long you want messages to appear for + { disappearingMessagesInChat: WA_DEFAULT_EPHEMERAL } +) +// will send as a disappearing message +await sock.sendMessage(jid, { text: 'hello' }, { ephemeralExpiration: WA_DEFAULT_EPHEMERAL }) +// turn off disappearing messages +await sock.sendMessage( + jid, + { disappearingMessagesInChat: false } +) + +``` + +## Misc + +- To check if a given ID is on WhatsApp + ``` ts + const id = '123456' + const [result] = await sock.onWhatsApp(id) + if (result.exists) console.log (`${id} exists on WhatsApp, as jid: ${result.jid}`) + ``` +- To query chat history on a group or with someone + TODO, if possible +- To get the status of some person + ``` ts + const status = await sock.fetchStatus("xyz@s.whatsapp.net") + console.log("status: " + status) + ``` +- To change your profile status + ``` ts + const status = 'Hello World!' + await sock.updateProfileStatus(status) + ``` +- To change your profile name + ``` ts + const name = 'My name' + await sock.updateProfileName(name) + ``` +- To get the display picture of some person/group + ``` ts + // for low res picture + const ppUrl = await sock.profilePictureUrl("xyz@g.us") + console.log("download profile picture from: " + ppUrl) + // for high res picture + const ppUrl = await sock.profilePictureUrl("xyz@g.us", 'image') + ``` +- To change your display picture or a group's + ``` ts + const jid = '111234567890-1594482450@g.us' // can be your own too + await sock.updateProfilePicture(jid, { url: './new-profile-picture.jpeg' }) + ``` +- To get someone's presence (if they're typing or online) + ``` ts + // the presence update is fetched and called here + sock.ev.on('presence-update', json => console.log(json)) + // request updates for a chat + await sock.presenceSubscribe("xyz@s.whatsapp.net") + ``` +- To block or unblock user + ``` ts + await sock.updateBlockStatus("xyz@s.whatsapp.net", "block") // Block user + await sock.updateBlockStatus("xyz@s.whatsapp.net", "unblock") // Unblock user + ``` +- To get a business profile, such as description or category + ```ts + const profile = await sock.getBusinessProfile("xyz@s.whatsapp.net") + console.log("business description: " + profile.description + ", category: " + profile.category) + ``` +Of course, replace ``` xyz ``` with an actual ID. + +## Groups +- To create a group + ``` ts + // title & participants + const group = await sock.groupCreate("My Fab Group", ["1234@s.whatsapp.net", "4564@s.whatsapp.net"]) + console.log ("created group with id: " + group.gid) + sock.sendMessage(group.id, { text: 'hello there' }) // say hello to everyone on the group + ``` +- To add/remove people to a group or demote/promote people + ``` ts + // id & people to add to the group (will throw error if it fails) + const response = await sock.groupParticipantsUpdate( + "abcd-xyz@g.us", + ["abcd@s.whatsapp.net", "efgh@s.whatsapp.net"], + "add" // replace this parameter with "remove", "demote" or "promote" + ) + ``` +- To change the group's subject + ``` ts + await sock.groupUpdateSubject("abcd-xyz@g.us", "New Subject!") + ``` +- To change the group's description + ``` ts + await sock.groupUpdateDescription("abcd-xyz@g.us", "New Description!") + ``` +- To change group settings + ``` ts + // only allow admins to send messages + await sock.groupSettingUpdate("abcd-xyz@g.us", 'announcement') + // allow everyone to send messages + await sock.groupSettingUpdate("abcd-xyz@g.us", 'not_announcement') + // allow everyone to modify the group's settings -- like display picture etc. + await sock.groupSettingUpdate("abcd-xyz@g.us", 'unlocked') + // only allow admins to modify the group's settings + await sock.groupSettingUpdate("abcd-xyz@g.us", 'locked') + ``` +- To leave a group + ``` ts + await sock.groupLeave("abcd-xyz@g.us") // (will throw error if it fails) + ``` +- To get the invite code for a group + ``` ts + const code = await sock.groupInviteCode("abcd-xyz@g.us") + console.log("group code: " + code) + ``` +- To revoke the invite code in a group + ```ts + const code = await sock.groupRevokeInvite("abcd-xyz@g.us") + console.log("New group code: " + code) + ``` +- To query the metadata of a group + ``` ts + const metadata = await sock.groupMetadata("abcd-xyz@g.us") + console.log(metadata.id + ", title: " + metadata.subject + ", description: " + metadata.desc) + ``` +- To join the group using the invitation code + ``` ts + const response = await sock.groupAcceptInvite("xxx") + console.log("joined to: " + response) + ``` + Of course, replace ``` xxx ``` with invitation code. +- To get group info by invite code + ```ts + const response = await sock.groupGetInviteInfo("xxx") + console.log("group information: " + response) + ``` +- To join the group using groupInviteMessage + ``` ts + const response = await sock.groupAcceptInviteV4("abcd@s.whatsapp.net", groupInviteMessage) + console.log("joined to: " + response) + ``` + Of course, replace ``` xxx ``` with invitation code. + +## Broadcast Lists & Stories + +**Note:** messages currently cannot be sent to broadcast lists from the MD version. + +- You can send messages to broadcast lists the same way you send messages to groups & individual chats. +- Right now, WA Web does not support creating broadcast lists, but you can still delete them. +- Broadcast IDs are in the format `12345678@broadcast` +- To query a broadcast list's recipients & name: + ``` ts + const bList = await sock.getBroadcastListInfo("1234@broadcast") + console.log (`list name: ${bList.name}, recps: ${bList.recipients}`) + ``` + +## Writing Custom Functionality +Baileys is written with custom functionality in mind. Instead of forking the project & re-writing the internals, you can simply write your own extensions. + +First, enable the logging of unhandled messages from WhatsApp by setting: +``` ts +const sock = makeWASocket({ + logger: P({ level: 'debug' }), +}) +``` +This will enable you to see all sorts of messages WhatsApp sends in the console. + +Some examples: + +1. Functionality to track the battery percentage of your phone. + You enable logging and you'll see a message about your battery pop up in the console: + ```{"level":10,"fromMe":false,"frame":{"tag":"ib","attrs":{"from":"@s.whatsapp.net"},"content":[{"tag":"edge_routing","attrs":{},"content":[{"tag":"routing_info","attrs":{},"content":{"type":"Buffer","data":[8,2,8,5]}}]}]},"msg":"communication"} ``` + + The "frame" is what the message received is, it has three components: + - `tag` -- what this frame is about (eg. message will have "message") + - `attrs` -- a string key-value pair with some metadata (contains ID of the message usually) + - `content` -- the actual data (eg. a message node will have the actual message content in it) + - read more about this format [here](/src/WABinary/readme.md) + + You can register a callback for an event using the following: + ``` ts + // for any message with tag 'edge_routing' + sock.ws.on(`CB:edge_routing`, (node: BinaryNode) => { }) + // for any message with tag 'edge_routing' and id attribute = abcd + sock.ws.on(`CB:edge_routing,id:abcd`, (node: BinaryNode) => { }) + // for any message with tag 'edge_routing', id attribute = abcd & first content node routing_info + sock.ws.on(`CB:edge_routing,id:abcd,routing_info`, (node: BinaryNode) => { }) + ``` + +### Note + + This library was originally a project for **CS-2362 at Ashoka University** and is in no way affiliated with WhatsApp. Use at your own discretion. Do not spam people with this. + + Also, this repo is now licenced under GPL 3 since it uses [libsignal-node](https://git.questbook.io/backend/service-coderunner/-/merge_requests/1) diff --git a/whatsapp_addon/Baileys/WAProto/GenerateStatics.sh b/whatsapp_addon/Baileys/WAProto/GenerateStatics.sh new file mode 100644 index 0000000..7d77a28 --- /dev/null +++ b/whatsapp_addon/Baileys/WAProto/GenerateStatics.sh @@ -0,0 +1,4 @@ +yarn pbjs -t static-module -w commonjs -o ./WAProto/index.js ./WAProto/WAProto.proto; +yarn pbts -o ./WAProto/index.d.ts ./WAProto/index.js; + +#protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_opt=env=node,useOptionals=true,forceLong=long --ts_proto_out=. ./src/Binary/WAMessage.proto; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WAProto/WAProto.proto b/whatsapp_addon/Baileys/WAProto/WAProto.proto new file mode 100644 index 0000000..081bd6d --- /dev/null +++ b/whatsapp_addon/Baileys/WAProto/WAProto.proto @@ -0,0 +1,2463 @@ +syntax = "proto2"; +package proto; + +message ADVDeviceIdentity { + optional uint32 rawId = 1; + optional uint64 timestamp = 2; + optional uint32 keyIndex = 3; +} + +message ADVKeyIndexList { + optional uint32 rawId = 1; + optional uint64 timestamp = 2; + optional uint32 currentIndex = 3; + repeated uint32 validIndexes = 4 [packed=true]; +} + +message ADVSignedDeviceIdentity { + optional bytes details = 1; + optional bytes accountSignatureKey = 2; + optional bytes accountSignature = 3; + optional bytes deviceSignature = 4; +} + +message ADVSignedDeviceIdentityHMAC { + optional bytes details = 1; + optional bytes hmac = 2; +} + +message ADVSignedKeyIndexList { + optional bytes details = 1; + optional bytes accountSignature = 2; +} + +message ActionLink { + optional string url = 1; + optional string buttonTitle = 2; +} + +message AutoDownloadSettings { + optional bool downloadImages = 1; + optional bool downloadAudio = 2; + optional bool downloadVideo = 3; + optional bool downloadDocuments = 4; +} + +message AvatarUserSettings { + optional string fbid = 1; + optional string password = 2; +} + +message BizAccountLinkInfo { + optional uint64 whatsappBizAcctFbid = 1; + optional string whatsappAcctNumber = 2; + optional uint64 issueTime = 3; + optional HostStorageType hostStorage = 4; + optional AccountType accountType = 5; + enum AccountType { + ENTERPRISE = 0; + } + enum HostStorageType { + ON_PREMISE = 0; + FACEBOOK = 1; + } +} + +message BizAccountPayload { + optional VerifiedNameCertificate vnameCert = 1; + optional bytes bizAcctLinkInfo = 2; +} + +message BizIdentityInfo { + optional VerifiedLevelValue vlevel = 1; + optional VerifiedNameCertificate vnameCert = 2; + optional bool signed = 3; + optional bool revoked = 4; + optional HostStorageType hostStorage = 5; + optional ActualActorsType actualActors = 6; + optional uint64 privacyModeTs = 7; + optional uint64 featureControls = 8; + enum ActualActorsType { + SELF = 0; + BSP = 1; + } + enum HostStorageType { + ON_PREMISE = 0; + FACEBOOK = 1; + } + enum VerifiedLevelValue { + UNKNOWN = 0; + LOW = 1; + HIGH = 2; + } +} + +message CertChain { + optional NoiseCertificate leaf = 1; + optional NoiseCertificate intermediate = 2; + message NoiseCertificate { + optional bytes details = 1; + optional bytes signature = 2; + message Details { + optional uint32 serial = 1; + optional uint32 issuerSerial = 2; + optional bytes key = 3; + optional uint64 notBefore = 4; + optional uint64 notAfter = 5; + } + + } + +} + +message Chain { + optional bytes senderRatchetKey = 1; + optional bytes senderRatchetKeyPrivate = 2; + optional ChainKey chainKey = 3; + repeated MessageKey messageKeys = 4; +} + +message ChainKey { + optional uint32 index = 1; + optional bytes key = 2; +} + +message ClientPayload { + optional uint64 username = 1; + optional bool passive = 3; + optional UserAgent userAgent = 5; + optional WebInfo webInfo = 6; + optional string pushName = 7; + optional sfixed32 sessionId = 9; + optional bool shortConnect = 10; + optional ConnectType connectType = 12; + optional ConnectReason connectReason = 13; + repeated int32 shards = 14; + optional DNSSource dnsSource = 15; + optional uint32 connectAttemptCount = 16; + optional uint32 device = 18; + optional DevicePairingRegistrationData devicePairingData = 19; + optional Product product = 20; + optional bytes fbCat = 21; + optional bytes fbUserAgent = 22; + optional bool oc = 23; + optional int32 lc = 24; + optional IOSAppExtension iosAppExtension = 30; + optional uint64 fbAppId = 31; + optional bytes fbDeviceId = 32; + optional bool pull = 33; + optional bytes paddingBytes = 34; + optional BizMarketSegment bizMarketSegment = 35; + optional int32 yearClass = 36; + optional int32 memClass = 37; + enum BizMarketSegment { + DEFAULT = 0; + DEVX = 1; + INBOX = 2; + } + enum ConnectReason { + PUSH = 0; + USER_ACTIVATED = 1; + SCHEDULED = 2; + ERROR_RECONNECT = 3; + NETWORK_SWITCH = 4; + PING_RECONNECT = 5; + } + enum ConnectType { + CELLULAR_UNKNOWN = 0; + WIFI_UNKNOWN = 1; + CELLULAR_EDGE = 100; + CELLULAR_IDEN = 101; + CELLULAR_UMTS = 102; + CELLULAR_EVDO = 103; + CELLULAR_GPRS = 104; + CELLULAR_HSDPA = 105; + CELLULAR_HSUPA = 106; + CELLULAR_HSPA = 107; + CELLULAR_CDMA = 108; + CELLULAR_1XRTT = 109; + CELLULAR_EHRPD = 110; + CELLULAR_LTE = 111; + CELLULAR_HSPAP = 112; + } + message DNSSource { + optional DNSResolutionMethod dnsMethod = 15; + optional bool appCached = 16; + enum DNSResolutionMethod { + SYSTEM = 0; + GOOGLE = 1; + HARDCODED = 2; + OVERRIDE = 3; + FALLBACK = 4; + } + } + + message DevicePairingRegistrationData { + optional bytes eRegid = 1; + optional bytes eKeytype = 2; + optional bytes eIdent = 3; + optional bytes eSkeyId = 4; + optional bytes eSkeyVal = 5; + optional bytes eSkeySig = 6; + optional bytes buildHash = 7; + optional bytes deviceProps = 8; + } + + enum IOSAppExtension { + SHARE_EXTENSION = 0; + SERVICE_EXTENSION = 1; + INTENTS_EXTENSION = 2; + } + enum Product { + WHATSAPP = 0; + MESSENGER = 1; + } + message UserAgent { + optional Platform platform = 1; + optional AppVersion appVersion = 2; + optional string mcc = 3; + optional string mnc = 4; + optional string osVersion = 5; + optional string manufacturer = 6; + optional string device = 7; + optional string osBuildNumber = 8; + optional string phoneId = 9; + optional ReleaseChannel releaseChannel = 10; + optional string localeLanguageIso6391 = 11; + optional string localeCountryIso31661Alpha2 = 12; + optional string deviceBoard = 13; + message AppVersion { + optional uint32 primary = 1; + optional uint32 secondary = 2; + optional uint32 tertiary = 3; + optional uint32 quaternary = 4; + optional uint32 quinary = 5; + } + + enum Platform { + ANDROID = 0; + IOS = 1; + WINDOWS_PHONE = 2; + BLACKBERRY = 3; + BLACKBERRYX = 4; + S40 = 5; + S60 = 6; + PYTHON_CLIENT = 7; + TIZEN = 8; + ENTERPRISE = 9; + SMB_ANDROID = 10; + KAIOS = 11; + SMB_IOS = 12; + WINDOWS = 13; + WEB = 14; + PORTAL = 15; + GREEN_ANDROID = 16; + GREEN_IPHONE = 17; + BLUE_ANDROID = 18; + BLUE_IPHONE = 19; + FBLITE_ANDROID = 20; + MLITE_ANDROID = 21; + IGLITE_ANDROID = 22; + PAGE = 23; + MACOS = 24; + OCULUS_MSG = 25; + OCULUS_CALL = 26; + MILAN = 27; + CAPI = 28; + WEAROS = 29; + ARDEVICE = 30; + VRDEVICE = 31; + } + enum ReleaseChannel { + RELEASE = 0; + BETA = 1; + ALPHA = 2; + DEBUG = 3; + } + } + + message WebInfo { + optional string refToken = 1; + optional string version = 2; + optional WebdPayload webdPayload = 3; + optional WebSubPlatform webSubPlatform = 4; + enum WebSubPlatform { + WEB_BROWSER = 0; + APP_STORE = 1; + WIN_STORE = 2; + DARWIN = 3; + WIN32 = 4; + } + message WebdPayload { + optional bool usesParticipantInKey = 1; + optional bool supportsStarredMessages = 2; + optional bool supportsDocumentMessages = 3; + optional bool supportsUrlMessages = 4; + optional bool supportsMediaRetry = 5; + optional bool supportsE2EImage = 6; + optional bool supportsE2EVideo = 7; + optional bool supportsE2EAudio = 8; + optional bool supportsE2EDocument = 9; + optional string documentTypes = 10; + optional bytes features = 11; + } + + } + +} + +message ContextInfo { + optional string stanzaId = 1; + optional string participant = 2; + optional Message quotedMessage = 3; + optional string remoteJid = 4; + repeated string mentionedJid = 15; + optional string conversionSource = 18; + optional bytes conversionData = 19; + optional uint32 conversionDelaySeconds = 20; + optional uint32 forwardingScore = 21; + optional bool isForwarded = 22; + optional AdReplyInfo quotedAd = 23; + optional MessageKey placeholderKey = 24; + optional uint32 expiration = 25; + optional int64 ephemeralSettingTimestamp = 26; + optional bytes ephemeralSharedSecret = 27; + optional ExternalAdReplyInfo externalAdReply = 28; + optional string entryPointConversionSource = 29; + optional string entryPointConversionApp = 30; + optional uint32 entryPointConversionDelaySeconds = 31; + optional DisappearingMode disappearingMode = 32; + optional ActionLink actionLink = 33; + optional string groupSubject = 34; + optional string parentGroupJid = 35; + optional string trustBannerType = 37; + optional uint32 trustBannerAction = 38; + message AdReplyInfo { + optional string advertiserName = 1; + optional MediaType mediaType = 2; + optional bytes jpegThumbnail = 16; + optional string caption = 17; + enum MediaType { + NONE = 0; + IMAGE = 1; + VIDEO = 2; + } + } + + message ExternalAdReplyInfo { + optional string title = 1; + optional string body = 2; + optional MediaType mediaType = 3; + optional string thumbnailUrl = 4; + optional string mediaUrl = 5; + optional bytes thumbnail = 6; + optional string sourceType = 7; + optional string sourceId = 8; + optional string sourceUrl = 9; + optional bool containsAutoReply = 10; + optional bool renderLargerThumbnail = 11; + optional bool showAdAttribution = 12; + optional string ctwaClid = 13; + enum MediaType { + NONE = 0; + IMAGE = 1; + VIDEO = 2; + } + } + +} + +message Conversation { + required string id = 1; + repeated HistorySyncMsg messages = 2; + optional string newJid = 3; + optional string oldJid = 4; + optional uint64 lastMsgTimestamp = 5; + optional uint32 unreadCount = 6; + optional bool readOnly = 7; + optional bool endOfHistoryTransfer = 8; + optional uint32 ephemeralExpiration = 9; + optional int64 ephemeralSettingTimestamp = 10; + optional EndOfHistoryTransferType endOfHistoryTransferType = 11; + optional uint64 conversationTimestamp = 12; + optional string name = 13; + optional string pHash = 14; + optional bool notSpam = 15; + optional bool archived = 16; + optional DisappearingMode disappearingMode = 17; + optional uint32 unreadMentionCount = 18; + optional bool markedAsUnread = 19; + repeated GroupParticipant participant = 20; + optional bytes tcToken = 21; + optional uint64 tcTokenTimestamp = 22; + optional bytes contactPrimaryIdentityKey = 23; + optional uint32 pinned = 24; + optional uint64 muteEndTime = 25; + optional WallpaperSettings wallpaper = 26; + optional MediaVisibility mediaVisibility = 27; + optional uint64 tcTokenSenderTimestamp = 28; + optional bool suspended = 29; + optional bool terminated = 30; + optional uint64 createdAt = 31; + optional string createdBy = 32; + optional string description = 33; + optional bool support = 34; + optional bool isParentGroup = 35; + optional bool isDefaultSubgroup = 36; + optional string parentGroupId = 37; + optional string displayName = 38; + optional string pnJid = 39; + optional bool shareOwnPn = 40; + optional bool pnhDuplicateLidThread = 41; + optional string lidJid = 42; + enum EndOfHistoryTransferType { + COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY = 0; + COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY = 1; + } +} + +message DeviceListMetadata { + optional bytes senderKeyHash = 1; + optional uint64 senderTimestamp = 2; + repeated uint32 senderKeyIndexes = 3 [packed=true]; + optional bytes recipientKeyHash = 8; + optional uint64 recipientTimestamp = 9; + repeated uint32 recipientKeyIndexes = 10 [packed=true]; +} + +message DeviceProps { + optional string os = 1; + optional AppVersion version = 2; + optional PlatformType platformType = 3; + optional bool requireFullSync = 4; + optional HistorySyncConfig historySyncConfig = 5; + message AppVersion { + optional uint32 primary = 1; + optional uint32 secondary = 2; + optional uint32 tertiary = 3; + optional uint32 quaternary = 4; + optional uint32 quinary = 5; + } + + message HistorySyncConfig { + optional uint32 fullSyncDaysLimit = 1; + optional uint32 fullSyncSizeMbLimit = 2; + optional uint32 storageQuotaMb = 3; + } + + enum PlatformType { + UNKNOWN = 0; + CHROME = 1; + FIREFOX = 2; + IE = 3; + OPERA = 4; + SAFARI = 5; + EDGE = 6; + DESKTOP = 7; + IPAD = 8; + ANDROID_TABLET = 9; + OHANA = 10; + ALOHA = 11; + CATALINA = 12; + TCL_TV = 13; + } +} + +message DisappearingMode { + optional Initiator initiator = 1; + enum Initiator { + CHANGED_IN_CHAT = 0; + INITIATED_BY_ME = 1; + INITIATED_BY_OTHER = 2; + } +} + +message EphemeralSetting { + optional sfixed32 duration = 1; + optional sfixed64 timestamp = 2; +} + +message ExitCode { + optional uint64 code = 1; + optional string text = 2; +} + +message ExternalBlobReference { + optional bytes mediaKey = 1; + optional string directPath = 2; + optional string handle = 3; + optional uint64 fileSizeBytes = 4; + optional bytes fileSha256 = 5; + optional bytes fileEncSha256 = 6; +} + +message GlobalSettings { + optional WallpaperSettings lightThemeWallpaper = 1; + optional MediaVisibility mediaVisibility = 2; + optional WallpaperSettings darkThemeWallpaper = 3; + optional AutoDownloadSettings autoDownloadWiFi = 4; + optional AutoDownloadSettings autoDownloadCellular = 5; + optional AutoDownloadSettings autoDownloadRoaming = 6; + optional bool showIndividualNotificationsPreview = 7; + optional bool showGroupNotificationsPreview = 8; + optional int32 disappearingModeDuration = 9; + optional int64 disappearingModeTimestamp = 10; + optional AvatarUserSettings avatarUserSettings = 11; +} + +message GroupParticipant { + required string userJid = 1; + optional Rank rank = 2; + enum Rank { + REGULAR = 0; + ADMIN = 1; + SUPERADMIN = 2; + } +} + +message HandshakeMessage { + optional ClientHello clientHello = 2; + optional ServerHello serverHello = 3; + optional ClientFinish clientFinish = 4; + message ClientFinish { + optional bytes static = 1; + optional bytes payload = 2; + } + + message ClientHello { + optional bytes ephemeral = 1; + optional bytes static = 2; + optional bytes payload = 3; + } + + message ServerHello { + optional bytes ephemeral = 1; + optional bytes static = 2; + optional bytes payload = 3; + } + +} + +message HistorySync { + required HistorySyncType syncType = 1; + repeated Conversation conversations = 2; + repeated WebMessageInfo statusV3Messages = 3; + optional uint32 chunkOrder = 5; + optional uint32 progress = 6; + repeated Pushname pushnames = 7; + optional GlobalSettings globalSettings = 8; + optional bytes threadIdUserSecret = 9; + optional uint32 threadDsTimeframeOffset = 10; + repeated StickerMetadata recentStickers = 11; + repeated PastParticipants pastParticipants = 12; + enum HistorySyncType { + INITIAL_BOOTSTRAP = 0; + INITIAL_STATUS_V3 = 1; + FULL = 2; + RECENT = 3; + PUSH_NAME = 4; + NON_BLOCKING_DATA = 5; + } +} + +message HistorySyncMsg { + optional WebMessageInfo message = 1; + optional uint64 msgOrderId = 2; +} + +message HydratedTemplateButton { + optional uint32 index = 4; + oneof hydratedButton { + HydratedTemplateButton.HydratedQuickReplyButton quickReplyButton = 1; + HydratedTemplateButton.HydratedURLButton urlButton = 2; + HydratedTemplateButton.HydratedCallButton callButton = 3; + } + message HydratedCallButton { + optional string displayText = 1; + optional string phoneNumber = 2; + } + + message HydratedQuickReplyButton { + optional string displayText = 1; + optional string id = 2; + } + + message HydratedURLButton { + optional string displayText = 1; + optional string url = 2; + } + +} + +message IdentityKeyPairStructure { + optional bytes publicKey = 1; + optional bytes privateKey = 2; +} + +message InteractiveAnnotation { + repeated Point polygonVertices = 1; + oneof action { + Location location = 2; + } +} + +message KeepInChat { + optional KeepType keepType = 1; + optional int64 serverTimestamp = 2; + optional MessageKey key = 3; + optional string deviceJid = 4; + optional int64 clientTimestampMs = 5; + optional int64 serverTimestampMs = 6; +} + +enum KeepType { + UNKNOWN = 0; + KEEP_FOR_ALL = 1; + UNDO_KEEP_FOR_ALL = 2; +} +message KeyId { + optional bytes id = 1; +} + +message LocalizedName { + optional string lg = 1; + optional string lc = 2; + optional string verifiedName = 3; +} + +message Location { + optional double degreesLatitude = 1; + optional double degreesLongitude = 2; + optional string name = 3; +} + +message MediaData { + optional string localPath = 1; +} + +message MediaRetryNotification { + optional string stanzaId = 1; + optional string directPath = 2; + optional ResultType result = 3; + enum ResultType { + GENERAL_ERROR = 0; + SUCCESS = 1; + NOT_FOUND = 2; + DECRYPTION_ERROR = 3; + } +} + +enum MediaVisibility { + DEFAULT = 0; + OFF = 1; + ON = 2; +} +message Message { + optional string conversation = 1; + optional SenderKeyDistributionMessage senderKeyDistributionMessage = 2; + optional ImageMessage imageMessage = 3; + optional ContactMessage contactMessage = 4; + optional LocationMessage locationMessage = 5; + optional ExtendedTextMessage extendedTextMessage = 6; + optional DocumentMessage documentMessage = 7; + optional AudioMessage audioMessage = 8; + optional VideoMessage videoMessage = 9; + optional Call call = 10; + optional Chat chat = 11; + optional ProtocolMessage protocolMessage = 12; + optional ContactsArrayMessage contactsArrayMessage = 13; + optional HighlyStructuredMessage highlyStructuredMessage = 14; + optional SenderKeyDistributionMessage fastRatchetKeySenderKeyDistributionMessage = 15; + optional SendPaymentMessage sendPaymentMessage = 16; + optional LiveLocationMessage liveLocationMessage = 18; + optional RequestPaymentMessage requestPaymentMessage = 22; + optional DeclinePaymentRequestMessage declinePaymentRequestMessage = 23; + optional CancelPaymentRequestMessage cancelPaymentRequestMessage = 24; + optional TemplateMessage templateMessage = 25; + optional StickerMessage stickerMessage = 26; + optional GroupInviteMessage groupInviteMessage = 28; + optional TemplateButtonReplyMessage templateButtonReplyMessage = 29; + optional ProductMessage productMessage = 30; + optional DeviceSentMessage deviceSentMessage = 31; + optional MessageContextInfo messageContextInfo = 35; + optional ListMessage listMessage = 36; + optional FutureProofMessage viewOnceMessage = 37; + optional OrderMessage orderMessage = 38; + optional ListResponseMessage listResponseMessage = 39; + optional FutureProofMessage ephemeralMessage = 40; + optional InvoiceMessage invoiceMessage = 41; + optional ButtonsMessage buttonsMessage = 42; + optional ButtonsResponseMessage buttonsResponseMessage = 43; + optional PaymentInviteMessage paymentInviteMessage = 44; + optional InteractiveMessage interactiveMessage = 45; + optional ReactionMessage reactionMessage = 46; + optional StickerSyncRMRMessage stickerSyncRmrMessage = 47; + optional InteractiveResponseMessage interactiveResponseMessage = 48; + optional PollCreationMessage pollCreationMessage = 49; + optional PollUpdateMessage pollUpdateMessage = 50; + optional KeepInChatMessage keepInChatMessage = 51; + optional FutureProofMessage documentWithCaptionMessage = 53; + optional RequestPhoneNumberMessage requestPhoneNumberMessage = 54; + optional FutureProofMessage viewOnceMessageV2 = 55; + optional EncReactionMessage encReactionMessage = 56; + optional FutureProofMessage editedMessage = 58; + optional FutureProofMessage viewOnceMessageV2Extension = 59; + message AppStateFatalExceptionNotification { + repeated string collectionNames = 1; + optional int64 timestamp = 2; + } + + message AppStateSyncKey { + optional Message.AppStateSyncKeyId keyId = 1; + optional Message.AppStateSyncKeyData keyData = 2; + } + + message AppStateSyncKeyData { + optional bytes keyData = 1; + optional Message.AppStateSyncKeyFingerprint fingerprint = 2; + optional int64 timestamp = 3; + } + + message AppStateSyncKeyFingerprint { + optional uint32 rawId = 1; + optional uint32 currentIndex = 2; + repeated uint32 deviceIndexes = 3 [packed=true]; + } + + message AppStateSyncKeyId { + optional bytes keyId = 1; + } + + message AppStateSyncKeyRequest { + repeated Message.AppStateSyncKeyId keyIds = 1; + } + + message AppStateSyncKeyShare { + repeated Message.AppStateSyncKey keys = 1; + } + + message AudioMessage { + optional string url = 1; + optional string mimetype = 2; + optional bytes fileSha256 = 3; + optional uint64 fileLength = 4; + optional uint32 seconds = 5; + optional bool ptt = 6; + optional bytes mediaKey = 7; + optional bytes fileEncSha256 = 8; + optional string directPath = 9; + optional int64 mediaKeyTimestamp = 10; + optional ContextInfo contextInfo = 17; + optional bytes streamingSidecar = 18; + optional bytes waveform = 19; + optional fixed32 backgroundArgb = 20; + } + + message ButtonsMessage { + optional string contentText = 6; + optional string footerText = 7; + optional ContextInfo contextInfo = 8; + repeated Button buttons = 9; + optional HeaderType headerType = 10; + oneof header { + string text = 1; + Message.DocumentMessage documentMessage = 2; + Message.ImageMessage imageMessage = 3; + Message.VideoMessage videoMessage = 4; + Message.LocationMessage locationMessage = 5; + } + message Button { + optional string buttonId = 1; + optional ButtonText buttonText = 2; + optional Type type = 3; + optional NativeFlowInfo nativeFlowInfo = 4; + message ButtonText { + optional string displayText = 1; + } + + message NativeFlowInfo { + optional string name = 1; + optional string paramsJson = 2; + } + + enum Type { + UNKNOWN = 0; + RESPONSE = 1; + NATIVE_FLOW = 2; + } + } + + enum HeaderType { + UNKNOWN = 0; + EMPTY = 1; + TEXT = 2; + DOCUMENT = 3; + IMAGE = 4; + VIDEO = 5; + LOCATION = 6; + } + } + + message ButtonsResponseMessage { + optional string selectedButtonId = 1; + optional ContextInfo contextInfo = 3; + optional Type type = 4; + oneof response { + string selectedDisplayText = 2; + } + enum Type { + UNKNOWN = 0; + DISPLAY_TEXT = 1; + } + } + + message Call { + optional bytes callKey = 1; + optional string conversionSource = 2; + optional bytes conversionData = 3; + optional uint32 conversionDelaySeconds = 4; + } + + message CancelPaymentRequestMessage { + optional MessageKey key = 1; + } + + message Chat { + optional string displayName = 1; + optional string id = 2; + } + + message ContactMessage { + optional string displayName = 1; + optional string vcard = 16; + optional ContextInfo contextInfo = 17; + } + + message ContactsArrayMessage { + optional string displayName = 1; + repeated Message.ContactMessage contacts = 2; + optional ContextInfo contextInfo = 17; + } + + message DeclinePaymentRequestMessage { + optional MessageKey key = 1; + } + + message DeviceSentMessage { + optional string destinationJid = 1; + optional Message message = 2; + optional string phash = 3; + } + + message DocumentMessage { + optional string url = 1; + optional string mimetype = 2; + optional string title = 3; + optional bytes fileSha256 = 4; + optional uint64 fileLength = 5; + optional uint32 pageCount = 6; + optional bytes mediaKey = 7; + optional string fileName = 8; + optional bytes fileEncSha256 = 9; + optional string directPath = 10; + optional int64 mediaKeyTimestamp = 11; + optional bool contactVcard = 12; + optional string thumbnailDirectPath = 13; + optional bytes thumbnailSha256 = 14; + optional bytes thumbnailEncSha256 = 15; + optional bytes jpegThumbnail = 16; + optional ContextInfo contextInfo = 17; + optional uint32 thumbnailHeight = 18; + optional uint32 thumbnailWidth = 19; + optional string caption = 20; + } + + message EncReactionMessage { + optional MessageKey targetMessageKey = 1; + optional bytes encPayload = 2; + optional bytes encIv = 3; + } + + message ExtendedTextMessage { + optional string text = 1; + optional string matchedText = 2; + optional string canonicalUrl = 4; + optional string description = 5; + optional string title = 6; + optional fixed32 textArgb = 7; + optional fixed32 backgroundArgb = 8; + optional FontType font = 9; + optional PreviewType previewType = 10; + optional bytes jpegThumbnail = 16; + optional ContextInfo contextInfo = 17; + optional bool doNotPlayInline = 18; + optional string thumbnailDirectPath = 19; + optional bytes thumbnailSha256 = 20; + optional bytes thumbnailEncSha256 = 21; + optional bytes mediaKey = 22; + optional int64 mediaKeyTimestamp = 23; + optional uint32 thumbnailHeight = 24; + optional uint32 thumbnailWidth = 25; + optional InviteLinkGroupType inviteLinkGroupType = 26; + optional string inviteLinkParentGroupSubjectV2 = 27; + optional bytes inviteLinkParentGroupThumbnailV2 = 28; + optional InviteLinkGroupType inviteLinkGroupTypeV2 = 29; + optional bool viewOnce = 30; + enum FontType { + SANS_SERIF = 0; + SERIF = 1; + NORICAN_REGULAR = 2; + BRYNDAN_WRITE = 3; + BEBASNEUE_REGULAR = 4; + OSWALD_HEAVY = 5; + } + enum InviteLinkGroupType { + DEFAULT = 0; + PARENT = 1; + SUB = 2; + DEFAULT_SUB = 3; + } + enum PreviewType { + NONE = 0; + VIDEO = 1; + } + } + + message FutureProofMessage { + optional Message message = 1; + } + + message GroupInviteMessage { + optional string groupJid = 1; + optional string inviteCode = 2; + optional int64 inviteExpiration = 3; + optional string groupName = 4; + optional bytes jpegThumbnail = 5; + optional string caption = 6; + optional ContextInfo contextInfo = 7; + optional GroupType groupType = 8; + enum GroupType { + DEFAULT = 0; + PARENT = 1; + } + } + + message HighlyStructuredMessage { + optional string namespace = 1; + optional string elementName = 2; + repeated string params = 3; + optional string fallbackLg = 4; + optional string fallbackLc = 5; + repeated HSMLocalizableParameter localizableParams = 6; + optional string deterministicLg = 7; + optional string deterministicLc = 8; + optional Message.TemplateMessage hydratedHsm = 9; + message HSMLocalizableParameter { + optional string default = 1; + oneof paramOneof { + Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency currency = 2; + Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime dateTime = 3; + } + message HSMCurrency { + optional string currencyCode = 1; + optional int64 amount1000 = 2; + } + + message HSMDateTime { + oneof datetimeOneof { + Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent component = 1; + Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch unixEpoch = 2; + } + message HSMDateTimeComponent { + optional DayOfWeekType dayOfWeek = 1; + optional uint32 year = 2; + optional uint32 month = 3; + optional uint32 dayOfMonth = 4; + optional uint32 hour = 5; + optional uint32 minute = 6; + optional CalendarType calendar = 7; + enum CalendarType { + GREGORIAN = 1; + SOLAR_HIJRI = 2; + } + enum DayOfWeekType { + MONDAY = 1; + TUESDAY = 2; + WEDNESDAY = 3; + THURSDAY = 4; + FRIDAY = 5; + SATURDAY = 6; + SUNDAY = 7; + } + } + + message HSMDateTimeUnixEpoch { + optional int64 timestamp = 1; + } + + } + + } + + } + + message HistorySyncNotification { + optional bytes fileSha256 = 1; + optional uint64 fileLength = 2; + optional bytes mediaKey = 3; + optional bytes fileEncSha256 = 4; + optional string directPath = 5; + optional HistorySyncType syncType = 6; + optional uint32 chunkOrder = 7; + optional string originalMessageId = 8; + optional uint32 progress = 9; + optional int64 oldestMsgInChunkTimestampSec = 10; + enum HistorySyncType { + INITIAL_BOOTSTRAP = 0; + INITIAL_STATUS_V3 = 1; + FULL = 2; + RECENT = 3; + PUSH_NAME = 4; + NON_BLOCKING_DATA = 5; + } + } + + message ImageMessage { + optional string url = 1; + optional string mimetype = 2; + optional string caption = 3; + optional bytes fileSha256 = 4; + optional uint64 fileLength = 5; + optional uint32 height = 6; + optional uint32 width = 7; + optional bytes mediaKey = 8; + optional bytes fileEncSha256 = 9; + repeated InteractiveAnnotation interactiveAnnotations = 10; + optional string directPath = 11; + optional int64 mediaKeyTimestamp = 12; + optional bytes jpegThumbnail = 16; + optional ContextInfo contextInfo = 17; + optional bytes firstScanSidecar = 18; + optional uint32 firstScanLength = 19; + optional uint32 experimentGroupId = 20; + optional bytes scansSidecar = 21; + repeated uint32 scanLengths = 22; + optional bytes midQualityFileSha256 = 23; + optional bytes midQualityFileEncSha256 = 24; + optional bool viewOnce = 25; + optional string thumbnailDirectPath = 26; + optional bytes thumbnailSha256 = 27; + optional bytes thumbnailEncSha256 = 28; + optional string staticUrl = 29; + } + + message InitialSecurityNotificationSettingSync { + optional bool securityNotificationEnabled = 1; + } + + message InteractiveMessage { + optional Header header = 1; + optional Body body = 2; + optional Footer footer = 3; + optional ContextInfo contextInfo = 15; + oneof interactiveMessage { + Message.InteractiveMessage.ShopMessage shopStorefrontMessage = 4; + Message.InteractiveMessage.CollectionMessage collectionMessage = 5; + Message.InteractiveMessage.NativeFlowMessage nativeFlowMessage = 6; + } + message Body { + optional string text = 1; + } + + message CollectionMessage { + optional string bizJid = 1; + optional string id = 2; + optional int32 messageVersion = 3; + } + + message Footer { + optional string text = 1; + } + + message Header { + optional string title = 1; + optional string subtitle = 2; + optional bool hasMediaAttachment = 5; + oneof media { + Message.DocumentMessage documentMessage = 3; + Message.ImageMessage imageMessage = 4; + bytes jpegThumbnail = 6; + Message.VideoMessage videoMessage = 7; + } + } + + message NativeFlowMessage { + repeated NativeFlowButton buttons = 1; + optional string messageParamsJson = 2; + optional int32 messageVersion = 3; + message NativeFlowButton { + optional string name = 1; + optional string buttonParamsJson = 2; + } + + } + + message ShopMessage { + optional string id = 1; + optional Surface surface = 2; + optional int32 messageVersion = 3; + enum Surface { + UNKNOWN_SURFACE = 0; + FB = 1; + IG = 2; + WA = 3; + } + } + + } + + message InteractiveResponseMessage { + optional Body body = 1; + optional ContextInfo contextInfo = 15; + oneof interactiveResponseMessage { + Message.InteractiveResponseMessage.NativeFlowResponseMessage nativeFlowResponseMessage = 2; + } + message Body { + optional string text = 1; + } + + message NativeFlowResponseMessage { + optional string name = 1; + optional string paramsJson = 2; + optional int32 version = 3; + } + + } + + message InvoiceMessage { + optional string note = 1; + optional string token = 2; + optional AttachmentType attachmentType = 3; + optional string attachmentMimetype = 4; + optional bytes attachmentMediaKey = 5; + optional int64 attachmentMediaKeyTimestamp = 6; + optional bytes attachmentFileSha256 = 7; + optional bytes attachmentFileEncSha256 = 8; + optional string attachmentDirectPath = 9; + optional bytes attachmentJpegThumbnail = 10; + enum AttachmentType { + IMAGE = 0; + PDF = 1; + } + } + + message KeepInChatMessage { + optional MessageKey key = 1; + optional KeepType keepType = 2; + optional int64 timestampMs = 3; + } + + message ListMessage { + optional string title = 1; + optional string description = 2; + optional string buttonText = 3; + optional ListType listType = 4; + repeated Section sections = 5; + optional ProductListInfo productListInfo = 6; + optional string footerText = 7; + optional ContextInfo contextInfo = 8; + enum ListType { + UNKNOWN = 0; + SINGLE_SELECT = 1; + PRODUCT_LIST = 2; + } + message Product { + optional string productId = 1; + } + + message ProductListHeaderImage { + optional string productId = 1; + optional bytes jpegThumbnail = 2; + } + + message ProductListInfo { + repeated Message.ListMessage.ProductSection productSections = 1; + optional Message.ListMessage.ProductListHeaderImage headerImage = 2; + optional string businessOwnerJid = 3; + } + + message ProductSection { + optional string title = 1; + repeated Message.ListMessage.Product products = 2; + } + + message Row { + optional string title = 1; + optional string description = 2; + optional string rowId = 3; + } + + message Section { + optional string title = 1; + repeated Message.ListMessage.Row rows = 2; + } + + } + + message ListResponseMessage { + optional string title = 1; + optional ListType listType = 2; + optional SingleSelectReply singleSelectReply = 3; + optional ContextInfo contextInfo = 4; + optional string description = 5; + enum ListType { + UNKNOWN = 0; + SINGLE_SELECT = 1; + } + message SingleSelectReply { + optional string selectedRowId = 1; + } + + } + + message LiveLocationMessage { + optional double degreesLatitude = 1; + optional double degreesLongitude = 2; + optional uint32 accuracyInMeters = 3; + optional float speedInMps = 4; + optional uint32 degreesClockwiseFromMagneticNorth = 5; + optional string caption = 6; + optional int64 sequenceNumber = 7; + optional uint32 timeOffset = 8; + optional bytes jpegThumbnail = 16; + optional ContextInfo contextInfo = 17; + } + + message LocationMessage { + optional double degreesLatitude = 1; + optional double degreesLongitude = 2; + optional string name = 3; + optional string address = 4; + optional string url = 5; + optional bool isLive = 6; + optional uint32 accuracyInMeters = 7; + optional float speedInMps = 8; + optional uint32 degreesClockwiseFromMagneticNorth = 9; + optional string comment = 11; + optional bytes jpegThumbnail = 16; + optional ContextInfo contextInfo = 17; + } + + message OrderMessage { + optional string orderId = 1; + optional bytes thumbnail = 2; + optional int32 itemCount = 3; + optional OrderStatus status = 4; + optional OrderSurface surface = 5; + optional string message = 6; + optional string orderTitle = 7; + optional string sellerJid = 8; + optional string token = 9; + optional int64 totalAmount1000 = 10; + optional string totalCurrencyCode = 11; + optional ContextInfo contextInfo = 17; + enum OrderStatus { + INQUIRY = 1; + } + enum OrderSurface { + CATALOG = 1; + } + } + + message PaymentInviteMessage { + optional ServiceType serviceType = 1; + optional int64 expiryTimestamp = 2; + enum ServiceType { + UNKNOWN = 0; + FBPAY = 1; + NOVI = 2; + UPI = 3; + } + } + + message PeerDataOperationRequestMessage { + optional Message.PeerDataOperationRequestType peerDataOperationRequestType = 1; + repeated RequestStickerReupload requestStickerReupload = 2; + repeated RequestUrlPreview requestUrlPreview = 3; + message RequestStickerReupload { + optional string fileSha256 = 1; + } + + message RequestUrlPreview { + optional string url = 1; + } + + } + + message PeerDataOperationRequestResponseMessage { + optional Message.PeerDataOperationRequestType peerDataOperationRequestType = 1; + optional string stanzaId = 2; + repeated PeerDataOperationResult peerDataOperationResult = 3; + message PeerDataOperationResult { + optional MediaRetryNotification.ResultType mediaUploadResult = 1; + optional Message.StickerMessage stickerMessage = 2; + optional LinkPreviewResponse linkPreviewResponse = 3; + message LinkPreviewResponse { + optional string url = 1; + optional string title = 2; + optional string description = 3; + optional bytes thumbData = 4; + optional string canonicalUrl = 5; + optional string matchText = 6; + optional string previewType = 7; + } + + } + + } + + enum PeerDataOperationRequestType { + UPLOAD_STICKER = 0; + SEND_RECENT_STICKER_BOOTSTRAP = 1; + GENERATE_LINK_PREVIEW = 2; + } + message PollCreationMessage { + optional bytes encKey = 1; + optional string name = 2; + repeated Option options = 3; + optional uint32 selectableOptionsCount = 4; + optional ContextInfo contextInfo = 5; + message Option { + optional string optionName = 1; + } + + } + + message PollEncValue { + optional bytes encPayload = 1; + optional bytes encIv = 2; + } + + message PollUpdateMessage { + optional MessageKey pollCreationMessageKey = 1; + optional Message.PollEncValue vote = 2; + optional Message.PollUpdateMessageMetadata metadata = 3; + optional int64 senderTimestampMs = 4; + } + + message PollUpdateMessageMetadata { + } + + message PollVoteMessage { + repeated bytes selectedOptions = 1; + } + + message ProductMessage { + optional ProductSnapshot product = 1; + optional string businessOwnerJid = 2; + optional CatalogSnapshot catalog = 4; + optional string body = 5; + optional string footer = 6; + optional ContextInfo contextInfo = 17; + message CatalogSnapshot { + optional Message.ImageMessage catalogImage = 1; + optional string title = 2; + optional string description = 3; + } + + message ProductSnapshot { + optional Message.ImageMessage productImage = 1; + optional string productId = 2; + optional string title = 3; + optional string description = 4; + optional string currencyCode = 5; + optional int64 priceAmount1000 = 6; + optional string retailerId = 7; + optional string url = 8; + optional uint32 productImageCount = 9; + optional string firstImageId = 11; + optional int64 salePriceAmount1000 = 12; + } + + } + + message ProtocolMessage { + optional MessageKey key = 1; + optional Type type = 2; + optional uint32 ephemeralExpiration = 4; + optional int64 ephemeralSettingTimestamp = 5; + optional Message.HistorySyncNotification historySyncNotification = 6; + optional Message.AppStateSyncKeyShare appStateSyncKeyShare = 7; + optional Message.AppStateSyncKeyRequest appStateSyncKeyRequest = 8; + optional Message.InitialSecurityNotificationSettingSync initialSecurityNotificationSettingSync = 9; + optional Message.AppStateFatalExceptionNotification appStateFatalExceptionNotification = 10; + optional DisappearingMode disappearingMode = 11; + optional Message editedMessage = 14; + optional int64 timestampMs = 15; + optional Message.PeerDataOperationRequestMessage peerDataOperationRequestMessage = 16; + optional Message.PeerDataOperationRequestResponseMessage peerDataOperationRequestResponseMessage = 17; + enum Type { + REVOKE = 0; + EPHEMERAL_SETTING = 3; + EPHEMERAL_SYNC_RESPONSE = 4; + HISTORY_SYNC_NOTIFICATION = 5; + APP_STATE_SYNC_KEY_SHARE = 6; + APP_STATE_SYNC_KEY_REQUEST = 7; + MSG_FANOUT_BACKFILL_REQUEST = 8; + INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC = 9; + APP_STATE_FATAL_EXCEPTION_NOTIFICATION = 10; + SHARE_PHONE_NUMBER = 11; + MESSAGE_EDIT = 14; + PEER_DATA_OPERATION_REQUEST_MESSAGE = 16; + PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE = 17; + } + } + + message ReactionMessage { + optional MessageKey key = 1; + optional string text = 2; + optional string groupingKey = 3; + optional int64 senderTimestampMs = 4; + } + + message RequestPaymentMessage { + optional Message noteMessage = 4; + optional string currencyCodeIso4217 = 1; + optional uint64 amount1000 = 2; + optional string requestFrom = 3; + optional int64 expiryTimestamp = 5; + optional Money amount = 6; + optional PaymentBackground background = 7; + } + + message RequestPhoneNumberMessage { + optional ContextInfo contextInfo = 1; + } + + message SendPaymentMessage { + optional Message noteMessage = 2; + optional MessageKey requestMessageKey = 3; + optional PaymentBackground background = 4; + } + + message SenderKeyDistributionMessage { + optional string groupId = 1; + optional bytes axolotlSenderKeyDistributionMessage = 2; + } + + message StickerMessage { + optional string url = 1; + optional bytes fileSha256 = 2; + optional bytes fileEncSha256 = 3; + optional bytes mediaKey = 4; + optional string mimetype = 5; + optional uint32 height = 6; + optional uint32 width = 7; + optional string directPath = 8; + optional uint64 fileLength = 9; + optional int64 mediaKeyTimestamp = 10; + optional uint32 firstFrameLength = 11; + optional bytes firstFrameSidecar = 12; + optional bool isAnimated = 13; + optional bytes pngThumbnail = 16; + optional ContextInfo contextInfo = 17; + optional int64 stickerSentTs = 18; + optional bool isAvatar = 19; + } + + message StickerSyncRMRMessage { + repeated string filehash = 1; + optional string rmrSource = 2; + optional int64 requestTimestamp = 3; + } + + message TemplateButtonReplyMessage { + optional string selectedId = 1; + optional string selectedDisplayText = 2; + optional ContextInfo contextInfo = 3; + optional uint32 selectedIndex = 4; + } + + message TemplateMessage { + optional ContextInfo contextInfo = 3; + optional HydratedFourRowTemplate hydratedTemplate = 4; + optional string templateId = 9; + oneof format { + Message.TemplateMessage.FourRowTemplate fourRowTemplate = 1; + Message.TemplateMessage.HydratedFourRowTemplate hydratedFourRowTemplate = 2; + Message.InteractiveMessage interactiveMessageTemplate = 5; + } + message FourRowTemplate { + optional Message.HighlyStructuredMessage content = 6; + optional Message.HighlyStructuredMessage footer = 7; + repeated TemplateButton buttons = 8; + oneof title { + Message.DocumentMessage documentMessage = 1; + Message.HighlyStructuredMessage highlyStructuredMessage = 2; + Message.ImageMessage imageMessage = 3; + Message.VideoMessage videoMessage = 4; + Message.LocationMessage locationMessage = 5; + } + } + + message HydratedFourRowTemplate { + optional string hydratedContentText = 6; + optional string hydratedFooterText = 7; + repeated HydratedTemplateButton hydratedButtons = 8; + optional string templateId = 9; + oneof title { + Message.DocumentMessage documentMessage = 1; + string hydratedTitleText = 2; + Message.ImageMessage imageMessage = 3; + Message.VideoMessage videoMessage = 4; + Message.LocationMessage locationMessage = 5; + } + } + + } + + message VideoMessage { + optional string url = 1; + optional string mimetype = 2; + optional bytes fileSha256 = 3; + optional uint64 fileLength = 4; + optional uint32 seconds = 5; + optional bytes mediaKey = 6; + optional string caption = 7; + optional bool gifPlayback = 8; + optional uint32 height = 9; + optional uint32 width = 10; + optional bytes fileEncSha256 = 11; + repeated InteractiveAnnotation interactiveAnnotations = 12; + optional string directPath = 13; + optional int64 mediaKeyTimestamp = 14; + optional bytes jpegThumbnail = 16; + optional ContextInfo contextInfo = 17; + optional bytes streamingSidecar = 18; + optional Attribution gifAttribution = 19; + optional bool viewOnce = 20; + optional string thumbnailDirectPath = 21; + optional bytes thumbnailSha256 = 22; + optional bytes thumbnailEncSha256 = 23; + optional string staticUrl = 24; + enum Attribution { + NONE = 0; + GIPHY = 1; + TENOR = 2; + } + } + +} + +message MessageContextInfo { + optional DeviceListMetadata deviceListMetadata = 1; + optional int32 deviceListMetadataVersion = 2; + optional bytes messageSecret = 3; + optional bytes paddingBytes = 4; +} + +message MessageKey { + optional string remoteJid = 1; + optional bool fromMe = 2; + optional string id = 3; + optional string participant = 4; +} + +message Money { + optional int64 value = 1; + optional uint32 offset = 2; + optional string currencyCode = 3; +} + +message MsgOpaqueData { + optional string body = 1; + optional string caption = 3; + optional double lng = 5; + optional bool isLive = 6; + optional double lat = 7; + optional int32 paymentAmount1000 = 8; + optional string paymentNoteMsgBody = 9; + optional string canonicalUrl = 10; + optional string matchedText = 11; + optional string title = 12; + optional string description = 13; + optional bytes futureproofBuffer = 14; + optional string clientUrl = 15; + optional string loc = 16; + optional string pollName = 17; + repeated PollOption pollOptions = 18; + optional uint32 pollSelectableOptionsCount = 20; + optional bytes messageSecret = 21; + optional string originalSelfAuthor = 51; + optional int64 senderTimestampMs = 22; + optional string pollUpdateParentKey = 23; + optional PollEncValue encPollVote = 24; + message PollOption { + optional string name = 1; + } + +} + +message MsgRowOpaqueData { + optional MsgOpaqueData currentMsg = 1; + optional MsgOpaqueData quotedMsg = 2; +} + +message NoiseCertificate { + optional bytes details = 1; + optional bytes signature = 2; + message Details { + optional uint32 serial = 1; + optional string issuer = 2; + optional uint64 expires = 3; + optional string subject = 4; + optional bytes key = 5; + } + +} + +message NotificationMessageInfo { + optional MessageKey key = 1; + optional Message message = 2; + optional uint64 messageTimestamp = 3; + optional string participant = 4; +} + +message PastParticipant { + optional string userJid = 1; + optional LeaveReason leaveReason = 2; + optional uint64 leaveTs = 3; + enum LeaveReason { + LEFT = 0; + REMOVED = 1; + } +} + +message PastParticipants { + optional string groupJid = 1; + repeated PastParticipant pastParticipants = 2; +} + +message PaymentBackground { + optional string id = 1; + optional uint64 fileLength = 2; + optional uint32 width = 3; + optional uint32 height = 4; + optional string mimetype = 5; + optional fixed32 placeholderArgb = 6; + optional fixed32 textArgb = 7; + optional fixed32 subtextArgb = 8; + optional MediaData mediaData = 9; + optional Type type = 10; + message MediaData { + optional bytes mediaKey = 1; + optional int64 mediaKeyTimestamp = 2; + optional bytes fileSha256 = 3; + optional bytes fileEncSha256 = 4; + optional string directPath = 5; + } + + enum Type { + UNKNOWN = 0; + DEFAULT = 1; + } +} + +message PaymentInfo { + optional Currency currencyDeprecated = 1; + optional uint64 amount1000 = 2; + optional string receiverJid = 3; + optional Status status = 4; + optional uint64 transactionTimestamp = 5; + optional MessageKey requestMessageKey = 6; + optional uint64 expiryTimestamp = 7; + optional bool futureproofed = 8; + optional string currency = 9; + optional TxnStatus txnStatus = 10; + optional bool useNoviFiatFormat = 11; + optional Money primaryAmount = 12; + optional Money exchangeAmount = 13; + enum Currency { + UNKNOWN_CURRENCY = 0; + INR = 1; + } + enum Status { + UNKNOWN_STATUS = 0; + PROCESSING = 1; + SENT = 2; + NEED_TO_ACCEPT = 3; + COMPLETE = 4; + COULD_NOT_COMPLETE = 5; + REFUNDED = 6; + EXPIRED = 7; + REJECTED = 8; + CANCELLED = 9; + WAITING_FOR_PAYER = 10; + WAITING = 11; + } + enum TxnStatus { + UNKNOWN = 0; + PENDING_SETUP = 1; + PENDING_RECEIVER_SETUP = 2; + INIT = 3; + SUCCESS = 4; + COMPLETED = 5; + FAILED = 6; + FAILED_RISK = 7; + FAILED_PROCESSING = 8; + FAILED_RECEIVER_PROCESSING = 9; + FAILED_DA = 10; + FAILED_DA_FINAL = 11; + REFUNDED_TXN = 12; + REFUND_FAILED = 13; + REFUND_FAILED_PROCESSING = 14; + REFUND_FAILED_DA = 15; + EXPIRED_TXN = 16; + AUTH_CANCELED = 17; + AUTH_CANCEL_FAILED_PROCESSING = 18; + AUTH_CANCEL_FAILED = 19; + COLLECT_INIT = 20; + COLLECT_SUCCESS = 21; + COLLECT_FAILED = 22; + COLLECT_FAILED_RISK = 23; + COLLECT_REJECTED = 24; + COLLECT_EXPIRED = 25; + COLLECT_CANCELED = 26; + COLLECT_CANCELLING = 27; + IN_REVIEW = 28; + REVERSAL_SUCCESS = 29; + REVERSAL_PENDING = 30; + REFUND_PENDING = 31; + } +} + +message PendingKeyExchange { + optional uint32 sequence = 1; + optional bytes localBaseKey = 2; + optional bytes localBaseKeyPrivate = 3; + optional bytes localRatchetKey = 4; + optional bytes localRatchetKeyPrivate = 5; + optional bytes localIdentityKey = 7; + optional bytes localIdentityKeyPrivate = 8; +} + +message PendingPreKey { + optional uint32 preKeyId = 1; + optional int32 signedPreKeyId = 3; + optional bytes baseKey = 2; +} + +message PhotoChange { + optional bytes oldPhoto = 1; + optional bytes newPhoto = 2; + optional uint32 newPhotoId = 3; +} + +message Point { + optional int32 xDeprecated = 1; + optional int32 yDeprecated = 2; + optional double x = 3; + optional double y = 4; +} + +message PollAdditionalMetadata { + optional bool pollInvalidated = 1; +} + +message PollEncValue { + optional bytes encPayload = 1; + optional bytes encIv = 2; +} + +message PollUpdate { + optional MessageKey pollUpdateMessageKey = 1; + optional Message.PollVoteMessage vote = 2; + optional int64 senderTimestampMs = 3; +} + +message PreKeyRecordStructure { + optional uint32 id = 1; + optional bytes publicKey = 2; + optional bytes privateKey = 3; +} + +message Pushname { + optional string id = 1; + optional string pushname = 2; +} + +message Reaction { + optional MessageKey key = 1; + optional string text = 2; + optional string groupingKey = 3; + optional int64 senderTimestampMs = 4; + optional bool unread = 5; +} + +message RecentEmojiWeight { + optional string emoji = 1; + optional float weight = 2; +} + +message RecordStructure { + optional SessionStructure currentSession = 1; + repeated SessionStructure previousSessions = 2; +} + +message SenderChainKey { + optional uint32 iteration = 1; + optional bytes seed = 2; +} + +message SenderKeyRecordStructure { + repeated SenderKeyStateStructure senderKeyStates = 1; +} + +message SenderKeyStateStructure { + optional uint32 senderKeyId = 1; + optional SenderChainKey senderChainKey = 2; + optional SenderSigningKey senderSigningKey = 3; + repeated SenderMessageKey senderMessageKeys = 4; +} + +message SenderMessageKey { + optional uint32 iteration = 1; + optional bytes seed = 2; +} + +message SenderSigningKey { + optional bytes public = 1; + optional bytes private = 2; +} + +message ServerErrorReceipt { + optional string stanzaId = 1; +} + +message SessionStructure { + optional uint32 sessionVersion = 1; + optional bytes localIdentityPublic = 2; + optional bytes remoteIdentityPublic = 3; + optional bytes rootKey = 4; + optional uint32 previousCounter = 5; + optional Chain senderChain = 6; + repeated Chain receiverChains = 7; + optional PendingKeyExchange pendingKeyExchange = 8; + optional PendingPreKey pendingPreKey = 9; + optional uint32 remoteRegistrationId = 10; + optional uint32 localRegistrationId = 11; + optional bool needsRefresh = 12; + optional bytes aliceBaseKey = 13; +} + +message SignedPreKeyRecordStructure { + optional uint32 id = 1; + optional bytes publicKey = 2; + optional bytes privateKey = 3; + optional bytes signature = 4; + optional fixed64 timestamp = 5; +} + +message StatusPSA { + required uint64 campaignId = 44; + optional uint64 campaignExpirationTimestamp = 45; +} + +message StickerMetadata { + optional string url = 1; + optional bytes fileSha256 = 2; + optional bytes fileEncSha256 = 3; + optional bytes mediaKey = 4; + optional string mimetype = 5; + optional uint32 height = 6; + optional uint32 width = 7; + optional string directPath = 8; + optional uint64 fileLength = 9; + optional float weight = 10; + optional int64 lastStickerSentTs = 11; +} + +message SyncActionData { + optional bytes index = 1; + optional SyncActionValue value = 2; + optional bytes padding = 3; + optional int32 version = 4; +} + +message SyncActionValue { + optional int64 timestamp = 1; + optional StarAction starAction = 2; + optional ContactAction contactAction = 3; + optional MuteAction muteAction = 4; + optional PinAction pinAction = 5; + optional SecurityNotificationSetting securityNotificationSetting = 6; + optional PushNameSetting pushNameSetting = 7; + optional QuickReplyAction quickReplyAction = 8; + optional RecentEmojiWeightsAction recentEmojiWeightsAction = 11; + optional LabelEditAction labelEditAction = 14; + optional LabelAssociationAction labelAssociationAction = 15; + optional LocaleSetting localeSetting = 16; + optional ArchiveChatAction archiveChatAction = 17; + optional DeleteMessageForMeAction deleteMessageForMeAction = 18; + optional KeyExpiration keyExpiration = 19; + optional MarkChatAsReadAction markChatAsReadAction = 20; + optional ClearChatAction clearChatAction = 21; + optional DeleteChatAction deleteChatAction = 22; + optional UnarchiveChatsSetting unarchiveChatsSetting = 23; + optional PrimaryFeature primaryFeature = 24; + optional AndroidUnsupportedActions androidUnsupportedActions = 26; + optional AgentAction agentAction = 27; + optional SubscriptionAction subscriptionAction = 28; + optional UserStatusMuteAction userStatusMuteAction = 29; + optional TimeFormatAction timeFormatAction = 30; + optional NuxAction nuxAction = 31; + optional PrimaryVersionAction primaryVersionAction = 32; + optional StickerAction stickerAction = 33; + optional RemoveRecentStickerAction removeRecentStickerAction = 34; + optional ChatAssignmentAction chatAssignment = 35; + optional ChatAssignmentOpenedStatusAction chatAssignmentOpenedStatus = 36; + message AgentAction { + optional string name = 1; + optional int32 deviceID = 2; + optional bool isDeleted = 3; + } + + message AndroidUnsupportedActions { + optional bool allowed = 1; + } + + message ArchiveChatAction { + optional bool archived = 1; + optional SyncActionValue.SyncActionMessageRange messageRange = 2; + } + + message ChatAssignmentAction { + optional string deviceAgentID = 1; + } + + message ChatAssignmentOpenedStatusAction { + optional bool chatOpened = 1; + } + + message ClearChatAction { + optional SyncActionValue.SyncActionMessageRange messageRange = 1; + } + + message ContactAction { + optional string fullName = 1; + optional string firstName = 2; + optional string lidJid = 3; + } + + message DeleteChatAction { + optional SyncActionValue.SyncActionMessageRange messageRange = 1; + } + + message DeleteMessageForMeAction { + optional bool deleteMedia = 1; + optional int64 messageTimestamp = 2; + } + + message KeyExpiration { + optional int32 expiredKeyEpoch = 1; + } + + message LabelAssociationAction { + optional bool labeled = 1; + } + + message LabelEditAction { + optional string name = 1; + optional int32 color = 2; + optional int32 predefinedId = 3; + optional bool deleted = 4; + } + + message LocaleSetting { + optional string locale = 1; + } + + message MarkChatAsReadAction { + optional bool read = 1; + optional SyncActionValue.SyncActionMessageRange messageRange = 2; + } + + message MuteAction { + optional bool muted = 1; + optional int64 muteEndTimestamp = 2; + optional bool autoMuted = 3; + } + + message NuxAction { + optional bool acknowledged = 1; + } + + message PinAction { + optional bool pinned = 1; + } + + message PrimaryFeature { + repeated string flags = 1; + } + + message PrimaryVersionAction { + optional string version = 1; + } + + message PushNameSetting { + optional string name = 1; + } + + message QuickReplyAction { + optional string shortcut = 1; + optional string message = 2; + repeated string keywords = 3; + optional int32 count = 4; + optional bool deleted = 5; + } + + message RecentEmojiWeightsAction { + repeated RecentEmojiWeight weights = 1; + } + + message RemoveRecentStickerAction { + optional int64 lastStickerSentTs = 1; + } + + message SecurityNotificationSetting { + optional bool showNotification = 1; + } + + message StarAction { + optional bool starred = 1; + } + + message StickerAction { + optional string url = 1; + optional bytes fileEncSha256 = 2; + optional bytes mediaKey = 3; + optional string mimetype = 4; + optional uint32 height = 5; + optional uint32 width = 6; + optional string directPath = 7; + optional uint64 fileLength = 8; + optional bool isFavorite = 9; + optional uint32 deviceIdHint = 10; + } + + message SubscriptionAction { + optional bool isDeactivated = 1; + optional bool isAutoRenewing = 2; + optional int64 expirationDate = 3; + } + + message SyncActionMessage { + optional MessageKey key = 1; + optional int64 timestamp = 2; + } + + message SyncActionMessageRange { + optional int64 lastMessageTimestamp = 1; + optional int64 lastSystemMessageTimestamp = 2; + repeated SyncActionValue.SyncActionMessage messages = 3; + } + + message TimeFormatAction { + optional bool isTwentyFourHourFormatEnabled = 1; + } + + message UnarchiveChatsSetting { + optional bool unarchiveChats = 1; + } + + message UserStatusMuteAction { + optional bool muted = 1; + } + +} + +message SyncdIndex { + optional bytes blob = 1; +} + +message SyncdMutation { + optional SyncdOperation operation = 1; + optional SyncdRecord record = 2; + enum SyncdOperation { + SET = 0; + REMOVE = 1; + } +} + +message SyncdMutations { + repeated SyncdMutation mutations = 1; +} + +message SyncdPatch { + optional SyncdVersion version = 1; + repeated SyncdMutation mutations = 2; + optional ExternalBlobReference externalMutations = 3; + optional bytes snapshotMac = 4; + optional bytes patchMac = 5; + optional KeyId keyId = 6; + optional ExitCode exitCode = 7; + optional uint32 deviceIndex = 8; +} + +message SyncdRecord { + optional SyncdIndex index = 1; + optional SyncdValue value = 2; + optional KeyId keyId = 3; +} + +message SyncdSnapshot { + optional SyncdVersion version = 1; + repeated SyncdRecord records = 2; + optional bytes mac = 3; + optional KeyId keyId = 4; +} + +message SyncdValue { + optional bytes blob = 1; +} + +message SyncdVersion { + optional uint64 version = 1; +} + +message TemplateButton { + optional uint32 index = 4; + oneof button { + TemplateButton.QuickReplyButton quickReplyButton = 1; + TemplateButton.URLButton urlButton = 2; + TemplateButton.CallButton callButton = 3; + } + message CallButton { + optional Message.HighlyStructuredMessage displayText = 1; + optional Message.HighlyStructuredMessage phoneNumber = 2; + } + + message QuickReplyButton { + optional Message.HighlyStructuredMessage displayText = 1; + optional string id = 2; + } + + message URLButton { + optional Message.HighlyStructuredMessage displayText = 1; + optional Message.HighlyStructuredMessage url = 2; + } + +} + +message UserReceipt { + required string userJid = 1; + optional int64 receiptTimestamp = 2; + optional int64 readTimestamp = 3; + optional int64 playedTimestamp = 4; + repeated string pendingDeviceJid = 5; + repeated string deliveredDeviceJid = 6; +} + +message VerifiedNameCertificate { + optional bytes details = 1; + optional bytes signature = 2; + optional bytes serverSignature = 3; + message Details { + optional uint64 serial = 1; + optional string issuer = 2; + optional string verifiedName = 4; + repeated LocalizedName localizedNames = 8; + optional uint64 issueTime = 10; + } + +} + +message WallpaperSettings { + optional string filename = 1; + optional uint32 opacity = 2; +} + +message WebFeatures { + optional Flag labelsDisplay = 1; + optional Flag voipIndividualOutgoing = 2; + optional Flag groupsV3 = 3; + optional Flag groupsV3Create = 4; + optional Flag changeNumberV2 = 5; + optional Flag queryStatusV3Thumbnail = 6; + optional Flag liveLocations = 7; + optional Flag queryVname = 8; + optional Flag voipIndividualIncoming = 9; + optional Flag quickRepliesQuery = 10; + optional Flag payments = 11; + optional Flag stickerPackQuery = 12; + optional Flag liveLocationsFinal = 13; + optional Flag labelsEdit = 14; + optional Flag mediaUpload = 15; + optional Flag mediaUploadRichQuickReplies = 18; + optional Flag vnameV2 = 19; + optional Flag videoPlaybackUrl = 20; + optional Flag statusRanking = 21; + optional Flag voipIndividualVideo = 22; + optional Flag thirdPartyStickers = 23; + optional Flag frequentlyForwardedSetting = 24; + optional Flag groupsV4JoinPermission = 25; + optional Flag recentStickers = 26; + optional Flag catalog = 27; + optional Flag starredStickers = 28; + optional Flag voipGroupCall = 29; + optional Flag templateMessage = 30; + optional Flag templateMessageInteractivity = 31; + optional Flag ephemeralMessages = 32; + optional Flag e2ENotificationSync = 33; + optional Flag recentStickersV2 = 34; + optional Flag recentStickersV3 = 36; + optional Flag userNotice = 37; + optional Flag support = 39; + optional Flag groupUiiCleanup = 40; + optional Flag groupDogfoodingInternalOnly = 41; + optional Flag settingsSync = 42; + optional Flag archiveV2 = 43; + optional Flag ephemeralAllowGroupMembers = 44; + optional Flag ephemeral24HDuration = 45; + optional Flag mdForceUpgrade = 46; + optional Flag disappearingMode = 47; + optional Flag externalMdOptInAvailable = 48; + optional Flag noDeleteMessageTimeLimit = 49; + enum Flag { + NOT_STARTED = 0; + FORCE_UPGRADE = 1; + DEVELOPMENT = 2; + PRODUCTION = 3; + } +} + +message WebMessageInfo { + required MessageKey key = 1; + optional Message message = 2; + optional uint64 messageTimestamp = 3; + optional Status status = 4; + optional string participant = 5; + optional uint64 messageC2STimestamp = 6; + optional bool ignore = 16; + optional bool starred = 17; + optional bool broadcast = 18; + optional string pushName = 19; + optional bytes mediaCiphertextSha256 = 20; + optional bool multicast = 21; + optional bool urlText = 22; + optional bool urlNumber = 23; + optional StubType messageStubType = 24; + optional bool clearMedia = 25; + repeated string messageStubParameters = 26; + optional uint32 duration = 27; + repeated string labels = 28; + optional PaymentInfo paymentInfo = 29; + optional Message.LiveLocationMessage finalLiveLocation = 30; + optional PaymentInfo quotedPaymentInfo = 31; + optional uint64 ephemeralStartTimestamp = 32; + optional uint32 ephemeralDuration = 33; + optional bool ephemeralOffToOn = 34; + optional bool ephemeralOutOfSync = 35; + optional BizPrivacyStatus bizPrivacyStatus = 36; + optional string verifiedBizName = 37; + optional MediaData mediaData = 38; + optional PhotoChange photoChange = 39; + repeated UserReceipt userReceipt = 40; + repeated Reaction reactions = 41; + optional MediaData quotedStickerData = 42; + optional bytes futureproofData = 43; + optional StatusPSA statusPsa = 44; + repeated PollUpdate pollUpdates = 45; + optional PollAdditionalMetadata pollAdditionalMetadata = 46; + optional string agentId = 47; + optional bool statusAlreadyViewed = 48; + optional bytes messageSecret = 49; + optional KeepInChat keepInChat = 50; + optional string originalSelfAuthorUserJidString = 51; + optional uint64 revokeMessageTimestamp = 52; + enum BizPrivacyStatus { + E2EE = 0; + FB = 2; + BSP = 1; + BSP_AND_FB = 3; + } + enum Status { + ERROR = 0; + PENDING = 1; + SERVER_ACK = 2; + DELIVERY_ACK = 3; + READ = 4; + PLAYED = 5; + } + enum StubType { + UNKNOWN = 0; + REVOKE = 1; + CIPHERTEXT = 2; + FUTUREPROOF = 3; + NON_VERIFIED_TRANSITION = 4; + UNVERIFIED_TRANSITION = 5; + VERIFIED_TRANSITION = 6; + VERIFIED_LOW_UNKNOWN = 7; + VERIFIED_HIGH = 8; + VERIFIED_INITIAL_UNKNOWN = 9; + VERIFIED_INITIAL_LOW = 10; + VERIFIED_INITIAL_HIGH = 11; + VERIFIED_TRANSITION_ANY_TO_NONE = 12; + VERIFIED_TRANSITION_ANY_TO_HIGH = 13; + VERIFIED_TRANSITION_HIGH_TO_LOW = 14; + VERIFIED_TRANSITION_HIGH_TO_UNKNOWN = 15; + VERIFIED_TRANSITION_UNKNOWN_TO_LOW = 16; + VERIFIED_TRANSITION_LOW_TO_UNKNOWN = 17; + VERIFIED_TRANSITION_NONE_TO_LOW = 18; + VERIFIED_TRANSITION_NONE_TO_UNKNOWN = 19; + GROUP_CREATE = 20; + GROUP_CHANGE_SUBJECT = 21; + GROUP_CHANGE_ICON = 22; + GROUP_CHANGE_INVITE_LINK = 23; + GROUP_CHANGE_DESCRIPTION = 24; + GROUP_CHANGE_RESTRICT = 25; + GROUP_CHANGE_ANNOUNCE = 26; + GROUP_PARTICIPANT_ADD = 27; + GROUP_PARTICIPANT_REMOVE = 28; + GROUP_PARTICIPANT_PROMOTE = 29; + GROUP_PARTICIPANT_DEMOTE = 30; + GROUP_PARTICIPANT_INVITE = 31; + GROUP_PARTICIPANT_LEAVE = 32; + GROUP_PARTICIPANT_CHANGE_NUMBER = 33; + BROADCAST_CREATE = 34; + BROADCAST_ADD = 35; + BROADCAST_REMOVE = 36; + GENERIC_NOTIFICATION = 37; + E2E_IDENTITY_CHANGED = 38; + E2E_ENCRYPTED = 39; + CALL_MISSED_VOICE = 40; + CALL_MISSED_VIDEO = 41; + INDIVIDUAL_CHANGE_NUMBER = 42; + GROUP_DELETE = 43; + GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE = 44; + CALL_MISSED_GROUP_VOICE = 45; + CALL_MISSED_GROUP_VIDEO = 46; + PAYMENT_CIPHERTEXT = 47; + PAYMENT_FUTUREPROOF = 48; + PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED = 49; + PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED = 50; + PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED = 51; + PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP = 52; + PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP = 53; + PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER = 54; + PAYMENT_ACTION_SEND_PAYMENT_REMINDER = 55; + PAYMENT_ACTION_SEND_PAYMENT_INVITATION = 56; + PAYMENT_ACTION_REQUEST_DECLINED = 57; + PAYMENT_ACTION_REQUEST_EXPIRED = 58; + PAYMENT_ACTION_REQUEST_CANCELLED = 59; + BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM = 60; + BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP = 61; + BIZ_INTRO_TOP = 62; + BIZ_INTRO_BOTTOM = 63; + BIZ_NAME_CHANGE = 64; + BIZ_MOVE_TO_CONSUMER_APP = 65; + BIZ_TWO_TIER_MIGRATION_TOP = 66; + BIZ_TWO_TIER_MIGRATION_BOTTOM = 67; + OVERSIZED = 68; + GROUP_CHANGE_NO_FREQUENTLY_FORWARDED = 69; + GROUP_V4_ADD_INVITE_SENT = 70; + GROUP_PARTICIPANT_ADD_REQUEST_JOIN = 71; + CHANGE_EPHEMERAL_SETTING = 72; + E2E_DEVICE_CHANGED = 73; + VIEWED_ONCE = 74; + E2E_ENCRYPTED_NOW = 75; + BLUE_MSG_BSP_FB_TO_BSP_PREMISE = 76; + BLUE_MSG_BSP_FB_TO_SELF_FB = 77; + BLUE_MSG_BSP_FB_TO_SELF_PREMISE = 78; + BLUE_MSG_BSP_FB_UNVERIFIED = 79; + BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 80; + BLUE_MSG_BSP_FB_VERIFIED = 81; + BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 82; + BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE = 83; + BLUE_MSG_BSP_PREMISE_UNVERIFIED = 84; + BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 85; + BLUE_MSG_BSP_PREMISE_VERIFIED = 86; + BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 87; + BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED = 88; + BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED = 89; + BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED = 90; + BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED = 91; + BLUE_MSG_SELF_FB_TO_BSP_PREMISE = 92; + BLUE_MSG_SELF_FB_TO_SELF_PREMISE = 93; + BLUE_MSG_SELF_FB_UNVERIFIED = 94; + BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 95; + BLUE_MSG_SELF_FB_VERIFIED = 96; + BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 97; + BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE = 98; + BLUE_MSG_SELF_PREMISE_UNVERIFIED = 99; + BLUE_MSG_SELF_PREMISE_VERIFIED = 100; + BLUE_MSG_TO_BSP_FB = 101; + BLUE_MSG_TO_CONSUMER = 102; + BLUE_MSG_TO_SELF_FB = 103; + BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED = 104; + BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 105; + BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED = 106; + BLUE_MSG_UNVERIFIED_TO_VERIFIED = 107; + BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED = 108; + BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 109; + BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED = 110; + BLUE_MSG_VERIFIED_TO_UNVERIFIED = 111; + BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 112; + BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED = 113; + BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 114; + BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED = 115; + BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 116; + BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 117; + E2E_IDENTITY_UNAVAILABLE = 118; + GROUP_CREATING = 119; + GROUP_CREATE_FAILED = 120; + GROUP_BOUNCED = 121; + BLOCK_CONTACT = 122; + EPHEMERAL_SETTING_NOT_APPLIED = 123; + SYNC_FAILED = 124; + SYNCING = 125; + BIZ_PRIVACY_MODE_INIT_FB = 126; + BIZ_PRIVACY_MODE_INIT_BSP = 127; + BIZ_PRIVACY_MODE_TO_FB = 128; + BIZ_PRIVACY_MODE_TO_BSP = 129; + DISAPPEARING_MODE = 130; + E2E_DEVICE_FETCH_FAILED = 131; + ADMIN_REVOKE = 132; + GROUP_INVITE_LINK_GROWTH_LOCKED = 133; + COMMUNITY_LINK_PARENT_GROUP = 134; + COMMUNITY_LINK_SIBLING_GROUP = 135; + COMMUNITY_LINK_SUB_GROUP = 136; + COMMUNITY_UNLINK_PARENT_GROUP = 137; + COMMUNITY_UNLINK_SIBLING_GROUP = 138; + COMMUNITY_UNLINK_SUB_GROUP = 139; + GROUP_PARTICIPANT_ACCEPT = 140; + GROUP_PARTICIPANT_LINKED_GROUP_JOIN = 141; + COMMUNITY_CREATE = 142; + EPHEMERAL_KEEP_IN_CHAT = 143; + GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST = 144; + GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE = 145; + INTEGRITY_UNLINK_PARENT_GROUP = 146; + COMMUNITY_PARTICIPANT_PROMOTE = 147; + COMMUNITY_PARTICIPANT_DEMOTE = 148; + COMMUNITY_PARENT_GROUP_DELETED = 149; + COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL = 150; + GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP = 151; + MASKED_THREAD_CREATED = 152; + MASKED_THREAD_UNMASKED = 153; + BIZ_CHAT_ASSIGNMENT = 154; + CHAT_PSA = 155; + CHAT_POLL_CREATION_MESSAGE = 156; + CAG_MASKED_THREAD_CREATED = 157; + COMMUNITY_PARENT_GROUP_SUBJECT_CHANGED = 158; + CAG_INVITE_AUTO_ADD = 159; + BIZ_CHAT_ASSIGNMENT_UNASSIGN = 160; + CAG_INVITE_AUTO_JOINED = 161; + } +} + +message WebNotificationsInfo { + optional uint64 timestamp = 2; + optional uint32 unreadChats = 3; + optional uint32 notifyMessageCount = 4; + repeated WebMessageInfo notifyMessages = 5; +} diff --git a/whatsapp_addon/Baileys/WAProto/index.d.ts b/whatsapp_addon/Baileys/WAProto/index.d.ts new file mode 100644 index 0000000..70d2bdd --- /dev/null +++ b/whatsapp_addon/Baileys/WAProto/index.d.ts @@ -0,0 +1,27603 @@ +import * as $protobuf from "protobufjs"; +/** Namespace proto. */ +export namespace proto { + + /** Properties of a ADVDeviceIdentity. */ + interface IADVDeviceIdentity { + + /** ADVDeviceIdentity rawId */ + rawId?: (number|null); + + /** ADVDeviceIdentity timestamp */ + timestamp?: (number|Long|null); + + /** ADVDeviceIdentity keyIndex */ + keyIndex?: (number|null); + } + + /** Represents a ADVDeviceIdentity. */ + class ADVDeviceIdentity implements IADVDeviceIdentity { + + /** + * Constructs a new ADVDeviceIdentity. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IADVDeviceIdentity); + + /** ADVDeviceIdentity rawId. */ + public rawId: number; + + /** ADVDeviceIdentity timestamp. */ + public timestamp: (number|Long); + + /** ADVDeviceIdentity keyIndex. */ + public keyIndex: number; + + /** + * Creates a new ADVDeviceIdentity instance using the specified properties. + * @param [properties] Properties to set + * @returns ADVDeviceIdentity instance + */ + public static create(properties?: proto.IADVDeviceIdentity): proto.ADVDeviceIdentity; + + /** + * Encodes the specified ADVDeviceIdentity message. Does not implicitly {@link proto.ADVDeviceIdentity.verify|verify} messages. + * @param message ADVDeviceIdentity message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IADVDeviceIdentity, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ADVDeviceIdentity message, length delimited. Does not implicitly {@link proto.ADVDeviceIdentity.verify|verify} messages. + * @param message ADVDeviceIdentity message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IADVDeviceIdentity, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ADVDeviceIdentity message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ADVDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ADVDeviceIdentity; + + /** + * Decodes a ADVDeviceIdentity message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ADVDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ADVDeviceIdentity; + + /** + * Verifies a ADVDeviceIdentity message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ADVDeviceIdentity message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ADVDeviceIdentity + */ + public static fromObject(object: { [k: string]: any }): proto.ADVDeviceIdentity; + + /** + * Creates a plain object from a ADVDeviceIdentity message. Also converts values to other types if specified. + * @param message ADVDeviceIdentity + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ADVDeviceIdentity, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ADVDeviceIdentity to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ADVKeyIndexList. */ + interface IADVKeyIndexList { + + /** ADVKeyIndexList rawId */ + rawId?: (number|null); + + /** ADVKeyIndexList timestamp */ + timestamp?: (number|Long|null); + + /** ADVKeyIndexList currentIndex */ + currentIndex?: (number|null); + + /** ADVKeyIndexList validIndexes */ + validIndexes?: (number[]|null); + } + + /** Represents a ADVKeyIndexList. */ + class ADVKeyIndexList implements IADVKeyIndexList { + + /** + * Constructs a new ADVKeyIndexList. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IADVKeyIndexList); + + /** ADVKeyIndexList rawId. */ + public rawId: number; + + /** ADVKeyIndexList timestamp. */ + public timestamp: (number|Long); + + /** ADVKeyIndexList currentIndex. */ + public currentIndex: number; + + /** ADVKeyIndexList validIndexes. */ + public validIndexes: number[]; + + /** + * Creates a new ADVKeyIndexList instance using the specified properties. + * @param [properties] Properties to set + * @returns ADVKeyIndexList instance + */ + public static create(properties?: proto.IADVKeyIndexList): proto.ADVKeyIndexList; + + /** + * Encodes the specified ADVKeyIndexList message. Does not implicitly {@link proto.ADVKeyIndexList.verify|verify} messages. + * @param message ADVKeyIndexList message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IADVKeyIndexList, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ADVKeyIndexList message, length delimited. Does not implicitly {@link proto.ADVKeyIndexList.verify|verify} messages. + * @param message ADVKeyIndexList message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IADVKeyIndexList, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ADVKeyIndexList message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ADVKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ADVKeyIndexList; + + /** + * Decodes a ADVKeyIndexList message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ADVKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ADVKeyIndexList; + + /** + * Verifies a ADVKeyIndexList message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ADVKeyIndexList message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ADVKeyIndexList + */ + public static fromObject(object: { [k: string]: any }): proto.ADVKeyIndexList; + + /** + * Creates a plain object from a ADVKeyIndexList message. Also converts values to other types if specified. + * @param message ADVKeyIndexList + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ADVKeyIndexList, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ADVKeyIndexList to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ADVSignedDeviceIdentity. */ + interface IADVSignedDeviceIdentity { + + /** ADVSignedDeviceIdentity details */ + details?: (Uint8Array|null); + + /** ADVSignedDeviceIdentity accountSignatureKey */ + accountSignatureKey?: (Uint8Array|null); + + /** ADVSignedDeviceIdentity accountSignature */ + accountSignature?: (Uint8Array|null); + + /** ADVSignedDeviceIdentity deviceSignature */ + deviceSignature?: (Uint8Array|null); + } + + /** Represents a ADVSignedDeviceIdentity. */ + class ADVSignedDeviceIdentity implements IADVSignedDeviceIdentity { + + /** + * Constructs a new ADVSignedDeviceIdentity. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IADVSignedDeviceIdentity); + + /** ADVSignedDeviceIdentity details. */ + public details: Uint8Array; + + /** ADVSignedDeviceIdentity accountSignatureKey. */ + public accountSignatureKey: Uint8Array; + + /** ADVSignedDeviceIdentity accountSignature. */ + public accountSignature: Uint8Array; + + /** ADVSignedDeviceIdentity deviceSignature. */ + public deviceSignature: Uint8Array; + + /** + * Creates a new ADVSignedDeviceIdentity instance using the specified properties. + * @param [properties] Properties to set + * @returns ADVSignedDeviceIdentity instance + */ + public static create(properties?: proto.IADVSignedDeviceIdentity): proto.ADVSignedDeviceIdentity; + + /** + * Encodes the specified ADVSignedDeviceIdentity message. Does not implicitly {@link proto.ADVSignedDeviceIdentity.verify|verify} messages. + * @param message ADVSignedDeviceIdentity message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IADVSignedDeviceIdentity, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ADVSignedDeviceIdentity message, length delimited. Does not implicitly {@link proto.ADVSignedDeviceIdentity.verify|verify} messages. + * @param message ADVSignedDeviceIdentity message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IADVSignedDeviceIdentity, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ADVSignedDeviceIdentity message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ADVSignedDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ADVSignedDeviceIdentity; + + /** + * Decodes a ADVSignedDeviceIdentity message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ADVSignedDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ADVSignedDeviceIdentity; + + /** + * Verifies a ADVSignedDeviceIdentity message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ADVSignedDeviceIdentity message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ADVSignedDeviceIdentity + */ + public static fromObject(object: { [k: string]: any }): proto.ADVSignedDeviceIdentity; + + /** + * Creates a plain object from a ADVSignedDeviceIdentity message. Also converts values to other types if specified. + * @param message ADVSignedDeviceIdentity + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ADVSignedDeviceIdentity, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ADVSignedDeviceIdentity to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ADVSignedDeviceIdentityHMAC. */ + interface IADVSignedDeviceIdentityHMAC { + + /** ADVSignedDeviceIdentityHMAC details */ + details?: (Uint8Array|null); + + /** ADVSignedDeviceIdentityHMAC hmac */ + hmac?: (Uint8Array|null); + } + + /** Represents a ADVSignedDeviceIdentityHMAC. */ + class ADVSignedDeviceIdentityHMAC implements IADVSignedDeviceIdentityHMAC { + + /** + * Constructs a new ADVSignedDeviceIdentityHMAC. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IADVSignedDeviceIdentityHMAC); + + /** ADVSignedDeviceIdentityHMAC details. */ + public details: Uint8Array; + + /** ADVSignedDeviceIdentityHMAC hmac. */ + public hmac: Uint8Array; + + /** + * Creates a new ADVSignedDeviceIdentityHMAC instance using the specified properties. + * @param [properties] Properties to set + * @returns ADVSignedDeviceIdentityHMAC instance + */ + public static create(properties?: proto.IADVSignedDeviceIdentityHMAC): proto.ADVSignedDeviceIdentityHMAC; + + /** + * Encodes the specified ADVSignedDeviceIdentityHMAC message. Does not implicitly {@link proto.ADVSignedDeviceIdentityHMAC.verify|verify} messages. + * @param message ADVSignedDeviceIdentityHMAC message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IADVSignedDeviceIdentityHMAC, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ADVSignedDeviceIdentityHMAC message, length delimited. Does not implicitly {@link proto.ADVSignedDeviceIdentityHMAC.verify|verify} messages. + * @param message ADVSignedDeviceIdentityHMAC message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IADVSignedDeviceIdentityHMAC, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ADVSignedDeviceIdentityHMAC message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ADVSignedDeviceIdentityHMAC + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ADVSignedDeviceIdentityHMAC; + + /** + * Decodes a ADVSignedDeviceIdentityHMAC message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ADVSignedDeviceIdentityHMAC + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ADVSignedDeviceIdentityHMAC; + + /** + * Verifies a ADVSignedDeviceIdentityHMAC message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ADVSignedDeviceIdentityHMAC message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ADVSignedDeviceIdentityHMAC + */ + public static fromObject(object: { [k: string]: any }): proto.ADVSignedDeviceIdentityHMAC; + + /** + * Creates a plain object from a ADVSignedDeviceIdentityHMAC message. Also converts values to other types if specified. + * @param message ADVSignedDeviceIdentityHMAC + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ADVSignedDeviceIdentityHMAC, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ADVSignedDeviceIdentityHMAC to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ADVSignedKeyIndexList. */ + interface IADVSignedKeyIndexList { + + /** ADVSignedKeyIndexList details */ + details?: (Uint8Array|null); + + /** ADVSignedKeyIndexList accountSignature */ + accountSignature?: (Uint8Array|null); + } + + /** Represents a ADVSignedKeyIndexList. */ + class ADVSignedKeyIndexList implements IADVSignedKeyIndexList { + + /** + * Constructs a new ADVSignedKeyIndexList. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IADVSignedKeyIndexList); + + /** ADVSignedKeyIndexList details. */ + public details: Uint8Array; + + /** ADVSignedKeyIndexList accountSignature. */ + public accountSignature: Uint8Array; + + /** + * Creates a new ADVSignedKeyIndexList instance using the specified properties. + * @param [properties] Properties to set + * @returns ADVSignedKeyIndexList instance + */ + public static create(properties?: proto.IADVSignedKeyIndexList): proto.ADVSignedKeyIndexList; + + /** + * Encodes the specified ADVSignedKeyIndexList message. Does not implicitly {@link proto.ADVSignedKeyIndexList.verify|verify} messages. + * @param message ADVSignedKeyIndexList message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IADVSignedKeyIndexList, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ADVSignedKeyIndexList message, length delimited. Does not implicitly {@link proto.ADVSignedKeyIndexList.verify|verify} messages. + * @param message ADVSignedKeyIndexList message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IADVSignedKeyIndexList, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ADVSignedKeyIndexList message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ADVSignedKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ADVSignedKeyIndexList; + + /** + * Decodes a ADVSignedKeyIndexList message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ADVSignedKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ADVSignedKeyIndexList; + + /** + * Verifies a ADVSignedKeyIndexList message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ADVSignedKeyIndexList message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ADVSignedKeyIndexList + */ + public static fromObject(object: { [k: string]: any }): proto.ADVSignedKeyIndexList; + + /** + * Creates a plain object from a ADVSignedKeyIndexList message. Also converts values to other types if specified. + * @param message ADVSignedKeyIndexList + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ADVSignedKeyIndexList, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ADVSignedKeyIndexList to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an ActionLink. */ + interface IActionLink { + + /** ActionLink url */ + url?: (string|null); + + /** ActionLink buttonTitle */ + buttonTitle?: (string|null); + } + + /** Represents an ActionLink. */ + class ActionLink implements IActionLink { + + /** + * Constructs a new ActionLink. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IActionLink); + + /** ActionLink url. */ + public url: string; + + /** ActionLink buttonTitle. */ + public buttonTitle: string; + + /** + * Creates a new ActionLink instance using the specified properties. + * @param [properties] Properties to set + * @returns ActionLink instance + */ + public static create(properties?: proto.IActionLink): proto.ActionLink; + + /** + * Encodes the specified ActionLink message. Does not implicitly {@link proto.ActionLink.verify|verify} messages. + * @param message ActionLink message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IActionLink, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ActionLink message, length delimited. Does not implicitly {@link proto.ActionLink.verify|verify} messages. + * @param message ActionLink message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IActionLink, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an ActionLink message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ActionLink + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ActionLink; + + /** + * Decodes an ActionLink message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ActionLink + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ActionLink; + + /** + * Verifies an ActionLink message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an ActionLink message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ActionLink + */ + public static fromObject(object: { [k: string]: any }): proto.ActionLink; + + /** + * Creates a plain object from an ActionLink message. Also converts values to other types if specified. + * @param message ActionLink + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ActionLink, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ActionLink to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AutoDownloadSettings. */ + interface IAutoDownloadSettings { + + /** AutoDownloadSettings downloadImages */ + downloadImages?: (boolean|null); + + /** AutoDownloadSettings downloadAudio */ + downloadAudio?: (boolean|null); + + /** AutoDownloadSettings downloadVideo */ + downloadVideo?: (boolean|null); + + /** AutoDownloadSettings downloadDocuments */ + downloadDocuments?: (boolean|null); + } + + /** Represents an AutoDownloadSettings. */ + class AutoDownloadSettings implements IAutoDownloadSettings { + + /** + * Constructs a new AutoDownloadSettings. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IAutoDownloadSettings); + + /** AutoDownloadSettings downloadImages. */ + public downloadImages: boolean; + + /** AutoDownloadSettings downloadAudio. */ + public downloadAudio: boolean; + + /** AutoDownloadSettings downloadVideo. */ + public downloadVideo: boolean; + + /** AutoDownloadSettings downloadDocuments. */ + public downloadDocuments: boolean; + + /** + * Creates a new AutoDownloadSettings instance using the specified properties. + * @param [properties] Properties to set + * @returns AutoDownloadSettings instance + */ + public static create(properties?: proto.IAutoDownloadSettings): proto.AutoDownloadSettings; + + /** + * Encodes the specified AutoDownloadSettings message. Does not implicitly {@link proto.AutoDownloadSettings.verify|verify} messages. + * @param message AutoDownloadSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IAutoDownloadSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AutoDownloadSettings message, length delimited. Does not implicitly {@link proto.AutoDownloadSettings.verify|verify} messages. + * @param message AutoDownloadSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IAutoDownloadSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AutoDownloadSettings message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AutoDownloadSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.AutoDownloadSettings; + + /** + * Decodes an AutoDownloadSettings message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AutoDownloadSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.AutoDownloadSettings; + + /** + * Verifies an AutoDownloadSettings message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AutoDownloadSettings message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AutoDownloadSettings + */ + public static fromObject(object: { [k: string]: any }): proto.AutoDownloadSettings; + + /** + * Creates a plain object from an AutoDownloadSettings message. Also converts values to other types if specified. + * @param message AutoDownloadSettings + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.AutoDownloadSettings, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AutoDownloadSettings to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AvatarUserSettings. */ + interface IAvatarUserSettings { + + /** AvatarUserSettings fbid */ + fbid?: (string|null); + + /** AvatarUserSettings password */ + password?: (string|null); + } + + /** Represents an AvatarUserSettings. */ + class AvatarUserSettings implements IAvatarUserSettings { + + /** + * Constructs a new AvatarUserSettings. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IAvatarUserSettings); + + /** AvatarUserSettings fbid. */ + public fbid: string; + + /** AvatarUserSettings password. */ + public password: string; + + /** + * Creates a new AvatarUserSettings instance using the specified properties. + * @param [properties] Properties to set + * @returns AvatarUserSettings instance + */ + public static create(properties?: proto.IAvatarUserSettings): proto.AvatarUserSettings; + + /** + * Encodes the specified AvatarUserSettings message. Does not implicitly {@link proto.AvatarUserSettings.verify|verify} messages. + * @param message AvatarUserSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IAvatarUserSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AvatarUserSettings message, length delimited. Does not implicitly {@link proto.AvatarUserSettings.verify|verify} messages. + * @param message AvatarUserSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IAvatarUserSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AvatarUserSettings message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AvatarUserSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.AvatarUserSettings; + + /** + * Decodes an AvatarUserSettings message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AvatarUserSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.AvatarUserSettings; + + /** + * Verifies an AvatarUserSettings message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AvatarUserSettings message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AvatarUserSettings + */ + public static fromObject(object: { [k: string]: any }): proto.AvatarUserSettings; + + /** + * Creates a plain object from an AvatarUserSettings message. Also converts values to other types if specified. + * @param message AvatarUserSettings + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.AvatarUserSettings, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AvatarUserSettings to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a BizAccountLinkInfo. */ + interface IBizAccountLinkInfo { + + /** BizAccountLinkInfo whatsappBizAcctFbid */ + whatsappBizAcctFbid?: (number|Long|null); + + /** BizAccountLinkInfo whatsappAcctNumber */ + whatsappAcctNumber?: (string|null); + + /** BizAccountLinkInfo issueTime */ + issueTime?: (number|Long|null); + + /** BizAccountLinkInfo hostStorage */ + hostStorage?: (proto.BizAccountLinkInfo.HostStorageType|null); + + /** BizAccountLinkInfo accountType */ + accountType?: (proto.BizAccountLinkInfo.AccountType|null); + } + + /** Represents a BizAccountLinkInfo. */ + class BizAccountLinkInfo implements IBizAccountLinkInfo { + + /** + * Constructs a new BizAccountLinkInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IBizAccountLinkInfo); + + /** BizAccountLinkInfo whatsappBizAcctFbid. */ + public whatsappBizAcctFbid: (number|Long); + + /** BizAccountLinkInfo whatsappAcctNumber. */ + public whatsappAcctNumber: string; + + /** BizAccountLinkInfo issueTime. */ + public issueTime: (number|Long); + + /** BizAccountLinkInfo hostStorage. */ + public hostStorage: proto.BizAccountLinkInfo.HostStorageType; + + /** BizAccountLinkInfo accountType. */ + public accountType: proto.BizAccountLinkInfo.AccountType; + + /** + * Creates a new BizAccountLinkInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns BizAccountLinkInfo instance + */ + public static create(properties?: proto.IBizAccountLinkInfo): proto.BizAccountLinkInfo; + + /** + * Encodes the specified BizAccountLinkInfo message. Does not implicitly {@link proto.BizAccountLinkInfo.verify|verify} messages. + * @param message BizAccountLinkInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IBizAccountLinkInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified BizAccountLinkInfo message, length delimited. Does not implicitly {@link proto.BizAccountLinkInfo.verify|verify} messages. + * @param message BizAccountLinkInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IBizAccountLinkInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a BizAccountLinkInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns BizAccountLinkInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.BizAccountLinkInfo; + + /** + * Decodes a BizAccountLinkInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns BizAccountLinkInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.BizAccountLinkInfo; + + /** + * Verifies a BizAccountLinkInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a BizAccountLinkInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns BizAccountLinkInfo + */ + public static fromObject(object: { [k: string]: any }): proto.BizAccountLinkInfo; + + /** + * Creates a plain object from a BizAccountLinkInfo message. Also converts values to other types if specified. + * @param message BizAccountLinkInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.BizAccountLinkInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this BizAccountLinkInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace BizAccountLinkInfo { + + /** AccountType enum. */ + enum AccountType { + ENTERPRISE = 0 + } + + /** HostStorageType enum. */ + enum HostStorageType { + ON_PREMISE = 0, + FACEBOOK = 1 + } + } + + /** Properties of a BizAccountPayload. */ + interface IBizAccountPayload { + + /** BizAccountPayload vnameCert */ + vnameCert?: (proto.IVerifiedNameCertificate|null); + + /** BizAccountPayload bizAcctLinkInfo */ + bizAcctLinkInfo?: (Uint8Array|null); + } + + /** Represents a BizAccountPayload. */ + class BizAccountPayload implements IBizAccountPayload { + + /** + * Constructs a new BizAccountPayload. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IBizAccountPayload); + + /** BizAccountPayload vnameCert. */ + public vnameCert?: (proto.IVerifiedNameCertificate|null); + + /** BizAccountPayload bizAcctLinkInfo. */ + public bizAcctLinkInfo: Uint8Array; + + /** + * Creates a new BizAccountPayload instance using the specified properties. + * @param [properties] Properties to set + * @returns BizAccountPayload instance + */ + public static create(properties?: proto.IBizAccountPayload): proto.BizAccountPayload; + + /** + * Encodes the specified BizAccountPayload message. Does not implicitly {@link proto.BizAccountPayload.verify|verify} messages. + * @param message BizAccountPayload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IBizAccountPayload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified BizAccountPayload message, length delimited. Does not implicitly {@link proto.BizAccountPayload.verify|verify} messages. + * @param message BizAccountPayload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IBizAccountPayload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a BizAccountPayload message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns BizAccountPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.BizAccountPayload; + + /** + * Decodes a BizAccountPayload message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns BizAccountPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.BizAccountPayload; + + /** + * Verifies a BizAccountPayload message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a BizAccountPayload message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns BizAccountPayload + */ + public static fromObject(object: { [k: string]: any }): proto.BizAccountPayload; + + /** + * Creates a plain object from a BizAccountPayload message. Also converts values to other types if specified. + * @param message BizAccountPayload + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.BizAccountPayload, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this BizAccountPayload to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a BizIdentityInfo. */ + interface IBizIdentityInfo { + + /** BizIdentityInfo vlevel */ + vlevel?: (proto.BizIdentityInfo.VerifiedLevelValue|null); + + /** BizIdentityInfo vnameCert */ + vnameCert?: (proto.IVerifiedNameCertificate|null); + + /** BizIdentityInfo signed */ + signed?: (boolean|null); + + /** BizIdentityInfo revoked */ + revoked?: (boolean|null); + + /** BizIdentityInfo hostStorage */ + hostStorage?: (proto.BizIdentityInfo.HostStorageType|null); + + /** BizIdentityInfo actualActors */ + actualActors?: (proto.BizIdentityInfo.ActualActorsType|null); + + /** BizIdentityInfo privacyModeTs */ + privacyModeTs?: (number|Long|null); + + /** BizIdentityInfo featureControls */ + featureControls?: (number|Long|null); + } + + /** Represents a BizIdentityInfo. */ + class BizIdentityInfo implements IBizIdentityInfo { + + /** + * Constructs a new BizIdentityInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IBizIdentityInfo); + + /** BizIdentityInfo vlevel. */ + public vlevel: proto.BizIdentityInfo.VerifiedLevelValue; + + /** BizIdentityInfo vnameCert. */ + public vnameCert?: (proto.IVerifiedNameCertificate|null); + + /** BizIdentityInfo signed. */ + public signed: boolean; + + /** BizIdentityInfo revoked. */ + public revoked: boolean; + + /** BizIdentityInfo hostStorage. */ + public hostStorage: proto.BizIdentityInfo.HostStorageType; + + /** BizIdentityInfo actualActors. */ + public actualActors: proto.BizIdentityInfo.ActualActorsType; + + /** BizIdentityInfo privacyModeTs. */ + public privacyModeTs: (number|Long); + + /** BizIdentityInfo featureControls. */ + public featureControls: (number|Long); + + /** + * Creates a new BizIdentityInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns BizIdentityInfo instance + */ + public static create(properties?: proto.IBizIdentityInfo): proto.BizIdentityInfo; + + /** + * Encodes the specified BizIdentityInfo message. Does not implicitly {@link proto.BizIdentityInfo.verify|verify} messages. + * @param message BizIdentityInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IBizIdentityInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified BizIdentityInfo message, length delimited. Does not implicitly {@link proto.BizIdentityInfo.verify|verify} messages. + * @param message BizIdentityInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IBizIdentityInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a BizIdentityInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns BizIdentityInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.BizIdentityInfo; + + /** + * Decodes a BizIdentityInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns BizIdentityInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.BizIdentityInfo; + + /** + * Verifies a BizIdentityInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a BizIdentityInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns BizIdentityInfo + */ + public static fromObject(object: { [k: string]: any }): proto.BizIdentityInfo; + + /** + * Creates a plain object from a BizIdentityInfo message. Also converts values to other types if specified. + * @param message BizIdentityInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.BizIdentityInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this BizIdentityInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace BizIdentityInfo { + + /** ActualActorsType enum. */ + enum ActualActorsType { + SELF = 0, + BSP = 1 + } + + /** HostStorageType enum. */ + enum HostStorageType { + ON_PREMISE = 0, + FACEBOOK = 1 + } + + /** VerifiedLevelValue enum. */ + enum VerifiedLevelValue { + UNKNOWN = 0, + LOW = 1, + HIGH = 2 + } + } + + /** Properties of a CertChain. */ + interface ICertChain { + + /** CertChain leaf */ + leaf?: (proto.CertChain.INoiseCertificate|null); + + /** CertChain intermediate */ + intermediate?: (proto.CertChain.INoiseCertificate|null); + } + + /** Represents a CertChain. */ + class CertChain implements ICertChain { + + /** + * Constructs a new CertChain. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ICertChain); + + /** CertChain leaf. */ + public leaf?: (proto.CertChain.INoiseCertificate|null); + + /** CertChain intermediate. */ + public intermediate?: (proto.CertChain.INoiseCertificate|null); + + /** + * Creates a new CertChain instance using the specified properties. + * @param [properties] Properties to set + * @returns CertChain instance + */ + public static create(properties?: proto.ICertChain): proto.CertChain; + + /** + * Encodes the specified CertChain message. Does not implicitly {@link proto.CertChain.verify|verify} messages. + * @param message CertChain message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ICertChain, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CertChain message, length delimited. Does not implicitly {@link proto.CertChain.verify|verify} messages. + * @param message CertChain message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ICertChain, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CertChain message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CertChain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.CertChain; + + /** + * Decodes a CertChain message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CertChain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.CertChain; + + /** + * Verifies a CertChain message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CertChain message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CertChain + */ + public static fromObject(object: { [k: string]: any }): proto.CertChain; + + /** + * Creates a plain object from a CertChain message. Also converts values to other types if specified. + * @param message CertChain + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.CertChain, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CertChain to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace CertChain { + + /** Properties of a NoiseCertificate. */ + interface INoiseCertificate { + + /** NoiseCertificate details */ + details?: (Uint8Array|null); + + /** NoiseCertificate signature */ + signature?: (Uint8Array|null); + } + + /** Represents a NoiseCertificate. */ + class NoiseCertificate implements INoiseCertificate { + + /** + * Constructs a new NoiseCertificate. + * @param [properties] Properties to set + */ + constructor(properties?: proto.CertChain.INoiseCertificate); + + /** NoiseCertificate details. */ + public details: Uint8Array; + + /** NoiseCertificate signature. */ + public signature: Uint8Array; + + /** + * Creates a new NoiseCertificate instance using the specified properties. + * @param [properties] Properties to set + * @returns NoiseCertificate instance + */ + public static create(properties?: proto.CertChain.INoiseCertificate): proto.CertChain.NoiseCertificate; + + /** + * Encodes the specified NoiseCertificate message. Does not implicitly {@link proto.CertChain.NoiseCertificate.verify|verify} messages. + * @param message NoiseCertificate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.CertChain.INoiseCertificate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NoiseCertificate message, length delimited. Does not implicitly {@link proto.CertChain.NoiseCertificate.verify|verify} messages. + * @param message NoiseCertificate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.CertChain.INoiseCertificate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.CertChain.NoiseCertificate; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.CertChain.NoiseCertificate; + + /** + * Verifies a NoiseCertificate message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NoiseCertificate message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NoiseCertificate + */ + public static fromObject(object: { [k: string]: any }): proto.CertChain.NoiseCertificate; + + /** + * Creates a plain object from a NoiseCertificate message. Also converts values to other types if specified. + * @param message NoiseCertificate + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.CertChain.NoiseCertificate, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NoiseCertificate to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace NoiseCertificate { + + /** Properties of a Details. */ + interface IDetails { + + /** Details serial */ + serial?: (number|null); + + /** Details issuerSerial */ + issuerSerial?: (number|null); + + /** Details key */ + key?: (Uint8Array|null); + + /** Details notBefore */ + notBefore?: (number|Long|null); + + /** Details notAfter */ + notAfter?: (number|Long|null); + } + + /** Represents a Details. */ + class Details implements IDetails { + + /** + * Constructs a new Details. + * @param [properties] Properties to set + */ + constructor(properties?: proto.CertChain.NoiseCertificate.IDetails); + + /** Details serial. */ + public serial: number; + + /** Details issuerSerial. */ + public issuerSerial: number; + + /** Details key. */ + public key: Uint8Array; + + /** Details notBefore. */ + public notBefore: (number|Long); + + /** Details notAfter. */ + public notAfter: (number|Long); + + /** + * Creates a new Details instance using the specified properties. + * @param [properties] Properties to set + * @returns Details instance + */ + public static create(properties?: proto.CertChain.NoiseCertificate.IDetails): proto.CertChain.NoiseCertificate.Details; + + /** + * Encodes the specified Details message. Does not implicitly {@link proto.CertChain.NoiseCertificate.Details.verify|verify} messages. + * @param message Details message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.CertChain.NoiseCertificate.IDetails, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Details message, length delimited. Does not implicitly {@link proto.CertChain.NoiseCertificate.Details.verify|verify} messages. + * @param message Details message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.CertChain.NoiseCertificate.IDetails, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Details message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.CertChain.NoiseCertificate.Details; + + /** + * Decodes a Details message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.CertChain.NoiseCertificate.Details; + + /** + * Verifies a Details message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Details message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Details + */ + public static fromObject(object: { [k: string]: any }): proto.CertChain.NoiseCertificate.Details; + + /** + * Creates a plain object from a Details message. Also converts values to other types if specified. + * @param message Details + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.CertChain.NoiseCertificate.Details, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Details to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + } + + /** Properties of a Chain. */ + interface IChain { + + /** Chain senderRatchetKey */ + senderRatchetKey?: (Uint8Array|null); + + /** Chain senderRatchetKeyPrivate */ + senderRatchetKeyPrivate?: (Uint8Array|null); + + /** Chain chainKey */ + chainKey?: (proto.IChainKey|null); + + /** Chain messageKeys */ + messageKeys?: (proto.IMessageKey[]|null); + } + + /** Represents a Chain. */ + class Chain implements IChain { + + /** + * Constructs a new Chain. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IChain); + + /** Chain senderRatchetKey. */ + public senderRatchetKey: Uint8Array; + + /** Chain senderRatchetKeyPrivate. */ + public senderRatchetKeyPrivate: Uint8Array; + + /** Chain chainKey. */ + public chainKey?: (proto.IChainKey|null); + + /** Chain messageKeys. */ + public messageKeys: proto.IMessageKey[]; + + /** + * Creates a new Chain instance using the specified properties. + * @param [properties] Properties to set + * @returns Chain instance + */ + public static create(properties?: proto.IChain): proto.Chain; + + /** + * Encodes the specified Chain message. Does not implicitly {@link proto.Chain.verify|verify} messages. + * @param message Chain message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IChain, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Chain message, length delimited. Does not implicitly {@link proto.Chain.verify|verify} messages. + * @param message Chain message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IChain, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Chain message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Chain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Chain; + + /** + * Decodes a Chain message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Chain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Chain; + + /** + * Verifies a Chain message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Chain message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Chain + */ + public static fromObject(object: { [k: string]: any }): proto.Chain; + + /** + * Creates a plain object from a Chain message. Also converts values to other types if specified. + * @param message Chain + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Chain, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Chain to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ChainKey. */ + interface IChainKey { + + /** ChainKey index */ + index?: (number|null); + + /** ChainKey key */ + key?: (Uint8Array|null); + } + + /** Represents a ChainKey. */ + class ChainKey implements IChainKey { + + /** + * Constructs a new ChainKey. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IChainKey); + + /** ChainKey index. */ + public index: number; + + /** ChainKey key. */ + public key: Uint8Array; + + /** + * Creates a new ChainKey instance using the specified properties. + * @param [properties] Properties to set + * @returns ChainKey instance + */ + public static create(properties?: proto.IChainKey): proto.ChainKey; + + /** + * Encodes the specified ChainKey message. Does not implicitly {@link proto.ChainKey.verify|verify} messages. + * @param message ChainKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IChainKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ChainKey message, length delimited. Does not implicitly {@link proto.ChainKey.verify|verify} messages. + * @param message ChainKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IChainKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ChainKey message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ChainKey; + + /** + * Decodes a ChainKey message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ChainKey; + + /** + * Verifies a ChainKey message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ChainKey message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ChainKey + */ + public static fromObject(object: { [k: string]: any }): proto.ChainKey; + + /** + * Creates a plain object from a ChainKey message. Also converts values to other types if specified. + * @param message ChainKey + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ChainKey, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ChainKey to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ClientPayload. */ + interface IClientPayload { + + /** ClientPayload username */ + username?: (number|Long|null); + + /** ClientPayload passive */ + passive?: (boolean|null); + + /** ClientPayload userAgent */ + userAgent?: (proto.ClientPayload.IUserAgent|null); + + /** ClientPayload webInfo */ + webInfo?: (proto.ClientPayload.IWebInfo|null); + + /** ClientPayload pushName */ + pushName?: (string|null); + + /** ClientPayload sessionId */ + sessionId?: (number|null); + + /** ClientPayload shortConnect */ + shortConnect?: (boolean|null); + + /** ClientPayload connectType */ + connectType?: (proto.ClientPayload.ConnectType|null); + + /** ClientPayload connectReason */ + connectReason?: (proto.ClientPayload.ConnectReason|null); + + /** ClientPayload shards */ + shards?: (number[]|null); + + /** ClientPayload dnsSource */ + dnsSource?: (proto.ClientPayload.IDNSSource|null); + + /** ClientPayload connectAttemptCount */ + connectAttemptCount?: (number|null); + + /** ClientPayload device */ + device?: (number|null); + + /** ClientPayload devicePairingData */ + devicePairingData?: (proto.ClientPayload.IDevicePairingRegistrationData|null); + + /** ClientPayload product */ + product?: (proto.ClientPayload.Product|null); + + /** ClientPayload fbCat */ + fbCat?: (Uint8Array|null); + + /** ClientPayload fbUserAgent */ + fbUserAgent?: (Uint8Array|null); + + /** ClientPayload oc */ + oc?: (boolean|null); + + /** ClientPayload lc */ + lc?: (number|null); + + /** ClientPayload iosAppExtension */ + iosAppExtension?: (proto.ClientPayload.IOSAppExtension|null); + + /** ClientPayload fbAppId */ + fbAppId?: (number|Long|null); + + /** ClientPayload fbDeviceId */ + fbDeviceId?: (Uint8Array|null); + + /** ClientPayload pull */ + pull?: (boolean|null); + + /** ClientPayload paddingBytes */ + paddingBytes?: (Uint8Array|null); + + /** ClientPayload bizMarketSegment */ + bizMarketSegment?: (proto.ClientPayload.BizMarketSegment|null); + + /** ClientPayload yearClass */ + yearClass?: (number|null); + + /** ClientPayload memClass */ + memClass?: (number|null); + } + + /** Represents a ClientPayload. */ + class ClientPayload implements IClientPayload { + + /** + * Constructs a new ClientPayload. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IClientPayload); + + /** ClientPayload username. */ + public username: (number|Long); + + /** ClientPayload passive. */ + public passive: boolean; + + /** ClientPayload userAgent. */ + public userAgent?: (proto.ClientPayload.IUserAgent|null); + + /** ClientPayload webInfo. */ + public webInfo?: (proto.ClientPayload.IWebInfo|null); + + /** ClientPayload pushName. */ + public pushName: string; + + /** ClientPayload sessionId. */ + public sessionId: number; + + /** ClientPayload shortConnect. */ + public shortConnect: boolean; + + /** ClientPayload connectType. */ + public connectType: proto.ClientPayload.ConnectType; + + /** ClientPayload connectReason. */ + public connectReason: proto.ClientPayload.ConnectReason; + + /** ClientPayload shards. */ + public shards: number[]; + + /** ClientPayload dnsSource. */ + public dnsSource?: (proto.ClientPayload.IDNSSource|null); + + /** ClientPayload connectAttemptCount. */ + public connectAttemptCount: number; + + /** ClientPayload device. */ + public device: number; + + /** ClientPayload devicePairingData. */ + public devicePairingData?: (proto.ClientPayload.IDevicePairingRegistrationData|null); + + /** ClientPayload product. */ + public product: proto.ClientPayload.Product; + + /** ClientPayload fbCat. */ + public fbCat: Uint8Array; + + /** ClientPayload fbUserAgent. */ + public fbUserAgent: Uint8Array; + + /** ClientPayload oc. */ + public oc: boolean; + + /** ClientPayload lc. */ + public lc: number; + + /** ClientPayload iosAppExtension. */ + public iosAppExtension: proto.ClientPayload.IOSAppExtension; + + /** ClientPayload fbAppId. */ + public fbAppId: (number|Long); + + /** ClientPayload fbDeviceId. */ + public fbDeviceId: Uint8Array; + + /** ClientPayload pull. */ + public pull: boolean; + + /** ClientPayload paddingBytes. */ + public paddingBytes: Uint8Array; + + /** ClientPayload bizMarketSegment. */ + public bizMarketSegment: proto.ClientPayload.BizMarketSegment; + + /** ClientPayload yearClass. */ + public yearClass: number; + + /** ClientPayload memClass. */ + public memClass: number; + + /** + * Creates a new ClientPayload instance using the specified properties. + * @param [properties] Properties to set + * @returns ClientPayload instance + */ + public static create(properties?: proto.IClientPayload): proto.ClientPayload; + + /** + * Encodes the specified ClientPayload message. Does not implicitly {@link proto.ClientPayload.verify|verify} messages. + * @param message ClientPayload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IClientPayload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ClientPayload message, length delimited. Does not implicitly {@link proto.ClientPayload.verify|verify} messages. + * @param message ClientPayload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IClientPayload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ClientPayload message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ClientPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ClientPayload; + + /** + * Decodes a ClientPayload message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ClientPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ClientPayload; + + /** + * Verifies a ClientPayload message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ClientPayload message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ClientPayload + */ + public static fromObject(object: { [k: string]: any }): proto.ClientPayload; + + /** + * Creates a plain object from a ClientPayload message. Also converts values to other types if specified. + * @param message ClientPayload + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ClientPayload, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ClientPayload to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ClientPayload { + + /** BizMarketSegment enum. */ + enum BizMarketSegment { + DEFAULT = 0, + DEVX = 1, + INBOX = 2 + } + + /** ConnectReason enum. */ + enum ConnectReason { + PUSH = 0, + USER_ACTIVATED = 1, + SCHEDULED = 2, + ERROR_RECONNECT = 3, + NETWORK_SWITCH = 4, + PING_RECONNECT = 5 + } + + /** ConnectType enum. */ + enum ConnectType { + CELLULAR_UNKNOWN = 0, + WIFI_UNKNOWN = 1, + CELLULAR_EDGE = 100, + CELLULAR_IDEN = 101, + CELLULAR_UMTS = 102, + CELLULAR_EVDO = 103, + CELLULAR_GPRS = 104, + CELLULAR_HSDPA = 105, + CELLULAR_HSUPA = 106, + CELLULAR_HSPA = 107, + CELLULAR_CDMA = 108, + CELLULAR_1XRTT = 109, + CELLULAR_EHRPD = 110, + CELLULAR_LTE = 111, + CELLULAR_HSPAP = 112 + } + + /** Properties of a DNSSource. */ + interface IDNSSource { + + /** DNSSource dnsMethod */ + dnsMethod?: (proto.ClientPayload.DNSSource.DNSResolutionMethod|null); + + /** DNSSource appCached */ + appCached?: (boolean|null); + } + + /** Represents a DNSSource. */ + class DNSSource implements IDNSSource { + + /** + * Constructs a new DNSSource. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ClientPayload.IDNSSource); + + /** DNSSource dnsMethod. */ + public dnsMethod: proto.ClientPayload.DNSSource.DNSResolutionMethod; + + /** DNSSource appCached. */ + public appCached: boolean; + + /** + * Creates a new DNSSource instance using the specified properties. + * @param [properties] Properties to set + * @returns DNSSource instance + */ + public static create(properties?: proto.ClientPayload.IDNSSource): proto.ClientPayload.DNSSource; + + /** + * Encodes the specified DNSSource message. Does not implicitly {@link proto.ClientPayload.DNSSource.verify|verify} messages. + * @param message DNSSource message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ClientPayload.IDNSSource, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DNSSource message, length delimited. Does not implicitly {@link proto.ClientPayload.DNSSource.verify|verify} messages. + * @param message DNSSource message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ClientPayload.IDNSSource, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DNSSource message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DNSSource + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ClientPayload.DNSSource; + + /** + * Decodes a DNSSource message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DNSSource + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ClientPayload.DNSSource; + + /** + * Verifies a DNSSource message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DNSSource message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DNSSource + */ + public static fromObject(object: { [k: string]: any }): proto.ClientPayload.DNSSource; + + /** + * Creates a plain object from a DNSSource message. Also converts values to other types if specified. + * @param message DNSSource + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ClientPayload.DNSSource, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DNSSource to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace DNSSource { + + /** DNSResolutionMethod enum. */ + enum DNSResolutionMethod { + SYSTEM = 0, + GOOGLE = 1, + HARDCODED = 2, + OVERRIDE = 3, + FALLBACK = 4 + } + } + + /** Properties of a DevicePairingRegistrationData. */ + interface IDevicePairingRegistrationData { + + /** DevicePairingRegistrationData eRegid */ + eRegid?: (Uint8Array|null); + + /** DevicePairingRegistrationData eKeytype */ + eKeytype?: (Uint8Array|null); + + /** DevicePairingRegistrationData eIdent */ + eIdent?: (Uint8Array|null); + + /** DevicePairingRegistrationData eSkeyId */ + eSkeyId?: (Uint8Array|null); + + /** DevicePairingRegistrationData eSkeyVal */ + eSkeyVal?: (Uint8Array|null); + + /** DevicePairingRegistrationData eSkeySig */ + eSkeySig?: (Uint8Array|null); + + /** DevicePairingRegistrationData buildHash */ + buildHash?: (Uint8Array|null); + + /** DevicePairingRegistrationData deviceProps */ + deviceProps?: (Uint8Array|null); + } + + /** Represents a DevicePairingRegistrationData. */ + class DevicePairingRegistrationData implements IDevicePairingRegistrationData { + + /** + * Constructs a new DevicePairingRegistrationData. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ClientPayload.IDevicePairingRegistrationData); + + /** DevicePairingRegistrationData eRegid. */ + public eRegid: Uint8Array; + + /** DevicePairingRegistrationData eKeytype. */ + public eKeytype: Uint8Array; + + /** DevicePairingRegistrationData eIdent. */ + public eIdent: Uint8Array; + + /** DevicePairingRegistrationData eSkeyId. */ + public eSkeyId: Uint8Array; + + /** DevicePairingRegistrationData eSkeyVal. */ + public eSkeyVal: Uint8Array; + + /** DevicePairingRegistrationData eSkeySig. */ + public eSkeySig: Uint8Array; + + /** DevicePairingRegistrationData buildHash. */ + public buildHash: Uint8Array; + + /** DevicePairingRegistrationData deviceProps. */ + public deviceProps: Uint8Array; + + /** + * Creates a new DevicePairingRegistrationData instance using the specified properties. + * @param [properties] Properties to set + * @returns DevicePairingRegistrationData instance + */ + public static create(properties?: proto.ClientPayload.IDevicePairingRegistrationData): proto.ClientPayload.DevicePairingRegistrationData; + + /** + * Encodes the specified DevicePairingRegistrationData message. Does not implicitly {@link proto.ClientPayload.DevicePairingRegistrationData.verify|verify} messages. + * @param message DevicePairingRegistrationData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ClientPayload.IDevicePairingRegistrationData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DevicePairingRegistrationData message, length delimited. Does not implicitly {@link proto.ClientPayload.DevicePairingRegistrationData.verify|verify} messages. + * @param message DevicePairingRegistrationData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ClientPayload.IDevicePairingRegistrationData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DevicePairingRegistrationData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DevicePairingRegistrationData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ClientPayload.DevicePairingRegistrationData; + + /** + * Decodes a DevicePairingRegistrationData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DevicePairingRegistrationData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ClientPayload.DevicePairingRegistrationData; + + /** + * Verifies a DevicePairingRegistrationData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DevicePairingRegistrationData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DevicePairingRegistrationData + */ + public static fromObject(object: { [k: string]: any }): proto.ClientPayload.DevicePairingRegistrationData; + + /** + * Creates a plain object from a DevicePairingRegistrationData message. Also converts values to other types if specified. + * @param message DevicePairingRegistrationData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ClientPayload.DevicePairingRegistrationData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DevicePairingRegistrationData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** IOSAppExtension enum. */ + enum IOSAppExtension { + SHARE_EXTENSION = 0, + SERVICE_EXTENSION = 1, + INTENTS_EXTENSION = 2 + } + + /** Product enum. */ + enum Product { + WHATSAPP = 0, + MESSENGER = 1 + } + + /** Properties of a UserAgent. */ + interface IUserAgent { + + /** UserAgent platform */ + platform?: (proto.ClientPayload.UserAgent.Platform|null); + + /** UserAgent appVersion */ + appVersion?: (proto.ClientPayload.UserAgent.IAppVersion|null); + + /** UserAgent mcc */ + mcc?: (string|null); + + /** UserAgent mnc */ + mnc?: (string|null); + + /** UserAgent osVersion */ + osVersion?: (string|null); + + /** UserAgent manufacturer */ + manufacturer?: (string|null); + + /** UserAgent device */ + device?: (string|null); + + /** UserAgent osBuildNumber */ + osBuildNumber?: (string|null); + + /** UserAgent phoneId */ + phoneId?: (string|null); + + /** UserAgent releaseChannel */ + releaseChannel?: (proto.ClientPayload.UserAgent.ReleaseChannel|null); + + /** UserAgent localeLanguageIso6391 */ + localeLanguageIso6391?: (string|null); + + /** UserAgent localeCountryIso31661Alpha2 */ + localeCountryIso31661Alpha2?: (string|null); + + /** UserAgent deviceBoard */ + deviceBoard?: (string|null); + } + + /** Represents a UserAgent. */ + class UserAgent implements IUserAgent { + + /** + * Constructs a new UserAgent. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ClientPayload.IUserAgent); + + /** UserAgent platform. */ + public platform: proto.ClientPayload.UserAgent.Platform; + + /** UserAgent appVersion. */ + public appVersion?: (proto.ClientPayload.UserAgent.IAppVersion|null); + + /** UserAgent mcc. */ + public mcc: string; + + /** UserAgent mnc. */ + public mnc: string; + + /** UserAgent osVersion. */ + public osVersion: string; + + /** UserAgent manufacturer. */ + public manufacturer: string; + + /** UserAgent device. */ + public device: string; + + /** UserAgent osBuildNumber. */ + public osBuildNumber: string; + + /** UserAgent phoneId. */ + public phoneId: string; + + /** UserAgent releaseChannel. */ + public releaseChannel: proto.ClientPayload.UserAgent.ReleaseChannel; + + /** UserAgent localeLanguageIso6391. */ + public localeLanguageIso6391: string; + + /** UserAgent localeCountryIso31661Alpha2. */ + public localeCountryIso31661Alpha2: string; + + /** UserAgent deviceBoard. */ + public deviceBoard: string; + + /** + * Creates a new UserAgent instance using the specified properties. + * @param [properties] Properties to set + * @returns UserAgent instance + */ + public static create(properties?: proto.ClientPayload.IUserAgent): proto.ClientPayload.UserAgent; + + /** + * Encodes the specified UserAgent message. Does not implicitly {@link proto.ClientPayload.UserAgent.verify|verify} messages. + * @param message UserAgent message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ClientPayload.IUserAgent, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified UserAgent message, length delimited. Does not implicitly {@link proto.ClientPayload.UserAgent.verify|verify} messages. + * @param message UserAgent message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ClientPayload.IUserAgent, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a UserAgent message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns UserAgent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ClientPayload.UserAgent; + + /** + * Decodes a UserAgent message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns UserAgent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ClientPayload.UserAgent; + + /** + * Verifies a UserAgent message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a UserAgent message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns UserAgent + */ + public static fromObject(object: { [k: string]: any }): proto.ClientPayload.UserAgent; + + /** + * Creates a plain object from a UserAgent message. Also converts values to other types if specified. + * @param message UserAgent + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ClientPayload.UserAgent, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this UserAgent to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace UserAgent { + + /** Properties of an AppVersion. */ + interface IAppVersion { + + /** AppVersion primary */ + primary?: (number|null); + + /** AppVersion secondary */ + secondary?: (number|null); + + /** AppVersion tertiary */ + tertiary?: (number|null); + + /** AppVersion quaternary */ + quaternary?: (number|null); + + /** AppVersion quinary */ + quinary?: (number|null); + } + + /** Represents an AppVersion. */ + class AppVersion implements IAppVersion { + + /** + * Constructs a new AppVersion. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ClientPayload.UserAgent.IAppVersion); + + /** AppVersion primary. */ + public primary: number; + + /** AppVersion secondary. */ + public secondary: number; + + /** AppVersion tertiary. */ + public tertiary: number; + + /** AppVersion quaternary. */ + public quaternary: number; + + /** AppVersion quinary. */ + public quinary: number; + + /** + * Creates a new AppVersion instance using the specified properties. + * @param [properties] Properties to set + * @returns AppVersion instance + */ + public static create(properties?: proto.ClientPayload.UserAgent.IAppVersion): proto.ClientPayload.UserAgent.AppVersion; + + /** + * Encodes the specified AppVersion message. Does not implicitly {@link proto.ClientPayload.UserAgent.AppVersion.verify|verify} messages. + * @param message AppVersion message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ClientPayload.UserAgent.IAppVersion, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppVersion message, length delimited. Does not implicitly {@link proto.ClientPayload.UserAgent.AppVersion.verify|verify} messages. + * @param message AppVersion message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ClientPayload.UserAgent.IAppVersion, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppVersion message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ClientPayload.UserAgent.AppVersion; + + /** + * Decodes an AppVersion message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ClientPayload.UserAgent.AppVersion; + + /** + * Verifies an AppVersion message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppVersion message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppVersion + */ + public static fromObject(object: { [k: string]: any }): proto.ClientPayload.UserAgent.AppVersion; + + /** + * Creates a plain object from an AppVersion message. Also converts values to other types if specified. + * @param message AppVersion + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ClientPayload.UserAgent.AppVersion, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppVersion to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Platform enum. */ + enum Platform { + ANDROID = 0, + IOS = 1, + WINDOWS_PHONE = 2, + BLACKBERRY = 3, + BLACKBERRYX = 4, + S40 = 5, + S60 = 6, + PYTHON_CLIENT = 7, + TIZEN = 8, + ENTERPRISE = 9, + SMB_ANDROID = 10, + KAIOS = 11, + SMB_IOS = 12, + WINDOWS = 13, + WEB = 14, + PORTAL = 15, + GREEN_ANDROID = 16, + GREEN_IPHONE = 17, + BLUE_ANDROID = 18, + BLUE_IPHONE = 19, + FBLITE_ANDROID = 20, + MLITE_ANDROID = 21, + IGLITE_ANDROID = 22, + PAGE = 23, + MACOS = 24, + OCULUS_MSG = 25, + OCULUS_CALL = 26, + MILAN = 27, + CAPI = 28, + WEAROS = 29, + ARDEVICE = 30, + VRDEVICE = 31 + } + + /** ReleaseChannel enum. */ + enum ReleaseChannel { + RELEASE = 0, + BETA = 1, + ALPHA = 2, + DEBUG = 3 + } + } + + /** Properties of a WebInfo. */ + interface IWebInfo { + + /** WebInfo refToken */ + refToken?: (string|null); + + /** WebInfo version */ + version?: (string|null); + + /** WebInfo webdPayload */ + webdPayload?: (proto.ClientPayload.WebInfo.IWebdPayload|null); + + /** WebInfo webSubPlatform */ + webSubPlatform?: (proto.ClientPayload.WebInfo.WebSubPlatform|null); + } + + /** Represents a WebInfo. */ + class WebInfo implements IWebInfo { + + /** + * Constructs a new WebInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ClientPayload.IWebInfo); + + /** WebInfo refToken. */ + public refToken: string; + + /** WebInfo version. */ + public version: string; + + /** WebInfo webdPayload. */ + public webdPayload?: (proto.ClientPayload.WebInfo.IWebdPayload|null); + + /** WebInfo webSubPlatform. */ + public webSubPlatform: proto.ClientPayload.WebInfo.WebSubPlatform; + + /** + * Creates a new WebInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns WebInfo instance + */ + public static create(properties?: proto.ClientPayload.IWebInfo): proto.ClientPayload.WebInfo; + + /** + * Encodes the specified WebInfo message. Does not implicitly {@link proto.ClientPayload.WebInfo.verify|verify} messages. + * @param message WebInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ClientPayload.IWebInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WebInfo message, length delimited. Does not implicitly {@link proto.ClientPayload.WebInfo.verify|verify} messages. + * @param message WebInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ClientPayload.IWebInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WebInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WebInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ClientPayload.WebInfo; + + /** + * Decodes a WebInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WebInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ClientPayload.WebInfo; + + /** + * Verifies a WebInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WebInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WebInfo + */ + public static fromObject(object: { [k: string]: any }): proto.ClientPayload.WebInfo; + + /** + * Creates a plain object from a WebInfo message. Also converts values to other types if specified. + * @param message WebInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ClientPayload.WebInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WebInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace WebInfo { + + /** WebSubPlatform enum. */ + enum WebSubPlatform { + WEB_BROWSER = 0, + APP_STORE = 1, + WIN_STORE = 2, + DARWIN = 3, + WIN32 = 4 + } + + /** Properties of a WebdPayload. */ + interface IWebdPayload { + + /** WebdPayload usesParticipantInKey */ + usesParticipantInKey?: (boolean|null); + + /** WebdPayload supportsStarredMessages */ + supportsStarredMessages?: (boolean|null); + + /** WebdPayload supportsDocumentMessages */ + supportsDocumentMessages?: (boolean|null); + + /** WebdPayload supportsUrlMessages */ + supportsUrlMessages?: (boolean|null); + + /** WebdPayload supportsMediaRetry */ + supportsMediaRetry?: (boolean|null); + + /** WebdPayload supportsE2EImage */ + supportsE2EImage?: (boolean|null); + + /** WebdPayload supportsE2EVideo */ + supportsE2EVideo?: (boolean|null); + + /** WebdPayload supportsE2EAudio */ + supportsE2EAudio?: (boolean|null); + + /** WebdPayload supportsE2EDocument */ + supportsE2EDocument?: (boolean|null); + + /** WebdPayload documentTypes */ + documentTypes?: (string|null); + + /** WebdPayload features */ + features?: (Uint8Array|null); + } + + /** Represents a WebdPayload. */ + class WebdPayload implements IWebdPayload { + + /** + * Constructs a new WebdPayload. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ClientPayload.WebInfo.IWebdPayload); + + /** WebdPayload usesParticipantInKey. */ + public usesParticipantInKey: boolean; + + /** WebdPayload supportsStarredMessages. */ + public supportsStarredMessages: boolean; + + /** WebdPayload supportsDocumentMessages. */ + public supportsDocumentMessages: boolean; + + /** WebdPayload supportsUrlMessages. */ + public supportsUrlMessages: boolean; + + /** WebdPayload supportsMediaRetry. */ + public supportsMediaRetry: boolean; + + /** WebdPayload supportsE2EImage. */ + public supportsE2EImage: boolean; + + /** WebdPayload supportsE2EVideo. */ + public supportsE2EVideo: boolean; + + /** WebdPayload supportsE2EAudio. */ + public supportsE2EAudio: boolean; + + /** WebdPayload supportsE2EDocument. */ + public supportsE2EDocument: boolean; + + /** WebdPayload documentTypes. */ + public documentTypes: string; + + /** WebdPayload features. */ + public features: Uint8Array; + + /** + * Creates a new WebdPayload instance using the specified properties. + * @param [properties] Properties to set + * @returns WebdPayload instance + */ + public static create(properties?: proto.ClientPayload.WebInfo.IWebdPayload): proto.ClientPayload.WebInfo.WebdPayload; + + /** + * Encodes the specified WebdPayload message. Does not implicitly {@link proto.ClientPayload.WebInfo.WebdPayload.verify|verify} messages. + * @param message WebdPayload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ClientPayload.WebInfo.IWebdPayload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WebdPayload message, length delimited. Does not implicitly {@link proto.ClientPayload.WebInfo.WebdPayload.verify|verify} messages. + * @param message WebdPayload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ClientPayload.WebInfo.IWebdPayload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WebdPayload message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WebdPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ClientPayload.WebInfo.WebdPayload; + + /** + * Decodes a WebdPayload message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WebdPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ClientPayload.WebInfo.WebdPayload; + + /** + * Verifies a WebdPayload message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WebdPayload message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WebdPayload + */ + public static fromObject(object: { [k: string]: any }): proto.ClientPayload.WebInfo.WebdPayload; + + /** + * Creates a plain object from a WebdPayload message. Also converts values to other types if specified. + * @param message WebdPayload + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ClientPayload.WebInfo.WebdPayload, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WebdPayload to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + } + + /** Properties of a ContextInfo. */ + interface IContextInfo { + + /** ContextInfo stanzaId */ + stanzaId?: (string|null); + + /** ContextInfo participant */ + participant?: (string|null); + + /** ContextInfo quotedMessage */ + quotedMessage?: (proto.IMessage|null); + + /** ContextInfo remoteJid */ + remoteJid?: (string|null); + + /** ContextInfo mentionedJid */ + mentionedJid?: (string[]|null); + + /** ContextInfo conversionSource */ + conversionSource?: (string|null); + + /** ContextInfo conversionData */ + conversionData?: (Uint8Array|null); + + /** ContextInfo conversionDelaySeconds */ + conversionDelaySeconds?: (number|null); + + /** ContextInfo forwardingScore */ + forwardingScore?: (number|null); + + /** ContextInfo isForwarded */ + isForwarded?: (boolean|null); + + /** ContextInfo quotedAd */ + quotedAd?: (proto.ContextInfo.IAdReplyInfo|null); + + /** ContextInfo placeholderKey */ + placeholderKey?: (proto.IMessageKey|null); + + /** ContextInfo expiration */ + expiration?: (number|null); + + /** ContextInfo ephemeralSettingTimestamp */ + ephemeralSettingTimestamp?: (number|Long|null); + + /** ContextInfo ephemeralSharedSecret */ + ephemeralSharedSecret?: (Uint8Array|null); + + /** ContextInfo externalAdReply */ + externalAdReply?: (proto.ContextInfo.IExternalAdReplyInfo|null); + + /** ContextInfo entryPointConversionSource */ + entryPointConversionSource?: (string|null); + + /** ContextInfo entryPointConversionApp */ + entryPointConversionApp?: (string|null); + + /** ContextInfo entryPointConversionDelaySeconds */ + entryPointConversionDelaySeconds?: (number|null); + + /** ContextInfo disappearingMode */ + disappearingMode?: (proto.IDisappearingMode|null); + + /** ContextInfo actionLink */ + actionLink?: (proto.IActionLink|null); + + /** ContextInfo groupSubject */ + groupSubject?: (string|null); + + /** ContextInfo parentGroupJid */ + parentGroupJid?: (string|null); + + /** ContextInfo trustBannerType */ + trustBannerType?: (string|null); + + /** ContextInfo trustBannerAction */ + trustBannerAction?: (number|null); + } + + /** Represents a ContextInfo. */ + class ContextInfo implements IContextInfo { + + /** + * Constructs a new ContextInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IContextInfo); + + /** ContextInfo stanzaId. */ + public stanzaId: string; + + /** ContextInfo participant. */ + public participant: string; + + /** ContextInfo quotedMessage. */ + public quotedMessage?: (proto.IMessage|null); + + /** ContextInfo remoteJid. */ + public remoteJid: string; + + /** ContextInfo mentionedJid. */ + public mentionedJid: string[]; + + /** ContextInfo conversionSource. */ + public conversionSource: string; + + /** ContextInfo conversionData. */ + public conversionData: Uint8Array; + + /** ContextInfo conversionDelaySeconds. */ + public conversionDelaySeconds: number; + + /** ContextInfo forwardingScore. */ + public forwardingScore: number; + + /** ContextInfo isForwarded. */ + public isForwarded: boolean; + + /** ContextInfo quotedAd. */ + public quotedAd?: (proto.ContextInfo.IAdReplyInfo|null); + + /** ContextInfo placeholderKey. */ + public placeholderKey?: (proto.IMessageKey|null); + + /** ContextInfo expiration. */ + public expiration: number; + + /** ContextInfo ephemeralSettingTimestamp. */ + public ephemeralSettingTimestamp: (number|Long); + + /** ContextInfo ephemeralSharedSecret. */ + public ephemeralSharedSecret: Uint8Array; + + /** ContextInfo externalAdReply. */ + public externalAdReply?: (proto.ContextInfo.IExternalAdReplyInfo|null); + + /** ContextInfo entryPointConversionSource. */ + public entryPointConversionSource: string; + + /** ContextInfo entryPointConversionApp. */ + public entryPointConversionApp: string; + + /** ContextInfo entryPointConversionDelaySeconds. */ + public entryPointConversionDelaySeconds: number; + + /** ContextInfo disappearingMode. */ + public disappearingMode?: (proto.IDisappearingMode|null); + + /** ContextInfo actionLink. */ + public actionLink?: (proto.IActionLink|null); + + /** ContextInfo groupSubject. */ + public groupSubject: string; + + /** ContextInfo parentGroupJid. */ + public parentGroupJid: string; + + /** ContextInfo trustBannerType. */ + public trustBannerType: string; + + /** ContextInfo trustBannerAction. */ + public trustBannerAction: number; + + /** + * Creates a new ContextInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns ContextInfo instance + */ + public static create(properties?: proto.IContextInfo): proto.ContextInfo; + + /** + * Encodes the specified ContextInfo message. Does not implicitly {@link proto.ContextInfo.verify|verify} messages. + * @param message ContextInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IContextInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ContextInfo message, length delimited. Does not implicitly {@link proto.ContextInfo.verify|verify} messages. + * @param message ContextInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IContextInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ContextInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ContextInfo; + + /** + * Decodes a ContextInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ContextInfo; + + /** + * Verifies a ContextInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ContextInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ContextInfo + */ + public static fromObject(object: { [k: string]: any }): proto.ContextInfo; + + /** + * Creates a plain object from a ContextInfo message. Also converts values to other types if specified. + * @param message ContextInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ContextInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ContextInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ContextInfo { + + /** Properties of an AdReplyInfo. */ + interface IAdReplyInfo { + + /** AdReplyInfo advertiserName */ + advertiserName?: (string|null); + + /** AdReplyInfo mediaType */ + mediaType?: (proto.ContextInfo.AdReplyInfo.MediaType|null); + + /** AdReplyInfo jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** AdReplyInfo caption */ + caption?: (string|null); + } + + /** Represents an AdReplyInfo. */ + class AdReplyInfo implements IAdReplyInfo { + + /** + * Constructs a new AdReplyInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ContextInfo.IAdReplyInfo); + + /** AdReplyInfo advertiserName. */ + public advertiserName: string; + + /** AdReplyInfo mediaType. */ + public mediaType: proto.ContextInfo.AdReplyInfo.MediaType; + + /** AdReplyInfo jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** AdReplyInfo caption. */ + public caption: string; + + /** + * Creates a new AdReplyInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns AdReplyInfo instance + */ + public static create(properties?: proto.ContextInfo.IAdReplyInfo): proto.ContextInfo.AdReplyInfo; + + /** + * Encodes the specified AdReplyInfo message. Does not implicitly {@link proto.ContextInfo.AdReplyInfo.verify|verify} messages. + * @param message AdReplyInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ContextInfo.IAdReplyInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AdReplyInfo message, length delimited. Does not implicitly {@link proto.ContextInfo.AdReplyInfo.verify|verify} messages. + * @param message AdReplyInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ContextInfo.IAdReplyInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AdReplyInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ContextInfo.AdReplyInfo; + + /** + * Decodes an AdReplyInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ContextInfo.AdReplyInfo; + + /** + * Verifies an AdReplyInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AdReplyInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AdReplyInfo + */ + public static fromObject(object: { [k: string]: any }): proto.ContextInfo.AdReplyInfo; + + /** + * Creates a plain object from an AdReplyInfo message. Also converts values to other types if specified. + * @param message AdReplyInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ContextInfo.AdReplyInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AdReplyInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace AdReplyInfo { + + /** MediaType enum. */ + enum MediaType { + NONE = 0, + IMAGE = 1, + VIDEO = 2 + } + } + + /** Properties of an ExternalAdReplyInfo. */ + interface IExternalAdReplyInfo { + + /** ExternalAdReplyInfo title */ + title?: (string|null); + + /** ExternalAdReplyInfo body */ + body?: (string|null); + + /** ExternalAdReplyInfo mediaType */ + mediaType?: (proto.ContextInfo.ExternalAdReplyInfo.MediaType|null); + + /** ExternalAdReplyInfo thumbnailUrl */ + thumbnailUrl?: (string|null); + + /** ExternalAdReplyInfo mediaUrl */ + mediaUrl?: (string|null); + + /** ExternalAdReplyInfo thumbnail */ + thumbnail?: (Uint8Array|null); + + /** ExternalAdReplyInfo sourceType */ + sourceType?: (string|null); + + /** ExternalAdReplyInfo sourceId */ + sourceId?: (string|null); + + /** ExternalAdReplyInfo sourceUrl */ + sourceUrl?: (string|null); + + /** ExternalAdReplyInfo containsAutoReply */ + containsAutoReply?: (boolean|null); + + /** ExternalAdReplyInfo renderLargerThumbnail */ + renderLargerThumbnail?: (boolean|null); + + /** ExternalAdReplyInfo showAdAttribution */ + showAdAttribution?: (boolean|null); + + /** ExternalAdReplyInfo ctwaClid */ + ctwaClid?: (string|null); + } + + /** Represents an ExternalAdReplyInfo. */ + class ExternalAdReplyInfo implements IExternalAdReplyInfo { + + /** + * Constructs a new ExternalAdReplyInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ContextInfo.IExternalAdReplyInfo); + + /** ExternalAdReplyInfo title. */ + public title: string; + + /** ExternalAdReplyInfo body. */ + public body: string; + + /** ExternalAdReplyInfo mediaType. */ + public mediaType: proto.ContextInfo.ExternalAdReplyInfo.MediaType; + + /** ExternalAdReplyInfo thumbnailUrl. */ + public thumbnailUrl: string; + + /** ExternalAdReplyInfo mediaUrl. */ + public mediaUrl: string; + + /** ExternalAdReplyInfo thumbnail. */ + public thumbnail: Uint8Array; + + /** ExternalAdReplyInfo sourceType. */ + public sourceType: string; + + /** ExternalAdReplyInfo sourceId. */ + public sourceId: string; + + /** ExternalAdReplyInfo sourceUrl. */ + public sourceUrl: string; + + /** ExternalAdReplyInfo containsAutoReply. */ + public containsAutoReply: boolean; + + /** ExternalAdReplyInfo renderLargerThumbnail. */ + public renderLargerThumbnail: boolean; + + /** ExternalAdReplyInfo showAdAttribution. */ + public showAdAttribution: boolean; + + /** ExternalAdReplyInfo ctwaClid. */ + public ctwaClid: string; + + /** + * Creates a new ExternalAdReplyInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns ExternalAdReplyInfo instance + */ + public static create(properties?: proto.ContextInfo.IExternalAdReplyInfo): proto.ContextInfo.ExternalAdReplyInfo; + + /** + * Encodes the specified ExternalAdReplyInfo message. Does not implicitly {@link proto.ContextInfo.ExternalAdReplyInfo.verify|verify} messages. + * @param message ExternalAdReplyInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ContextInfo.IExternalAdReplyInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ExternalAdReplyInfo message, length delimited. Does not implicitly {@link proto.ContextInfo.ExternalAdReplyInfo.verify|verify} messages. + * @param message ExternalAdReplyInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ContextInfo.IExternalAdReplyInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an ExternalAdReplyInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ExternalAdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ContextInfo.ExternalAdReplyInfo; + + /** + * Decodes an ExternalAdReplyInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ExternalAdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ContextInfo.ExternalAdReplyInfo; + + /** + * Verifies an ExternalAdReplyInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an ExternalAdReplyInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ExternalAdReplyInfo + */ + public static fromObject(object: { [k: string]: any }): proto.ContextInfo.ExternalAdReplyInfo; + + /** + * Creates a plain object from an ExternalAdReplyInfo message. Also converts values to other types if specified. + * @param message ExternalAdReplyInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ContextInfo.ExternalAdReplyInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ExternalAdReplyInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ExternalAdReplyInfo { + + /** MediaType enum. */ + enum MediaType { + NONE = 0, + IMAGE = 1, + VIDEO = 2 + } + } + } + + /** Properties of a Conversation. */ + interface IConversation { + + /** Conversation id */ + id: string; + + /** Conversation messages */ + messages?: (proto.IHistorySyncMsg[]|null); + + /** Conversation newJid */ + newJid?: (string|null); + + /** Conversation oldJid */ + oldJid?: (string|null); + + /** Conversation lastMsgTimestamp */ + lastMsgTimestamp?: (number|Long|null); + + /** Conversation unreadCount */ + unreadCount?: (number|null); + + /** Conversation readOnly */ + readOnly?: (boolean|null); + + /** Conversation endOfHistoryTransfer */ + endOfHistoryTransfer?: (boolean|null); + + /** Conversation ephemeralExpiration */ + ephemeralExpiration?: (number|null); + + /** Conversation ephemeralSettingTimestamp */ + ephemeralSettingTimestamp?: (number|Long|null); + + /** Conversation endOfHistoryTransferType */ + endOfHistoryTransferType?: (proto.Conversation.EndOfHistoryTransferType|null); + + /** Conversation conversationTimestamp */ + conversationTimestamp?: (number|Long|null); + + /** Conversation name */ + name?: (string|null); + + /** Conversation pHash */ + pHash?: (string|null); + + /** Conversation notSpam */ + notSpam?: (boolean|null); + + /** Conversation archived */ + archived?: (boolean|null); + + /** Conversation disappearingMode */ + disappearingMode?: (proto.IDisappearingMode|null); + + /** Conversation unreadMentionCount */ + unreadMentionCount?: (number|null); + + /** Conversation markedAsUnread */ + markedAsUnread?: (boolean|null); + + /** Conversation participant */ + participant?: (proto.IGroupParticipant[]|null); + + /** Conversation tcToken */ + tcToken?: (Uint8Array|null); + + /** Conversation tcTokenTimestamp */ + tcTokenTimestamp?: (number|Long|null); + + /** Conversation contactPrimaryIdentityKey */ + contactPrimaryIdentityKey?: (Uint8Array|null); + + /** Conversation pinned */ + pinned?: (number|null); + + /** Conversation muteEndTime */ + muteEndTime?: (number|Long|null); + + /** Conversation wallpaper */ + wallpaper?: (proto.IWallpaperSettings|null); + + /** Conversation mediaVisibility */ + mediaVisibility?: (proto.MediaVisibility|null); + + /** Conversation tcTokenSenderTimestamp */ + tcTokenSenderTimestamp?: (number|Long|null); + + /** Conversation suspended */ + suspended?: (boolean|null); + + /** Conversation terminated */ + terminated?: (boolean|null); + + /** Conversation createdAt */ + createdAt?: (number|Long|null); + + /** Conversation createdBy */ + createdBy?: (string|null); + + /** Conversation description */ + description?: (string|null); + + /** Conversation support */ + support?: (boolean|null); + + /** Conversation isParentGroup */ + isParentGroup?: (boolean|null); + + /** Conversation isDefaultSubgroup */ + isDefaultSubgroup?: (boolean|null); + + /** Conversation parentGroupId */ + parentGroupId?: (string|null); + + /** Conversation displayName */ + displayName?: (string|null); + + /** Conversation pnJid */ + pnJid?: (string|null); + + /** Conversation shareOwnPn */ + shareOwnPn?: (boolean|null); + + /** Conversation pnhDuplicateLidThread */ + pnhDuplicateLidThread?: (boolean|null); + + /** Conversation lidJid */ + lidJid?: (string|null); + } + + /** Represents a Conversation. */ + class Conversation implements IConversation { + + /** + * Constructs a new Conversation. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IConversation); + + /** Conversation id. */ + public id: string; + + /** Conversation messages. */ + public messages: proto.IHistorySyncMsg[]; + + /** Conversation newJid. */ + public newJid: string; + + /** Conversation oldJid. */ + public oldJid: string; + + /** Conversation lastMsgTimestamp. */ + public lastMsgTimestamp: (number|Long); + + /** Conversation unreadCount. */ + public unreadCount: number; + + /** Conversation readOnly. */ + public readOnly: boolean; + + /** Conversation endOfHistoryTransfer. */ + public endOfHistoryTransfer: boolean; + + /** Conversation ephemeralExpiration. */ + public ephemeralExpiration: number; + + /** Conversation ephemeralSettingTimestamp. */ + public ephemeralSettingTimestamp: (number|Long); + + /** Conversation endOfHistoryTransferType. */ + public endOfHistoryTransferType: proto.Conversation.EndOfHistoryTransferType; + + /** Conversation conversationTimestamp. */ + public conversationTimestamp: (number|Long); + + /** Conversation name. */ + public name: string; + + /** Conversation pHash. */ + public pHash: string; + + /** Conversation notSpam. */ + public notSpam: boolean; + + /** Conversation archived. */ + public archived: boolean; + + /** Conversation disappearingMode. */ + public disappearingMode?: (proto.IDisappearingMode|null); + + /** Conversation unreadMentionCount. */ + public unreadMentionCount: number; + + /** Conversation markedAsUnread. */ + public markedAsUnread: boolean; + + /** Conversation participant. */ + public participant: proto.IGroupParticipant[]; + + /** Conversation tcToken. */ + public tcToken: Uint8Array; + + /** Conversation tcTokenTimestamp. */ + public tcTokenTimestamp: (number|Long); + + /** Conversation contactPrimaryIdentityKey. */ + public contactPrimaryIdentityKey: Uint8Array; + + /** Conversation pinned. */ + public pinned: number; + + /** Conversation muteEndTime. */ + public muteEndTime: (number|Long); + + /** Conversation wallpaper. */ + public wallpaper?: (proto.IWallpaperSettings|null); + + /** Conversation mediaVisibility. */ + public mediaVisibility: proto.MediaVisibility; + + /** Conversation tcTokenSenderTimestamp. */ + public tcTokenSenderTimestamp: (number|Long); + + /** Conversation suspended. */ + public suspended: boolean; + + /** Conversation terminated. */ + public terminated: boolean; + + /** Conversation createdAt. */ + public createdAt: (number|Long); + + /** Conversation createdBy. */ + public createdBy: string; + + /** Conversation description. */ + public description: string; + + /** Conversation support. */ + public support: boolean; + + /** Conversation isParentGroup. */ + public isParentGroup: boolean; + + /** Conversation isDefaultSubgroup. */ + public isDefaultSubgroup: boolean; + + /** Conversation parentGroupId. */ + public parentGroupId: string; + + /** Conversation displayName. */ + public displayName: string; + + /** Conversation pnJid. */ + public pnJid: string; + + /** Conversation shareOwnPn. */ + public shareOwnPn: boolean; + + /** Conversation pnhDuplicateLidThread. */ + public pnhDuplicateLidThread: boolean; + + /** Conversation lidJid. */ + public lidJid: string; + + /** + * Creates a new Conversation instance using the specified properties. + * @param [properties] Properties to set + * @returns Conversation instance + */ + public static create(properties?: proto.IConversation): proto.Conversation; + + /** + * Encodes the specified Conversation message. Does not implicitly {@link proto.Conversation.verify|verify} messages. + * @param message Conversation message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IConversation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Conversation message, length delimited. Does not implicitly {@link proto.Conversation.verify|verify} messages. + * @param message Conversation message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IConversation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Conversation message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Conversation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Conversation; + + /** + * Decodes a Conversation message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Conversation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Conversation; + + /** + * Verifies a Conversation message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Conversation message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Conversation + */ + public static fromObject(object: { [k: string]: any }): proto.Conversation; + + /** + * Creates a plain object from a Conversation message. Also converts values to other types if specified. + * @param message Conversation + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Conversation, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Conversation to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace Conversation { + + /** EndOfHistoryTransferType enum. */ + enum EndOfHistoryTransferType { + COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY = 0, + COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY = 1 + } + } + + /** Properties of a DeviceListMetadata. */ + interface IDeviceListMetadata { + + /** DeviceListMetadata senderKeyHash */ + senderKeyHash?: (Uint8Array|null); + + /** DeviceListMetadata senderTimestamp */ + senderTimestamp?: (number|Long|null); + + /** DeviceListMetadata senderKeyIndexes */ + senderKeyIndexes?: (number[]|null); + + /** DeviceListMetadata recipientKeyHash */ + recipientKeyHash?: (Uint8Array|null); + + /** DeviceListMetadata recipientTimestamp */ + recipientTimestamp?: (number|Long|null); + + /** DeviceListMetadata recipientKeyIndexes */ + recipientKeyIndexes?: (number[]|null); + } + + /** Represents a DeviceListMetadata. */ + class DeviceListMetadata implements IDeviceListMetadata { + + /** + * Constructs a new DeviceListMetadata. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IDeviceListMetadata); + + /** DeviceListMetadata senderKeyHash. */ + public senderKeyHash: Uint8Array; + + /** DeviceListMetadata senderTimestamp. */ + public senderTimestamp: (number|Long); + + /** DeviceListMetadata senderKeyIndexes. */ + public senderKeyIndexes: number[]; + + /** DeviceListMetadata recipientKeyHash. */ + public recipientKeyHash: Uint8Array; + + /** DeviceListMetadata recipientTimestamp. */ + public recipientTimestamp: (number|Long); + + /** DeviceListMetadata recipientKeyIndexes. */ + public recipientKeyIndexes: number[]; + + /** + * Creates a new DeviceListMetadata instance using the specified properties. + * @param [properties] Properties to set + * @returns DeviceListMetadata instance + */ + public static create(properties?: proto.IDeviceListMetadata): proto.DeviceListMetadata; + + /** + * Encodes the specified DeviceListMetadata message. Does not implicitly {@link proto.DeviceListMetadata.verify|verify} messages. + * @param message DeviceListMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IDeviceListMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeviceListMetadata message, length delimited. Does not implicitly {@link proto.DeviceListMetadata.verify|verify} messages. + * @param message DeviceListMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IDeviceListMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeviceListMetadata message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeviceListMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.DeviceListMetadata; + + /** + * Decodes a DeviceListMetadata message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeviceListMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.DeviceListMetadata; + + /** + * Verifies a DeviceListMetadata message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeviceListMetadata message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeviceListMetadata + */ + public static fromObject(object: { [k: string]: any }): proto.DeviceListMetadata; + + /** + * Creates a plain object from a DeviceListMetadata message. Also converts values to other types if specified. + * @param message DeviceListMetadata + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.DeviceListMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeviceListMetadata to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a DeviceProps. */ + interface IDeviceProps { + + /** DeviceProps os */ + os?: (string|null); + + /** DeviceProps version */ + version?: (proto.DeviceProps.IAppVersion|null); + + /** DeviceProps platformType */ + platformType?: (proto.DeviceProps.PlatformType|null); + + /** DeviceProps requireFullSync */ + requireFullSync?: (boolean|null); + + /** DeviceProps historySyncConfig */ + historySyncConfig?: (proto.DeviceProps.IHistorySyncConfig|null); + } + + /** Represents a DeviceProps. */ + class DeviceProps implements IDeviceProps { + + /** + * Constructs a new DeviceProps. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IDeviceProps); + + /** DeviceProps os. */ + public os: string; + + /** DeviceProps version. */ + public version?: (proto.DeviceProps.IAppVersion|null); + + /** DeviceProps platformType. */ + public platformType: proto.DeviceProps.PlatformType; + + /** DeviceProps requireFullSync. */ + public requireFullSync: boolean; + + /** DeviceProps historySyncConfig. */ + public historySyncConfig?: (proto.DeviceProps.IHistorySyncConfig|null); + + /** + * Creates a new DeviceProps instance using the specified properties. + * @param [properties] Properties to set + * @returns DeviceProps instance + */ + public static create(properties?: proto.IDeviceProps): proto.DeviceProps; + + /** + * Encodes the specified DeviceProps message. Does not implicitly {@link proto.DeviceProps.verify|verify} messages. + * @param message DeviceProps message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IDeviceProps, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeviceProps message, length delimited. Does not implicitly {@link proto.DeviceProps.verify|verify} messages. + * @param message DeviceProps message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IDeviceProps, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeviceProps message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeviceProps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.DeviceProps; + + /** + * Decodes a DeviceProps message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeviceProps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.DeviceProps; + + /** + * Verifies a DeviceProps message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeviceProps message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeviceProps + */ + public static fromObject(object: { [k: string]: any }): proto.DeviceProps; + + /** + * Creates a plain object from a DeviceProps message. Also converts values to other types if specified. + * @param message DeviceProps + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.DeviceProps, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeviceProps to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace DeviceProps { + + /** Properties of an AppVersion. */ + interface IAppVersion { + + /** AppVersion primary */ + primary?: (number|null); + + /** AppVersion secondary */ + secondary?: (number|null); + + /** AppVersion tertiary */ + tertiary?: (number|null); + + /** AppVersion quaternary */ + quaternary?: (number|null); + + /** AppVersion quinary */ + quinary?: (number|null); + } + + /** Represents an AppVersion. */ + class AppVersion implements IAppVersion { + + /** + * Constructs a new AppVersion. + * @param [properties] Properties to set + */ + constructor(properties?: proto.DeviceProps.IAppVersion); + + /** AppVersion primary. */ + public primary: number; + + /** AppVersion secondary. */ + public secondary: number; + + /** AppVersion tertiary. */ + public tertiary: number; + + /** AppVersion quaternary. */ + public quaternary: number; + + /** AppVersion quinary. */ + public quinary: number; + + /** + * Creates a new AppVersion instance using the specified properties. + * @param [properties] Properties to set + * @returns AppVersion instance + */ + public static create(properties?: proto.DeviceProps.IAppVersion): proto.DeviceProps.AppVersion; + + /** + * Encodes the specified AppVersion message. Does not implicitly {@link proto.DeviceProps.AppVersion.verify|verify} messages. + * @param message AppVersion message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.DeviceProps.IAppVersion, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppVersion message, length delimited. Does not implicitly {@link proto.DeviceProps.AppVersion.verify|verify} messages. + * @param message AppVersion message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.DeviceProps.IAppVersion, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppVersion message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.DeviceProps.AppVersion; + + /** + * Decodes an AppVersion message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.DeviceProps.AppVersion; + + /** + * Verifies an AppVersion message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppVersion message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppVersion + */ + public static fromObject(object: { [k: string]: any }): proto.DeviceProps.AppVersion; + + /** + * Creates a plain object from an AppVersion message. Also converts values to other types if specified. + * @param message AppVersion + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.DeviceProps.AppVersion, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppVersion to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a HistorySyncConfig. */ + interface IHistorySyncConfig { + + /** HistorySyncConfig fullSyncDaysLimit */ + fullSyncDaysLimit?: (number|null); + + /** HistorySyncConfig fullSyncSizeMbLimit */ + fullSyncSizeMbLimit?: (number|null); + + /** HistorySyncConfig storageQuotaMb */ + storageQuotaMb?: (number|null); + } + + /** Represents a HistorySyncConfig. */ + class HistorySyncConfig implements IHistorySyncConfig { + + /** + * Constructs a new HistorySyncConfig. + * @param [properties] Properties to set + */ + constructor(properties?: proto.DeviceProps.IHistorySyncConfig); + + /** HistorySyncConfig fullSyncDaysLimit. */ + public fullSyncDaysLimit: number; + + /** HistorySyncConfig fullSyncSizeMbLimit. */ + public fullSyncSizeMbLimit: number; + + /** HistorySyncConfig storageQuotaMb. */ + public storageQuotaMb: number; + + /** + * Creates a new HistorySyncConfig instance using the specified properties. + * @param [properties] Properties to set + * @returns HistorySyncConfig instance + */ + public static create(properties?: proto.DeviceProps.IHistorySyncConfig): proto.DeviceProps.HistorySyncConfig; + + /** + * Encodes the specified HistorySyncConfig message. Does not implicitly {@link proto.DeviceProps.HistorySyncConfig.verify|verify} messages. + * @param message HistorySyncConfig message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.DeviceProps.IHistorySyncConfig, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HistorySyncConfig message, length delimited. Does not implicitly {@link proto.DeviceProps.HistorySyncConfig.verify|verify} messages. + * @param message HistorySyncConfig message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.DeviceProps.IHistorySyncConfig, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HistorySyncConfig message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HistorySyncConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.DeviceProps.HistorySyncConfig; + + /** + * Decodes a HistorySyncConfig message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HistorySyncConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.DeviceProps.HistorySyncConfig; + + /** + * Verifies a HistorySyncConfig message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HistorySyncConfig message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HistorySyncConfig + */ + public static fromObject(object: { [k: string]: any }): proto.DeviceProps.HistorySyncConfig; + + /** + * Creates a plain object from a HistorySyncConfig message. Also converts values to other types if specified. + * @param message HistorySyncConfig + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.DeviceProps.HistorySyncConfig, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HistorySyncConfig to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** PlatformType enum. */ + enum PlatformType { + UNKNOWN = 0, + CHROME = 1, + FIREFOX = 2, + IE = 3, + OPERA = 4, + SAFARI = 5, + EDGE = 6, + DESKTOP = 7, + IPAD = 8, + ANDROID_TABLET = 9, + OHANA = 10, + ALOHA = 11, + CATALINA = 12, + TCL_TV = 13 + } + } + + /** Properties of a DisappearingMode. */ + interface IDisappearingMode { + + /** DisappearingMode initiator */ + initiator?: (proto.DisappearingMode.Initiator|null); + } + + /** Represents a DisappearingMode. */ + class DisappearingMode implements IDisappearingMode { + + /** + * Constructs a new DisappearingMode. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IDisappearingMode); + + /** DisappearingMode initiator. */ + public initiator: proto.DisappearingMode.Initiator; + + /** + * Creates a new DisappearingMode instance using the specified properties. + * @param [properties] Properties to set + * @returns DisappearingMode instance + */ + public static create(properties?: proto.IDisappearingMode): proto.DisappearingMode; + + /** + * Encodes the specified DisappearingMode message. Does not implicitly {@link proto.DisappearingMode.verify|verify} messages. + * @param message DisappearingMode message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IDisappearingMode, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DisappearingMode message, length delimited. Does not implicitly {@link proto.DisappearingMode.verify|verify} messages. + * @param message DisappearingMode message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IDisappearingMode, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DisappearingMode message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DisappearingMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.DisappearingMode; + + /** + * Decodes a DisappearingMode message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DisappearingMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.DisappearingMode; + + /** + * Verifies a DisappearingMode message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DisappearingMode message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DisappearingMode + */ + public static fromObject(object: { [k: string]: any }): proto.DisappearingMode; + + /** + * Creates a plain object from a DisappearingMode message. Also converts values to other types if specified. + * @param message DisappearingMode + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.DisappearingMode, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DisappearingMode to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace DisappearingMode { + + /** Initiator enum. */ + enum Initiator { + CHANGED_IN_CHAT = 0, + INITIATED_BY_ME = 1, + INITIATED_BY_OTHER = 2 + } + } + + /** Properties of an EphemeralSetting. */ + interface IEphemeralSetting { + + /** EphemeralSetting duration */ + duration?: (number|null); + + /** EphemeralSetting timestamp */ + timestamp?: (number|Long|null); + } + + /** Represents an EphemeralSetting. */ + class EphemeralSetting implements IEphemeralSetting { + + /** + * Constructs a new EphemeralSetting. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IEphemeralSetting); + + /** EphemeralSetting duration. */ + public duration: number; + + /** EphemeralSetting timestamp. */ + public timestamp: (number|Long); + + /** + * Creates a new EphemeralSetting instance using the specified properties. + * @param [properties] Properties to set + * @returns EphemeralSetting instance + */ + public static create(properties?: proto.IEphemeralSetting): proto.EphemeralSetting; + + /** + * Encodes the specified EphemeralSetting message. Does not implicitly {@link proto.EphemeralSetting.verify|verify} messages. + * @param message EphemeralSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IEphemeralSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified EphemeralSetting message, length delimited. Does not implicitly {@link proto.EphemeralSetting.verify|verify} messages. + * @param message EphemeralSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IEphemeralSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an EphemeralSetting message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns EphemeralSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.EphemeralSetting; + + /** + * Decodes an EphemeralSetting message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns EphemeralSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.EphemeralSetting; + + /** + * Verifies an EphemeralSetting message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an EphemeralSetting message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns EphemeralSetting + */ + public static fromObject(object: { [k: string]: any }): proto.EphemeralSetting; + + /** + * Creates a plain object from an EphemeralSetting message. Also converts values to other types if specified. + * @param message EphemeralSetting + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.EphemeralSetting, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this EphemeralSetting to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an ExitCode. */ + interface IExitCode { + + /** ExitCode code */ + code?: (number|Long|null); + + /** ExitCode text */ + text?: (string|null); + } + + /** Represents an ExitCode. */ + class ExitCode implements IExitCode { + + /** + * Constructs a new ExitCode. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IExitCode); + + /** ExitCode code. */ + public code: (number|Long); + + /** ExitCode text. */ + public text: string; + + /** + * Creates a new ExitCode instance using the specified properties. + * @param [properties] Properties to set + * @returns ExitCode instance + */ + public static create(properties?: proto.IExitCode): proto.ExitCode; + + /** + * Encodes the specified ExitCode message. Does not implicitly {@link proto.ExitCode.verify|verify} messages. + * @param message ExitCode message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IExitCode, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ExitCode message, length delimited. Does not implicitly {@link proto.ExitCode.verify|verify} messages. + * @param message ExitCode message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IExitCode, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an ExitCode message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ExitCode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ExitCode; + + /** + * Decodes an ExitCode message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ExitCode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ExitCode; + + /** + * Verifies an ExitCode message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an ExitCode message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ExitCode + */ + public static fromObject(object: { [k: string]: any }): proto.ExitCode; + + /** + * Creates a plain object from an ExitCode message. Also converts values to other types if specified. + * @param message ExitCode + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ExitCode, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ExitCode to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an ExternalBlobReference. */ + interface IExternalBlobReference { + + /** ExternalBlobReference mediaKey */ + mediaKey?: (Uint8Array|null); + + /** ExternalBlobReference directPath */ + directPath?: (string|null); + + /** ExternalBlobReference handle */ + handle?: (string|null); + + /** ExternalBlobReference fileSizeBytes */ + fileSizeBytes?: (number|Long|null); + + /** ExternalBlobReference fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** ExternalBlobReference fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + } + + /** Represents an ExternalBlobReference. */ + class ExternalBlobReference implements IExternalBlobReference { + + /** + * Constructs a new ExternalBlobReference. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IExternalBlobReference); + + /** ExternalBlobReference mediaKey. */ + public mediaKey: Uint8Array; + + /** ExternalBlobReference directPath. */ + public directPath: string; + + /** ExternalBlobReference handle. */ + public handle: string; + + /** ExternalBlobReference fileSizeBytes. */ + public fileSizeBytes: (number|Long); + + /** ExternalBlobReference fileSha256. */ + public fileSha256: Uint8Array; + + /** ExternalBlobReference fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** + * Creates a new ExternalBlobReference instance using the specified properties. + * @param [properties] Properties to set + * @returns ExternalBlobReference instance + */ + public static create(properties?: proto.IExternalBlobReference): proto.ExternalBlobReference; + + /** + * Encodes the specified ExternalBlobReference message. Does not implicitly {@link proto.ExternalBlobReference.verify|verify} messages. + * @param message ExternalBlobReference message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IExternalBlobReference, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ExternalBlobReference message, length delimited. Does not implicitly {@link proto.ExternalBlobReference.verify|verify} messages. + * @param message ExternalBlobReference message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IExternalBlobReference, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an ExternalBlobReference message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ExternalBlobReference + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ExternalBlobReference; + + /** + * Decodes an ExternalBlobReference message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ExternalBlobReference + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ExternalBlobReference; + + /** + * Verifies an ExternalBlobReference message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an ExternalBlobReference message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ExternalBlobReference + */ + public static fromObject(object: { [k: string]: any }): proto.ExternalBlobReference; + + /** + * Creates a plain object from an ExternalBlobReference message. Also converts values to other types if specified. + * @param message ExternalBlobReference + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ExternalBlobReference, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ExternalBlobReference to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a GlobalSettings. */ + interface IGlobalSettings { + + /** GlobalSettings lightThemeWallpaper */ + lightThemeWallpaper?: (proto.IWallpaperSettings|null); + + /** GlobalSettings mediaVisibility */ + mediaVisibility?: (proto.MediaVisibility|null); + + /** GlobalSettings darkThemeWallpaper */ + darkThemeWallpaper?: (proto.IWallpaperSettings|null); + + /** GlobalSettings autoDownloadWiFi */ + autoDownloadWiFi?: (proto.IAutoDownloadSettings|null); + + /** GlobalSettings autoDownloadCellular */ + autoDownloadCellular?: (proto.IAutoDownloadSettings|null); + + /** GlobalSettings autoDownloadRoaming */ + autoDownloadRoaming?: (proto.IAutoDownloadSettings|null); + + /** GlobalSettings showIndividualNotificationsPreview */ + showIndividualNotificationsPreview?: (boolean|null); + + /** GlobalSettings showGroupNotificationsPreview */ + showGroupNotificationsPreview?: (boolean|null); + + /** GlobalSettings disappearingModeDuration */ + disappearingModeDuration?: (number|null); + + /** GlobalSettings disappearingModeTimestamp */ + disappearingModeTimestamp?: (number|Long|null); + + /** GlobalSettings avatarUserSettings */ + avatarUserSettings?: (proto.IAvatarUserSettings|null); + } + + /** Represents a GlobalSettings. */ + class GlobalSettings implements IGlobalSettings { + + /** + * Constructs a new GlobalSettings. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IGlobalSettings); + + /** GlobalSettings lightThemeWallpaper. */ + public lightThemeWallpaper?: (proto.IWallpaperSettings|null); + + /** GlobalSettings mediaVisibility. */ + public mediaVisibility: proto.MediaVisibility; + + /** GlobalSettings darkThemeWallpaper. */ + public darkThemeWallpaper?: (proto.IWallpaperSettings|null); + + /** GlobalSettings autoDownloadWiFi. */ + public autoDownloadWiFi?: (proto.IAutoDownloadSettings|null); + + /** GlobalSettings autoDownloadCellular. */ + public autoDownloadCellular?: (proto.IAutoDownloadSettings|null); + + /** GlobalSettings autoDownloadRoaming. */ + public autoDownloadRoaming?: (proto.IAutoDownloadSettings|null); + + /** GlobalSettings showIndividualNotificationsPreview. */ + public showIndividualNotificationsPreview: boolean; + + /** GlobalSettings showGroupNotificationsPreview. */ + public showGroupNotificationsPreview: boolean; + + /** GlobalSettings disappearingModeDuration. */ + public disappearingModeDuration: number; + + /** GlobalSettings disappearingModeTimestamp. */ + public disappearingModeTimestamp: (number|Long); + + /** GlobalSettings avatarUserSettings. */ + public avatarUserSettings?: (proto.IAvatarUserSettings|null); + + /** + * Creates a new GlobalSettings instance using the specified properties. + * @param [properties] Properties to set + * @returns GlobalSettings instance + */ + public static create(properties?: proto.IGlobalSettings): proto.GlobalSettings; + + /** + * Encodes the specified GlobalSettings message. Does not implicitly {@link proto.GlobalSettings.verify|verify} messages. + * @param message GlobalSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IGlobalSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GlobalSettings message, length delimited. Does not implicitly {@link proto.GlobalSettings.verify|verify} messages. + * @param message GlobalSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IGlobalSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GlobalSettings message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GlobalSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.GlobalSettings; + + /** + * Decodes a GlobalSettings message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GlobalSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.GlobalSettings; + + /** + * Verifies a GlobalSettings message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GlobalSettings message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GlobalSettings + */ + public static fromObject(object: { [k: string]: any }): proto.GlobalSettings; + + /** + * Creates a plain object from a GlobalSettings message. Also converts values to other types if specified. + * @param message GlobalSettings + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.GlobalSettings, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GlobalSettings to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a GroupParticipant. */ + interface IGroupParticipant { + + /** GroupParticipant userJid */ + userJid: string; + + /** GroupParticipant rank */ + rank?: (proto.GroupParticipant.Rank|null); + } + + /** Represents a GroupParticipant. */ + class GroupParticipant implements IGroupParticipant { + + /** + * Constructs a new GroupParticipant. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IGroupParticipant); + + /** GroupParticipant userJid. */ + public userJid: string; + + /** GroupParticipant rank. */ + public rank: proto.GroupParticipant.Rank; + + /** + * Creates a new GroupParticipant instance using the specified properties. + * @param [properties] Properties to set + * @returns GroupParticipant instance + */ + public static create(properties?: proto.IGroupParticipant): proto.GroupParticipant; + + /** + * Encodes the specified GroupParticipant message. Does not implicitly {@link proto.GroupParticipant.verify|verify} messages. + * @param message GroupParticipant message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IGroupParticipant, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GroupParticipant message, length delimited. Does not implicitly {@link proto.GroupParticipant.verify|verify} messages. + * @param message GroupParticipant message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IGroupParticipant, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GroupParticipant message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GroupParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.GroupParticipant; + + /** + * Decodes a GroupParticipant message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GroupParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.GroupParticipant; + + /** + * Verifies a GroupParticipant message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GroupParticipant message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GroupParticipant + */ + public static fromObject(object: { [k: string]: any }): proto.GroupParticipant; + + /** + * Creates a plain object from a GroupParticipant message. Also converts values to other types if specified. + * @param message GroupParticipant + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.GroupParticipant, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GroupParticipant to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace GroupParticipant { + + /** Rank enum. */ + enum Rank { + REGULAR = 0, + ADMIN = 1, + SUPERADMIN = 2 + } + } + + /** Properties of a HandshakeMessage. */ + interface IHandshakeMessage { + + /** HandshakeMessage clientHello */ + clientHello?: (proto.HandshakeMessage.IClientHello|null); + + /** HandshakeMessage serverHello */ + serverHello?: (proto.HandshakeMessage.IServerHello|null); + + /** HandshakeMessage clientFinish */ + clientFinish?: (proto.HandshakeMessage.IClientFinish|null); + } + + /** Represents a HandshakeMessage. */ + class HandshakeMessage implements IHandshakeMessage { + + /** + * Constructs a new HandshakeMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IHandshakeMessage); + + /** HandshakeMessage clientHello. */ + public clientHello?: (proto.HandshakeMessage.IClientHello|null); + + /** HandshakeMessage serverHello. */ + public serverHello?: (proto.HandshakeMessage.IServerHello|null); + + /** HandshakeMessage clientFinish. */ + public clientFinish?: (proto.HandshakeMessage.IClientFinish|null); + + /** + * Creates a new HandshakeMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns HandshakeMessage instance + */ + public static create(properties?: proto.IHandshakeMessage): proto.HandshakeMessage; + + /** + * Encodes the specified HandshakeMessage message. Does not implicitly {@link proto.HandshakeMessage.verify|verify} messages. + * @param message HandshakeMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IHandshakeMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HandshakeMessage message, length delimited. Does not implicitly {@link proto.HandshakeMessage.verify|verify} messages. + * @param message HandshakeMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IHandshakeMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HandshakeMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HandshakeMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HandshakeMessage; + + /** + * Decodes a HandshakeMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HandshakeMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HandshakeMessage; + + /** + * Verifies a HandshakeMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HandshakeMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HandshakeMessage + */ + public static fromObject(object: { [k: string]: any }): proto.HandshakeMessage; + + /** + * Creates a plain object from a HandshakeMessage message. Also converts values to other types if specified. + * @param message HandshakeMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HandshakeMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HandshakeMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HandshakeMessage { + + /** Properties of a ClientFinish. */ + interface IClientFinish { + + /** ClientFinish static */ + "static"?: (Uint8Array|null); + + /** ClientFinish payload */ + payload?: (Uint8Array|null); + } + + /** Represents a ClientFinish. */ + class ClientFinish implements IClientFinish { + + /** + * Constructs a new ClientFinish. + * @param [properties] Properties to set + */ + constructor(properties?: proto.HandshakeMessage.IClientFinish); + + /** ClientFinish static. */ + public static: Uint8Array; + + /** ClientFinish payload. */ + public payload: Uint8Array; + + /** + * Creates a new ClientFinish instance using the specified properties. + * @param [properties] Properties to set + * @returns ClientFinish instance + */ + public static create(properties?: proto.HandshakeMessage.IClientFinish): proto.HandshakeMessage.ClientFinish; + + /** + * Encodes the specified ClientFinish message. Does not implicitly {@link proto.HandshakeMessage.ClientFinish.verify|verify} messages. + * @param message ClientFinish message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.HandshakeMessage.IClientFinish, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ClientFinish message, length delimited. Does not implicitly {@link proto.HandshakeMessage.ClientFinish.verify|verify} messages. + * @param message ClientFinish message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.HandshakeMessage.IClientFinish, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ClientFinish message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ClientFinish + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HandshakeMessage.ClientFinish; + + /** + * Decodes a ClientFinish message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ClientFinish + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HandshakeMessage.ClientFinish; + + /** + * Verifies a ClientFinish message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ClientFinish message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ClientFinish + */ + public static fromObject(object: { [k: string]: any }): proto.HandshakeMessage.ClientFinish; + + /** + * Creates a plain object from a ClientFinish message. Also converts values to other types if specified. + * @param message ClientFinish + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HandshakeMessage.ClientFinish, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ClientFinish to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ClientHello. */ + interface IClientHello { + + /** ClientHello ephemeral */ + ephemeral?: (Uint8Array|null); + + /** ClientHello static */ + "static"?: (Uint8Array|null); + + /** ClientHello payload */ + payload?: (Uint8Array|null); + } + + /** Represents a ClientHello. */ + class ClientHello implements IClientHello { + + /** + * Constructs a new ClientHello. + * @param [properties] Properties to set + */ + constructor(properties?: proto.HandshakeMessage.IClientHello); + + /** ClientHello ephemeral. */ + public ephemeral: Uint8Array; + + /** ClientHello static. */ + public static: Uint8Array; + + /** ClientHello payload. */ + public payload: Uint8Array; + + /** + * Creates a new ClientHello instance using the specified properties. + * @param [properties] Properties to set + * @returns ClientHello instance + */ + public static create(properties?: proto.HandshakeMessage.IClientHello): proto.HandshakeMessage.ClientHello; + + /** + * Encodes the specified ClientHello message. Does not implicitly {@link proto.HandshakeMessage.ClientHello.verify|verify} messages. + * @param message ClientHello message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.HandshakeMessage.IClientHello, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ClientHello message, length delimited. Does not implicitly {@link proto.HandshakeMessage.ClientHello.verify|verify} messages. + * @param message ClientHello message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.HandshakeMessage.IClientHello, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ClientHello message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ClientHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HandshakeMessage.ClientHello; + + /** + * Decodes a ClientHello message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ClientHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HandshakeMessage.ClientHello; + + /** + * Verifies a ClientHello message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ClientHello message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ClientHello + */ + public static fromObject(object: { [k: string]: any }): proto.HandshakeMessage.ClientHello; + + /** + * Creates a plain object from a ClientHello message. Also converts values to other types if specified. + * @param message ClientHello + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HandshakeMessage.ClientHello, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ClientHello to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ServerHello. */ + interface IServerHello { + + /** ServerHello ephemeral */ + ephemeral?: (Uint8Array|null); + + /** ServerHello static */ + "static"?: (Uint8Array|null); + + /** ServerHello payload */ + payload?: (Uint8Array|null); + } + + /** Represents a ServerHello. */ + class ServerHello implements IServerHello { + + /** + * Constructs a new ServerHello. + * @param [properties] Properties to set + */ + constructor(properties?: proto.HandshakeMessage.IServerHello); + + /** ServerHello ephemeral. */ + public ephemeral: Uint8Array; + + /** ServerHello static. */ + public static: Uint8Array; + + /** ServerHello payload. */ + public payload: Uint8Array; + + /** + * Creates a new ServerHello instance using the specified properties. + * @param [properties] Properties to set + * @returns ServerHello instance + */ + public static create(properties?: proto.HandshakeMessage.IServerHello): proto.HandshakeMessage.ServerHello; + + /** + * Encodes the specified ServerHello message. Does not implicitly {@link proto.HandshakeMessage.ServerHello.verify|verify} messages. + * @param message ServerHello message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.HandshakeMessage.IServerHello, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ServerHello message, length delimited. Does not implicitly {@link proto.HandshakeMessage.ServerHello.verify|verify} messages. + * @param message ServerHello message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.HandshakeMessage.IServerHello, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ServerHello message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ServerHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HandshakeMessage.ServerHello; + + /** + * Decodes a ServerHello message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ServerHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HandshakeMessage.ServerHello; + + /** + * Verifies a ServerHello message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ServerHello message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ServerHello + */ + public static fromObject(object: { [k: string]: any }): proto.HandshakeMessage.ServerHello; + + /** + * Creates a plain object from a ServerHello message. Also converts values to other types if specified. + * @param message ServerHello + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HandshakeMessage.ServerHello, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ServerHello to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a HistorySync. */ + interface IHistorySync { + + /** HistorySync syncType */ + syncType: proto.HistorySync.HistorySyncType; + + /** HistorySync conversations */ + conversations?: (proto.IConversation[]|null); + + /** HistorySync statusV3Messages */ + statusV3Messages?: (proto.IWebMessageInfo[]|null); + + /** HistorySync chunkOrder */ + chunkOrder?: (number|null); + + /** HistorySync progress */ + progress?: (number|null); + + /** HistorySync pushnames */ + pushnames?: (proto.IPushname[]|null); + + /** HistorySync globalSettings */ + globalSettings?: (proto.IGlobalSettings|null); + + /** HistorySync threadIdUserSecret */ + threadIdUserSecret?: (Uint8Array|null); + + /** HistorySync threadDsTimeframeOffset */ + threadDsTimeframeOffset?: (number|null); + + /** HistorySync recentStickers */ + recentStickers?: (proto.IStickerMetadata[]|null); + + /** HistorySync pastParticipants */ + pastParticipants?: (proto.IPastParticipants[]|null); + } + + /** Represents a HistorySync. */ + class HistorySync implements IHistorySync { + + /** + * Constructs a new HistorySync. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IHistorySync); + + /** HistorySync syncType. */ + public syncType: proto.HistorySync.HistorySyncType; + + /** HistorySync conversations. */ + public conversations: proto.IConversation[]; + + /** HistorySync statusV3Messages. */ + public statusV3Messages: proto.IWebMessageInfo[]; + + /** HistorySync chunkOrder. */ + public chunkOrder: number; + + /** HistorySync progress. */ + public progress: number; + + /** HistorySync pushnames. */ + public pushnames: proto.IPushname[]; + + /** HistorySync globalSettings. */ + public globalSettings?: (proto.IGlobalSettings|null); + + /** HistorySync threadIdUserSecret. */ + public threadIdUserSecret: Uint8Array; + + /** HistorySync threadDsTimeframeOffset. */ + public threadDsTimeframeOffset: number; + + /** HistorySync recentStickers. */ + public recentStickers: proto.IStickerMetadata[]; + + /** HistorySync pastParticipants. */ + public pastParticipants: proto.IPastParticipants[]; + + /** + * Creates a new HistorySync instance using the specified properties. + * @param [properties] Properties to set + * @returns HistorySync instance + */ + public static create(properties?: proto.IHistorySync): proto.HistorySync; + + /** + * Encodes the specified HistorySync message. Does not implicitly {@link proto.HistorySync.verify|verify} messages. + * @param message HistorySync message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IHistorySync, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HistorySync message, length delimited. Does not implicitly {@link proto.HistorySync.verify|verify} messages. + * @param message HistorySync message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IHistorySync, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HistorySync message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HistorySync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HistorySync; + + /** + * Decodes a HistorySync message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HistorySync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HistorySync; + + /** + * Verifies a HistorySync message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HistorySync message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HistorySync + */ + public static fromObject(object: { [k: string]: any }): proto.HistorySync; + + /** + * Creates a plain object from a HistorySync message. Also converts values to other types if specified. + * @param message HistorySync + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HistorySync, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HistorySync to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HistorySync { + + /** HistorySyncType enum. */ + enum HistorySyncType { + INITIAL_BOOTSTRAP = 0, + INITIAL_STATUS_V3 = 1, + FULL = 2, + RECENT = 3, + PUSH_NAME = 4, + NON_BLOCKING_DATA = 5 + } + } + + /** Properties of a HistorySyncMsg. */ + interface IHistorySyncMsg { + + /** HistorySyncMsg message */ + message?: (proto.IWebMessageInfo|null); + + /** HistorySyncMsg msgOrderId */ + msgOrderId?: (number|Long|null); + } + + /** Represents a HistorySyncMsg. */ + class HistorySyncMsg implements IHistorySyncMsg { + + /** + * Constructs a new HistorySyncMsg. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IHistorySyncMsg); + + /** HistorySyncMsg message. */ + public message?: (proto.IWebMessageInfo|null); + + /** HistorySyncMsg msgOrderId. */ + public msgOrderId: (number|Long); + + /** + * Creates a new HistorySyncMsg instance using the specified properties. + * @param [properties] Properties to set + * @returns HistorySyncMsg instance + */ + public static create(properties?: proto.IHistorySyncMsg): proto.HistorySyncMsg; + + /** + * Encodes the specified HistorySyncMsg message. Does not implicitly {@link proto.HistorySyncMsg.verify|verify} messages. + * @param message HistorySyncMsg message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IHistorySyncMsg, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HistorySyncMsg message, length delimited. Does not implicitly {@link proto.HistorySyncMsg.verify|verify} messages. + * @param message HistorySyncMsg message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IHistorySyncMsg, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HistorySyncMsg message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HistorySyncMsg + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HistorySyncMsg; + + /** + * Decodes a HistorySyncMsg message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HistorySyncMsg + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HistorySyncMsg; + + /** + * Verifies a HistorySyncMsg message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HistorySyncMsg message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HistorySyncMsg + */ + public static fromObject(object: { [k: string]: any }): proto.HistorySyncMsg; + + /** + * Creates a plain object from a HistorySyncMsg message. Also converts values to other types if specified. + * @param message HistorySyncMsg + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HistorySyncMsg, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HistorySyncMsg to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a HydratedTemplateButton. */ + interface IHydratedTemplateButton { + + /** HydratedTemplateButton index */ + index?: (number|null); + + /** HydratedTemplateButton quickReplyButton */ + quickReplyButton?: (proto.HydratedTemplateButton.IHydratedQuickReplyButton|null); + + /** HydratedTemplateButton urlButton */ + urlButton?: (proto.HydratedTemplateButton.IHydratedURLButton|null); + + /** HydratedTemplateButton callButton */ + callButton?: (proto.HydratedTemplateButton.IHydratedCallButton|null); + } + + /** Represents a HydratedTemplateButton. */ + class HydratedTemplateButton implements IHydratedTemplateButton { + + /** + * Constructs a new HydratedTemplateButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IHydratedTemplateButton); + + /** HydratedTemplateButton index. */ + public index: number; + + /** HydratedTemplateButton quickReplyButton. */ + public quickReplyButton?: (proto.HydratedTemplateButton.IHydratedQuickReplyButton|null); + + /** HydratedTemplateButton urlButton. */ + public urlButton?: (proto.HydratedTemplateButton.IHydratedURLButton|null); + + /** HydratedTemplateButton callButton. */ + public callButton?: (proto.HydratedTemplateButton.IHydratedCallButton|null); + + /** HydratedTemplateButton hydratedButton. */ + public hydratedButton?: ("quickReplyButton"|"urlButton"|"callButton"); + + /** + * Creates a new HydratedTemplateButton instance using the specified properties. + * @param [properties] Properties to set + * @returns HydratedTemplateButton instance + */ + public static create(properties?: proto.IHydratedTemplateButton): proto.HydratedTemplateButton; + + /** + * Encodes the specified HydratedTemplateButton message. Does not implicitly {@link proto.HydratedTemplateButton.verify|verify} messages. + * @param message HydratedTemplateButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IHydratedTemplateButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HydratedTemplateButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.verify|verify} messages. + * @param message HydratedTemplateButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IHydratedTemplateButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HydratedTemplateButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HydratedTemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HydratedTemplateButton; + + /** + * Decodes a HydratedTemplateButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HydratedTemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HydratedTemplateButton; + + /** + * Verifies a HydratedTemplateButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HydratedTemplateButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HydratedTemplateButton + */ + public static fromObject(object: { [k: string]: any }): proto.HydratedTemplateButton; + + /** + * Creates a plain object from a HydratedTemplateButton message. Also converts values to other types if specified. + * @param message HydratedTemplateButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HydratedTemplateButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HydratedTemplateButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HydratedTemplateButton { + + /** Properties of a HydratedCallButton. */ + interface IHydratedCallButton { + + /** HydratedCallButton displayText */ + displayText?: (string|null); + + /** HydratedCallButton phoneNumber */ + phoneNumber?: (string|null); + } + + /** Represents a HydratedCallButton. */ + class HydratedCallButton implements IHydratedCallButton { + + /** + * Constructs a new HydratedCallButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.HydratedTemplateButton.IHydratedCallButton); + + /** HydratedCallButton displayText. */ + public displayText: string; + + /** HydratedCallButton phoneNumber. */ + public phoneNumber: string; + + /** + * Creates a new HydratedCallButton instance using the specified properties. + * @param [properties] Properties to set + * @returns HydratedCallButton instance + */ + public static create(properties?: proto.HydratedTemplateButton.IHydratedCallButton): proto.HydratedTemplateButton.HydratedCallButton; + + /** + * Encodes the specified HydratedCallButton message. Does not implicitly {@link proto.HydratedTemplateButton.HydratedCallButton.verify|verify} messages. + * @param message HydratedCallButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.HydratedTemplateButton.IHydratedCallButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HydratedCallButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.HydratedCallButton.verify|verify} messages. + * @param message HydratedCallButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.HydratedTemplateButton.IHydratedCallButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HydratedCallButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HydratedCallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HydratedTemplateButton.HydratedCallButton; + + /** + * Decodes a HydratedCallButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HydratedCallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HydratedTemplateButton.HydratedCallButton; + + /** + * Verifies a HydratedCallButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HydratedCallButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HydratedCallButton + */ + public static fromObject(object: { [k: string]: any }): proto.HydratedTemplateButton.HydratedCallButton; + + /** + * Creates a plain object from a HydratedCallButton message. Also converts values to other types if specified. + * @param message HydratedCallButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HydratedTemplateButton.HydratedCallButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HydratedCallButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a HydratedQuickReplyButton. */ + interface IHydratedQuickReplyButton { + + /** HydratedQuickReplyButton displayText */ + displayText?: (string|null); + + /** HydratedQuickReplyButton id */ + id?: (string|null); + } + + /** Represents a HydratedQuickReplyButton. */ + class HydratedQuickReplyButton implements IHydratedQuickReplyButton { + + /** + * Constructs a new HydratedQuickReplyButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.HydratedTemplateButton.IHydratedQuickReplyButton); + + /** HydratedQuickReplyButton displayText. */ + public displayText: string; + + /** HydratedQuickReplyButton id. */ + public id: string; + + /** + * Creates a new HydratedQuickReplyButton instance using the specified properties. + * @param [properties] Properties to set + * @returns HydratedQuickReplyButton instance + */ + public static create(properties?: proto.HydratedTemplateButton.IHydratedQuickReplyButton): proto.HydratedTemplateButton.HydratedQuickReplyButton; + + /** + * Encodes the specified HydratedQuickReplyButton message. Does not implicitly {@link proto.HydratedTemplateButton.HydratedQuickReplyButton.verify|verify} messages. + * @param message HydratedQuickReplyButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.HydratedTemplateButton.IHydratedQuickReplyButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HydratedQuickReplyButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.HydratedQuickReplyButton.verify|verify} messages. + * @param message HydratedQuickReplyButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.HydratedTemplateButton.IHydratedQuickReplyButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HydratedQuickReplyButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HydratedQuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HydratedTemplateButton.HydratedQuickReplyButton; + + /** + * Decodes a HydratedQuickReplyButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HydratedQuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HydratedTemplateButton.HydratedQuickReplyButton; + + /** + * Verifies a HydratedQuickReplyButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HydratedQuickReplyButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HydratedQuickReplyButton + */ + public static fromObject(object: { [k: string]: any }): proto.HydratedTemplateButton.HydratedQuickReplyButton; + + /** + * Creates a plain object from a HydratedQuickReplyButton message. Also converts values to other types if specified. + * @param message HydratedQuickReplyButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HydratedTemplateButton.HydratedQuickReplyButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HydratedQuickReplyButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a HydratedURLButton. */ + interface IHydratedURLButton { + + /** HydratedURLButton displayText */ + displayText?: (string|null); + + /** HydratedURLButton url */ + url?: (string|null); + } + + /** Represents a HydratedURLButton. */ + class HydratedURLButton implements IHydratedURLButton { + + /** + * Constructs a new HydratedURLButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.HydratedTemplateButton.IHydratedURLButton); + + /** HydratedURLButton displayText. */ + public displayText: string; + + /** HydratedURLButton url. */ + public url: string; + + /** + * Creates a new HydratedURLButton instance using the specified properties. + * @param [properties] Properties to set + * @returns HydratedURLButton instance + */ + public static create(properties?: proto.HydratedTemplateButton.IHydratedURLButton): proto.HydratedTemplateButton.HydratedURLButton; + + /** + * Encodes the specified HydratedURLButton message. Does not implicitly {@link proto.HydratedTemplateButton.HydratedURLButton.verify|verify} messages. + * @param message HydratedURLButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.HydratedTemplateButton.IHydratedURLButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HydratedURLButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.HydratedURLButton.verify|verify} messages. + * @param message HydratedURLButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.HydratedTemplateButton.IHydratedURLButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HydratedURLButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HydratedURLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.HydratedTemplateButton.HydratedURLButton; + + /** + * Decodes a HydratedURLButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HydratedURLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.HydratedTemplateButton.HydratedURLButton; + + /** + * Verifies a HydratedURLButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HydratedURLButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HydratedURLButton + */ + public static fromObject(object: { [k: string]: any }): proto.HydratedTemplateButton.HydratedURLButton; + + /** + * Creates a plain object from a HydratedURLButton message. Also converts values to other types if specified. + * @param message HydratedURLButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.HydratedTemplateButton.HydratedURLButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HydratedURLButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of an IdentityKeyPairStructure. */ + interface IIdentityKeyPairStructure { + + /** IdentityKeyPairStructure publicKey */ + publicKey?: (Uint8Array|null); + + /** IdentityKeyPairStructure privateKey */ + privateKey?: (Uint8Array|null); + } + + /** Represents an IdentityKeyPairStructure. */ + class IdentityKeyPairStructure implements IIdentityKeyPairStructure { + + /** + * Constructs a new IdentityKeyPairStructure. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IIdentityKeyPairStructure); + + /** IdentityKeyPairStructure publicKey. */ + public publicKey: Uint8Array; + + /** IdentityKeyPairStructure privateKey. */ + public privateKey: Uint8Array; + + /** + * Creates a new IdentityKeyPairStructure instance using the specified properties. + * @param [properties] Properties to set + * @returns IdentityKeyPairStructure instance + */ + public static create(properties?: proto.IIdentityKeyPairStructure): proto.IdentityKeyPairStructure; + + /** + * Encodes the specified IdentityKeyPairStructure message. Does not implicitly {@link proto.IdentityKeyPairStructure.verify|verify} messages. + * @param message IdentityKeyPairStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IIdentityKeyPairStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified IdentityKeyPairStructure message, length delimited. Does not implicitly {@link proto.IdentityKeyPairStructure.verify|verify} messages. + * @param message IdentityKeyPairStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IIdentityKeyPairStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an IdentityKeyPairStructure message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns IdentityKeyPairStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.IdentityKeyPairStructure; + + /** + * Decodes an IdentityKeyPairStructure message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns IdentityKeyPairStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.IdentityKeyPairStructure; + + /** + * Verifies an IdentityKeyPairStructure message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an IdentityKeyPairStructure message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns IdentityKeyPairStructure + */ + public static fromObject(object: { [k: string]: any }): proto.IdentityKeyPairStructure; + + /** + * Creates a plain object from an IdentityKeyPairStructure message. Also converts values to other types if specified. + * @param message IdentityKeyPairStructure + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.IdentityKeyPairStructure, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this IdentityKeyPairStructure to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an InteractiveAnnotation. */ + interface IInteractiveAnnotation { + + /** InteractiveAnnotation polygonVertices */ + polygonVertices?: (proto.IPoint[]|null); + + /** InteractiveAnnotation location */ + location?: (proto.ILocation|null); + } + + /** Represents an InteractiveAnnotation. */ + class InteractiveAnnotation implements IInteractiveAnnotation { + + /** + * Constructs a new InteractiveAnnotation. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IInteractiveAnnotation); + + /** InteractiveAnnotation polygonVertices. */ + public polygonVertices: proto.IPoint[]; + + /** InteractiveAnnotation location. */ + public location?: (proto.ILocation|null); + + /** InteractiveAnnotation action. */ + public action?: "location"; + + /** + * Creates a new InteractiveAnnotation instance using the specified properties. + * @param [properties] Properties to set + * @returns InteractiveAnnotation instance + */ + public static create(properties?: proto.IInteractiveAnnotation): proto.InteractiveAnnotation; + + /** + * Encodes the specified InteractiveAnnotation message. Does not implicitly {@link proto.InteractiveAnnotation.verify|verify} messages. + * @param message InteractiveAnnotation message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IInteractiveAnnotation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified InteractiveAnnotation message, length delimited. Does not implicitly {@link proto.InteractiveAnnotation.verify|verify} messages. + * @param message InteractiveAnnotation message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IInteractiveAnnotation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an InteractiveAnnotation message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns InteractiveAnnotation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.InteractiveAnnotation; + + /** + * Decodes an InteractiveAnnotation message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns InteractiveAnnotation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.InteractiveAnnotation; + + /** + * Verifies an InteractiveAnnotation message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an InteractiveAnnotation message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns InteractiveAnnotation + */ + public static fromObject(object: { [k: string]: any }): proto.InteractiveAnnotation; + + /** + * Creates a plain object from an InteractiveAnnotation message. Also converts values to other types if specified. + * @param message InteractiveAnnotation + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.InteractiveAnnotation, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this InteractiveAnnotation to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a KeepInChat. */ + interface IKeepInChat { + + /** KeepInChat keepType */ + keepType?: (proto.KeepType|null); + + /** KeepInChat serverTimestamp */ + serverTimestamp?: (number|Long|null); + + /** KeepInChat key */ + key?: (proto.IMessageKey|null); + + /** KeepInChat deviceJid */ + deviceJid?: (string|null); + + /** KeepInChat clientTimestampMs */ + clientTimestampMs?: (number|Long|null); + + /** KeepInChat serverTimestampMs */ + serverTimestampMs?: (number|Long|null); + } + + /** Represents a KeepInChat. */ + class KeepInChat implements IKeepInChat { + + /** + * Constructs a new KeepInChat. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IKeepInChat); + + /** KeepInChat keepType. */ + public keepType: proto.KeepType; + + /** KeepInChat serverTimestamp. */ + public serverTimestamp: (number|Long); + + /** KeepInChat key. */ + public key?: (proto.IMessageKey|null); + + /** KeepInChat deviceJid. */ + public deviceJid: string; + + /** KeepInChat clientTimestampMs. */ + public clientTimestampMs: (number|Long); + + /** KeepInChat serverTimestampMs. */ + public serverTimestampMs: (number|Long); + + /** + * Creates a new KeepInChat instance using the specified properties. + * @param [properties] Properties to set + * @returns KeepInChat instance + */ + public static create(properties?: proto.IKeepInChat): proto.KeepInChat; + + /** + * Encodes the specified KeepInChat message. Does not implicitly {@link proto.KeepInChat.verify|verify} messages. + * @param message KeepInChat message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IKeepInChat, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified KeepInChat message, length delimited. Does not implicitly {@link proto.KeepInChat.verify|verify} messages. + * @param message KeepInChat message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IKeepInChat, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a KeepInChat message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns KeepInChat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.KeepInChat; + + /** + * Decodes a KeepInChat message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns KeepInChat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.KeepInChat; + + /** + * Verifies a KeepInChat message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a KeepInChat message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns KeepInChat + */ + public static fromObject(object: { [k: string]: any }): proto.KeepInChat; + + /** + * Creates a plain object from a KeepInChat message. Also converts values to other types if specified. + * @param message KeepInChat + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.KeepInChat, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this KeepInChat to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** KeepType enum. */ + enum KeepType { + UNKNOWN = 0, + KEEP_FOR_ALL = 1, + UNDO_KEEP_FOR_ALL = 2 + } + + /** Properties of a KeyId. */ + interface IKeyId { + + /** KeyId id */ + id?: (Uint8Array|null); + } + + /** Represents a KeyId. */ + class KeyId implements IKeyId { + + /** + * Constructs a new KeyId. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IKeyId); + + /** KeyId id. */ + public id: Uint8Array; + + /** + * Creates a new KeyId instance using the specified properties. + * @param [properties] Properties to set + * @returns KeyId instance + */ + public static create(properties?: proto.IKeyId): proto.KeyId; + + /** + * Encodes the specified KeyId message. Does not implicitly {@link proto.KeyId.verify|verify} messages. + * @param message KeyId message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IKeyId, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified KeyId message, length delimited. Does not implicitly {@link proto.KeyId.verify|verify} messages. + * @param message KeyId message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IKeyId, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a KeyId message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns KeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.KeyId; + + /** + * Decodes a KeyId message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns KeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.KeyId; + + /** + * Verifies a KeyId message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a KeyId message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns KeyId + */ + public static fromObject(object: { [k: string]: any }): proto.KeyId; + + /** + * Creates a plain object from a KeyId message. Also converts values to other types if specified. + * @param message KeyId + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.KeyId, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this KeyId to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a LocalizedName. */ + interface ILocalizedName { + + /** LocalizedName lg */ + lg?: (string|null); + + /** LocalizedName lc */ + lc?: (string|null); + + /** LocalizedName verifiedName */ + verifiedName?: (string|null); + } + + /** Represents a LocalizedName. */ + class LocalizedName implements ILocalizedName { + + /** + * Constructs a new LocalizedName. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ILocalizedName); + + /** LocalizedName lg. */ + public lg: string; + + /** LocalizedName lc. */ + public lc: string; + + /** LocalizedName verifiedName. */ + public verifiedName: string; + + /** + * Creates a new LocalizedName instance using the specified properties. + * @param [properties] Properties to set + * @returns LocalizedName instance + */ + public static create(properties?: proto.ILocalizedName): proto.LocalizedName; + + /** + * Encodes the specified LocalizedName message. Does not implicitly {@link proto.LocalizedName.verify|verify} messages. + * @param message LocalizedName message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ILocalizedName, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LocalizedName message, length delimited. Does not implicitly {@link proto.LocalizedName.verify|verify} messages. + * @param message LocalizedName message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ILocalizedName, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LocalizedName message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LocalizedName + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.LocalizedName; + + /** + * Decodes a LocalizedName message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LocalizedName + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.LocalizedName; + + /** + * Verifies a LocalizedName message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LocalizedName message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LocalizedName + */ + public static fromObject(object: { [k: string]: any }): proto.LocalizedName; + + /** + * Creates a plain object from a LocalizedName message. Also converts values to other types if specified. + * @param message LocalizedName + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.LocalizedName, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LocalizedName to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Location. */ + interface ILocation { + + /** Location degreesLatitude */ + degreesLatitude?: (number|null); + + /** Location degreesLongitude */ + degreesLongitude?: (number|null); + + /** Location name */ + name?: (string|null); + } + + /** Represents a Location. */ + class Location implements ILocation { + + /** + * Constructs a new Location. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ILocation); + + /** Location degreesLatitude. */ + public degreesLatitude: number; + + /** Location degreesLongitude. */ + public degreesLongitude: number; + + /** Location name. */ + public name: string; + + /** + * Creates a new Location instance using the specified properties. + * @param [properties] Properties to set + * @returns Location instance + */ + public static create(properties?: proto.ILocation): proto.Location; + + /** + * Encodes the specified Location message. Does not implicitly {@link proto.Location.verify|verify} messages. + * @param message Location message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ILocation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Location message, length delimited. Does not implicitly {@link proto.Location.verify|verify} messages. + * @param message Location message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ILocation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Location message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Location + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Location; + + /** + * Decodes a Location message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Location + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Location; + + /** + * Verifies a Location message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Location message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Location + */ + public static fromObject(object: { [k: string]: any }): proto.Location; + + /** + * Creates a plain object from a Location message. Also converts values to other types if specified. + * @param message Location + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Location, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Location to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a MediaData. */ + interface IMediaData { + + /** MediaData localPath */ + localPath?: (string|null); + } + + /** Represents a MediaData. */ + class MediaData implements IMediaData { + + /** + * Constructs a new MediaData. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMediaData); + + /** MediaData localPath. */ + public localPath: string; + + /** + * Creates a new MediaData instance using the specified properties. + * @param [properties] Properties to set + * @returns MediaData instance + */ + public static create(properties?: proto.IMediaData): proto.MediaData; + + /** + * Encodes the specified MediaData message. Does not implicitly {@link proto.MediaData.verify|verify} messages. + * @param message MediaData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMediaData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MediaData message, length delimited. Does not implicitly {@link proto.MediaData.verify|verify} messages. + * @param message MediaData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMediaData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MediaData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.MediaData; + + /** + * Decodes a MediaData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.MediaData; + + /** + * Verifies a MediaData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MediaData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MediaData + */ + public static fromObject(object: { [k: string]: any }): proto.MediaData; + + /** + * Creates a plain object from a MediaData message. Also converts values to other types if specified. + * @param message MediaData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.MediaData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MediaData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a MediaRetryNotification. */ + interface IMediaRetryNotification { + + /** MediaRetryNotification stanzaId */ + stanzaId?: (string|null); + + /** MediaRetryNotification directPath */ + directPath?: (string|null); + + /** MediaRetryNotification result */ + result?: (proto.MediaRetryNotification.ResultType|null); + } + + /** Represents a MediaRetryNotification. */ + class MediaRetryNotification implements IMediaRetryNotification { + + /** + * Constructs a new MediaRetryNotification. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMediaRetryNotification); + + /** MediaRetryNotification stanzaId. */ + public stanzaId: string; + + /** MediaRetryNotification directPath. */ + public directPath: string; + + /** MediaRetryNotification result. */ + public result: proto.MediaRetryNotification.ResultType; + + /** + * Creates a new MediaRetryNotification instance using the specified properties. + * @param [properties] Properties to set + * @returns MediaRetryNotification instance + */ + public static create(properties?: proto.IMediaRetryNotification): proto.MediaRetryNotification; + + /** + * Encodes the specified MediaRetryNotification message. Does not implicitly {@link proto.MediaRetryNotification.verify|verify} messages. + * @param message MediaRetryNotification message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMediaRetryNotification, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MediaRetryNotification message, length delimited. Does not implicitly {@link proto.MediaRetryNotification.verify|verify} messages. + * @param message MediaRetryNotification message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMediaRetryNotification, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MediaRetryNotification message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MediaRetryNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.MediaRetryNotification; + + /** + * Decodes a MediaRetryNotification message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MediaRetryNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.MediaRetryNotification; + + /** + * Verifies a MediaRetryNotification message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MediaRetryNotification message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MediaRetryNotification + */ + public static fromObject(object: { [k: string]: any }): proto.MediaRetryNotification; + + /** + * Creates a plain object from a MediaRetryNotification message. Also converts values to other types if specified. + * @param message MediaRetryNotification + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.MediaRetryNotification, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MediaRetryNotification to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace MediaRetryNotification { + + /** ResultType enum. */ + enum ResultType { + GENERAL_ERROR = 0, + SUCCESS = 1, + NOT_FOUND = 2, + DECRYPTION_ERROR = 3 + } + } + + /** MediaVisibility enum. */ + enum MediaVisibility { + DEFAULT = 0, + OFF = 1, + ON = 2 + } + + /** Properties of a Message. */ + interface IMessage { + + /** Message conversation */ + conversation?: (string|null); + + /** Message senderKeyDistributionMessage */ + senderKeyDistributionMessage?: (proto.Message.ISenderKeyDistributionMessage|null); + + /** Message imageMessage */ + imageMessage?: (proto.Message.IImageMessage|null); + + /** Message contactMessage */ + contactMessage?: (proto.Message.IContactMessage|null); + + /** Message locationMessage */ + locationMessage?: (proto.Message.ILocationMessage|null); + + /** Message extendedTextMessage */ + extendedTextMessage?: (proto.Message.IExtendedTextMessage|null); + + /** Message documentMessage */ + documentMessage?: (proto.Message.IDocumentMessage|null); + + /** Message audioMessage */ + audioMessage?: (proto.Message.IAudioMessage|null); + + /** Message videoMessage */ + videoMessage?: (proto.Message.IVideoMessage|null); + + /** Message call */ + call?: (proto.Message.ICall|null); + + /** Message chat */ + chat?: (proto.Message.IChat|null); + + /** Message protocolMessage */ + protocolMessage?: (proto.Message.IProtocolMessage|null); + + /** Message contactsArrayMessage */ + contactsArrayMessage?: (proto.Message.IContactsArrayMessage|null); + + /** Message highlyStructuredMessage */ + highlyStructuredMessage?: (proto.Message.IHighlyStructuredMessage|null); + + /** Message fastRatchetKeySenderKeyDistributionMessage */ + fastRatchetKeySenderKeyDistributionMessage?: (proto.Message.ISenderKeyDistributionMessage|null); + + /** Message sendPaymentMessage */ + sendPaymentMessage?: (proto.Message.ISendPaymentMessage|null); + + /** Message liveLocationMessage */ + liveLocationMessage?: (proto.Message.ILiveLocationMessage|null); + + /** Message requestPaymentMessage */ + requestPaymentMessage?: (proto.Message.IRequestPaymentMessage|null); + + /** Message declinePaymentRequestMessage */ + declinePaymentRequestMessage?: (proto.Message.IDeclinePaymentRequestMessage|null); + + /** Message cancelPaymentRequestMessage */ + cancelPaymentRequestMessage?: (proto.Message.ICancelPaymentRequestMessage|null); + + /** Message templateMessage */ + templateMessage?: (proto.Message.ITemplateMessage|null); + + /** Message stickerMessage */ + stickerMessage?: (proto.Message.IStickerMessage|null); + + /** Message groupInviteMessage */ + groupInviteMessage?: (proto.Message.IGroupInviteMessage|null); + + /** Message templateButtonReplyMessage */ + templateButtonReplyMessage?: (proto.Message.ITemplateButtonReplyMessage|null); + + /** Message productMessage */ + productMessage?: (proto.Message.IProductMessage|null); + + /** Message deviceSentMessage */ + deviceSentMessage?: (proto.Message.IDeviceSentMessage|null); + + /** Message messageContextInfo */ + messageContextInfo?: (proto.IMessageContextInfo|null); + + /** Message listMessage */ + listMessage?: (proto.Message.IListMessage|null); + + /** Message viewOnceMessage */ + viewOnceMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message orderMessage */ + orderMessage?: (proto.Message.IOrderMessage|null); + + /** Message listResponseMessage */ + listResponseMessage?: (proto.Message.IListResponseMessage|null); + + /** Message ephemeralMessage */ + ephemeralMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message invoiceMessage */ + invoiceMessage?: (proto.Message.IInvoiceMessage|null); + + /** Message buttonsMessage */ + buttonsMessage?: (proto.Message.IButtonsMessage|null); + + /** Message buttonsResponseMessage */ + buttonsResponseMessage?: (proto.Message.IButtonsResponseMessage|null); + + /** Message paymentInviteMessage */ + paymentInviteMessage?: (proto.Message.IPaymentInviteMessage|null); + + /** Message interactiveMessage */ + interactiveMessage?: (proto.Message.IInteractiveMessage|null); + + /** Message reactionMessage */ + reactionMessage?: (proto.Message.IReactionMessage|null); + + /** Message stickerSyncRmrMessage */ + stickerSyncRmrMessage?: (proto.Message.IStickerSyncRMRMessage|null); + + /** Message interactiveResponseMessage */ + interactiveResponseMessage?: (proto.Message.IInteractiveResponseMessage|null); + + /** Message pollCreationMessage */ + pollCreationMessage?: (proto.Message.IPollCreationMessage|null); + + /** Message pollUpdateMessage */ + pollUpdateMessage?: (proto.Message.IPollUpdateMessage|null); + + /** Message keepInChatMessage */ + keepInChatMessage?: (proto.Message.IKeepInChatMessage|null); + + /** Message documentWithCaptionMessage */ + documentWithCaptionMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message requestPhoneNumberMessage */ + requestPhoneNumberMessage?: (proto.Message.IRequestPhoneNumberMessage|null); + + /** Message viewOnceMessageV2 */ + viewOnceMessageV2?: (proto.Message.IFutureProofMessage|null); + + /** Message encReactionMessage */ + encReactionMessage?: (proto.Message.IEncReactionMessage|null); + + /** Message editedMessage */ + editedMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message viewOnceMessageV2Extension */ + viewOnceMessageV2Extension?: (proto.Message.IFutureProofMessage|null); + } + + /** Represents a Message. */ + class Message implements IMessage { + + /** + * Constructs a new Message. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMessage); + + /** Message conversation. */ + public conversation: string; + + /** Message senderKeyDistributionMessage. */ + public senderKeyDistributionMessage?: (proto.Message.ISenderKeyDistributionMessage|null); + + /** Message imageMessage. */ + public imageMessage?: (proto.Message.IImageMessage|null); + + /** Message contactMessage. */ + public contactMessage?: (proto.Message.IContactMessage|null); + + /** Message locationMessage. */ + public locationMessage?: (proto.Message.ILocationMessage|null); + + /** Message extendedTextMessage. */ + public extendedTextMessage?: (proto.Message.IExtendedTextMessage|null); + + /** Message documentMessage. */ + public documentMessage?: (proto.Message.IDocumentMessage|null); + + /** Message audioMessage. */ + public audioMessage?: (proto.Message.IAudioMessage|null); + + /** Message videoMessage. */ + public videoMessage?: (proto.Message.IVideoMessage|null); + + /** Message call. */ + public call?: (proto.Message.ICall|null); + + /** Message chat. */ + public chat?: (proto.Message.IChat|null); + + /** Message protocolMessage. */ + public protocolMessage?: (proto.Message.IProtocolMessage|null); + + /** Message contactsArrayMessage. */ + public contactsArrayMessage?: (proto.Message.IContactsArrayMessage|null); + + /** Message highlyStructuredMessage. */ + public highlyStructuredMessage?: (proto.Message.IHighlyStructuredMessage|null); + + /** Message fastRatchetKeySenderKeyDistributionMessage. */ + public fastRatchetKeySenderKeyDistributionMessage?: (proto.Message.ISenderKeyDistributionMessage|null); + + /** Message sendPaymentMessage. */ + public sendPaymentMessage?: (proto.Message.ISendPaymentMessage|null); + + /** Message liveLocationMessage. */ + public liveLocationMessage?: (proto.Message.ILiveLocationMessage|null); + + /** Message requestPaymentMessage. */ + public requestPaymentMessage?: (proto.Message.IRequestPaymentMessage|null); + + /** Message declinePaymentRequestMessage. */ + public declinePaymentRequestMessage?: (proto.Message.IDeclinePaymentRequestMessage|null); + + /** Message cancelPaymentRequestMessage. */ + public cancelPaymentRequestMessage?: (proto.Message.ICancelPaymentRequestMessage|null); + + /** Message templateMessage. */ + public templateMessage?: (proto.Message.ITemplateMessage|null); + + /** Message stickerMessage. */ + public stickerMessage?: (proto.Message.IStickerMessage|null); + + /** Message groupInviteMessage. */ + public groupInviteMessage?: (proto.Message.IGroupInviteMessage|null); + + /** Message templateButtonReplyMessage. */ + public templateButtonReplyMessage?: (proto.Message.ITemplateButtonReplyMessage|null); + + /** Message productMessage. */ + public productMessage?: (proto.Message.IProductMessage|null); + + /** Message deviceSentMessage. */ + public deviceSentMessage?: (proto.Message.IDeviceSentMessage|null); + + /** Message messageContextInfo. */ + public messageContextInfo?: (proto.IMessageContextInfo|null); + + /** Message listMessage. */ + public listMessage?: (proto.Message.IListMessage|null); + + /** Message viewOnceMessage. */ + public viewOnceMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message orderMessage. */ + public orderMessage?: (proto.Message.IOrderMessage|null); + + /** Message listResponseMessage. */ + public listResponseMessage?: (proto.Message.IListResponseMessage|null); + + /** Message ephemeralMessage. */ + public ephemeralMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message invoiceMessage. */ + public invoiceMessage?: (proto.Message.IInvoiceMessage|null); + + /** Message buttonsMessage. */ + public buttonsMessage?: (proto.Message.IButtonsMessage|null); + + /** Message buttonsResponseMessage. */ + public buttonsResponseMessage?: (proto.Message.IButtonsResponseMessage|null); + + /** Message paymentInviteMessage. */ + public paymentInviteMessage?: (proto.Message.IPaymentInviteMessage|null); + + /** Message interactiveMessage. */ + public interactiveMessage?: (proto.Message.IInteractiveMessage|null); + + /** Message reactionMessage. */ + public reactionMessage?: (proto.Message.IReactionMessage|null); + + /** Message stickerSyncRmrMessage. */ + public stickerSyncRmrMessage?: (proto.Message.IStickerSyncRMRMessage|null); + + /** Message interactiveResponseMessage. */ + public interactiveResponseMessage?: (proto.Message.IInteractiveResponseMessage|null); + + /** Message pollCreationMessage. */ + public pollCreationMessage?: (proto.Message.IPollCreationMessage|null); + + /** Message pollUpdateMessage. */ + public pollUpdateMessage?: (proto.Message.IPollUpdateMessage|null); + + /** Message keepInChatMessage. */ + public keepInChatMessage?: (proto.Message.IKeepInChatMessage|null); + + /** Message documentWithCaptionMessage. */ + public documentWithCaptionMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message requestPhoneNumberMessage. */ + public requestPhoneNumberMessage?: (proto.Message.IRequestPhoneNumberMessage|null); + + /** Message viewOnceMessageV2. */ + public viewOnceMessageV2?: (proto.Message.IFutureProofMessage|null); + + /** Message encReactionMessage. */ + public encReactionMessage?: (proto.Message.IEncReactionMessage|null); + + /** Message editedMessage. */ + public editedMessage?: (proto.Message.IFutureProofMessage|null); + + /** Message viewOnceMessageV2Extension. */ + public viewOnceMessageV2Extension?: (proto.Message.IFutureProofMessage|null); + + /** + * Creates a new Message instance using the specified properties. + * @param [properties] Properties to set + * @returns Message instance + */ + public static create(properties?: proto.IMessage): proto.Message; + + /** + * Encodes the specified Message message. Does not implicitly {@link proto.Message.verify|verify} messages. + * @param message Message message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Message message, length delimited. Does not implicitly {@link proto.Message.verify|verify} messages. + * @param message Message message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Message message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Message + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message; + + /** + * Decodes a Message message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Message + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message; + + /** + * Verifies a Message message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Message message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Message + */ + public static fromObject(object: { [k: string]: any }): proto.Message; + + /** + * Creates a plain object from a Message message. Also converts values to other types if specified. + * @param message Message + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Message to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace Message { + + /** Properties of an AppStateFatalExceptionNotification. */ + interface IAppStateFatalExceptionNotification { + + /** AppStateFatalExceptionNotification collectionNames */ + collectionNames?: (string[]|null); + + /** AppStateFatalExceptionNotification timestamp */ + timestamp?: (number|Long|null); + } + + /** Represents an AppStateFatalExceptionNotification. */ + class AppStateFatalExceptionNotification implements IAppStateFatalExceptionNotification { + + /** + * Constructs a new AppStateFatalExceptionNotification. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAppStateFatalExceptionNotification); + + /** AppStateFatalExceptionNotification collectionNames. */ + public collectionNames: string[]; + + /** AppStateFatalExceptionNotification timestamp. */ + public timestamp: (number|Long); + + /** + * Creates a new AppStateFatalExceptionNotification instance using the specified properties. + * @param [properties] Properties to set + * @returns AppStateFatalExceptionNotification instance + */ + public static create(properties?: proto.Message.IAppStateFatalExceptionNotification): proto.Message.AppStateFatalExceptionNotification; + + /** + * Encodes the specified AppStateFatalExceptionNotification message. Does not implicitly {@link proto.Message.AppStateFatalExceptionNotification.verify|verify} messages. + * @param message AppStateFatalExceptionNotification message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAppStateFatalExceptionNotification, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppStateFatalExceptionNotification message, length delimited. Does not implicitly {@link proto.Message.AppStateFatalExceptionNotification.verify|verify} messages. + * @param message AppStateFatalExceptionNotification message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAppStateFatalExceptionNotification, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppStateFatalExceptionNotification message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppStateFatalExceptionNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AppStateFatalExceptionNotification; + + /** + * Decodes an AppStateFatalExceptionNotification message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppStateFatalExceptionNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AppStateFatalExceptionNotification; + + /** + * Verifies an AppStateFatalExceptionNotification message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppStateFatalExceptionNotification message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppStateFatalExceptionNotification + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AppStateFatalExceptionNotification; + + /** + * Creates a plain object from an AppStateFatalExceptionNotification message. Also converts values to other types if specified. + * @param message AppStateFatalExceptionNotification + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AppStateFatalExceptionNotification, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppStateFatalExceptionNotification to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AppStateSyncKey. */ + interface IAppStateSyncKey { + + /** AppStateSyncKey keyId */ + keyId?: (proto.Message.IAppStateSyncKeyId|null); + + /** AppStateSyncKey keyData */ + keyData?: (proto.Message.IAppStateSyncKeyData|null); + } + + /** Represents an AppStateSyncKey. */ + class AppStateSyncKey implements IAppStateSyncKey { + + /** + * Constructs a new AppStateSyncKey. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAppStateSyncKey); + + /** AppStateSyncKey keyId. */ + public keyId?: (proto.Message.IAppStateSyncKeyId|null); + + /** AppStateSyncKey keyData. */ + public keyData?: (proto.Message.IAppStateSyncKeyData|null); + + /** + * Creates a new AppStateSyncKey instance using the specified properties. + * @param [properties] Properties to set + * @returns AppStateSyncKey instance + */ + public static create(properties?: proto.Message.IAppStateSyncKey): proto.Message.AppStateSyncKey; + + /** + * Encodes the specified AppStateSyncKey message. Does not implicitly {@link proto.Message.AppStateSyncKey.verify|verify} messages. + * @param message AppStateSyncKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAppStateSyncKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppStateSyncKey message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKey.verify|verify} messages. + * @param message AppStateSyncKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAppStateSyncKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppStateSyncKey message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppStateSyncKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AppStateSyncKey; + + /** + * Decodes an AppStateSyncKey message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppStateSyncKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AppStateSyncKey; + + /** + * Verifies an AppStateSyncKey message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppStateSyncKey message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppStateSyncKey + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AppStateSyncKey; + + /** + * Creates a plain object from an AppStateSyncKey message. Also converts values to other types if specified. + * @param message AppStateSyncKey + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AppStateSyncKey, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppStateSyncKey to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AppStateSyncKeyData. */ + interface IAppStateSyncKeyData { + + /** AppStateSyncKeyData keyData */ + keyData?: (Uint8Array|null); + + /** AppStateSyncKeyData fingerprint */ + fingerprint?: (proto.Message.IAppStateSyncKeyFingerprint|null); + + /** AppStateSyncKeyData timestamp */ + timestamp?: (number|Long|null); + } + + /** Represents an AppStateSyncKeyData. */ + class AppStateSyncKeyData implements IAppStateSyncKeyData { + + /** + * Constructs a new AppStateSyncKeyData. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAppStateSyncKeyData); + + /** AppStateSyncKeyData keyData. */ + public keyData: Uint8Array; + + /** AppStateSyncKeyData fingerprint. */ + public fingerprint?: (proto.Message.IAppStateSyncKeyFingerprint|null); + + /** AppStateSyncKeyData timestamp. */ + public timestamp: (number|Long); + + /** + * Creates a new AppStateSyncKeyData instance using the specified properties. + * @param [properties] Properties to set + * @returns AppStateSyncKeyData instance + */ + public static create(properties?: proto.Message.IAppStateSyncKeyData): proto.Message.AppStateSyncKeyData; + + /** + * Encodes the specified AppStateSyncKeyData message. Does not implicitly {@link proto.Message.AppStateSyncKeyData.verify|verify} messages. + * @param message AppStateSyncKeyData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAppStateSyncKeyData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppStateSyncKeyData message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyData.verify|verify} messages. + * @param message AppStateSyncKeyData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAppStateSyncKeyData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppStateSyncKeyData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppStateSyncKeyData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AppStateSyncKeyData; + + /** + * Decodes an AppStateSyncKeyData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppStateSyncKeyData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AppStateSyncKeyData; + + /** + * Verifies an AppStateSyncKeyData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppStateSyncKeyData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppStateSyncKeyData + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AppStateSyncKeyData; + + /** + * Creates a plain object from an AppStateSyncKeyData message. Also converts values to other types if specified. + * @param message AppStateSyncKeyData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AppStateSyncKeyData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppStateSyncKeyData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AppStateSyncKeyFingerprint. */ + interface IAppStateSyncKeyFingerprint { + + /** AppStateSyncKeyFingerprint rawId */ + rawId?: (number|null); + + /** AppStateSyncKeyFingerprint currentIndex */ + currentIndex?: (number|null); + + /** AppStateSyncKeyFingerprint deviceIndexes */ + deviceIndexes?: (number[]|null); + } + + /** Represents an AppStateSyncKeyFingerprint. */ + class AppStateSyncKeyFingerprint implements IAppStateSyncKeyFingerprint { + + /** + * Constructs a new AppStateSyncKeyFingerprint. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAppStateSyncKeyFingerprint); + + /** AppStateSyncKeyFingerprint rawId. */ + public rawId: number; + + /** AppStateSyncKeyFingerprint currentIndex. */ + public currentIndex: number; + + /** AppStateSyncKeyFingerprint deviceIndexes. */ + public deviceIndexes: number[]; + + /** + * Creates a new AppStateSyncKeyFingerprint instance using the specified properties. + * @param [properties] Properties to set + * @returns AppStateSyncKeyFingerprint instance + */ + public static create(properties?: proto.Message.IAppStateSyncKeyFingerprint): proto.Message.AppStateSyncKeyFingerprint; + + /** + * Encodes the specified AppStateSyncKeyFingerprint message. Does not implicitly {@link proto.Message.AppStateSyncKeyFingerprint.verify|verify} messages. + * @param message AppStateSyncKeyFingerprint message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAppStateSyncKeyFingerprint, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppStateSyncKeyFingerprint message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyFingerprint.verify|verify} messages. + * @param message AppStateSyncKeyFingerprint message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAppStateSyncKeyFingerprint, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppStateSyncKeyFingerprint message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppStateSyncKeyFingerprint + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AppStateSyncKeyFingerprint; + + /** + * Decodes an AppStateSyncKeyFingerprint message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppStateSyncKeyFingerprint + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AppStateSyncKeyFingerprint; + + /** + * Verifies an AppStateSyncKeyFingerprint message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppStateSyncKeyFingerprint message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppStateSyncKeyFingerprint + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AppStateSyncKeyFingerprint; + + /** + * Creates a plain object from an AppStateSyncKeyFingerprint message. Also converts values to other types if specified. + * @param message AppStateSyncKeyFingerprint + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AppStateSyncKeyFingerprint, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppStateSyncKeyFingerprint to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AppStateSyncKeyId. */ + interface IAppStateSyncKeyId { + + /** AppStateSyncKeyId keyId */ + keyId?: (Uint8Array|null); + } + + /** Represents an AppStateSyncKeyId. */ + class AppStateSyncKeyId implements IAppStateSyncKeyId { + + /** + * Constructs a new AppStateSyncKeyId. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAppStateSyncKeyId); + + /** AppStateSyncKeyId keyId. */ + public keyId: Uint8Array; + + /** + * Creates a new AppStateSyncKeyId instance using the specified properties. + * @param [properties] Properties to set + * @returns AppStateSyncKeyId instance + */ + public static create(properties?: proto.Message.IAppStateSyncKeyId): proto.Message.AppStateSyncKeyId; + + /** + * Encodes the specified AppStateSyncKeyId message. Does not implicitly {@link proto.Message.AppStateSyncKeyId.verify|verify} messages. + * @param message AppStateSyncKeyId message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAppStateSyncKeyId, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppStateSyncKeyId message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyId.verify|verify} messages. + * @param message AppStateSyncKeyId message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAppStateSyncKeyId, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppStateSyncKeyId message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppStateSyncKeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AppStateSyncKeyId; + + /** + * Decodes an AppStateSyncKeyId message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppStateSyncKeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AppStateSyncKeyId; + + /** + * Verifies an AppStateSyncKeyId message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppStateSyncKeyId message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppStateSyncKeyId + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AppStateSyncKeyId; + + /** + * Creates a plain object from an AppStateSyncKeyId message. Also converts values to other types if specified. + * @param message AppStateSyncKeyId + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AppStateSyncKeyId, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppStateSyncKeyId to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AppStateSyncKeyRequest. */ + interface IAppStateSyncKeyRequest { + + /** AppStateSyncKeyRequest keyIds */ + keyIds?: (proto.Message.IAppStateSyncKeyId[]|null); + } + + /** Represents an AppStateSyncKeyRequest. */ + class AppStateSyncKeyRequest implements IAppStateSyncKeyRequest { + + /** + * Constructs a new AppStateSyncKeyRequest. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAppStateSyncKeyRequest); + + /** AppStateSyncKeyRequest keyIds. */ + public keyIds: proto.Message.IAppStateSyncKeyId[]; + + /** + * Creates a new AppStateSyncKeyRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns AppStateSyncKeyRequest instance + */ + public static create(properties?: proto.Message.IAppStateSyncKeyRequest): proto.Message.AppStateSyncKeyRequest; + + /** + * Encodes the specified AppStateSyncKeyRequest message. Does not implicitly {@link proto.Message.AppStateSyncKeyRequest.verify|verify} messages. + * @param message AppStateSyncKeyRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAppStateSyncKeyRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppStateSyncKeyRequest message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyRequest.verify|verify} messages. + * @param message AppStateSyncKeyRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAppStateSyncKeyRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppStateSyncKeyRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppStateSyncKeyRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AppStateSyncKeyRequest; + + /** + * Decodes an AppStateSyncKeyRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppStateSyncKeyRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AppStateSyncKeyRequest; + + /** + * Verifies an AppStateSyncKeyRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppStateSyncKeyRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppStateSyncKeyRequest + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AppStateSyncKeyRequest; + + /** + * Creates a plain object from an AppStateSyncKeyRequest message. Also converts values to other types if specified. + * @param message AppStateSyncKeyRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AppStateSyncKeyRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppStateSyncKeyRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AppStateSyncKeyShare. */ + interface IAppStateSyncKeyShare { + + /** AppStateSyncKeyShare keys */ + keys?: (proto.Message.IAppStateSyncKey[]|null); + } + + /** Represents an AppStateSyncKeyShare. */ + class AppStateSyncKeyShare implements IAppStateSyncKeyShare { + + /** + * Constructs a new AppStateSyncKeyShare. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAppStateSyncKeyShare); + + /** AppStateSyncKeyShare keys. */ + public keys: proto.Message.IAppStateSyncKey[]; + + /** + * Creates a new AppStateSyncKeyShare instance using the specified properties. + * @param [properties] Properties to set + * @returns AppStateSyncKeyShare instance + */ + public static create(properties?: proto.Message.IAppStateSyncKeyShare): proto.Message.AppStateSyncKeyShare; + + /** + * Encodes the specified AppStateSyncKeyShare message. Does not implicitly {@link proto.Message.AppStateSyncKeyShare.verify|verify} messages. + * @param message AppStateSyncKeyShare message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAppStateSyncKeyShare, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AppStateSyncKeyShare message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyShare.verify|verify} messages. + * @param message AppStateSyncKeyShare message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAppStateSyncKeyShare, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AppStateSyncKeyShare message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AppStateSyncKeyShare + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AppStateSyncKeyShare; + + /** + * Decodes an AppStateSyncKeyShare message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AppStateSyncKeyShare + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AppStateSyncKeyShare; + + /** + * Verifies an AppStateSyncKeyShare message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AppStateSyncKeyShare message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AppStateSyncKeyShare + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AppStateSyncKeyShare; + + /** + * Creates a plain object from an AppStateSyncKeyShare message. Also converts values to other types if specified. + * @param message AppStateSyncKeyShare + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AppStateSyncKeyShare, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AppStateSyncKeyShare to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AudioMessage. */ + interface IAudioMessage { + + /** AudioMessage url */ + url?: (string|null); + + /** AudioMessage mimetype */ + mimetype?: (string|null); + + /** AudioMessage fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** AudioMessage fileLength */ + fileLength?: (number|Long|null); + + /** AudioMessage seconds */ + seconds?: (number|null); + + /** AudioMessage ptt */ + ptt?: (boolean|null); + + /** AudioMessage mediaKey */ + mediaKey?: (Uint8Array|null); + + /** AudioMessage fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** AudioMessage directPath */ + directPath?: (string|null); + + /** AudioMessage mediaKeyTimestamp */ + mediaKeyTimestamp?: (number|Long|null); + + /** AudioMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** AudioMessage streamingSidecar */ + streamingSidecar?: (Uint8Array|null); + + /** AudioMessage waveform */ + waveform?: (Uint8Array|null); + + /** AudioMessage backgroundArgb */ + backgroundArgb?: (number|null); + } + + /** Represents an AudioMessage. */ + class AudioMessage implements IAudioMessage { + + /** + * Constructs a new AudioMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IAudioMessage); + + /** AudioMessage url. */ + public url: string; + + /** AudioMessage mimetype. */ + public mimetype: string; + + /** AudioMessage fileSha256. */ + public fileSha256: Uint8Array; + + /** AudioMessage fileLength. */ + public fileLength: (number|Long); + + /** AudioMessage seconds. */ + public seconds: number; + + /** AudioMessage ptt. */ + public ptt: boolean; + + /** AudioMessage mediaKey. */ + public mediaKey: Uint8Array; + + /** AudioMessage fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** AudioMessage directPath. */ + public directPath: string; + + /** AudioMessage mediaKeyTimestamp. */ + public mediaKeyTimestamp: (number|Long); + + /** AudioMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** AudioMessage streamingSidecar. */ + public streamingSidecar: Uint8Array; + + /** AudioMessage waveform. */ + public waveform: Uint8Array; + + /** AudioMessage backgroundArgb. */ + public backgroundArgb: number; + + /** + * Creates a new AudioMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns AudioMessage instance + */ + public static create(properties?: proto.Message.IAudioMessage): proto.Message.AudioMessage; + + /** + * Encodes the specified AudioMessage message. Does not implicitly {@link proto.Message.AudioMessage.verify|verify} messages. + * @param message AudioMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IAudioMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AudioMessage message, length delimited. Does not implicitly {@link proto.Message.AudioMessage.verify|verify} messages. + * @param message AudioMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IAudioMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AudioMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AudioMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.AudioMessage; + + /** + * Decodes an AudioMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AudioMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.AudioMessage; + + /** + * Verifies an AudioMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AudioMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AudioMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.AudioMessage; + + /** + * Creates a plain object from an AudioMessage message. Also converts values to other types if specified. + * @param message AudioMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.AudioMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AudioMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ButtonsMessage. */ + interface IButtonsMessage { + + /** ButtonsMessage contentText */ + contentText?: (string|null); + + /** ButtonsMessage footerText */ + footerText?: (string|null); + + /** ButtonsMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** ButtonsMessage buttons */ + buttons?: (proto.Message.ButtonsMessage.IButton[]|null); + + /** ButtonsMessage headerType */ + headerType?: (proto.Message.ButtonsMessage.HeaderType|null); + + /** ButtonsMessage text */ + text?: (string|null); + + /** ButtonsMessage documentMessage */ + documentMessage?: (proto.Message.IDocumentMessage|null); + + /** ButtonsMessage imageMessage */ + imageMessage?: (proto.Message.IImageMessage|null); + + /** ButtonsMessage videoMessage */ + videoMessage?: (proto.Message.IVideoMessage|null); + + /** ButtonsMessage locationMessage */ + locationMessage?: (proto.Message.ILocationMessage|null); + } + + /** Represents a ButtonsMessage. */ + class ButtonsMessage implements IButtonsMessage { + + /** + * Constructs a new ButtonsMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IButtonsMessage); + + /** ButtonsMessage contentText. */ + public contentText: string; + + /** ButtonsMessage footerText. */ + public footerText: string; + + /** ButtonsMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** ButtonsMessage buttons. */ + public buttons: proto.Message.ButtonsMessage.IButton[]; + + /** ButtonsMessage headerType. */ + public headerType: proto.Message.ButtonsMessage.HeaderType; + + /** ButtonsMessage text. */ + public text?: (string|null); + + /** ButtonsMessage documentMessage. */ + public documentMessage?: (proto.Message.IDocumentMessage|null); + + /** ButtonsMessage imageMessage. */ + public imageMessage?: (proto.Message.IImageMessage|null); + + /** ButtonsMessage videoMessage. */ + public videoMessage?: (proto.Message.IVideoMessage|null); + + /** ButtonsMessage locationMessage. */ + public locationMessage?: (proto.Message.ILocationMessage|null); + + /** ButtonsMessage header. */ + public header?: ("text"|"documentMessage"|"imageMessage"|"videoMessage"|"locationMessage"); + + /** + * Creates a new ButtonsMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ButtonsMessage instance + */ + public static create(properties?: proto.Message.IButtonsMessage): proto.Message.ButtonsMessage; + + /** + * Encodes the specified ButtonsMessage message. Does not implicitly {@link proto.Message.ButtonsMessage.verify|verify} messages. + * @param message ButtonsMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IButtonsMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ButtonsMessage message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.verify|verify} messages. + * @param message ButtonsMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IButtonsMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ButtonsMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ButtonsMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ButtonsMessage; + + /** + * Decodes a ButtonsMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ButtonsMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ButtonsMessage; + + /** + * Verifies a ButtonsMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ButtonsMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ButtonsMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ButtonsMessage; + + /** + * Creates a plain object from a ButtonsMessage message. Also converts values to other types if specified. + * @param message ButtonsMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ButtonsMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ButtonsMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ButtonsMessage { + + /** Properties of a Button. */ + interface IButton { + + /** Button buttonId */ + buttonId?: (string|null); + + /** Button buttonText */ + buttonText?: (proto.Message.ButtonsMessage.Button.IButtonText|null); + + /** Button type */ + type?: (proto.Message.ButtonsMessage.Button.Type|null); + + /** Button nativeFlowInfo */ + nativeFlowInfo?: (proto.Message.ButtonsMessage.Button.INativeFlowInfo|null); + } + + /** Represents a Button. */ + class Button implements IButton { + + /** + * Constructs a new Button. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ButtonsMessage.IButton); + + /** Button buttonId. */ + public buttonId: string; + + /** Button buttonText. */ + public buttonText?: (proto.Message.ButtonsMessage.Button.IButtonText|null); + + /** Button type. */ + public type: proto.Message.ButtonsMessage.Button.Type; + + /** Button nativeFlowInfo. */ + public nativeFlowInfo?: (proto.Message.ButtonsMessage.Button.INativeFlowInfo|null); + + /** + * Creates a new Button instance using the specified properties. + * @param [properties] Properties to set + * @returns Button instance + */ + public static create(properties?: proto.Message.ButtonsMessage.IButton): proto.Message.ButtonsMessage.Button; + + /** + * Encodes the specified Button message. Does not implicitly {@link proto.Message.ButtonsMessage.Button.verify|verify} messages. + * @param message Button message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ButtonsMessage.IButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Button message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.Button.verify|verify} messages. + * @param message Button message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ButtonsMessage.IButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Button message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Button + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ButtonsMessage.Button; + + /** + * Decodes a Button message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Button + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ButtonsMessage.Button; + + /** + * Verifies a Button message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Button message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Button + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ButtonsMessage.Button; + + /** + * Creates a plain object from a Button message. Also converts values to other types if specified. + * @param message Button + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ButtonsMessage.Button, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Button to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace Button { + + /** Properties of a ButtonText. */ + interface IButtonText { + + /** ButtonText displayText */ + displayText?: (string|null); + } + + /** Represents a ButtonText. */ + class ButtonText implements IButtonText { + + /** + * Constructs a new ButtonText. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ButtonsMessage.Button.IButtonText); + + /** ButtonText displayText. */ + public displayText: string; + + /** + * Creates a new ButtonText instance using the specified properties. + * @param [properties] Properties to set + * @returns ButtonText instance + */ + public static create(properties?: proto.Message.ButtonsMessage.Button.IButtonText): proto.Message.ButtonsMessage.Button.ButtonText; + + /** + * Encodes the specified ButtonText message. Does not implicitly {@link proto.Message.ButtonsMessage.Button.ButtonText.verify|verify} messages. + * @param message ButtonText message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ButtonsMessage.Button.IButtonText, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ButtonText message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.Button.ButtonText.verify|verify} messages. + * @param message ButtonText message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ButtonsMessage.Button.IButtonText, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ButtonText message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ButtonText + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ButtonsMessage.Button.ButtonText; + + /** + * Decodes a ButtonText message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ButtonText + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ButtonsMessage.Button.ButtonText; + + /** + * Verifies a ButtonText message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ButtonText message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ButtonText + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ButtonsMessage.Button.ButtonText; + + /** + * Creates a plain object from a ButtonText message. Also converts values to other types if specified. + * @param message ButtonText + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ButtonsMessage.Button.ButtonText, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ButtonText to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a NativeFlowInfo. */ + interface INativeFlowInfo { + + /** NativeFlowInfo name */ + name?: (string|null); + + /** NativeFlowInfo paramsJson */ + paramsJson?: (string|null); + } + + /** Represents a NativeFlowInfo. */ + class NativeFlowInfo implements INativeFlowInfo { + + /** + * Constructs a new NativeFlowInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ButtonsMessage.Button.INativeFlowInfo); + + /** NativeFlowInfo name. */ + public name: string; + + /** NativeFlowInfo paramsJson. */ + public paramsJson: string; + + /** + * Creates a new NativeFlowInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns NativeFlowInfo instance + */ + public static create(properties?: proto.Message.ButtonsMessage.Button.INativeFlowInfo): proto.Message.ButtonsMessage.Button.NativeFlowInfo; + + /** + * Encodes the specified NativeFlowInfo message. Does not implicitly {@link proto.Message.ButtonsMessage.Button.NativeFlowInfo.verify|verify} messages. + * @param message NativeFlowInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ButtonsMessage.Button.INativeFlowInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NativeFlowInfo message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.Button.NativeFlowInfo.verify|verify} messages. + * @param message NativeFlowInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ButtonsMessage.Button.INativeFlowInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NativeFlowInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NativeFlowInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ButtonsMessage.Button.NativeFlowInfo; + + /** + * Decodes a NativeFlowInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NativeFlowInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ButtonsMessage.Button.NativeFlowInfo; + + /** + * Verifies a NativeFlowInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NativeFlowInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NativeFlowInfo + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ButtonsMessage.Button.NativeFlowInfo; + + /** + * Creates a plain object from a NativeFlowInfo message. Also converts values to other types if specified. + * @param message NativeFlowInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ButtonsMessage.Button.NativeFlowInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NativeFlowInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Type enum. */ + enum Type { + UNKNOWN = 0, + RESPONSE = 1, + NATIVE_FLOW = 2 + } + } + + /** HeaderType enum. */ + enum HeaderType { + UNKNOWN = 0, + EMPTY = 1, + TEXT = 2, + DOCUMENT = 3, + IMAGE = 4, + VIDEO = 5, + LOCATION = 6 + } + } + + /** Properties of a ButtonsResponseMessage. */ + interface IButtonsResponseMessage { + + /** ButtonsResponseMessage selectedButtonId */ + selectedButtonId?: (string|null); + + /** ButtonsResponseMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** ButtonsResponseMessage type */ + type?: (proto.Message.ButtonsResponseMessage.Type|null); + + /** ButtonsResponseMessage selectedDisplayText */ + selectedDisplayText?: (string|null); + } + + /** Represents a ButtonsResponseMessage. */ + class ButtonsResponseMessage implements IButtonsResponseMessage { + + /** + * Constructs a new ButtonsResponseMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IButtonsResponseMessage); + + /** ButtonsResponseMessage selectedButtonId. */ + public selectedButtonId: string; + + /** ButtonsResponseMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** ButtonsResponseMessage type. */ + public type: proto.Message.ButtonsResponseMessage.Type; + + /** ButtonsResponseMessage selectedDisplayText. */ + public selectedDisplayText?: (string|null); + + /** ButtonsResponseMessage response. */ + public response?: "selectedDisplayText"; + + /** + * Creates a new ButtonsResponseMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ButtonsResponseMessage instance + */ + public static create(properties?: proto.Message.IButtonsResponseMessage): proto.Message.ButtonsResponseMessage; + + /** + * Encodes the specified ButtonsResponseMessage message. Does not implicitly {@link proto.Message.ButtonsResponseMessage.verify|verify} messages. + * @param message ButtonsResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IButtonsResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ButtonsResponseMessage message, length delimited. Does not implicitly {@link proto.Message.ButtonsResponseMessage.verify|verify} messages. + * @param message ButtonsResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IButtonsResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ButtonsResponseMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ButtonsResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ButtonsResponseMessage; + + /** + * Decodes a ButtonsResponseMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ButtonsResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ButtonsResponseMessage; + + /** + * Verifies a ButtonsResponseMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ButtonsResponseMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ButtonsResponseMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ButtonsResponseMessage; + + /** + * Creates a plain object from a ButtonsResponseMessage message. Also converts values to other types if specified. + * @param message ButtonsResponseMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ButtonsResponseMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ButtonsResponseMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ButtonsResponseMessage { + + /** Type enum. */ + enum Type { + UNKNOWN = 0, + DISPLAY_TEXT = 1 + } + } + + /** Properties of a Call. */ + interface ICall { + + /** Call callKey */ + callKey?: (Uint8Array|null); + + /** Call conversionSource */ + conversionSource?: (string|null); + + /** Call conversionData */ + conversionData?: (Uint8Array|null); + + /** Call conversionDelaySeconds */ + conversionDelaySeconds?: (number|null); + } + + /** Represents a Call. */ + class Call implements ICall { + + /** + * Constructs a new Call. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ICall); + + /** Call callKey. */ + public callKey: Uint8Array; + + /** Call conversionSource. */ + public conversionSource: string; + + /** Call conversionData. */ + public conversionData: Uint8Array; + + /** Call conversionDelaySeconds. */ + public conversionDelaySeconds: number; + + /** + * Creates a new Call instance using the specified properties. + * @param [properties] Properties to set + * @returns Call instance + */ + public static create(properties?: proto.Message.ICall): proto.Message.Call; + + /** + * Encodes the specified Call message. Does not implicitly {@link proto.Message.Call.verify|verify} messages. + * @param message Call message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ICall, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Call message, length delimited. Does not implicitly {@link proto.Message.Call.verify|verify} messages. + * @param message Call message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ICall, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Call message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Call + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.Call; + + /** + * Decodes a Call message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Call + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.Call; + + /** + * Verifies a Call message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Call message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Call + */ + public static fromObject(object: { [k: string]: any }): proto.Message.Call; + + /** + * Creates a plain object from a Call message. Also converts values to other types if specified. + * @param message Call + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.Call, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Call to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a CancelPaymentRequestMessage. */ + interface ICancelPaymentRequestMessage { + + /** CancelPaymentRequestMessage key */ + key?: (proto.IMessageKey|null); + } + + /** Represents a CancelPaymentRequestMessage. */ + class CancelPaymentRequestMessage implements ICancelPaymentRequestMessage { + + /** + * Constructs a new CancelPaymentRequestMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ICancelPaymentRequestMessage); + + /** CancelPaymentRequestMessage key. */ + public key?: (proto.IMessageKey|null); + + /** + * Creates a new CancelPaymentRequestMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns CancelPaymentRequestMessage instance + */ + public static create(properties?: proto.Message.ICancelPaymentRequestMessage): proto.Message.CancelPaymentRequestMessage; + + /** + * Encodes the specified CancelPaymentRequestMessage message. Does not implicitly {@link proto.Message.CancelPaymentRequestMessage.verify|verify} messages. + * @param message CancelPaymentRequestMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ICancelPaymentRequestMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CancelPaymentRequestMessage message, length delimited. Does not implicitly {@link proto.Message.CancelPaymentRequestMessage.verify|verify} messages. + * @param message CancelPaymentRequestMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ICancelPaymentRequestMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CancelPaymentRequestMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CancelPaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.CancelPaymentRequestMessage; + + /** + * Decodes a CancelPaymentRequestMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CancelPaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.CancelPaymentRequestMessage; + + /** + * Verifies a CancelPaymentRequestMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CancelPaymentRequestMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CancelPaymentRequestMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.CancelPaymentRequestMessage; + + /** + * Creates a plain object from a CancelPaymentRequestMessage message. Also converts values to other types if specified. + * @param message CancelPaymentRequestMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.CancelPaymentRequestMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CancelPaymentRequestMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Chat. */ + interface IChat { + + /** Chat displayName */ + displayName?: (string|null); + + /** Chat id */ + id?: (string|null); + } + + /** Represents a Chat. */ + class Chat implements IChat { + + /** + * Constructs a new Chat. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IChat); + + /** Chat displayName. */ + public displayName: string; + + /** Chat id. */ + public id: string; + + /** + * Creates a new Chat instance using the specified properties. + * @param [properties] Properties to set + * @returns Chat instance + */ + public static create(properties?: proto.Message.IChat): proto.Message.Chat; + + /** + * Encodes the specified Chat message. Does not implicitly {@link proto.Message.Chat.verify|verify} messages. + * @param message Chat message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IChat, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Chat message, length delimited. Does not implicitly {@link proto.Message.Chat.verify|verify} messages. + * @param message Chat message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IChat, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Chat message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Chat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.Chat; + + /** + * Decodes a Chat message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Chat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.Chat; + + /** + * Verifies a Chat message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Chat message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Chat + */ + public static fromObject(object: { [k: string]: any }): proto.Message.Chat; + + /** + * Creates a plain object from a Chat message. Also converts values to other types if specified. + * @param message Chat + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.Chat, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Chat to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ContactMessage. */ + interface IContactMessage { + + /** ContactMessage displayName */ + displayName?: (string|null); + + /** ContactMessage vcard */ + vcard?: (string|null); + + /** ContactMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a ContactMessage. */ + class ContactMessage implements IContactMessage { + + /** + * Constructs a new ContactMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IContactMessage); + + /** ContactMessage displayName. */ + public displayName: string; + + /** ContactMessage vcard. */ + public vcard: string; + + /** ContactMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new ContactMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ContactMessage instance + */ + public static create(properties?: proto.Message.IContactMessage): proto.Message.ContactMessage; + + /** + * Encodes the specified ContactMessage message. Does not implicitly {@link proto.Message.ContactMessage.verify|verify} messages. + * @param message ContactMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IContactMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ContactMessage message, length delimited. Does not implicitly {@link proto.Message.ContactMessage.verify|verify} messages. + * @param message ContactMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IContactMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ContactMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ContactMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ContactMessage; + + /** + * Decodes a ContactMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ContactMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ContactMessage; + + /** + * Verifies a ContactMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ContactMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ContactMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ContactMessage; + + /** + * Creates a plain object from a ContactMessage message. Also converts values to other types if specified. + * @param message ContactMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ContactMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ContactMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ContactsArrayMessage. */ + interface IContactsArrayMessage { + + /** ContactsArrayMessage displayName */ + displayName?: (string|null); + + /** ContactsArrayMessage contacts */ + contacts?: (proto.Message.IContactMessage[]|null); + + /** ContactsArrayMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a ContactsArrayMessage. */ + class ContactsArrayMessage implements IContactsArrayMessage { + + /** + * Constructs a new ContactsArrayMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IContactsArrayMessage); + + /** ContactsArrayMessage displayName. */ + public displayName: string; + + /** ContactsArrayMessage contacts. */ + public contacts: proto.Message.IContactMessage[]; + + /** ContactsArrayMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new ContactsArrayMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ContactsArrayMessage instance + */ + public static create(properties?: proto.Message.IContactsArrayMessage): proto.Message.ContactsArrayMessage; + + /** + * Encodes the specified ContactsArrayMessage message. Does not implicitly {@link proto.Message.ContactsArrayMessage.verify|verify} messages. + * @param message ContactsArrayMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IContactsArrayMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ContactsArrayMessage message, length delimited. Does not implicitly {@link proto.Message.ContactsArrayMessage.verify|verify} messages. + * @param message ContactsArrayMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IContactsArrayMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ContactsArrayMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ContactsArrayMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ContactsArrayMessage; + + /** + * Decodes a ContactsArrayMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ContactsArrayMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ContactsArrayMessage; + + /** + * Verifies a ContactsArrayMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ContactsArrayMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ContactsArrayMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ContactsArrayMessage; + + /** + * Creates a plain object from a ContactsArrayMessage message. Also converts values to other types if specified. + * @param message ContactsArrayMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ContactsArrayMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ContactsArrayMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a DeclinePaymentRequestMessage. */ + interface IDeclinePaymentRequestMessage { + + /** DeclinePaymentRequestMessage key */ + key?: (proto.IMessageKey|null); + } + + /** Represents a DeclinePaymentRequestMessage. */ + class DeclinePaymentRequestMessage implements IDeclinePaymentRequestMessage { + + /** + * Constructs a new DeclinePaymentRequestMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IDeclinePaymentRequestMessage); + + /** DeclinePaymentRequestMessage key. */ + public key?: (proto.IMessageKey|null); + + /** + * Creates a new DeclinePaymentRequestMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns DeclinePaymentRequestMessage instance + */ + public static create(properties?: proto.Message.IDeclinePaymentRequestMessage): proto.Message.DeclinePaymentRequestMessage; + + /** + * Encodes the specified DeclinePaymentRequestMessage message. Does not implicitly {@link proto.Message.DeclinePaymentRequestMessage.verify|verify} messages. + * @param message DeclinePaymentRequestMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IDeclinePaymentRequestMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeclinePaymentRequestMessage message, length delimited. Does not implicitly {@link proto.Message.DeclinePaymentRequestMessage.verify|verify} messages. + * @param message DeclinePaymentRequestMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IDeclinePaymentRequestMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeclinePaymentRequestMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeclinePaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.DeclinePaymentRequestMessage; + + /** + * Decodes a DeclinePaymentRequestMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeclinePaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.DeclinePaymentRequestMessage; + + /** + * Verifies a DeclinePaymentRequestMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeclinePaymentRequestMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeclinePaymentRequestMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.DeclinePaymentRequestMessage; + + /** + * Creates a plain object from a DeclinePaymentRequestMessage message. Also converts values to other types if specified. + * @param message DeclinePaymentRequestMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.DeclinePaymentRequestMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeclinePaymentRequestMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a DeviceSentMessage. */ + interface IDeviceSentMessage { + + /** DeviceSentMessage destinationJid */ + destinationJid?: (string|null); + + /** DeviceSentMessage message */ + message?: (proto.IMessage|null); + + /** DeviceSentMessage phash */ + phash?: (string|null); + } + + /** Represents a DeviceSentMessage. */ + class DeviceSentMessage implements IDeviceSentMessage { + + /** + * Constructs a new DeviceSentMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IDeviceSentMessage); + + /** DeviceSentMessage destinationJid. */ + public destinationJid: string; + + /** DeviceSentMessage message. */ + public message?: (proto.IMessage|null); + + /** DeviceSentMessage phash. */ + public phash: string; + + /** + * Creates a new DeviceSentMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns DeviceSentMessage instance + */ + public static create(properties?: proto.Message.IDeviceSentMessage): proto.Message.DeviceSentMessage; + + /** + * Encodes the specified DeviceSentMessage message. Does not implicitly {@link proto.Message.DeviceSentMessage.verify|verify} messages. + * @param message DeviceSentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IDeviceSentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeviceSentMessage message, length delimited. Does not implicitly {@link proto.Message.DeviceSentMessage.verify|verify} messages. + * @param message DeviceSentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IDeviceSentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeviceSentMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeviceSentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.DeviceSentMessage; + + /** + * Decodes a DeviceSentMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeviceSentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.DeviceSentMessage; + + /** + * Verifies a DeviceSentMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeviceSentMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeviceSentMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.DeviceSentMessage; + + /** + * Creates a plain object from a DeviceSentMessage message. Also converts values to other types if specified. + * @param message DeviceSentMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.DeviceSentMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeviceSentMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a DocumentMessage. */ + interface IDocumentMessage { + + /** DocumentMessage url */ + url?: (string|null); + + /** DocumentMessage mimetype */ + mimetype?: (string|null); + + /** DocumentMessage title */ + title?: (string|null); + + /** DocumentMessage fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** DocumentMessage fileLength */ + fileLength?: (number|Long|null); + + /** DocumentMessage pageCount */ + pageCount?: (number|null); + + /** DocumentMessage mediaKey */ + mediaKey?: (Uint8Array|null); + + /** DocumentMessage fileName */ + fileName?: (string|null); + + /** DocumentMessage fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** DocumentMessage directPath */ + directPath?: (string|null); + + /** DocumentMessage mediaKeyTimestamp */ + mediaKeyTimestamp?: (number|Long|null); + + /** DocumentMessage contactVcard */ + contactVcard?: (boolean|null); + + /** DocumentMessage thumbnailDirectPath */ + thumbnailDirectPath?: (string|null); + + /** DocumentMessage thumbnailSha256 */ + thumbnailSha256?: (Uint8Array|null); + + /** DocumentMessage thumbnailEncSha256 */ + thumbnailEncSha256?: (Uint8Array|null); + + /** DocumentMessage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** DocumentMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** DocumentMessage thumbnailHeight */ + thumbnailHeight?: (number|null); + + /** DocumentMessage thumbnailWidth */ + thumbnailWidth?: (number|null); + + /** DocumentMessage caption */ + caption?: (string|null); + } + + /** Represents a DocumentMessage. */ + class DocumentMessage implements IDocumentMessage { + + /** + * Constructs a new DocumentMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IDocumentMessage); + + /** DocumentMessage url. */ + public url: string; + + /** DocumentMessage mimetype. */ + public mimetype: string; + + /** DocumentMessage title. */ + public title: string; + + /** DocumentMessage fileSha256. */ + public fileSha256: Uint8Array; + + /** DocumentMessage fileLength. */ + public fileLength: (number|Long); + + /** DocumentMessage pageCount. */ + public pageCount: number; + + /** DocumentMessage mediaKey. */ + public mediaKey: Uint8Array; + + /** DocumentMessage fileName. */ + public fileName: string; + + /** DocumentMessage fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** DocumentMessage directPath. */ + public directPath: string; + + /** DocumentMessage mediaKeyTimestamp. */ + public mediaKeyTimestamp: (number|Long); + + /** DocumentMessage contactVcard. */ + public contactVcard: boolean; + + /** DocumentMessage thumbnailDirectPath. */ + public thumbnailDirectPath: string; + + /** DocumentMessage thumbnailSha256. */ + public thumbnailSha256: Uint8Array; + + /** DocumentMessage thumbnailEncSha256. */ + public thumbnailEncSha256: Uint8Array; + + /** DocumentMessage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** DocumentMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** DocumentMessage thumbnailHeight. */ + public thumbnailHeight: number; + + /** DocumentMessage thumbnailWidth. */ + public thumbnailWidth: number; + + /** DocumentMessage caption. */ + public caption: string; + + /** + * Creates a new DocumentMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns DocumentMessage instance + */ + public static create(properties?: proto.Message.IDocumentMessage): proto.Message.DocumentMessage; + + /** + * Encodes the specified DocumentMessage message. Does not implicitly {@link proto.Message.DocumentMessage.verify|verify} messages. + * @param message DocumentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IDocumentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DocumentMessage message, length delimited. Does not implicitly {@link proto.Message.DocumentMessage.verify|verify} messages. + * @param message DocumentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IDocumentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DocumentMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DocumentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.DocumentMessage; + + /** + * Decodes a DocumentMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DocumentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.DocumentMessage; + + /** + * Verifies a DocumentMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DocumentMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DocumentMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.DocumentMessage; + + /** + * Creates a plain object from a DocumentMessage message. Also converts values to other types if specified. + * @param message DocumentMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.DocumentMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DocumentMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an EncReactionMessage. */ + interface IEncReactionMessage { + + /** EncReactionMessage targetMessageKey */ + targetMessageKey?: (proto.IMessageKey|null); + + /** EncReactionMessage encPayload */ + encPayload?: (Uint8Array|null); + + /** EncReactionMessage encIv */ + encIv?: (Uint8Array|null); + } + + /** Represents an EncReactionMessage. */ + class EncReactionMessage implements IEncReactionMessage { + + /** + * Constructs a new EncReactionMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IEncReactionMessage); + + /** EncReactionMessage targetMessageKey. */ + public targetMessageKey?: (proto.IMessageKey|null); + + /** EncReactionMessage encPayload. */ + public encPayload: Uint8Array; + + /** EncReactionMessage encIv. */ + public encIv: Uint8Array; + + /** + * Creates a new EncReactionMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns EncReactionMessage instance + */ + public static create(properties?: proto.Message.IEncReactionMessage): proto.Message.EncReactionMessage; + + /** + * Encodes the specified EncReactionMessage message. Does not implicitly {@link proto.Message.EncReactionMessage.verify|verify} messages. + * @param message EncReactionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IEncReactionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified EncReactionMessage message, length delimited. Does not implicitly {@link proto.Message.EncReactionMessage.verify|verify} messages. + * @param message EncReactionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IEncReactionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an EncReactionMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns EncReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.EncReactionMessage; + + /** + * Decodes an EncReactionMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns EncReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.EncReactionMessage; + + /** + * Verifies an EncReactionMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an EncReactionMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns EncReactionMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.EncReactionMessage; + + /** + * Creates a plain object from an EncReactionMessage message. Also converts values to other types if specified. + * @param message EncReactionMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.EncReactionMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this EncReactionMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an ExtendedTextMessage. */ + interface IExtendedTextMessage { + + /** ExtendedTextMessage text */ + text?: (string|null); + + /** ExtendedTextMessage matchedText */ + matchedText?: (string|null); + + /** ExtendedTextMessage canonicalUrl */ + canonicalUrl?: (string|null); + + /** ExtendedTextMessage description */ + description?: (string|null); + + /** ExtendedTextMessage title */ + title?: (string|null); + + /** ExtendedTextMessage textArgb */ + textArgb?: (number|null); + + /** ExtendedTextMessage backgroundArgb */ + backgroundArgb?: (number|null); + + /** ExtendedTextMessage font */ + font?: (proto.Message.ExtendedTextMessage.FontType|null); + + /** ExtendedTextMessage previewType */ + previewType?: (proto.Message.ExtendedTextMessage.PreviewType|null); + + /** ExtendedTextMessage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** ExtendedTextMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** ExtendedTextMessage doNotPlayInline */ + doNotPlayInline?: (boolean|null); + + /** ExtendedTextMessage thumbnailDirectPath */ + thumbnailDirectPath?: (string|null); + + /** ExtendedTextMessage thumbnailSha256 */ + thumbnailSha256?: (Uint8Array|null); + + /** ExtendedTextMessage thumbnailEncSha256 */ + thumbnailEncSha256?: (Uint8Array|null); + + /** ExtendedTextMessage mediaKey */ + mediaKey?: (Uint8Array|null); + + /** ExtendedTextMessage mediaKeyTimestamp */ + mediaKeyTimestamp?: (number|Long|null); + + /** ExtendedTextMessage thumbnailHeight */ + thumbnailHeight?: (number|null); + + /** ExtendedTextMessage thumbnailWidth */ + thumbnailWidth?: (number|null); + + /** ExtendedTextMessage inviteLinkGroupType */ + inviteLinkGroupType?: (proto.Message.ExtendedTextMessage.InviteLinkGroupType|null); + + /** ExtendedTextMessage inviteLinkParentGroupSubjectV2 */ + inviteLinkParentGroupSubjectV2?: (string|null); + + /** ExtendedTextMessage inviteLinkParentGroupThumbnailV2 */ + inviteLinkParentGroupThumbnailV2?: (Uint8Array|null); + + /** ExtendedTextMessage inviteLinkGroupTypeV2 */ + inviteLinkGroupTypeV2?: (proto.Message.ExtendedTextMessage.InviteLinkGroupType|null); + + /** ExtendedTextMessage viewOnce */ + viewOnce?: (boolean|null); + } + + /** Represents an ExtendedTextMessage. */ + class ExtendedTextMessage implements IExtendedTextMessage { + + /** + * Constructs a new ExtendedTextMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IExtendedTextMessage); + + /** ExtendedTextMessage text. */ + public text: string; + + /** ExtendedTextMessage matchedText. */ + public matchedText: string; + + /** ExtendedTextMessage canonicalUrl. */ + public canonicalUrl: string; + + /** ExtendedTextMessage description. */ + public description: string; + + /** ExtendedTextMessage title. */ + public title: string; + + /** ExtendedTextMessage textArgb. */ + public textArgb: number; + + /** ExtendedTextMessage backgroundArgb. */ + public backgroundArgb: number; + + /** ExtendedTextMessage font. */ + public font: proto.Message.ExtendedTextMessage.FontType; + + /** ExtendedTextMessage previewType. */ + public previewType: proto.Message.ExtendedTextMessage.PreviewType; + + /** ExtendedTextMessage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** ExtendedTextMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** ExtendedTextMessage doNotPlayInline. */ + public doNotPlayInline: boolean; + + /** ExtendedTextMessage thumbnailDirectPath. */ + public thumbnailDirectPath: string; + + /** ExtendedTextMessage thumbnailSha256. */ + public thumbnailSha256: Uint8Array; + + /** ExtendedTextMessage thumbnailEncSha256. */ + public thumbnailEncSha256: Uint8Array; + + /** ExtendedTextMessage mediaKey. */ + public mediaKey: Uint8Array; + + /** ExtendedTextMessage mediaKeyTimestamp. */ + public mediaKeyTimestamp: (number|Long); + + /** ExtendedTextMessage thumbnailHeight. */ + public thumbnailHeight: number; + + /** ExtendedTextMessage thumbnailWidth. */ + public thumbnailWidth: number; + + /** ExtendedTextMessage inviteLinkGroupType. */ + public inviteLinkGroupType: proto.Message.ExtendedTextMessage.InviteLinkGroupType; + + /** ExtendedTextMessage inviteLinkParentGroupSubjectV2. */ + public inviteLinkParentGroupSubjectV2: string; + + /** ExtendedTextMessage inviteLinkParentGroupThumbnailV2. */ + public inviteLinkParentGroupThumbnailV2: Uint8Array; + + /** ExtendedTextMessage inviteLinkGroupTypeV2. */ + public inviteLinkGroupTypeV2: proto.Message.ExtendedTextMessage.InviteLinkGroupType; + + /** ExtendedTextMessage viewOnce. */ + public viewOnce: boolean; + + /** + * Creates a new ExtendedTextMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ExtendedTextMessage instance + */ + public static create(properties?: proto.Message.IExtendedTextMessage): proto.Message.ExtendedTextMessage; + + /** + * Encodes the specified ExtendedTextMessage message. Does not implicitly {@link proto.Message.ExtendedTextMessage.verify|verify} messages. + * @param message ExtendedTextMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IExtendedTextMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ExtendedTextMessage message, length delimited. Does not implicitly {@link proto.Message.ExtendedTextMessage.verify|verify} messages. + * @param message ExtendedTextMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IExtendedTextMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an ExtendedTextMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ExtendedTextMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ExtendedTextMessage; + + /** + * Decodes an ExtendedTextMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ExtendedTextMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ExtendedTextMessage; + + /** + * Verifies an ExtendedTextMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an ExtendedTextMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ExtendedTextMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ExtendedTextMessage; + + /** + * Creates a plain object from an ExtendedTextMessage message. Also converts values to other types if specified. + * @param message ExtendedTextMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ExtendedTextMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ExtendedTextMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ExtendedTextMessage { + + /** FontType enum. */ + enum FontType { + SANS_SERIF = 0, + SERIF = 1, + NORICAN_REGULAR = 2, + BRYNDAN_WRITE = 3, + BEBASNEUE_REGULAR = 4, + OSWALD_HEAVY = 5 + } + + /** InviteLinkGroupType enum. */ + enum InviteLinkGroupType { + DEFAULT = 0, + PARENT = 1, + SUB = 2, + DEFAULT_SUB = 3 + } + + /** PreviewType enum. */ + enum PreviewType { + NONE = 0, + VIDEO = 1 + } + } + + /** Properties of a FutureProofMessage. */ + interface IFutureProofMessage { + + /** FutureProofMessage message */ + message?: (proto.IMessage|null); + } + + /** Represents a FutureProofMessage. */ + class FutureProofMessage implements IFutureProofMessage { + + /** + * Constructs a new FutureProofMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IFutureProofMessage); + + /** FutureProofMessage message. */ + public message?: (proto.IMessage|null); + + /** + * Creates a new FutureProofMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns FutureProofMessage instance + */ + public static create(properties?: proto.Message.IFutureProofMessage): proto.Message.FutureProofMessage; + + /** + * Encodes the specified FutureProofMessage message. Does not implicitly {@link proto.Message.FutureProofMessage.verify|verify} messages. + * @param message FutureProofMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IFutureProofMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified FutureProofMessage message, length delimited. Does not implicitly {@link proto.Message.FutureProofMessage.verify|verify} messages. + * @param message FutureProofMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IFutureProofMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a FutureProofMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns FutureProofMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.FutureProofMessage; + + /** + * Decodes a FutureProofMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns FutureProofMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.FutureProofMessage; + + /** + * Verifies a FutureProofMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a FutureProofMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns FutureProofMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.FutureProofMessage; + + /** + * Creates a plain object from a FutureProofMessage message. Also converts values to other types if specified. + * @param message FutureProofMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.FutureProofMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this FutureProofMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a GroupInviteMessage. */ + interface IGroupInviteMessage { + + /** GroupInviteMessage groupJid */ + groupJid?: (string|null); + + /** GroupInviteMessage inviteCode */ + inviteCode?: (string|null); + + /** GroupInviteMessage inviteExpiration */ + inviteExpiration?: (number|Long|null); + + /** GroupInviteMessage groupName */ + groupName?: (string|null); + + /** GroupInviteMessage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** GroupInviteMessage caption */ + caption?: (string|null); + + /** GroupInviteMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** GroupInviteMessage groupType */ + groupType?: (proto.Message.GroupInviteMessage.GroupType|null); + } + + /** Represents a GroupInviteMessage. */ + class GroupInviteMessage implements IGroupInviteMessage { + + /** + * Constructs a new GroupInviteMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IGroupInviteMessage); + + /** GroupInviteMessage groupJid. */ + public groupJid: string; + + /** GroupInviteMessage inviteCode. */ + public inviteCode: string; + + /** GroupInviteMessage inviteExpiration. */ + public inviteExpiration: (number|Long); + + /** GroupInviteMessage groupName. */ + public groupName: string; + + /** GroupInviteMessage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** GroupInviteMessage caption. */ + public caption: string; + + /** GroupInviteMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** GroupInviteMessage groupType. */ + public groupType: proto.Message.GroupInviteMessage.GroupType; + + /** + * Creates a new GroupInviteMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns GroupInviteMessage instance + */ + public static create(properties?: proto.Message.IGroupInviteMessage): proto.Message.GroupInviteMessage; + + /** + * Encodes the specified GroupInviteMessage message. Does not implicitly {@link proto.Message.GroupInviteMessage.verify|verify} messages. + * @param message GroupInviteMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IGroupInviteMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified GroupInviteMessage message, length delimited. Does not implicitly {@link proto.Message.GroupInviteMessage.verify|verify} messages. + * @param message GroupInviteMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IGroupInviteMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a GroupInviteMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns GroupInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.GroupInviteMessage; + + /** + * Decodes a GroupInviteMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns GroupInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.GroupInviteMessage; + + /** + * Verifies a GroupInviteMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a GroupInviteMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns GroupInviteMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.GroupInviteMessage; + + /** + * Creates a plain object from a GroupInviteMessage message. Also converts values to other types if specified. + * @param message GroupInviteMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.GroupInviteMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this GroupInviteMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace GroupInviteMessage { + + /** GroupType enum. */ + enum GroupType { + DEFAULT = 0, + PARENT = 1 + } + } + + /** Properties of a HighlyStructuredMessage. */ + interface IHighlyStructuredMessage { + + /** HighlyStructuredMessage namespace */ + namespace?: (string|null); + + /** HighlyStructuredMessage elementName */ + elementName?: (string|null); + + /** HighlyStructuredMessage params */ + params?: (string[]|null); + + /** HighlyStructuredMessage fallbackLg */ + fallbackLg?: (string|null); + + /** HighlyStructuredMessage fallbackLc */ + fallbackLc?: (string|null); + + /** HighlyStructuredMessage localizableParams */ + localizableParams?: (proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter[]|null); + + /** HighlyStructuredMessage deterministicLg */ + deterministicLg?: (string|null); + + /** HighlyStructuredMessage deterministicLc */ + deterministicLc?: (string|null); + + /** HighlyStructuredMessage hydratedHsm */ + hydratedHsm?: (proto.Message.ITemplateMessage|null); + } + + /** Represents a HighlyStructuredMessage. */ + class HighlyStructuredMessage implements IHighlyStructuredMessage { + + /** + * Constructs a new HighlyStructuredMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IHighlyStructuredMessage); + + /** HighlyStructuredMessage namespace. */ + public namespace: string; + + /** HighlyStructuredMessage elementName. */ + public elementName: string; + + /** HighlyStructuredMessage params. */ + public params: string[]; + + /** HighlyStructuredMessage fallbackLg. */ + public fallbackLg: string; + + /** HighlyStructuredMessage fallbackLc. */ + public fallbackLc: string; + + /** HighlyStructuredMessage localizableParams. */ + public localizableParams: proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter[]; + + /** HighlyStructuredMessage deterministicLg. */ + public deterministicLg: string; + + /** HighlyStructuredMessage deterministicLc. */ + public deterministicLc: string; + + /** HighlyStructuredMessage hydratedHsm. */ + public hydratedHsm?: (proto.Message.ITemplateMessage|null); + + /** + * Creates a new HighlyStructuredMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns HighlyStructuredMessage instance + */ + public static create(properties?: proto.Message.IHighlyStructuredMessage): proto.Message.HighlyStructuredMessage; + + /** + * Encodes the specified HighlyStructuredMessage message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.verify|verify} messages. + * @param message HighlyStructuredMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IHighlyStructuredMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HighlyStructuredMessage message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.verify|verify} messages. + * @param message HighlyStructuredMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IHighlyStructuredMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HighlyStructuredMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HighlyStructuredMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.HighlyStructuredMessage; + + /** + * Decodes a HighlyStructuredMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HighlyStructuredMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.HighlyStructuredMessage; + + /** + * Verifies a HighlyStructuredMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HighlyStructuredMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HighlyStructuredMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.HighlyStructuredMessage; + + /** + * Creates a plain object from a HighlyStructuredMessage message. Also converts values to other types if specified. + * @param message HighlyStructuredMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.HighlyStructuredMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HighlyStructuredMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HighlyStructuredMessage { + + /** Properties of a HSMLocalizableParameter. */ + interface IHSMLocalizableParameter { + + /** HSMLocalizableParameter default */ + "default"?: (string|null); + + /** HSMLocalizableParameter currency */ + currency?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency|null); + + /** HSMLocalizableParameter dateTime */ + dateTime?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime|null); + } + + /** Represents a HSMLocalizableParameter. */ + class HSMLocalizableParameter implements IHSMLocalizableParameter { + + /** + * Constructs a new HSMLocalizableParameter. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter); + + /** HSMLocalizableParameter default. */ + public default: string; + + /** HSMLocalizableParameter currency. */ + public currency?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency|null); + + /** HSMLocalizableParameter dateTime. */ + public dateTime?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime|null); + + /** HSMLocalizableParameter paramOneof. */ + public paramOneof?: ("currency"|"dateTime"); + + /** + * Creates a new HSMLocalizableParameter instance using the specified properties. + * @param [properties] Properties to set + * @returns HSMLocalizableParameter instance + */ + public static create(properties?: proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter; + + /** + * Encodes the specified HSMLocalizableParameter message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.verify|verify} messages. + * @param message HSMLocalizableParameter message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HSMLocalizableParameter message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.verify|verify} messages. + * @param message HSMLocalizableParameter message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HSMLocalizableParameter message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HSMLocalizableParameter + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter; + + /** + * Decodes a HSMLocalizableParameter message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HSMLocalizableParameter + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter; + + /** + * Verifies a HSMLocalizableParameter message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HSMLocalizableParameter message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HSMLocalizableParameter + */ + public static fromObject(object: { [k: string]: any }): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter; + + /** + * Creates a plain object from a HSMLocalizableParameter message. Also converts values to other types if specified. + * @param message HSMLocalizableParameter + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HSMLocalizableParameter to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HSMLocalizableParameter { + + /** Properties of a HSMCurrency. */ + interface IHSMCurrency { + + /** HSMCurrency currencyCode */ + currencyCode?: (string|null); + + /** HSMCurrency amount1000 */ + amount1000?: (number|Long|null); + } + + /** Represents a HSMCurrency. */ + class HSMCurrency implements IHSMCurrency { + + /** + * Constructs a new HSMCurrency. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency); + + /** HSMCurrency currencyCode. */ + public currencyCode: string; + + /** HSMCurrency amount1000. */ + public amount1000: (number|Long); + + /** + * Creates a new HSMCurrency instance using the specified properties. + * @param [properties] Properties to set + * @returns HSMCurrency instance + */ + public static create(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency; + + /** + * Encodes the specified HSMCurrency message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.verify|verify} messages. + * @param message HSMCurrency message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HSMCurrency message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.verify|verify} messages. + * @param message HSMCurrency message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HSMCurrency message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HSMCurrency + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency; + + /** + * Decodes a HSMCurrency message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HSMCurrency + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency; + + /** + * Verifies a HSMCurrency message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HSMCurrency message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HSMCurrency + */ + public static fromObject(object: { [k: string]: any }): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency; + + /** + * Creates a plain object from a HSMCurrency message. Also converts values to other types if specified. + * @param message HSMCurrency + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HSMCurrency to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a HSMDateTime. */ + interface IHSMDateTime { + + /** HSMDateTime component */ + component?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent|null); + + /** HSMDateTime unixEpoch */ + unixEpoch?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch|null); + } + + /** Represents a HSMDateTime. */ + class HSMDateTime implements IHSMDateTime { + + /** + * Constructs a new HSMDateTime. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime); + + /** HSMDateTime component. */ + public component?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent|null); + + /** HSMDateTime unixEpoch. */ + public unixEpoch?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch|null); + + /** HSMDateTime datetimeOneof. */ + public datetimeOneof?: ("component"|"unixEpoch"); + + /** + * Creates a new HSMDateTime instance using the specified properties. + * @param [properties] Properties to set + * @returns HSMDateTime instance + */ + public static create(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime; + + /** + * Encodes the specified HSMDateTime message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.verify|verify} messages. + * @param message HSMDateTime message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HSMDateTime message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.verify|verify} messages. + * @param message HSMDateTime message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HSMDateTime message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HSMDateTime + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime; + + /** + * Decodes a HSMDateTime message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HSMDateTime + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime; + + /** + * Verifies a HSMDateTime message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HSMDateTime message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HSMDateTime + */ + public static fromObject(object: { [k: string]: any }): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime; + + /** + * Creates a plain object from a HSMDateTime message. Also converts values to other types if specified. + * @param message HSMDateTime + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HSMDateTime to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HSMDateTime { + + /** Properties of a HSMDateTimeComponent. */ + interface IHSMDateTimeComponent { + + /** HSMDateTimeComponent dayOfWeek */ + dayOfWeek?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.DayOfWeekType|null); + + /** HSMDateTimeComponent year */ + year?: (number|null); + + /** HSMDateTimeComponent month */ + month?: (number|null); + + /** HSMDateTimeComponent dayOfMonth */ + dayOfMonth?: (number|null); + + /** HSMDateTimeComponent hour */ + hour?: (number|null); + + /** HSMDateTimeComponent minute */ + minute?: (number|null); + + /** HSMDateTimeComponent calendar */ + calendar?: (proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.CalendarType|null); + } + + /** Represents a HSMDateTimeComponent. */ + class HSMDateTimeComponent implements IHSMDateTimeComponent { + + /** + * Constructs a new HSMDateTimeComponent. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent); + + /** HSMDateTimeComponent dayOfWeek. */ + public dayOfWeek: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.DayOfWeekType; + + /** HSMDateTimeComponent year. */ + public year: number; + + /** HSMDateTimeComponent month. */ + public month: number; + + /** HSMDateTimeComponent dayOfMonth. */ + public dayOfMonth: number; + + /** HSMDateTimeComponent hour. */ + public hour: number; + + /** HSMDateTimeComponent minute. */ + public minute: number; + + /** HSMDateTimeComponent calendar. */ + public calendar: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.CalendarType; + + /** + * Creates a new HSMDateTimeComponent instance using the specified properties. + * @param [properties] Properties to set + * @returns HSMDateTimeComponent instance + */ + public static create(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent; + + /** + * Encodes the specified HSMDateTimeComponent message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.verify|verify} messages. + * @param message HSMDateTimeComponent message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HSMDateTimeComponent message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.verify|verify} messages. + * @param message HSMDateTimeComponent message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HSMDateTimeComponent message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HSMDateTimeComponent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent; + + /** + * Decodes a HSMDateTimeComponent message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HSMDateTimeComponent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent; + + /** + * Verifies a HSMDateTimeComponent message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HSMDateTimeComponent message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HSMDateTimeComponent + */ + public static fromObject(object: { [k: string]: any }): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent; + + /** + * Creates a plain object from a HSMDateTimeComponent message. Also converts values to other types if specified. + * @param message HSMDateTimeComponent + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HSMDateTimeComponent to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HSMDateTimeComponent { + + /** CalendarType enum. */ + enum CalendarType { + GREGORIAN = 1, + SOLAR_HIJRI = 2 + } + + /** DayOfWeekType enum. */ + enum DayOfWeekType { + MONDAY = 1, + TUESDAY = 2, + WEDNESDAY = 3, + THURSDAY = 4, + FRIDAY = 5, + SATURDAY = 6, + SUNDAY = 7 + } + } + + /** Properties of a HSMDateTimeUnixEpoch. */ + interface IHSMDateTimeUnixEpoch { + + /** HSMDateTimeUnixEpoch timestamp */ + timestamp?: (number|Long|null); + } + + /** Represents a HSMDateTimeUnixEpoch. */ + class HSMDateTimeUnixEpoch implements IHSMDateTimeUnixEpoch { + + /** + * Constructs a new HSMDateTimeUnixEpoch. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch); + + /** HSMDateTimeUnixEpoch timestamp. */ + public timestamp: (number|Long); + + /** + * Creates a new HSMDateTimeUnixEpoch instance using the specified properties. + * @param [properties] Properties to set + * @returns HSMDateTimeUnixEpoch instance + */ + public static create(properties?: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch; + + /** + * Encodes the specified HSMDateTimeUnixEpoch message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.verify|verify} messages. + * @param message HSMDateTimeUnixEpoch message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HSMDateTimeUnixEpoch message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.verify|verify} messages. + * @param message HSMDateTimeUnixEpoch message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HSMDateTimeUnixEpoch message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HSMDateTimeUnixEpoch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch; + + /** + * Decodes a HSMDateTimeUnixEpoch message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HSMDateTimeUnixEpoch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch; + + /** + * Verifies a HSMDateTimeUnixEpoch message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HSMDateTimeUnixEpoch message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HSMDateTimeUnixEpoch + */ + public static fromObject(object: { [k: string]: any }): proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch; + + /** + * Creates a plain object from a HSMDateTimeUnixEpoch message. Also converts values to other types if specified. + * @param message HSMDateTimeUnixEpoch + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HSMDateTimeUnixEpoch to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + } + } + + /** Properties of a HistorySyncNotification. */ + interface IHistorySyncNotification { + + /** HistorySyncNotification fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** HistorySyncNotification fileLength */ + fileLength?: (number|Long|null); + + /** HistorySyncNotification mediaKey */ + mediaKey?: (Uint8Array|null); + + /** HistorySyncNotification fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** HistorySyncNotification directPath */ + directPath?: (string|null); + + /** HistorySyncNotification syncType */ + syncType?: (proto.Message.HistorySyncNotification.HistorySyncType|null); + + /** HistorySyncNotification chunkOrder */ + chunkOrder?: (number|null); + + /** HistorySyncNotification originalMessageId */ + originalMessageId?: (string|null); + + /** HistorySyncNotification progress */ + progress?: (number|null); + + /** HistorySyncNotification oldestMsgInChunkTimestampSec */ + oldestMsgInChunkTimestampSec?: (number|Long|null); + } + + /** Represents a HistorySyncNotification. */ + class HistorySyncNotification implements IHistorySyncNotification { + + /** + * Constructs a new HistorySyncNotification. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IHistorySyncNotification); + + /** HistorySyncNotification fileSha256. */ + public fileSha256: Uint8Array; + + /** HistorySyncNotification fileLength. */ + public fileLength: (number|Long); + + /** HistorySyncNotification mediaKey. */ + public mediaKey: Uint8Array; + + /** HistorySyncNotification fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** HistorySyncNotification directPath. */ + public directPath: string; + + /** HistorySyncNotification syncType. */ + public syncType: proto.Message.HistorySyncNotification.HistorySyncType; + + /** HistorySyncNotification chunkOrder. */ + public chunkOrder: number; + + /** HistorySyncNotification originalMessageId. */ + public originalMessageId: string; + + /** HistorySyncNotification progress. */ + public progress: number; + + /** HistorySyncNotification oldestMsgInChunkTimestampSec. */ + public oldestMsgInChunkTimestampSec: (number|Long); + + /** + * Creates a new HistorySyncNotification instance using the specified properties. + * @param [properties] Properties to set + * @returns HistorySyncNotification instance + */ + public static create(properties?: proto.Message.IHistorySyncNotification): proto.Message.HistorySyncNotification; + + /** + * Encodes the specified HistorySyncNotification message. Does not implicitly {@link proto.Message.HistorySyncNotification.verify|verify} messages. + * @param message HistorySyncNotification message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IHistorySyncNotification, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HistorySyncNotification message, length delimited. Does not implicitly {@link proto.Message.HistorySyncNotification.verify|verify} messages. + * @param message HistorySyncNotification message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IHistorySyncNotification, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HistorySyncNotification message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HistorySyncNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.HistorySyncNotification; + + /** + * Decodes a HistorySyncNotification message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HistorySyncNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.HistorySyncNotification; + + /** + * Verifies a HistorySyncNotification message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HistorySyncNotification message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HistorySyncNotification + */ + public static fromObject(object: { [k: string]: any }): proto.Message.HistorySyncNotification; + + /** + * Creates a plain object from a HistorySyncNotification message. Also converts values to other types if specified. + * @param message HistorySyncNotification + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.HistorySyncNotification, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HistorySyncNotification to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace HistorySyncNotification { + + /** HistorySyncType enum. */ + enum HistorySyncType { + INITIAL_BOOTSTRAP = 0, + INITIAL_STATUS_V3 = 1, + FULL = 2, + RECENT = 3, + PUSH_NAME = 4, + NON_BLOCKING_DATA = 5 + } + } + + /** Properties of an ImageMessage. */ + interface IImageMessage { + + /** ImageMessage url */ + url?: (string|null); + + /** ImageMessage mimetype */ + mimetype?: (string|null); + + /** ImageMessage caption */ + caption?: (string|null); + + /** ImageMessage fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** ImageMessage fileLength */ + fileLength?: (number|Long|null); + + /** ImageMessage height */ + height?: (number|null); + + /** ImageMessage width */ + width?: (number|null); + + /** ImageMessage mediaKey */ + mediaKey?: (Uint8Array|null); + + /** ImageMessage fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** ImageMessage interactiveAnnotations */ + interactiveAnnotations?: (proto.IInteractiveAnnotation[]|null); + + /** ImageMessage directPath */ + directPath?: (string|null); + + /** ImageMessage mediaKeyTimestamp */ + mediaKeyTimestamp?: (number|Long|null); + + /** ImageMessage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** ImageMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** ImageMessage firstScanSidecar */ + firstScanSidecar?: (Uint8Array|null); + + /** ImageMessage firstScanLength */ + firstScanLength?: (number|null); + + /** ImageMessage experimentGroupId */ + experimentGroupId?: (number|null); + + /** ImageMessage scansSidecar */ + scansSidecar?: (Uint8Array|null); + + /** ImageMessage scanLengths */ + scanLengths?: (number[]|null); + + /** ImageMessage midQualityFileSha256 */ + midQualityFileSha256?: (Uint8Array|null); + + /** ImageMessage midQualityFileEncSha256 */ + midQualityFileEncSha256?: (Uint8Array|null); + + /** ImageMessage viewOnce */ + viewOnce?: (boolean|null); + + /** ImageMessage thumbnailDirectPath */ + thumbnailDirectPath?: (string|null); + + /** ImageMessage thumbnailSha256 */ + thumbnailSha256?: (Uint8Array|null); + + /** ImageMessage thumbnailEncSha256 */ + thumbnailEncSha256?: (Uint8Array|null); + + /** ImageMessage staticUrl */ + staticUrl?: (string|null); + } + + /** Represents an ImageMessage. */ + class ImageMessage implements IImageMessage { + + /** + * Constructs a new ImageMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IImageMessage); + + /** ImageMessage url. */ + public url: string; + + /** ImageMessage mimetype. */ + public mimetype: string; + + /** ImageMessage caption. */ + public caption: string; + + /** ImageMessage fileSha256. */ + public fileSha256: Uint8Array; + + /** ImageMessage fileLength. */ + public fileLength: (number|Long); + + /** ImageMessage height. */ + public height: number; + + /** ImageMessage width. */ + public width: number; + + /** ImageMessage mediaKey. */ + public mediaKey: Uint8Array; + + /** ImageMessage fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** ImageMessage interactiveAnnotations. */ + public interactiveAnnotations: proto.IInteractiveAnnotation[]; + + /** ImageMessage directPath. */ + public directPath: string; + + /** ImageMessage mediaKeyTimestamp. */ + public mediaKeyTimestamp: (number|Long); + + /** ImageMessage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** ImageMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** ImageMessage firstScanSidecar. */ + public firstScanSidecar: Uint8Array; + + /** ImageMessage firstScanLength. */ + public firstScanLength: number; + + /** ImageMessage experimentGroupId. */ + public experimentGroupId: number; + + /** ImageMessage scansSidecar. */ + public scansSidecar: Uint8Array; + + /** ImageMessage scanLengths. */ + public scanLengths: number[]; + + /** ImageMessage midQualityFileSha256. */ + public midQualityFileSha256: Uint8Array; + + /** ImageMessage midQualityFileEncSha256. */ + public midQualityFileEncSha256: Uint8Array; + + /** ImageMessage viewOnce. */ + public viewOnce: boolean; + + /** ImageMessage thumbnailDirectPath. */ + public thumbnailDirectPath: string; + + /** ImageMessage thumbnailSha256. */ + public thumbnailSha256: Uint8Array; + + /** ImageMessage thumbnailEncSha256. */ + public thumbnailEncSha256: Uint8Array; + + /** ImageMessage staticUrl. */ + public staticUrl: string; + + /** + * Creates a new ImageMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ImageMessage instance + */ + public static create(properties?: proto.Message.IImageMessage): proto.Message.ImageMessage; + + /** + * Encodes the specified ImageMessage message. Does not implicitly {@link proto.Message.ImageMessage.verify|verify} messages. + * @param message ImageMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IImageMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ImageMessage message, length delimited. Does not implicitly {@link proto.Message.ImageMessage.verify|verify} messages. + * @param message ImageMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IImageMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an ImageMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ImageMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ImageMessage; + + /** + * Decodes an ImageMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ImageMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ImageMessage; + + /** + * Verifies an ImageMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an ImageMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ImageMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ImageMessage; + + /** + * Creates a plain object from an ImageMessage message. Also converts values to other types if specified. + * @param message ImageMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ImageMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ImageMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an InitialSecurityNotificationSettingSync. */ + interface IInitialSecurityNotificationSettingSync { + + /** InitialSecurityNotificationSettingSync securityNotificationEnabled */ + securityNotificationEnabled?: (boolean|null); + } + + /** Represents an InitialSecurityNotificationSettingSync. */ + class InitialSecurityNotificationSettingSync implements IInitialSecurityNotificationSettingSync { + + /** + * Constructs a new InitialSecurityNotificationSettingSync. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IInitialSecurityNotificationSettingSync); + + /** InitialSecurityNotificationSettingSync securityNotificationEnabled. */ + public securityNotificationEnabled: boolean; + + /** + * Creates a new InitialSecurityNotificationSettingSync instance using the specified properties. + * @param [properties] Properties to set + * @returns InitialSecurityNotificationSettingSync instance + */ + public static create(properties?: proto.Message.IInitialSecurityNotificationSettingSync): proto.Message.InitialSecurityNotificationSettingSync; + + /** + * Encodes the specified InitialSecurityNotificationSettingSync message. Does not implicitly {@link proto.Message.InitialSecurityNotificationSettingSync.verify|verify} messages. + * @param message InitialSecurityNotificationSettingSync message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IInitialSecurityNotificationSettingSync, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified InitialSecurityNotificationSettingSync message, length delimited. Does not implicitly {@link proto.Message.InitialSecurityNotificationSettingSync.verify|verify} messages. + * @param message InitialSecurityNotificationSettingSync message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IInitialSecurityNotificationSettingSync, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an InitialSecurityNotificationSettingSync message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns InitialSecurityNotificationSettingSync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InitialSecurityNotificationSettingSync; + + /** + * Decodes an InitialSecurityNotificationSettingSync message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns InitialSecurityNotificationSettingSync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InitialSecurityNotificationSettingSync; + + /** + * Verifies an InitialSecurityNotificationSettingSync message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an InitialSecurityNotificationSettingSync message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns InitialSecurityNotificationSettingSync + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InitialSecurityNotificationSettingSync; + + /** + * Creates a plain object from an InitialSecurityNotificationSettingSync message. Also converts values to other types if specified. + * @param message InitialSecurityNotificationSettingSync + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InitialSecurityNotificationSettingSync, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this InitialSecurityNotificationSettingSync to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an InteractiveMessage. */ + interface IInteractiveMessage { + + /** InteractiveMessage header */ + header?: (proto.Message.InteractiveMessage.IHeader|null); + + /** InteractiveMessage body */ + body?: (proto.Message.InteractiveMessage.IBody|null); + + /** InteractiveMessage footer */ + footer?: (proto.Message.InteractiveMessage.IFooter|null); + + /** InteractiveMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** InteractiveMessage shopStorefrontMessage */ + shopStorefrontMessage?: (proto.Message.InteractiveMessage.IShopMessage|null); + + /** InteractiveMessage collectionMessage */ + collectionMessage?: (proto.Message.InteractiveMessage.ICollectionMessage|null); + + /** InteractiveMessage nativeFlowMessage */ + nativeFlowMessage?: (proto.Message.InteractiveMessage.INativeFlowMessage|null); + } + + /** Represents an InteractiveMessage. */ + class InteractiveMessage implements IInteractiveMessage { + + /** + * Constructs a new InteractiveMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IInteractiveMessage); + + /** InteractiveMessage header. */ + public header?: (proto.Message.InteractiveMessage.IHeader|null); + + /** InteractiveMessage body. */ + public body?: (proto.Message.InteractiveMessage.IBody|null); + + /** InteractiveMessage footer. */ + public footer?: (proto.Message.InteractiveMessage.IFooter|null); + + /** InteractiveMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** InteractiveMessage shopStorefrontMessage. */ + public shopStorefrontMessage?: (proto.Message.InteractiveMessage.IShopMessage|null); + + /** InteractiveMessage collectionMessage. */ + public collectionMessage?: (proto.Message.InteractiveMessage.ICollectionMessage|null); + + /** InteractiveMessage nativeFlowMessage. */ + public nativeFlowMessage?: (proto.Message.InteractiveMessage.INativeFlowMessage|null); + + /** InteractiveMessage interactiveMessage. */ + public interactiveMessage?: ("shopStorefrontMessage"|"collectionMessage"|"nativeFlowMessage"); + + /** + * Creates a new InteractiveMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns InteractiveMessage instance + */ + public static create(properties?: proto.Message.IInteractiveMessage): proto.Message.InteractiveMessage; + + /** + * Encodes the specified InteractiveMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.verify|verify} messages. + * @param message InteractiveMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IInteractiveMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified InteractiveMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.verify|verify} messages. + * @param message InteractiveMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IInteractiveMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an InteractiveMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns InteractiveMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage; + + /** + * Decodes an InteractiveMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns InteractiveMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage; + + /** + * Verifies an InteractiveMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an InteractiveMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns InteractiveMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage; + + /** + * Creates a plain object from an InteractiveMessage message. Also converts values to other types if specified. + * @param message InteractiveMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this InteractiveMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace InteractiveMessage { + + /** Properties of a Body. */ + interface IBody { + + /** Body text */ + text?: (string|null); + } + + /** Represents a Body. */ + class Body implements IBody { + + /** + * Constructs a new Body. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveMessage.IBody); + + /** Body text. */ + public text: string; + + /** + * Creates a new Body instance using the specified properties. + * @param [properties] Properties to set + * @returns Body instance + */ + public static create(properties?: proto.Message.InteractiveMessage.IBody): proto.Message.InteractiveMessage.Body; + + /** + * Encodes the specified Body message. Does not implicitly {@link proto.Message.InteractiveMessage.Body.verify|verify} messages. + * @param message Body message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveMessage.IBody, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Body message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.Body.verify|verify} messages. + * @param message Body message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveMessage.IBody, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Body message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage.Body; + + /** + * Decodes a Body message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage.Body; + + /** + * Verifies a Body message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Body message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Body + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage.Body; + + /** + * Creates a plain object from a Body message. Also converts values to other types if specified. + * @param message Body + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage.Body, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Body to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a CollectionMessage. */ + interface ICollectionMessage { + + /** CollectionMessage bizJid */ + bizJid?: (string|null); + + /** CollectionMessage id */ + id?: (string|null); + + /** CollectionMessage messageVersion */ + messageVersion?: (number|null); + } + + /** Represents a CollectionMessage. */ + class CollectionMessage implements ICollectionMessage { + + /** + * Constructs a new CollectionMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveMessage.ICollectionMessage); + + /** CollectionMessage bizJid. */ + public bizJid: string; + + /** CollectionMessage id. */ + public id: string; + + /** CollectionMessage messageVersion. */ + public messageVersion: number; + + /** + * Creates a new CollectionMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns CollectionMessage instance + */ + public static create(properties?: proto.Message.InteractiveMessage.ICollectionMessage): proto.Message.InteractiveMessage.CollectionMessage; + + /** + * Encodes the specified CollectionMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.CollectionMessage.verify|verify} messages. + * @param message CollectionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveMessage.ICollectionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CollectionMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.CollectionMessage.verify|verify} messages. + * @param message CollectionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveMessage.ICollectionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CollectionMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CollectionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage.CollectionMessage; + + /** + * Decodes a CollectionMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CollectionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage.CollectionMessage; + + /** + * Verifies a CollectionMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CollectionMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CollectionMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage.CollectionMessage; + + /** + * Creates a plain object from a CollectionMessage message. Also converts values to other types if specified. + * @param message CollectionMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage.CollectionMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CollectionMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Footer. */ + interface IFooter { + + /** Footer text */ + text?: (string|null); + } + + /** Represents a Footer. */ + class Footer implements IFooter { + + /** + * Constructs a new Footer. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveMessage.IFooter); + + /** Footer text. */ + public text: string; + + /** + * Creates a new Footer instance using the specified properties. + * @param [properties] Properties to set + * @returns Footer instance + */ + public static create(properties?: proto.Message.InteractiveMessage.IFooter): proto.Message.InteractiveMessage.Footer; + + /** + * Encodes the specified Footer message. Does not implicitly {@link proto.Message.InteractiveMessage.Footer.verify|verify} messages. + * @param message Footer message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveMessage.IFooter, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Footer message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.Footer.verify|verify} messages. + * @param message Footer message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveMessage.IFooter, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Footer message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Footer + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage.Footer; + + /** + * Decodes a Footer message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Footer + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage.Footer; + + /** + * Verifies a Footer message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Footer message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Footer + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage.Footer; + + /** + * Creates a plain object from a Footer message. Also converts values to other types if specified. + * @param message Footer + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage.Footer, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Footer to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Header. */ + interface IHeader { + + /** Header title */ + title?: (string|null); + + /** Header subtitle */ + subtitle?: (string|null); + + /** Header hasMediaAttachment */ + hasMediaAttachment?: (boolean|null); + + /** Header documentMessage */ + documentMessage?: (proto.Message.IDocumentMessage|null); + + /** Header imageMessage */ + imageMessage?: (proto.Message.IImageMessage|null); + + /** Header jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** Header videoMessage */ + videoMessage?: (proto.Message.IVideoMessage|null); + } + + /** Represents a Header. */ + class Header implements IHeader { + + /** + * Constructs a new Header. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveMessage.IHeader); + + /** Header title. */ + public title: string; + + /** Header subtitle. */ + public subtitle: string; + + /** Header hasMediaAttachment. */ + public hasMediaAttachment: boolean; + + /** Header documentMessage. */ + public documentMessage?: (proto.Message.IDocumentMessage|null); + + /** Header imageMessage. */ + public imageMessage?: (proto.Message.IImageMessage|null); + + /** Header jpegThumbnail. */ + public jpegThumbnail?: (Uint8Array|null); + + /** Header videoMessage. */ + public videoMessage?: (proto.Message.IVideoMessage|null); + + /** Header media. */ + public media?: ("documentMessage"|"imageMessage"|"jpegThumbnail"|"videoMessage"); + + /** + * Creates a new Header instance using the specified properties. + * @param [properties] Properties to set + * @returns Header instance + */ + public static create(properties?: proto.Message.InteractiveMessage.IHeader): proto.Message.InteractiveMessage.Header; + + /** + * Encodes the specified Header message. Does not implicitly {@link proto.Message.InteractiveMessage.Header.verify|verify} messages. + * @param message Header message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveMessage.IHeader, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Header message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.Header.verify|verify} messages. + * @param message Header message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveMessage.IHeader, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Header message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Header + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage.Header; + + /** + * Decodes a Header message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Header + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage.Header; + + /** + * Verifies a Header message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Header message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Header + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage.Header; + + /** + * Creates a plain object from a Header message. Also converts values to other types if specified. + * @param message Header + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage.Header, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Header to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a NativeFlowMessage. */ + interface INativeFlowMessage { + + /** NativeFlowMessage buttons */ + buttons?: (proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton[]|null); + + /** NativeFlowMessage messageParamsJson */ + messageParamsJson?: (string|null); + + /** NativeFlowMessage messageVersion */ + messageVersion?: (number|null); + } + + /** Represents a NativeFlowMessage. */ + class NativeFlowMessage implements INativeFlowMessage { + + /** + * Constructs a new NativeFlowMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveMessage.INativeFlowMessage); + + /** NativeFlowMessage buttons. */ + public buttons: proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton[]; + + /** NativeFlowMessage messageParamsJson. */ + public messageParamsJson: string; + + /** NativeFlowMessage messageVersion. */ + public messageVersion: number; + + /** + * Creates a new NativeFlowMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns NativeFlowMessage instance + */ + public static create(properties?: proto.Message.InteractiveMessage.INativeFlowMessage): proto.Message.InteractiveMessage.NativeFlowMessage; + + /** + * Encodes the specified NativeFlowMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.verify|verify} messages. + * @param message NativeFlowMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveMessage.INativeFlowMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NativeFlowMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.verify|verify} messages. + * @param message NativeFlowMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveMessage.INativeFlowMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NativeFlowMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NativeFlowMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage.NativeFlowMessage; + + /** + * Decodes a NativeFlowMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NativeFlowMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage.NativeFlowMessage; + + /** + * Verifies a NativeFlowMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NativeFlowMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NativeFlowMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage.NativeFlowMessage; + + /** + * Creates a plain object from a NativeFlowMessage message. Also converts values to other types if specified. + * @param message NativeFlowMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage.NativeFlowMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NativeFlowMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace NativeFlowMessage { + + /** Properties of a NativeFlowButton. */ + interface INativeFlowButton { + + /** NativeFlowButton name */ + name?: (string|null); + + /** NativeFlowButton buttonParamsJson */ + buttonParamsJson?: (string|null); + } + + /** Represents a NativeFlowButton. */ + class NativeFlowButton implements INativeFlowButton { + + /** + * Constructs a new NativeFlowButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton); + + /** NativeFlowButton name. */ + public name: string; + + /** NativeFlowButton buttonParamsJson. */ + public buttonParamsJson: string; + + /** + * Creates a new NativeFlowButton instance using the specified properties. + * @param [properties] Properties to set + * @returns NativeFlowButton instance + */ + public static create(properties?: proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton): proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton; + + /** + * Encodes the specified NativeFlowButton message. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.verify|verify} messages. + * @param message NativeFlowButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NativeFlowButton message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.verify|verify} messages. + * @param message NativeFlowButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NativeFlowButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NativeFlowButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton; + + /** + * Decodes a NativeFlowButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NativeFlowButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton; + + /** + * Verifies a NativeFlowButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NativeFlowButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NativeFlowButton + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton; + + /** + * Creates a plain object from a NativeFlowButton message. Also converts values to other types if specified. + * @param message NativeFlowButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NativeFlowButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a ShopMessage. */ + interface IShopMessage { + + /** ShopMessage id */ + id?: (string|null); + + /** ShopMessage surface */ + surface?: (proto.Message.InteractiveMessage.ShopMessage.Surface|null); + + /** ShopMessage messageVersion */ + messageVersion?: (number|null); + } + + /** Represents a ShopMessage. */ + class ShopMessage implements IShopMessage { + + /** + * Constructs a new ShopMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveMessage.IShopMessage); + + /** ShopMessage id. */ + public id: string; + + /** ShopMessage surface. */ + public surface: proto.Message.InteractiveMessage.ShopMessage.Surface; + + /** ShopMessage messageVersion. */ + public messageVersion: number; + + /** + * Creates a new ShopMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ShopMessage instance + */ + public static create(properties?: proto.Message.InteractiveMessage.IShopMessage): proto.Message.InteractiveMessage.ShopMessage; + + /** + * Encodes the specified ShopMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.ShopMessage.verify|verify} messages. + * @param message ShopMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveMessage.IShopMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ShopMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.ShopMessage.verify|verify} messages. + * @param message ShopMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveMessage.IShopMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ShopMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ShopMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveMessage.ShopMessage; + + /** + * Decodes a ShopMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ShopMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveMessage.ShopMessage; + + /** + * Verifies a ShopMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ShopMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ShopMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveMessage.ShopMessage; + + /** + * Creates a plain object from a ShopMessage message. Also converts values to other types if specified. + * @param message ShopMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveMessage.ShopMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ShopMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ShopMessage { + + /** Surface enum. */ + enum Surface { + UNKNOWN_SURFACE = 0, + FB = 1, + IG = 2, + WA = 3 + } + } + } + + /** Properties of an InteractiveResponseMessage. */ + interface IInteractiveResponseMessage { + + /** InteractiveResponseMessage body */ + body?: (proto.Message.InteractiveResponseMessage.IBody|null); + + /** InteractiveResponseMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** InteractiveResponseMessage nativeFlowResponseMessage */ + nativeFlowResponseMessage?: (proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage|null); + } + + /** Represents an InteractiveResponseMessage. */ + class InteractiveResponseMessage implements IInteractiveResponseMessage { + + /** + * Constructs a new InteractiveResponseMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IInteractiveResponseMessage); + + /** InteractiveResponseMessage body. */ + public body?: (proto.Message.InteractiveResponseMessage.IBody|null); + + /** InteractiveResponseMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** InteractiveResponseMessage nativeFlowResponseMessage. */ + public nativeFlowResponseMessage?: (proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage|null); + + /** InteractiveResponseMessage interactiveResponseMessage. */ + public interactiveResponseMessage?: "nativeFlowResponseMessage"; + + /** + * Creates a new InteractiveResponseMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns InteractiveResponseMessage instance + */ + public static create(properties?: proto.Message.IInteractiveResponseMessage): proto.Message.InteractiveResponseMessage; + + /** + * Encodes the specified InteractiveResponseMessage message. Does not implicitly {@link proto.Message.InteractiveResponseMessage.verify|verify} messages. + * @param message InteractiveResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IInteractiveResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified InteractiveResponseMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveResponseMessage.verify|verify} messages. + * @param message InteractiveResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IInteractiveResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an InteractiveResponseMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns InteractiveResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveResponseMessage; + + /** + * Decodes an InteractiveResponseMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns InteractiveResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveResponseMessage; + + /** + * Verifies an InteractiveResponseMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an InteractiveResponseMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns InteractiveResponseMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveResponseMessage; + + /** + * Creates a plain object from an InteractiveResponseMessage message. Also converts values to other types if specified. + * @param message InteractiveResponseMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveResponseMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this InteractiveResponseMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace InteractiveResponseMessage { + + /** Properties of a Body. */ + interface IBody { + + /** Body text */ + text?: (string|null); + } + + /** Represents a Body. */ + class Body implements IBody { + + /** + * Constructs a new Body. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveResponseMessage.IBody); + + /** Body text. */ + public text: string; + + /** + * Creates a new Body instance using the specified properties. + * @param [properties] Properties to set + * @returns Body instance + */ + public static create(properties?: proto.Message.InteractiveResponseMessage.IBody): proto.Message.InteractiveResponseMessage.Body; + + /** + * Encodes the specified Body message. Does not implicitly {@link proto.Message.InteractiveResponseMessage.Body.verify|verify} messages. + * @param message Body message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveResponseMessage.IBody, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Body message, length delimited. Does not implicitly {@link proto.Message.InteractiveResponseMessage.Body.verify|verify} messages. + * @param message Body message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveResponseMessage.IBody, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Body message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveResponseMessage.Body; + + /** + * Decodes a Body message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveResponseMessage.Body; + + /** + * Verifies a Body message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Body message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Body + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveResponseMessage.Body; + + /** + * Creates a plain object from a Body message. Also converts values to other types if specified. + * @param message Body + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveResponseMessage.Body, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Body to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a NativeFlowResponseMessage. */ + interface INativeFlowResponseMessage { + + /** NativeFlowResponseMessage name */ + name?: (string|null); + + /** NativeFlowResponseMessage paramsJson */ + paramsJson?: (string|null); + + /** NativeFlowResponseMessage version */ + version?: (number|null); + } + + /** Represents a NativeFlowResponseMessage. */ + class NativeFlowResponseMessage implements INativeFlowResponseMessage { + + /** + * Constructs a new NativeFlowResponseMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage); + + /** NativeFlowResponseMessage name. */ + public name: string; + + /** NativeFlowResponseMessage paramsJson. */ + public paramsJson: string; + + /** NativeFlowResponseMessage version. */ + public version: number; + + /** + * Creates a new NativeFlowResponseMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns NativeFlowResponseMessage instance + */ + public static create(properties?: proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage): proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage; + + /** + * Encodes the specified NativeFlowResponseMessage message. Does not implicitly {@link proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.verify|verify} messages. + * @param message NativeFlowResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NativeFlowResponseMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.verify|verify} messages. + * @param message NativeFlowResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NativeFlowResponseMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NativeFlowResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage; + + /** + * Decodes a NativeFlowResponseMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NativeFlowResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage; + + /** + * Verifies a NativeFlowResponseMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NativeFlowResponseMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NativeFlowResponseMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage; + + /** + * Creates a plain object from a NativeFlowResponseMessage message. Also converts values to other types if specified. + * @param message NativeFlowResponseMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NativeFlowResponseMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of an InvoiceMessage. */ + interface IInvoiceMessage { + + /** InvoiceMessage note */ + note?: (string|null); + + /** InvoiceMessage token */ + token?: (string|null); + + /** InvoiceMessage attachmentType */ + attachmentType?: (proto.Message.InvoiceMessage.AttachmentType|null); + + /** InvoiceMessage attachmentMimetype */ + attachmentMimetype?: (string|null); + + /** InvoiceMessage attachmentMediaKey */ + attachmentMediaKey?: (Uint8Array|null); + + /** InvoiceMessage attachmentMediaKeyTimestamp */ + attachmentMediaKeyTimestamp?: (number|Long|null); + + /** InvoiceMessage attachmentFileSha256 */ + attachmentFileSha256?: (Uint8Array|null); + + /** InvoiceMessage attachmentFileEncSha256 */ + attachmentFileEncSha256?: (Uint8Array|null); + + /** InvoiceMessage attachmentDirectPath */ + attachmentDirectPath?: (string|null); + + /** InvoiceMessage attachmentJpegThumbnail */ + attachmentJpegThumbnail?: (Uint8Array|null); + } + + /** Represents an InvoiceMessage. */ + class InvoiceMessage implements IInvoiceMessage { + + /** + * Constructs a new InvoiceMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IInvoiceMessage); + + /** InvoiceMessage note. */ + public note: string; + + /** InvoiceMessage token. */ + public token: string; + + /** InvoiceMessage attachmentType. */ + public attachmentType: proto.Message.InvoiceMessage.AttachmentType; + + /** InvoiceMessage attachmentMimetype. */ + public attachmentMimetype: string; + + /** InvoiceMessage attachmentMediaKey. */ + public attachmentMediaKey: Uint8Array; + + /** InvoiceMessage attachmentMediaKeyTimestamp. */ + public attachmentMediaKeyTimestamp: (number|Long); + + /** InvoiceMessage attachmentFileSha256. */ + public attachmentFileSha256: Uint8Array; + + /** InvoiceMessage attachmentFileEncSha256. */ + public attachmentFileEncSha256: Uint8Array; + + /** InvoiceMessage attachmentDirectPath. */ + public attachmentDirectPath: string; + + /** InvoiceMessage attachmentJpegThumbnail. */ + public attachmentJpegThumbnail: Uint8Array; + + /** + * Creates a new InvoiceMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns InvoiceMessage instance + */ + public static create(properties?: proto.Message.IInvoiceMessage): proto.Message.InvoiceMessage; + + /** + * Encodes the specified InvoiceMessage message. Does not implicitly {@link proto.Message.InvoiceMessage.verify|verify} messages. + * @param message InvoiceMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IInvoiceMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified InvoiceMessage message, length delimited. Does not implicitly {@link proto.Message.InvoiceMessage.verify|verify} messages. + * @param message InvoiceMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IInvoiceMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an InvoiceMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns InvoiceMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.InvoiceMessage; + + /** + * Decodes an InvoiceMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns InvoiceMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.InvoiceMessage; + + /** + * Verifies an InvoiceMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an InvoiceMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns InvoiceMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.InvoiceMessage; + + /** + * Creates a plain object from an InvoiceMessage message. Also converts values to other types if specified. + * @param message InvoiceMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.InvoiceMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this InvoiceMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace InvoiceMessage { + + /** AttachmentType enum. */ + enum AttachmentType { + IMAGE = 0, + PDF = 1 + } + } + + /** Properties of a KeepInChatMessage. */ + interface IKeepInChatMessage { + + /** KeepInChatMessage key */ + key?: (proto.IMessageKey|null); + + /** KeepInChatMessage keepType */ + keepType?: (proto.KeepType|null); + + /** KeepInChatMessage timestampMs */ + timestampMs?: (number|Long|null); + } + + /** Represents a KeepInChatMessage. */ + class KeepInChatMessage implements IKeepInChatMessage { + + /** + * Constructs a new KeepInChatMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IKeepInChatMessage); + + /** KeepInChatMessage key. */ + public key?: (proto.IMessageKey|null); + + /** KeepInChatMessage keepType. */ + public keepType: proto.KeepType; + + /** KeepInChatMessage timestampMs. */ + public timestampMs: (number|Long); + + /** + * Creates a new KeepInChatMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns KeepInChatMessage instance + */ + public static create(properties?: proto.Message.IKeepInChatMessage): proto.Message.KeepInChatMessage; + + /** + * Encodes the specified KeepInChatMessage message. Does not implicitly {@link proto.Message.KeepInChatMessage.verify|verify} messages. + * @param message KeepInChatMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IKeepInChatMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified KeepInChatMessage message, length delimited. Does not implicitly {@link proto.Message.KeepInChatMessage.verify|verify} messages. + * @param message KeepInChatMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IKeepInChatMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a KeepInChatMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns KeepInChatMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.KeepInChatMessage; + + /** + * Decodes a KeepInChatMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns KeepInChatMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.KeepInChatMessage; + + /** + * Verifies a KeepInChatMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a KeepInChatMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns KeepInChatMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.KeepInChatMessage; + + /** + * Creates a plain object from a KeepInChatMessage message. Also converts values to other types if specified. + * @param message KeepInChatMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.KeepInChatMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this KeepInChatMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ListMessage. */ + interface IListMessage { + + /** ListMessage title */ + title?: (string|null); + + /** ListMessage description */ + description?: (string|null); + + /** ListMessage buttonText */ + buttonText?: (string|null); + + /** ListMessage listType */ + listType?: (proto.Message.ListMessage.ListType|null); + + /** ListMessage sections */ + sections?: (proto.Message.ListMessage.ISection[]|null); + + /** ListMessage productListInfo */ + productListInfo?: (proto.Message.ListMessage.IProductListInfo|null); + + /** ListMessage footerText */ + footerText?: (string|null); + + /** ListMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a ListMessage. */ + class ListMessage implements IListMessage { + + /** + * Constructs a new ListMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IListMessage); + + /** ListMessage title. */ + public title: string; + + /** ListMessage description. */ + public description: string; + + /** ListMessage buttonText. */ + public buttonText: string; + + /** ListMessage listType. */ + public listType: proto.Message.ListMessage.ListType; + + /** ListMessage sections. */ + public sections: proto.Message.ListMessage.ISection[]; + + /** ListMessage productListInfo. */ + public productListInfo?: (proto.Message.ListMessage.IProductListInfo|null); + + /** ListMessage footerText. */ + public footerText: string; + + /** ListMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new ListMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ListMessage instance + */ + public static create(properties?: proto.Message.IListMessage): proto.Message.ListMessage; + + /** + * Encodes the specified ListMessage message. Does not implicitly {@link proto.Message.ListMessage.verify|verify} messages. + * @param message ListMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IListMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ListMessage message, length delimited. Does not implicitly {@link proto.Message.ListMessage.verify|verify} messages. + * @param message ListMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IListMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ListMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ListMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListMessage; + + /** + * Decodes a ListMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ListMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListMessage; + + /** + * Verifies a ListMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ListMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ListMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListMessage; + + /** + * Creates a plain object from a ListMessage message. Also converts values to other types if specified. + * @param message ListMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ListMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ListMessage { + + /** ListType enum. */ + enum ListType { + UNKNOWN = 0, + SINGLE_SELECT = 1, + PRODUCT_LIST = 2 + } + + /** Properties of a Product. */ + interface IProduct { + + /** Product productId */ + productId?: (string|null); + } + + /** Represents a Product. */ + class Product implements IProduct { + + /** + * Constructs a new Product. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ListMessage.IProduct); + + /** Product productId. */ + public productId: string; + + /** + * Creates a new Product instance using the specified properties. + * @param [properties] Properties to set + * @returns Product instance + */ + public static create(properties?: proto.Message.ListMessage.IProduct): proto.Message.ListMessage.Product; + + /** + * Encodes the specified Product message. Does not implicitly {@link proto.Message.ListMessage.Product.verify|verify} messages. + * @param message Product message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ListMessage.IProduct, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Product message, length delimited. Does not implicitly {@link proto.Message.ListMessage.Product.verify|verify} messages. + * @param message Product message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ListMessage.IProduct, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Product message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Product + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListMessage.Product; + + /** + * Decodes a Product message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Product + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListMessage.Product; + + /** + * Verifies a Product message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Product message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Product + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListMessage.Product; + + /** + * Creates a plain object from a Product message. Also converts values to other types if specified. + * @param message Product + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListMessage.Product, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Product to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ProductListHeaderImage. */ + interface IProductListHeaderImage { + + /** ProductListHeaderImage productId */ + productId?: (string|null); + + /** ProductListHeaderImage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + } + + /** Represents a ProductListHeaderImage. */ + class ProductListHeaderImage implements IProductListHeaderImage { + + /** + * Constructs a new ProductListHeaderImage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ListMessage.IProductListHeaderImage); + + /** ProductListHeaderImage productId. */ + public productId: string; + + /** ProductListHeaderImage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** + * Creates a new ProductListHeaderImage instance using the specified properties. + * @param [properties] Properties to set + * @returns ProductListHeaderImage instance + */ + public static create(properties?: proto.Message.ListMessage.IProductListHeaderImage): proto.Message.ListMessage.ProductListHeaderImage; + + /** + * Encodes the specified ProductListHeaderImage message. Does not implicitly {@link proto.Message.ListMessage.ProductListHeaderImage.verify|verify} messages. + * @param message ProductListHeaderImage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ListMessage.IProductListHeaderImage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ProductListHeaderImage message, length delimited. Does not implicitly {@link proto.Message.ListMessage.ProductListHeaderImage.verify|verify} messages. + * @param message ProductListHeaderImage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ListMessage.IProductListHeaderImage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ProductListHeaderImage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ProductListHeaderImage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListMessage.ProductListHeaderImage; + + /** + * Decodes a ProductListHeaderImage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ProductListHeaderImage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListMessage.ProductListHeaderImage; + + /** + * Verifies a ProductListHeaderImage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ProductListHeaderImage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ProductListHeaderImage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListMessage.ProductListHeaderImage; + + /** + * Creates a plain object from a ProductListHeaderImage message. Also converts values to other types if specified. + * @param message ProductListHeaderImage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListMessage.ProductListHeaderImage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ProductListHeaderImage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ProductListInfo. */ + interface IProductListInfo { + + /** ProductListInfo productSections */ + productSections?: (proto.Message.ListMessage.IProductSection[]|null); + + /** ProductListInfo headerImage */ + headerImage?: (proto.Message.ListMessage.IProductListHeaderImage|null); + + /** ProductListInfo businessOwnerJid */ + businessOwnerJid?: (string|null); + } + + /** Represents a ProductListInfo. */ + class ProductListInfo implements IProductListInfo { + + /** + * Constructs a new ProductListInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ListMessage.IProductListInfo); + + /** ProductListInfo productSections. */ + public productSections: proto.Message.ListMessage.IProductSection[]; + + /** ProductListInfo headerImage. */ + public headerImage?: (proto.Message.ListMessage.IProductListHeaderImage|null); + + /** ProductListInfo businessOwnerJid. */ + public businessOwnerJid: string; + + /** + * Creates a new ProductListInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns ProductListInfo instance + */ + public static create(properties?: proto.Message.ListMessage.IProductListInfo): proto.Message.ListMessage.ProductListInfo; + + /** + * Encodes the specified ProductListInfo message. Does not implicitly {@link proto.Message.ListMessage.ProductListInfo.verify|verify} messages. + * @param message ProductListInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ListMessage.IProductListInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ProductListInfo message, length delimited. Does not implicitly {@link proto.Message.ListMessage.ProductListInfo.verify|verify} messages. + * @param message ProductListInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ListMessage.IProductListInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ProductListInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ProductListInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListMessage.ProductListInfo; + + /** + * Decodes a ProductListInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ProductListInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListMessage.ProductListInfo; + + /** + * Verifies a ProductListInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ProductListInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ProductListInfo + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListMessage.ProductListInfo; + + /** + * Creates a plain object from a ProductListInfo message. Also converts values to other types if specified. + * @param message ProductListInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListMessage.ProductListInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ProductListInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ProductSection. */ + interface IProductSection { + + /** ProductSection title */ + title?: (string|null); + + /** ProductSection products */ + products?: (proto.Message.ListMessage.IProduct[]|null); + } + + /** Represents a ProductSection. */ + class ProductSection implements IProductSection { + + /** + * Constructs a new ProductSection. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ListMessage.IProductSection); + + /** ProductSection title. */ + public title: string; + + /** ProductSection products. */ + public products: proto.Message.ListMessage.IProduct[]; + + /** + * Creates a new ProductSection instance using the specified properties. + * @param [properties] Properties to set + * @returns ProductSection instance + */ + public static create(properties?: proto.Message.ListMessage.IProductSection): proto.Message.ListMessage.ProductSection; + + /** + * Encodes the specified ProductSection message. Does not implicitly {@link proto.Message.ListMessage.ProductSection.verify|verify} messages. + * @param message ProductSection message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ListMessage.IProductSection, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ProductSection message, length delimited. Does not implicitly {@link proto.Message.ListMessage.ProductSection.verify|verify} messages. + * @param message ProductSection message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ListMessage.IProductSection, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ProductSection message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ProductSection + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListMessage.ProductSection; + + /** + * Decodes a ProductSection message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ProductSection + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListMessage.ProductSection; + + /** + * Verifies a ProductSection message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ProductSection message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ProductSection + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListMessage.ProductSection; + + /** + * Creates a plain object from a ProductSection message. Also converts values to other types if specified. + * @param message ProductSection + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListMessage.ProductSection, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ProductSection to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Row. */ + interface IRow { + + /** Row title */ + title?: (string|null); + + /** Row description */ + description?: (string|null); + + /** Row rowId */ + rowId?: (string|null); + } + + /** Represents a Row. */ + class Row implements IRow { + + /** + * Constructs a new Row. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ListMessage.IRow); + + /** Row title. */ + public title: string; + + /** Row description. */ + public description: string; + + /** Row rowId. */ + public rowId: string; + + /** + * Creates a new Row instance using the specified properties. + * @param [properties] Properties to set + * @returns Row instance + */ + public static create(properties?: proto.Message.ListMessage.IRow): proto.Message.ListMessage.Row; + + /** + * Encodes the specified Row message. Does not implicitly {@link proto.Message.ListMessage.Row.verify|verify} messages. + * @param message Row message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ListMessage.IRow, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Row message, length delimited. Does not implicitly {@link proto.Message.ListMessage.Row.verify|verify} messages. + * @param message Row message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ListMessage.IRow, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Row message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Row + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListMessage.Row; + + /** + * Decodes a Row message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Row + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListMessage.Row; + + /** + * Verifies a Row message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Row message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Row + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListMessage.Row; + + /** + * Creates a plain object from a Row message. Also converts values to other types if specified. + * @param message Row + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListMessage.Row, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Row to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Section. */ + interface ISection { + + /** Section title */ + title?: (string|null); + + /** Section rows */ + rows?: (proto.Message.ListMessage.IRow[]|null); + } + + /** Represents a Section. */ + class Section implements ISection { + + /** + * Constructs a new Section. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ListMessage.ISection); + + /** Section title. */ + public title: string; + + /** Section rows. */ + public rows: proto.Message.ListMessage.IRow[]; + + /** + * Creates a new Section instance using the specified properties. + * @param [properties] Properties to set + * @returns Section instance + */ + public static create(properties?: proto.Message.ListMessage.ISection): proto.Message.ListMessage.Section; + + /** + * Encodes the specified Section message. Does not implicitly {@link proto.Message.ListMessage.Section.verify|verify} messages. + * @param message Section message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ListMessage.ISection, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Section message, length delimited. Does not implicitly {@link proto.Message.ListMessage.Section.verify|verify} messages. + * @param message Section message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ListMessage.ISection, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Section message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Section + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListMessage.Section; + + /** + * Decodes a Section message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Section + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListMessage.Section; + + /** + * Verifies a Section message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Section message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Section + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListMessage.Section; + + /** + * Creates a plain object from a Section message. Also converts values to other types if specified. + * @param message Section + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListMessage.Section, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Section to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a ListResponseMessage. */ + interface IListResponseMessage { + + /** ListResponseMessage title */ + title?: (string|null); + + /** ListResponseMessage listType */ + listType?: (proto.Message.ListResponseMessage.ListType|null); + + /** ListResponseMessage singleSelectReply */ + singleSelectReply?: (proto.Message.ListResponseMessage.ISingleSelectReply|null); + + /** ListResponseMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** ListResponseMessage description */ + description?: (string|null); + } + + /** Represents a ListResponseMessage. */ + class ListResponseMessage implements IListResponseMessage { + + /** + * Constructs a new ListResponseMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IListResponseMessage); + + /** ListResponseMessage title. */ + public title: string; + + /** ListResponseMessage listType. */ + public listType: proto.Message.ListResponseMessage.ListType; + + /** ListResponseMessage singleSelectReply. */ + public singleSelectReply?: (proto.Message.ListResponseMessage.ISingleSelectReply|null); + + /** ListResponseMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** ListResponseMessage description. */ + public description: string; + + /** + * Creates a new ListResponseMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ListResponseMessage instance + */ + public static create(properties?: proto.Message.IListResponseMessage): proto.Message.ListResponseMessage; + + /** + * Encodes the specified ListResponseMessage message. Does not implicitly {@link proto.Message.ListResponseMessage.verify|verify} messages. + * @param message ListResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IListResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ListResponseMessage message, length delimited. Does not implicitly {@link proto.Message.ListResponseMessage.verify|verify} messages. + * @param message ListResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IListResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ListResponseMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ListResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListResponseMessage; + + /** + * Decodes a ListResponseMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ListResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListResponseMessage; + + /** + * Verifies a ListResponseMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ListResponseMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ListResponseMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListResponseMessage; + + /** + * Creates a plain object from a ListResponseMessage message. Also converts values to other types if specified. + * @param message ListResponseMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListResponseMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ListResponseMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ListResponseMessage { + + /** ListType enum. */ + enum ListType { + UNKNOWN = 0, + SINGLE_SELECT = 1 + } + + /** Properties of a SingleSelectReply. */ + interface ISingleSelectReply { + + /** SingleSelectReply selectedRowId */ + selectedRowId?: (string|null); + } + + /** Represents a SingleSelectReply. */ + class SingleSelectReply implements ISingleSelectReply { + + /** + * Constructs a new SingleSelectReply. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ListResponseMessage.ISingleSelectReply); + + /** SingleSelectReply selectedRowId. */ + public selectedRowId: string; + + /** + * Creates a new SingleSelectReply instance using the specified properties. + * @param [properties] Properties to set + * @returns SingleSelectReply instance + */ + public static create(properties?: proto.Message.ListResponseMessage.ISingleSelectReply): proto.Message.ListResponseMessage.SingleSelectReply; + + /** + * Encodes the specified SingleSelectReply message. Does not implicitly {@link proto.Message.ListResponseMessage.SingleSelectReply.verify|verify} messages. + * @param message SingleSelectReply message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ListResponseMessage.ISingleSelectReply, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SingleSelectReply message, length delimited. Does not implicitly {@link proto.Message.ListResponseMessage.SingleSelectReply.verify|verify} messages. + * @param message SingleSelectReply message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ListResponseMessage.ISingleSelectReply, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SingleSelectReply message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SingleSelectReply + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ListResponseMessage.SingleSelectReply; + + /** + * Decodes a SingleSelectReply message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SingleSelectReply + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ListResponseMessage.SingleSelectReply; + + /** + * Verifies a SingleSelectReply message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SingleSelectReply message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SingleSelectReply + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ListResponseMessage.SingleSelectReply; + + /** + * Creates a plain object from a SingleSelectReply message. Also converts values to other types if specified. + * @param message SingleSelectReply + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ListResponseMessage.SingleSelectReply, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SingleSelectReply to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a LiveLocationMessage. */ + interface ILiveLocationMessage { + + /** LiveLocationMessage degreesLatitude */ + degreesLatitude?: (number|null); + + /** LiveLocationMessage degreesLongitude */ + degreesLongitude?: (number|null); + + /** LiveLocationMessage accuracyInMeters */ + accuracyInMeters?: (number|null); + + /** LiveLocationMessage speedInMps */ + speedInMps?: (number|null); + + /** LiveLocationMessage degreesClockwiseFromMagneticNorth */ + degreesClockwiseFromMagneticNorth?: (number|null); + + /** LiveLocationMessage caption */ + caption?: (string|null); + + /** LiveLocationMessage sequenceNumber */ + sequenceNumber?: (number|Long|null); + + /** LiveLocationMessage timeOffset */ + timeOffset?: (number|null); + + /** LiveLocationMessage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** LiveLocationMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a LiveLocationMessage. */ + class LiveLocationMessage implements ILiveLocationMessage { + + /** + * Constructs a new LiveLocationMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ILiveLocationMessage); + + /** LiveLocationMessage degreesLatitude. */ + public degreesLatitude: number; + + /** LiveLocationMessage degreesLongitude. */ + public degreesLongitude: number; + + /** LiveLocationMessage accuracyInMeters. */ + public accuracyInMeters: number; + + /** LiveLocationMessage speedInMps. */ + public speedInMps: number; + + /** LiveLocationMessage degreesClockwiseFromMagneticNorth. */ + public degreesClockwiseFromMagneticNorth: number; + + /** LiveLocationMessage caption. */ + public caption: string; + + /** LiveLocationMessage sequenceNumber. */ + public sequenceNumber: (number|Long); + + /** LiveLocationMessage timeOffset. */ + public timeOffset: number; + + /** LiveLocationMessage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** LiveLocationMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new LiveLocationMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns LiveLocationMessage instance + */ + public static create(properties?: proto.Message.ILiveLocationMessage): proto.Message.LiveLocationMessage; + + /** + * Encodes the specified LiveLocationMessage message. Does not implicitly {@link proto.Message.LiveLocationMessage.verify|verify} messages. + * @param message LiveLocationMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ILiveLocationMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LiveLocationMessage message, length delimited. Does not implicitly {@link proto.Message.LiveLocationMessage.verify|verify} messages. + * @param message LiveLocationMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ILiveLocationMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LiveLocationMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LiveLocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.LiveLocationMessage; + + /** + * Decodes a LiveLocationMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LiveLocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.LiveLocationMessage; + + /** + * Verifies a LiveLocationMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LiveLocationMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LiveLocationMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.LiveLocationMessage; + + /** + * Creates a plain object from a LiveLocationMessage message. Also converts values to other types if specified. + * @param message LiveLocationMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.LiveLocationMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LiveLocationMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a LocationMessage. */ + interface ILocationMessage { + + /** LocationMessage degreesLatitude */ + degreesLatitude?: (number|null); + + /** LocationMessage degreesLongitude */ + degreesLongitude?: (number|null); + + /** LocationMessage name */ + name?: (string|null); + + /** LocationMessage address */ + address?: (string|null); + + /** LocationMessage url */ + url?: (string|null); + + /** LocationMessage isLive */ + isLive?: (boolean|null); + + /** LocationMessage accuracyInMeters */ + accuracyInMeters?: (number|null); + + /** LocationMessage speedInMps */ + speedInMps?: (number|null); + + /** LocationMessage degreesClockwiseFromMagneticNorth */ + degreesClockwiseFromMagneticNorth?: (number|null); + + /** LocationMessage comment */ + comment?: (string|null); + + /** LocationMessage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** LocationMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a LocationMessage. */ + class LocationMessage implements ILocationMessage { + + /** + * Constructs a new LocationMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ILocationMessage); + + /** LocationMessage degreesLatitude. */ + public degreesLatitude: number; + + /** LocationMessage degreesLongitude. */ + public degreesLongitude: number; + + /** LocationMessage name. */ + public name: string; + + /** LocationMessage address. */ + public address: string; + + /** LocationMessage url. */ + public url: string; + + /** LocationMessage isLive. */ + public isLive: boolean; + + /** LocationMessage accuracyInMeters. */ + public accuracyInMeters: number; + + /** LocationMessage speedInMps. */ + public speedInMps: number; + + /** LocationMessage degreesClockwiseFromMagneticNorth. */ + public degreesClockwiseFromMagneticNorth: number; + + /** LocationMessage comment. */ + public comment: string; + + /** LocationMessage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** LocationMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new LocationMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns LocationMessage instance + */ + public static create(properties?: proto.Message.ILocationMessage): proto.Message.LocationMessage; + + /** + * Encodes the specified LocationMessage message. Does not implicitly {@link proto.Message.LocationMessage.verify|verify} messages. + * @param message LocationMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ILocationMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LocationMessage message, length delimited. Does not implicitly {@link proto.Message.LocationMessage.verify|verify} messages. + * @param message LocationMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ILocationMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LocationMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.LocationMessage; + + /** + * Decodes a LocationMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.LocationMessage; + + /** + * Verifies a LocationMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LocationMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LocationMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.LocationMessage; + + /** + * Creates a plain object from a LocationMessage message. Also converts values to other types if specified. + * @param message LocationMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.LocationMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LocationMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an OrderMessage. */ + interface IOrderMessage { + + /** OrderMessage orderId */ + orderId?: (string|null); + + /** OrderMessage thumbnail */ + thumbnail?: (Uint8Array|null); + + /** OrderMessage itemCount */ + itemCount?: (number|null); + + /** OrderMessage status */ + status?: (proto.Message.OrderMessage.OrderStatus|null); + + /** OrderMessage surface */ + surface?: (proto.Message.OrderMessage.OrderSurface|null); + + /** OrderMessage message */ + message?: (string|null); + + /** OrderMessage orderTitle */ + orderTitle?: (string|null); + + /** OrderMessage sellerJid */ + sellerJid?: (string|null); + + /** OrderMessage token */ + token?: (string|null); + + /** OrderMessage totalAmount1000 */ + totalAmount1000?: (number|Long|null); + + /** OrderMessage totalCurrencyCode */ + totalCurrencyCode?: (string|null); + + /** OrderMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents an OrderMessage. */ + class OrderMessage implements IOrderMessage { + + /** + * Constructs a new OrderMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IOrderMessage); + + /** OrderMessage orderId. */ + public orderId: string; + + /** OrderMessage thumbnail. */ + public thumbnail: Uint8Array; + + /** OrderMessage itemCount. */ + public itemCount: number; + + /** OrderMessage status. */ + public status: proto.Message.OrderMessage.OrderStatus; + + /** OrderMessage surface. */ + public surface: proto.Message.OrderMessage.OrderSurface; + + /** OrderMessage message. */ + public message: string; + + /** OrderMessage orderTitle. */ + public orderTitle: string; + + /** OrderMessage sellerJid. */ + public sellerJid: string; + + /** OrderMessage token. */ + public token: string; + + /** OrderMessage totalAmount1000. */ + public totalAmount1000: (number|Long); + + /** OrderMessage totalCurrencyCode. */ + public totalCurrencyCode: string; + + /** OrderMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new OrderMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns OrderMessage instance + */ + public static create(properties?: proto.Message.IOrderMessage): proto.Message.OrderMessage; + + /** + * Encodes the specified OrderMessage message. Does not implicitly {@link proto.Message.OrderMessage.verify|verify} messages. + * @param message OrderMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IOrderMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified OrderMessage message, length delimited. Does not implicitly {@link proto.Message.OrderMessage.verify|verify} messages. + * @param message OrderMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IOrderMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an OrderMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns OrderMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.OrderMessage; + + /** + * Decodes an OrderMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns OrderMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.OrderMessage; + + /** + * Verifies an OrderMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an OrderMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns OrderMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.OrderMessage; + + /** + * Creates a plain object from an OrderMessage message. Also converts values to other types if specified. + * @param message OrderMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.OrderMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this OrderMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace OrderMessage { + + /** OrderStatus enum. */ + enum OrderStatus { + INQUIRY = 1 + } + + /** OrderSurface enum. */ + enum OrderSurface { + CATALOG = 1 + } + } + + /** Properties of a PaymentInviteMessage. */ + interface IPaymentInviteMessage { + + /** PaymentInviteMessage serviceType */ + serviceType?: (proto.Message.PaymentInviteMessage.ServiceType|null); + + /** PaymentInviteMessage expiryTimestamp */ + expiryTimestamp?: (number|Long|null); + } + + /** Represents a PaymentInviteMessage. */ + class PaymentInviteMessage implements IPaymentInviteMessage { + + /** + * Constructs a new PaymentInviteMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPaymentInviteMessage); + + /** PaymentInviteMessage serviceType. */ + public serviceType: proto.Message.PaymentInviteMessage.ServiceType; + + /** PaymentInviteMessage expiryTimestamp. */ + public expiryTimestamp: (number|Long); + + /** + * Creates a new PaymentInviteMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns PaymentInviteMessage instance + */ + public static create(properties?: proto.Message.IPaymentInviteMessage): proto.Message.PaymentInviteMessage; + + /** + * Encodes the specified PaymentInviteMessage message. Does not implicitly {@link proto.Message.PaymentInviteMessage.verify|verify} messages. + * @param message PaymentInviteMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPaymentInviteMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PaymentInviteMessage message, length delimited. Does not implicitly {@link proto.Message.PaymentInviteMessage.verify|verify} messages. + * @param message PaymentInviteMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPaymentInviteMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PaymentInviteMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PaymentInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PaymentInviteMessage; + + /** + * Decodes a PaymentInviteMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PaymentInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PaymentInviteMessage; + + /** + * Verifies a PaymentInviteMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PaymentInviteMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PaymentInviteMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PaymentInviteMessage; + + /** + * Creates a plain object from a PaymentInviteMessage message. Also converts values to other types if specified. + * @param message PaymentInviteMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PaymentInviteMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PaymentInviteMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PaymentInviteMessage { + + /** ServiceType enum. */ + enum ServiceType { + UNKNOWN = 0, + FBPAY = 1, + NOVI = 2, + UPI = 3 + } + } + + /** Properties of a PeerDataOperationRequestMessage. */ + interface IPeerDataOperationRequestMessage { + + /** PeerDataOperationRequestMessage peerDataOperationRequestType */ + peerDataOperationRequestType?: (proto.Message.PeerDataOperationRequestType|null); + + /** PeerDataOperationRequestMessage requestStickerReupload */ + requestStickerReupload?: (proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload[]|null); + + /** PeerDataOperationRequestMessage requestUrlPreview */ + requestUrlPreview?: (proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview[]|null); + } + + /** Represents a PeerDataOperationRequestMessage. */ + class PeerDataOperationRequestMessage implements IPeerDataOperationRequestMessage { + + /** + * Constructs a new PeerDataOperationRequestMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPeerDataOperationRequestMessage); + + /** PeerDataOperationRequestMessage peerDataOperationRequestType. */ + public peerDataOperationRequestType: proto.Message.PeerDataOperationRequestType; + + /** PeerDataOperationRequestMessage requestStickerReupload. */ + public requestStickerReupload: proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload[]; + + /** PeerDataOperationRequestMessage requestUrlPreview. */ + public requestUrlPreview: proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview[]; + + /** + * Creates a new PeerDataOperationRequestMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns PeerDataOperationRequestMessage instance + */ + public static create(properties?: proto.Message.IPeerDataOperationRequestMessage): proto.Message.PeerDataOperationRequestMessage; + + /** + * Encodes the specified PeerDataOperationRequestMessage message. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.verify|verify} messages. + * @param message PeerDataOperationRequestMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPeerDataOperationRequestMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PeerDataOperationRequestMessage message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.verify|verify} messages. + * @param message PeerDataOperationRequestMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPeerDataOperationRequestMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PeerDataOperationRequestMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PeerDataOperationRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PeerDataOperationRequestMessage; + + /** + * Decodes a PeerDataOperationRequestMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PeerDataOperationRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PeerDataOperationRequestMessage; + + /** + * Verifies a PeerDataOperationRequestMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PeerDataOperationRequestMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PeerDataOperationRequestMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PeerDataOperationRequestMessage; + + /** + * Creates a plain object from a PeerDataOperationRequestMessage message. Also converts values to other types if specified. + * @param message PeerDataOperationRequestMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PeerDataOperationRequestMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PeerDataOperationRequestMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PeerDataOperationRequestMessage { + + /** Properties of a RequestStickerReupload. */ + interface IRequestStickerReupload { + + /** RequestStickerReupload fileSha256 */ + fileSha256?: (string|null); + } + + /** Represents a RequestStickerReupload. */ + class RequestStickerReupload implements IRequestStickerReupload { + + /** + * Constructs a new RequestStickerReupload. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload); + + /** RequestStickerReupload fileSha256. */ + public fileSha256: string; + + /** + * Creates a new RequestStickerReupload instance using the specified properties. + * @param [properties] Properties to set + * @returns RequestStickerReupload instance + */ + public static create(properties?: proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload): proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload; + + /** + * Encodes the specified RequestStickerReupload message. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.verify|verify} messages. + * @param message RequestStickerReupload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RequestStickerReupload message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.verify|verify} messages. + * @param message RequestStickerReupload message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RequestStickerReupload message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RequestStickerReupload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload; + + /** + * Decodes a RequestStickerReupload message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RequestStickerReupload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload; + + /** + * Verifies a RequestStickerReupload message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RequestStickerReupload message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RequestStickerReupload + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload; + + /** + * Creates a plain object from a RequestStickerReupload message. Also converts values to other types if specified. + * @param message RequestStickerReupload + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RequestStickerReupload to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a RequestUrlPreview. */ + interface IRequestUrlPreview { + + /** RequestUrlPreview url */ + url?: (string|null); + } + + /** Represents a RequestUrlPreview. */ + class RequestUrlPreview implements IRequestUrlPreview { + + /** + * Constructs a new RequestUrlPreview. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview); + + /** RequestUrlPreview url. */ + public url: string; + + /** + * Creates a new RequestUrlPreview instance using the specified properties. + * @param [properties] Properties to set + * @returns RequestUrlPreview instance + */ + public static create(properties?: proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview): proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview; + + /** + * Encodes the specified RequestUrlPreview message. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.verify|verify} messages. + * @param message RequestUrlPreview message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RequestUrlPreview message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.verify|verify} messages. + * @param message RequestUrlPreview message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RequestUrlPreview message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RequestUrlPreview + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview; + + /** + * Decodes a RequestUrlPreview message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RequestUrlPreview + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview; + + /** + * Verifies a RequestUrlPreview message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RequestUrlPreview message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RequestUrlPreview + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview; + + /** + * Creates a plain object from a RequestUrlPreview message. Also converts values to other types if specified. + * @param message RequestUrlPreview + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RequestUrlPreview to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a PeerDataOperationRequestResponseMessage. */ + interface IPeerDataOperationRequestResponseMessage { + + /** PeerDataOperationRequestResponseMessage peerDataOperationRequestType */ + peerDataOperationRequestType?: (proto.Message.PeerDataOperationRequestType|null); + + /** PeerDataOperationRequestResponseMessage stanzaId */ + stanzaId?: (string|null); + + /** PeerDataOperationRequestResponseMessage peerDataOperationResult */ + peerDataOperationResult?: (proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult[]|null); + } + + /** Represents a PeerDataOperationRequestResponseMessage. */ + class PeerDataOperationRequestResponseMessage implements IPeerDataOperationRequestResponseMessage { + + /** + * Constructs a new PeerDataOperationRequestResponseMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPeerDataOperationRequestResponseMessage); + + /** PeerDataOperationRequestResponseMessage peerDataOperationRequestType. */ + public peerDataOperationRequestType: proto.Message.PeerDataOperationRequestType; + + /** PeerDataOperationRequestResponseMessage stanzaId. */ + public stanzaId: string; + + /** PeerDataOperationRequestResponseMessage peerDataOperationResult. */ + public peerDataOperationResult: proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult[]; + + /** + * Creates a new PeerDataOperationRequestResponseMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns PeerDataOperationRequestResponseMessage instance + */ + public static create(properties?: proto.Message.IPeerDataOperationRequestResponseMessage): proto.Message.PeerDataOperationRequestResponseMessage; + + /** + * Encodes the specified PeerDataOperationRequestResponseMessage message. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.verify|verify} messages. + * @param message PeerDataOperationRequestResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPeerDataOperationRequestResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PeerDataOperationRequestResponseMessage message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.verify|verify} messages. + * @param message PeerDataOperationRequestResponseMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPeerDataOperationRequestResponseMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PeerDataOperationRequestResponseMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PeerDataOperationRequestResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PeerDataOperationRequestResponseMessage; + + /** + * Decodes a PeerDataOperationRequestResponseMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PeerDataOperationRequestResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PeerDataOperationRequestResponseMessage; + + /** + * Verifies a PeerDataOperationRequestResponseMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PeerDataOperationRequestResponseMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PeerDataOperationRequestResponseMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PeerDataOperationRequestResponseMessage; + + /** + * Creates a plain object from a PeerDataOperationRequestResponseMessage message. Also converts values to other types if specified. + * @param message PeerDataOperationRequestResponseMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PeerDataOperationRequestResponseMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PeerDataOperationRequestResponseMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PeerDataOperationRequestResponseMessage { + + /** Properties of a PeerDataOperationResult. */ + interface IPeerDataOperationResult { + + /** PeerDataOperationResult mediaUploadResult */ + mediaUploadResult?: (proto.MediaRetryNotification.ResultType|null); + + /** PeerDataOperationResult stickerMessage */ + stickerMessage?: (proto.Message.IStickerMessage|null); + + /** PeerDataOperationResult linkPreviewResponse */ + linkPreviewResponse?: (proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse|null); + } + + /** Represents a PeerDataOperationResult. */ + class PeerDataOperationResult implements IPeerDataOperationResult { + + /** + * Constructs a new PeerDataOperationResult. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult); + + /** PeerDataOperationResult mediaUploadResult. */ + public mediaUploadResult: proto.MediaRetryNotification.ResultType; + + /** PeerDataOperationResult stickerMessage. */ + public stickerMessage?: (proto.Message.IStickerMessage|null); + + /** PeerDataOperationResult linkPreviewResponse. */ + public linkPreviewResponse?: (proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse|null); + + /** + * Creates a new PeerDataOperationResult instance using the specified properties. + * @param [properties] Properties to set + * @returns PeerDataOperationResult instance + */ + public static create(properties?: proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult; + + /** + * Encodes the specified PeerDataOperationResult message. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.verify|verify} messages. + * @param message PeerDataOperationResult message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PeerDataOperationResult message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.verify|verify} messages. + * @param message PeerDataOperationResult message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PeerDataOperationResult message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PeerDataOperationResult + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult; + + /** + * Decodes a PeerDataOperationResult message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PeerDataOperationResult + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult; + + /** + * Verifies a PeerDataOperationResult message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PeerDataOperationResult message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PeerDataOperationResult + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult; + + /** + * Creates a plain object from a PeerDataOperationResult message. Also converts values to other types if specified. + * @param message PeerDataOperationResult + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PeerDataOperationResult to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PeerDataOperationResult { + + /** Properties of a LinkPreviewResponse. */ + interface ILinkPreviewResponse { + + /** LinkPreviewResponse url */ + url?: (string|null); + + /** LinkPreviewResponse title */ + title?: (string|null); + + /** LinkPreviewResponse description */ + description?: (string|null); + + /** LinkPreviewResponse thumbData */ + thumbData?: (Uint8Array|null); + + /** LinkPreviewResponse canonicalUrl */ + canonicalUrl?: (string|null); + + /** LinkPreviewResponse matchText */ + matchText?: (string|null); + + /** LinkPreviewResponse previewType */ + previewType?: (string|null); + } + + /** Represents a LinkPreviewResponse. */ + class LinkPreviewResponse implements ILinkPreviewResponse { + + /** + * Constructs a new LinkPreviewResponse. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse); + + /** LinkPreviewResponse url. */ + public url: string; + + /** LinkPreviewResponse title. */ + public title: string; + + /** LinkPreviewResponse description. */ + public description: string; + + /** LinkPreviewResponse thumbData. */ + public thumbData: Uint8Array; + + /** LinkPreviewResponse canonicalUrl. */ + public canonicalUrl: string; + + /** LinkPreviewResponse matchText. */ + public matchText: string; + + /** LinkPreviewResponse previewType. */ + public previewType: string; + + /** + * Creates a new LinkPreviewResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns LinkPreviewResponse instance + */ + public static create(properties?: proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse; + + /** + * Encodes the specified LinkPreviewResponse message. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.verify|verify} messages. + * @param message LinkPreviewResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LinkPreviewResponse message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.verify|verify} messages. + * @param message LinkPreviewResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LinkPreviewResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LinkPreviewResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse; + + /** + * Decodes a LinkPreviewResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LinkPreviewResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse; + + /** + * Verifies a LinkPreviewResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LinkPreviewResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LinkPreviewResponse + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse; + + /** + * Creates a plain object from a LinkPreviewResponse message. Also converts values to other types if specified. + * @param message LinkPreviewResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LinkPreviewResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + } + + /** PeerDataOperationRequestType enum. */ + enum PeerDataOperationRequestType { + UPLOAD_STICKER = 0, + SEND_RECENT_STICKER_BOOTSTRAP = 1, + GENERATE_LINK_PREVIEW = 2 + } + + /** Properties of a PollCreationMessage. */ + interface IPollCreationMessage { + + /** PollCreationMessage encKey */ + encKey?: (Uint8Array|null); + + /** PollCreationMessage name */ + name?: (string|null); + + /** PollCreationMessage options */ + options?: (proto.Message.PollCreationMessage.IOption[]|null); + + /** PollCreationMessage selectableOptionsCount */ + selectableOptionsCount?: (number|null); + + /** PollCreationMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a PollCreationMessage. */ + class PollCreationMessage implements IPollCreationMessage { + + /** + * Constructs a new PollCreationMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPollCreationMessage); + + /** PollCreationMessage encKey. */ + public encKey: Uint8Array; + + /** PollCreationMessage name. */ + public name: string; + + /** PollCreationMessage options. */ + public options: proto.Message.PollCreationMessage.IOption[]; + + /** PollCreationMessage selectableOptionsCount. */ + public selectableOptionsCount: number; + + /** PollCreationMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new PollCreationMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns PollCreationMessage instance + */ + public static create(properties?: proto.Message.IPollCreationMessage): proto.Message.PollCreationMessage; + + /** + * Encodes the specified PollCreationMessage message. Does not implicitly {@link proto.Message.PollCreationMessage.verify|verify} messages. + * @param message PollCreationMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPollCreationMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollCreationMessage message, length delimited. Does not implicitly {@link proto.Message.PollCreationMessage.verify|verify} messages. + * @param message PollCreationMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPollCreationMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollCreationMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollCreationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PollCreationMessage; + + /** + * Decodes a PollCreationMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollCreationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PollCreationMessage; + + /** + * Verifies a PollCreationMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollCreationMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollCreationMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PollCreationMessage; + + /** + * Creates a plain object from a PollCreationMessage message. Also converts values to other types if specified. + * @param message PollCreationMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PollCreationMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollCreationMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PollCreationMessage { + + /** Properties of an Option. */ + interface IOption { + + /** Option optionName */ + optionName?: (string|null); + } + + /** Represents an Option. */ + class Option implements IOption { + + /** + * Constructs a new Option. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.PollCreationMessage.IOption); + + /** Option optionName. */ + public optionName: string; + + /** + * Creates a new Option instance using the specified properties. + * @param [properties] Properties to set + * @returns Option instance + */ + public static create(properties?: proto.Message.PollCreationMessage.IOption): proto.Message.PollCreationMessage.Option; + + /** + * Encodes the specified Option message. Does not implicitly {@link proto.Message.PollCreationMessage.Option.verify|verify} messages. + * @param message Option message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.PollCreationMessage.IOption, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Option message, length delimited. Does not implicitly {@link proto.Message.PollCreationMessage.Option.verify|verify} messages. + * @param message Option message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.PollCreationMessage.IOption, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an Option message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Option + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PollCreationMessage.Option; + + /** + * Decodes an Option message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Option + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PollCreationMessage.Option; + + /** + * Verifies an Option message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an Option message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Option + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PollCreationMessage.Option; + + /** + * Creates a plain object from an Option message. Also converts values to other types if specified. + * @param message Option + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PollCreationMessage.Option, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Option to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a PollEncValue. */ + interface IPollEncValue { + + /** PollEncValue encPayload */ + encPayload?: (Uint8Array|null); + + /** PollEncValue encIv */ + encIv?: (Uint8Array|null); + } + + /** Represents a PollEncValue. */ + class PollEncValue implements IPollEncValue { + + /** + * Constructs a new PollEncValue. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPollEncValue); + + /** PollEncValue encPayload. */ + public encPayload: Uint8Array; + + /** PollEncValue encIv. */ + public encIv: Uint8Array; + + /** + * Creates a new PollEncValue instance using the specified properties. + * @param [properties] Properties to set + * @returns PollEncValue instance + */ + public static create(properties?: proto.Message.IPollEncValue): proto.Message.PollEncValue; + + /** + * Encodes the specified PollEncValue message. Does not implicitly {@link proto.Message.PollEncValue.verify|verify} messages. + * @param message PollEncValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPollEncValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollEncValue message, length delimited. Does not implicitly {@link proto.Message.PollEncValue.verify|verify} messages. + * @param message PollEncValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPollEncValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollEncValue message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PollEncValue; + + /** + * Decodes a PollEncValue message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PollEncValue; + + /** + * Verifies a PollEncValue message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollEncValue message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollEncValue + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PollEncValue; + + /** + * Creates a plain object from a PollEncValue message. Also converts values to other types if specified. + * @param message PollEncValue + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PollEncValue, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollEncValue to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PollUpdateMessage. */ + interface IPollUpdateMessage { + + /** PollUpdateMessage pollCreationMessageKey */ + pollCreationMessageKey?: (proto.IMessageKey|null); + + /** PollUpdateMessage vote */ + vote?: (proto.Message.IPollEncValue|null); + + /** PollUpdateMessage metadata */ + metadata?: (proto.Message.IPollUpdateMessageMetadata|null); + + /** PollUpdateMessage senderTimestampMs */ + senderTimestampMs?: (number|Long|null); + } + + /** Represents a PollUpdateMessage. */ + class PollUpdateMessage implements IPollUpdateMessage { + + /** + * Constructs a new PollUpdateMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPollUpdateMessage); + + /** PollUpdateMessage pollCreationMessageKey. */ + public pollCreationMessageKey?: (proto.IMessageKey|null); + + /** PollUpdateMessage vote. */ + public vote?: (proto.Message.IPollEncValue|null); + + /** PollUpdateMessage metadata. */ + public metadata?: (proto.Message.IPollUpdateMessageMetadata|null); + + /** PollUpdateMessage senderTimestampMs. */ + public senderTimestampMs: (number|Long); + + /** + * Creates a new PollUpdateMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns PollUpdateMessage instance + */ + public static create(properties?: proto.Message.IPollUpdateMessage): proto.Message.PollUpdateMessage; + + /** + * Encodes the specified PollUpdateMessage message. Does not implicitly {@link proto.Message.PollUpdateMessage.verify|verify} messages. + * @param message PollUpdateMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPollUpdateMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollUpdateMessage message, length delimited. Does not implicitly {@link proto.Message.PollUpdateMessage.verify|verify} messages. + * @param message PollUpdateMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPollUpdateMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollUpdateMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollUpdateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PollUpdateMessage; + + /** + * Decodes a PollUpdateMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollUpdateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PollUpdateMessage; + + /** + * Verifies a PollUpdateMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollUpdateMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollUpdateMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PollUpdateMessage; + + /** + * Creates a plain object from a PollUpdateMessage message. Also converts values to other types if specified. + * @param message PollUpdateMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PollUpdateMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollUpdateMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PollUpdateMessageMetadata. */ + interface IPollUpdateMessageMetadata { + } + + /** Represents a PollUpdateMessageMetadata. */ + class PollUpdateMessageMetadata implements IPollUpdateMessageMetadata { + + /** + * Constructs a new PollUpdateMessageMetadata. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPollUpdateMessageMetadata); + + /** + * Creates a new PollUpdateMessageMetadata instance using the specified properties. + * @param [properties] Properties to set + * @returns PollUpdateMessageMetadata instance + */ + public static create(properties?: proto.Message.IPollUpdateMessageMetadata): proto.Message.PollUpdateMessageMetadata; + + /** + * Encodes the specified PollUpdateMessageMetadata message. Does not implicitly {@link proto.Message.PollUpdateMessageMetadata.verify|verify} messages. + * @param message PollUpdateMessageMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPollUpdateMessageMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollUpdateMessageMetadata message, length delimited. Does not implicitly {@link proto.Message.PollUpdateMessageMetadata.verify|verify} messages. + * @param message PollUpdateMessageMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPollUpdateMessageMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollUpdateMessageMetadata message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollUpdateMessageMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PollUpdateMessageMetadata; + + /** + * Decodes a PollUpdateMessageMetadata message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollUpdateMessageMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PollUpdateMessageMetadata; + + /** + * Verifies a PollUpdateMessageMetadata message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollUpdateMessageMetadata message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollUpdateMessageMetadata + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PollUpdateMessageMetadata; + + /** + * Creates a plain object from a PollUpdateMessageMetadata message. Also converts values to other types if specified. + * @param message PollUpdateMessageMetadata + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PollUpdateMessageMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollUpdateMessageMetadata to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PollVoteMessage. */ + interface IPollVoteMessage { + + /** PollVoteMessage selectedOptions */ + selectedOptions?: (Uint8Array[]|null); + } + + /** Represents a PollVoteMessage. */ + class PollVoteMessage implements IPollVoteMessage { + + /** + * Constructs a new PollVoteMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IPollVoteMessage); + + /** PollVoteMessage selectedOptions. */ + public selectedOptions: Uint8Array[]; + + /** + * Creates a new PollVoteMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns PollVoteMessage instance + */ + public static create(properties?: proto.Message.IPollVoteMessage): proto.Message.PollVoteMessage; + + /** + * Encodes the specified PollVoteMessage message. Does not implicitly {@link proto.Message.PollVoteMessage.verify|verify} messages. + * @param message PollVoteMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IPollVoteMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollVoteMessage message, length delimited. Does not implicitly {@link proto.Message.PollVoteMessage.verify|verify} messages. + * @param message PollVoteMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IPollVoteMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollVoteMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollVoteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.PollVoteMessage; + + /** + * Decodes a PollVoteMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollVoteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.PollVoteMessage; + + /** + * Verifies a PollVoteMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollVoteMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollVoteMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.PollVoteMessage; + + /** + * Creates a plain object from a PollVoteMessage message. Also converts values to other types if specified. + * @param message PollVoteMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.PollVoteMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollVoteMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ProductMessage. */ + interface IProductMessage { + + /** ProductMessage product */ + product?: (proto.Message.ProductMessage.IProductSnapshot|null); + + /** ProductMessage businessOwnerJid */ + businessOwnerJid?: (string|null); + + /** ProductMessage catalog */ + catalog?: (proto.Message.ProductMessage.ICatalogSnapshot|null); + + /** ProductMessage body */ + body?: (string|null); + + /** ProductMessage footer */ + footer?: (string|null); + + /** ProductMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a ProductMessage. */ + class ProductMessage implements IProductMessage { + + /** + * Constructs a new ProductMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IProductMessage); + + /** ProductMessage product. */ + public product?: (proto.Message.ProductMessage.IProductSnapshot|null); + + /** ProductMessage businessOwnerJid. */ + public businessOwnerJid: string; + + /** ProductMessage catalog. */ + public catalog?: (proto.Message.ProductMessage.ICatalogSnapshot|null); + + /** ProductMessage body. */ + public body: string; + + /** ProductMessage footer. */ + public footer: string; + + /** ProductMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new ProductMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ProductMessage instance + */ + public static create(properties?: proto.Message.IProductMessage): proto.Message.ProductMessage; + + /** + * Encodes the specified ProductMessage message. Does not implicitly {@link proto.Message.ProductMessage.verify|verify} messages. + * @param message ProductMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IProductMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ProductMessage message, length delimited. Does not implicitly {@link proto.Message.ProductMessage.verify|verify} messages. + * @param message ProductMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IProductMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ProductMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ProductMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ProductMessage; + + /** + * Decodes a ProductMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ProductMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ProductMessage; + + /** + * Verifies a ProductMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ProductMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ProductMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ProductMessage; + + /** + * Creates a plain object from a ProductMessage message. Also converts values to other types if specified. + * @param message ProductMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ProductMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ProductMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ProductMessage { + + /** Properties of a CatalogSnapshot. */ + interface ICatalogSnapshot { + + /** CatalogSnapshot catalogImage */ + catalogImage?: (proto.Message.IImageMessage|null); + + /** CatalogSnapshot title */ + title?: (string|null); + + /** CatalogSnapshot description */ + description?: (string|null); + } + + /** Represents a CatalogSnapshot. */ + class CatalogSnapshot implements ICatalogSnapshot { + + /** + * Constructs a new CatalogSnapshot. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ProductMessage.ICatalogSnapshot); + + /** CatalogSnapshot catalogImage. */ + public catalogImage?: (proto.Message.IImageMessage|null); + + /** CatalogSnapshot title. */ + public title: string; + + /** CatalogSnapshot description. */ + public description: string; + + /** + * Creates a new CatalogSnapshot instance using the specified properties. + * @param [properties] Properties to set + * @returns CatalogSnapshot instance + */ + public static create(properties?: proto.Message.ProductMessage.ICatalogSnapshot): proto.Message.ProductMessage.CatalogSnapshot; + + /** + * Encodes the specified CatalogSnapshot message. Does not implicitly {@link proto.Message.ProductMessage.CatalogSnapshot.verify|verify} messages. + * @param message CatalogSnapshot message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ProductMessage.ICatalogSnapshot, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CatalogSnapshot message, length delimited. Does not implicitly {@link proto.Message.ProductMessage.CatalogSnapshot.verify|verify} messages. + * @param message CatalogSnapshot message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ProductMessage.ICatalogSnapshot, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CatalogSnapshot message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CatalogSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ProductMessage.CatalogSnapshot; + + /** + * Decodes a CatalogSnapshot message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CatalogSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ProductMessage.CatalogSnapshot; + + /** + * Verifies a CatalogSnapshot message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CatalogSnapshot message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CatalogSnapshot + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ProductMessage.CatalogSnapshot; + + /** + * Creates a plain object from a CatalogSnapshot message. Also converts values to other types if specified. + * @param message CatalogSnapshot + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ProductMessage.CatalogSnapshot, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CatalogSnapshot to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ProductSnapshot. */ + interface IProductSnapshot { + + /** ProductSnapshot productImage */ + productImage?: (proto.Message.IImageMessage|null); + + /** ProductSnapshot productId */ + productId?: (string|null); + + /** ProductSnapshot title */ + title?: (string|null); + + /** ProductSnapshot description */ + description?: (string|null); + + /** ProductSnapshot currencyCode */ + currencyCode?: (string|null); + + /** ProductSnapshot priceAmount1000 */ + priceAmount1000?: (number|Long|null); + + /** ProductSnapshot retailerId */ + retailerId?: (string|null); + + /** ProductSnapshot url */ + url?: (string|null); + + /** ProductSnapshot productImageCount */ + productImageCount?: (number|null); + + /** ProductSnapshot firstImageId */ + firstImageId?: (string|null); + + /** ProductSnapshot salePriceAmount1000 */ + salePriceAmount1000?: (number|Long|null); + } + + /** Represents a ProductSnapshot. */ + class ProductSnapshot implements IProductSnapshot { + + /** + * Constructs a new ProductSnapshot. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ProductMessage.IProductSnapshot); + + /** ProductSnapshot productImage. */ + public productImage?: (proto.Message.IImageMessage|null); + + /** ProductSnapshot productId. */ + public productId: string; + + /** ProductSnapshot title. */ + public title: string; + + /** ProductSnapshot description. */ + public description: string; + + /** ProductSnapshot currencyCode. */ + public currencyCode: string; + + /** ProductSnapshot priceAmount1000. */ + public priceAmount1000: (number|Long); + + /** ProductSnapshot retailerId. */ + public retailerId: string; + + /** ProductSnapshot url. */ + public url: string; + + /** ProductSnapshot productImageCount. */ + public productImageCount: number; + + /** ProductSnapshot firstImageId. */ + public firstImageId: string; + + /** ProductSnapshot salePriceAmount1000. */ + public salePriceAmount1000: (number|Long); + + /** + * Creates a new ProductSnapshot instance using the specified properties. + * @param [properties] Properties to set + * @returns ProductSnapshot instance + */ + public static create(properties?: proto.Message.ProductMessage.IProductSnapshot): proto.Message.ProductMessage.ProductSnapshot; + + /** + * Encodes the specified ProductSnapshot message. Does not implicitly {@link proto.Message.ProductMessage.ProductSnapshot.verify|verify} messages. + * @param message ProductSnapshot message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ProductMessage.IProductSnapshot, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ProductSnapshot message, length delimited. Does not implicitly {@link proto.Message.ProductMessage.ProductSnapshot.verify|verify} messages. + * @param message ProductSnapshot message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ProductMessage.IProductSnapshot, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ProductSnapshot message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ProductSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ProductMessage.ProductSnapshot; + + /** + * Decodes a ProductSnapshot message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ProductSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ProductMessage.ProductSnapshot; + + /** + * Verifies a ProductSnapshot message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ProductSnapshot message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ProductSnapshot + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ProductMessage.ProductSnapshot; + + /** + * Creates a plain object from a ProductSnapshot message. Also converts values to other types if specified. + * @param message ProductSnapshot + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ProductMessage.ProductSnapshot, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ProductSnapshot to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a ProtocolMessage. */ + interface IProtocolMessage { + + /** ProtocolMessage key */ + key?: (proto.IMessageKey|null); + + /** ProtocolMessage type */ + type?: (proto.Message.ProtocolMessage.Type|null); + + /** ProtocolMessage ephemeralExpiration */ + ephemeralExpiration?: (number|null); + + /** ProtocolMessage ephemeralSettingTimestamp */ + ephemeralSettingTimestamp?: (number|Long|null); + + /** ProtocolMessage historySyncNotification */ + historySyncNotification?: (proto.Message.IHistorySyncNotification|null); + + /** ProtocolMessage appStateSyncKeyShare */ + appStateSyncKeyShare?: (proto.Message.IAppStateSyncKeyShare|null); + + /** ProtocolMessage appStateSyncKeyRequest */ + appStateSyncKeyRequest?: (proto.Message.IAppStateSyncKeyRequest|null); + + /** ProtocolMessage initialSecurityNotificationSettingSync */ + initialSecurityNotificationSettingSync?: (proto.Message.IInitialSecurityNotificationSettingSync|null); + + /** ProtocolMessage appStateFatalExceptionNotification */ + appStateFatalExceptionNotification?: (proto.Message.IAppStateFatalExceptionNotification|null); + + /** ProtocolMessage disappearingMode */ + disappearingMode?: (proto.IDisappearingMode|null); + + /** ProtocolMessage editedMessage */ + editedMessage?: (proto.IMessage|null); + + /** ProtocolMessage timestampMs */ + timestampMs?: (number|Long|null); + + /** ProtocolMessage peerDataOperationRequestMessage */ + peerDataOperationRequestMessage?: (proto.Message.IPeerDataOperationRequestMessage|null); + + /** ProtocolMessage peerDataOperationRequestResponseMessage */ + peerDataOperationRequestResponseMessage?: (proto.Message.IPeerDataOperationRequestResponseMessage|null); + } + + /** Represents a ProtocolMessage. */ + class ProtocolMessage implements IProtocolMessage { + + /** + * Constructs a new ProtocolMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IProtocolMessage); + + /** ProtocolMessage key. */ + public key?: (proto.IMessageKey|null); + + /** ProtocolMessage type. */ + public type: proto.Message.ProtocolMessage.Type; + + /** ProtocolMessage ephemeralExpiration. */ + public ephemeralExpiration: number; + + /** ProtocolMessage ephemeralSettingTimestamp. */ + public ephemeralSettingTimestamp: (number|Long); + + /** ProtocolMessage historySyncNotification. */ + public historySyncNotification?: (proto.Message.IHistorySyncNotification|null); + + /** ProtocolMessage appStateSyncKeyShare. */ + public appStateSyncKeyShare?: (proto.Message.IAppStateSyncKeyShare|null); + + /** ProtocolMessage appStateSyncKeyRequest. */ + public appStateSyncKeyRequest?: (proto.Message.IAppStateSyncKeyRequest|null); + + /** ProtocolMessage initialSecurityNotificationSettingSync. */ + public initialSecurityNotificationSettingSync?: (proto.Message.IInitialSecurityNotificationSettingSync|null); + + /** ProtocolMessage appStateFatalExceptionNotification. */ + public appStateFatalExceptionNotification?: (proto.Message.IAppStateFatalExceptionNotification|null); + + /** ProtocolMessage disappearingMode. */ + public disappearingMode?: (proto.IDisappearingMode|null); + + /** ProtocolMessage editedMessage. */ + public editedMessage?: (proto.IMessage|null); + + /** ProtocolMessage timestampMs. */ + public timestampMs: (number|Long); + + /** ProtocolMessage peerDataOperationRequestMessage. */ + public peerDataOperationRequestMessage?: (proto.Message.IPeerDataOperationRequestMessage|null); + + /** ProtocolMessage peerDataOperationRequestResponseMessage. */ + public peerDataOperationRequestResponseMessage?: (proto.Message.IPeerDataOperationRequestResponseMessage|null); + + /** + * Creates a new ProtocolMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ProtocolMessage instance + */ + public static create(properties?: proto.Message.IProtocolMessage): proto.Message.ProtocolMessage; + + /** + * Encodes the specified ProtocolMessage message. Does not implicitly {@link proto.Message.ProtocolMessage.verify|verify} messages. + * @param message ProtocolMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IProtocolMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ProtocolMessage message, length delimited. Does not implicitly {@link proto.Message.ProtocolMessage.verify|verify} messages. + * @param message ProtocolMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IProtocolMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ProtocolMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ProtocolMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ProtocolMessage; + + /** + * Decodes a ProtocolMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ProtocolMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ProtocolMessage; + + /** + * Verifies a ProtocolMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ProtocolMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ProtocolMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ProtocolMessage; + + /** + * Creates a plain object from a ProtocolMessage message. Also converts values to other types if specified. + * @param message ProtocolMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ProtocolMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ProtocolMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace ProtocolMessage { + + /** Type enum. */ + enum Type { + REVOKE = 0, + EPHEMERAL_SETTING = 3, + EPHEMERAL_SYNC_RESPONSE = 4, + HISTORY_SYNC_NOTIFICATION = 5, + APP_STATE_SYNC_KEY_SHARE = 6, + APP_STATE_SYNC_KEY_REQUEST = 7, + MSG_FANOUT_BACKFILL_REQUEST = 8, + INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC = 9, + APP_STATE_FATAL_EXCEPTION_NOTIFICATION = 10, + SHARE_PHONE_NUMBER = 11, + MESSAGE_EDIT = 14, + PEER_DATA_OPERATION_REQUEST_MESSAGE = 16, + PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE = 17 + } + } + + /** Properties of a ReactionMessage. */ + interface IReactionMessage { + + /** ReactionMessage key */ + key?: (proto.IMessageKey|null); + + /** ReactionMessage text */ + text?: (string|null); + + /** ReactionMessage groupingKey */ + groupingKey?: (string|null); + + /** ReactionMessage senderTimestampMs */ + senderTimestampMs?: (number|Long|null); + } + + /** Represents a ReactionMessage. */ + class ReactionMessage implements IReactionMessage { + + /** + * Constructs a new ReactionMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IReactionMessage); + + /** ReactionMessage key. */ + public key?: (proto.IMessageKey|null); + + /** ReactionMessage text. */ + public text: string; + + /** ReactionMessage groupingKey. */ + public groupingKey: string; + + /** ReactionMessage senderTimestampMs. */ + public senderTimestampMs: (number|Long); + + /** + * Creates a new ReactionMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns ReactionMessage instance + */ + public static create(properties?: proto.Message.IReactionMessage): proto.Message.ReactionMessage; + + /** + * Encodes the specified ReactionMessage message. Does not implicitly {@link proto.Message.ReactionMessage.verify|verify} messages. + * @param message ReactionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IReactionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ReactionMessage message, length delimited. Does not implicitly {@link proto.Message.ReactionMessage.verify|verify} messages. + * @param message ReactionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IReactionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ReactionMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.ReactionMessage; + + /** + * Decodes a ReactionMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.ReactionMessage; + + /** + * Verifies a ReactionMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ReactionMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ReactionMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.ReactionMessage; + + /** + * Creates a plain object from a ReactionMessage message. Also converts values to other types if specified. + * @param message ReactionMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.ReactionMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ReactionMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a RequestPaymentMessage. */ + interface IRequestPaymentMessage { + + /** RequestPaymentMessage noteMessage */ + noteMessage?: (proto.IMessage|null); + + /** RequestPaymentMessage currencyCodeIso4217 */ + currencyCodeIso4217?: (string|null); + + /** RequestPaymentMessage amount1000 */ + amount1000?: (number|Long|null); + + /** RequestPaymentMessage requestFrom */ + requestFrom?: (string|null); + + /** RequestPaymentMessage expiryTimestamp */ + expiryTimestamp?: (number|Long|null); + + /** RequestPaymentMessage amount */ + amount?: (proto.IMoney|null); + + /** RequestPaymentMessage background */ + background?: (proto.IPaymentBackground|null); + } + + /** Represents a RequestPaymentMessage. */ + class RequestPaymentMessage implements IRequestPaymentMessage { + + /** + * Constructs a new RequestPaymentMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IRequestPaymentMessage); + + /** RequestPaymentMessage noteMessage. */ + public noteMessage?: (proto.IMessage|null); + + /** RequestPaymentMessage currencyCodeIso4217. */ + public currencyCodeIso4217: string; + + /** RequestPaymentMessage amount1000. */ + public amount1000: (number|Long); + + /** RequestPaymentMessage requestFrom. */ + public requestFrom: string; + + /** RequestPaymentMessage expiryTimestamp. */ + public expiryTimestamp: (number|Long); + + /** RequestPaymentMessage amount. */ + public amount?: (proto.IMoney|null); + + /** RequestPaymentMessage background. */ + public background?: (proto.IPaymentBackground|null); + + /** + * Creates a new RequestPaymentMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns RequestPaymentMessage instance + */ + public static create(properties?: proto.Message.IRequestPaymentMessage): proto.Message.RequestPaymentMessage; + + /** + * Encodes the specified RequestPaymentMessage message. Does not implicitly {@link proto.Message.RequestPaymentMessage.verify|verify} messages. + * @param message RequestPaymentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IRequestPaymentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RequestPaymentMessage message, length delimited. Does not implicitly {@link proto.Message.RequestPaymentMessage.verify|verify} messages. + * @param message RequestPaymentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IRequestPaymentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RequestPaymentMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RequestPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.RequestPaymentMessage; + + /** + * Decodes a RequestPaymentMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RequestPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.RequestPaymentMessage; + + /** + * Verifies a RequestPaymentMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RequestPaymentMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RequestPaymentMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.RequestPaymentMessage; + + /** + * Creates a plain object from a RequestPaymentMessage message. Also converts values to other types if specified. + * @param message RequestPaymentMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.RequestPaymentMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RequestPaymentMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a RequestPhoneNumberMessage. */ + interface IRequestPhoneNumberMessage { + + /** RequestPhoneNumberMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + } + + /** Represents a RequestPhoneNumberMessage. */ + class RequestPhoneNumberMessage implements IRequestPhoneNumberMessage { + + /** + * Constructs a new RequestPhoneNumberMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IRequestPhoneNumberMessage); + + /** RequestPhoneNumberMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** + * Creates a new RequestPhoneNumberMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns RequestPhoneNumberMessage instance + */ + public static create(properties?: proto.Message.IRequestPhoneNumberMessage): proto.Message.RequestPhoneNumberMessage; + + /** + * Encodes the specified RequestPhoneNumberMessage message. Does not implicitly {@link proto.Message.RequestPhoneNumberMessage.verify|verify} messages. + * @param message RequestPhoneNumberMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IRequestPhoneNumberMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RequestPhoneNumberMessage message, length delimited. Does not implicitly {@link proto.Message.RequestPhoneNumberMessage.verify|verify} messages. + * @param message RequestPhoneNumberMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IRequestPhoneNumberMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RequestPhoneNumberMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RequestPhoneNumberMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.RequestPhoneNumberMessage; + + /** + * Decodes a RequestPhoneNumberMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RequestPhoneNumberMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.RequestPhoneNumberMessage; + + /** + * Verifies a RequestPhoneNumberMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RequestPhoneNumberMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RequestPhoneNumberMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.RequestPhoneNumberMessage; + + /** + * Creates a plain object from a RequestPhoneNumberMessage message. Also converts values to other types if specified. + * @param message RequestPhoneNumberMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.RequestPhoneNumberMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RequestPhoneNumberMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SendPaymentMessage. */ + interface ISendPaymentMessage { + + /** SendPaymentMessage noteMessage */ + noteMessage?: (proto.IMessage|null); + + /** SendPaymentMessage requestMessageKey */ + requestMessageKey?: (proto.IMessageKey|null); + + /** SendPaymentMessage background */ + background?: (proto.IPaymentBackground|null); + } + + /** Represents a SendPaymentMessage. */ + class SendPaymentMessage implements ISendPaymentMessage { + + /** + * Constructs a new SendPaymentMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ISendPaymentMessage); + + /** SendPaymentMessage noteMessage. */ + public noteMessage?: (proto.IMessage|null); + + /** SendPaymentMessage requestMessageKey. */ + public requestMessageKey?: (proto.IMessageKey|null); + + /** SendPaymentMessage background. */ + public background?: (proto.IPaymentBackground|null); + + /** + * Creates a new SendPaymentMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns SendPaymentMessage instance + */ + public static create(properties?: proto.Message.ISendPaymentMessage): proto.Message.SendPaymentMessage; + + /** + * Encodes the specified SendPaymentMessage message. Does not implicitly {@link proto.Message.SendPaymentMessage.verify|verify} messages. + * @param message SendPaymentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ISendPaymentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SendPaymentMessage message, length delimited. Does not implicitly {@link proto.Message.SendPaymentMessage.verify|verify} messages. + * @param message SendPaymentMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ISendPaymentMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SendPaymentMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SendPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.SendPaymentMessage; + + /** + * Decodes a SendPaymentMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SendPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.SendPaymentMessage; + + /** + * Verifies a SendPaymentMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SendPaymentMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SendPaymentMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.SendPaymentMessage; + + /** + * Creates a plain object from a SendPaymentMessage message. Also converts values to other types if specified. + * @param message SendPaymentMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.SendPaymentMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SendPaymentMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SenderKeyDistributionMessage. */ + interface ISenderKeyDistributionMessage { + + /** SenderKeyDistributionMessage groupId */ + groupId?: (string|null); + + /** SenderKeyDistributionMessage axolotlSenderKeyDistributionMessage */ + axolotlSenderKeyDistributionMessage?: (Uint8Array|null); + } + + /** Represents a SenderKeyDistributionMessage. */ + class SenderKeyDistributionMessage implements ISenderKeyDistributionMessage { + + /** + * Constructs a new SenderKeyDistributionMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ISenderKeyDistributionMessage); + + /** SenderKeyDistributionMessage groupId. */ + public groupId: string; + + /** SenderKeyDistributionMessage axolotlSenderKeyDistributionMessage. */ + public axolotlSenderKeyDistributionMessage: Uint8Array; + + /** + * Creates a new SenderKeyDistributionMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns SenderKeyDistributionMessage instance + */ + public static create(properties?: proto.Message.ISenderKeyDistributionMessage): proto.Message.SenderKeyDistributionMessage; + + /** + * Encodes the specified SenderKeyDistributionMessage message. Does not implicitly {@link proto.Message.SenderKeyDistributionMessage.verify|verify} messages. + * @param message SenderKeyDistributionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ISenderKeyDistributionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SenderKeyDistributionMessage message, length delimited. Does not implicitly {@link proto.Message.SenderKeyDistributionMessage.verify|verify} messages. + * @param message SenderKeyDistributionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ISenderKeyDistributionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SenderKeyDistributionMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SenderKeyDistributionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.SenderKeyDistributionMessage; + + /** + * Decodes a SenderKeyDistributionMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SenderKeyDistributionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.SenderKeyDistributionMessage; + + /** + * Verifies a SenderKeyDistributionMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SenderKeyDistributionMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SenderKeyDistributionMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.SenderKeyDistributionMessage; + + /** + * Creates a plain object from a SenderKeyDistributionMessage message. Also converts values to other types if specified. + * @param message SenderKeyDistributionMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.SenderKeyDistributionMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SenderKeyDistributionMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a StickerMessage. */ + interface IStickerMessage { + + /** StickerMessage url */ + url?: (string|null); + + /** StickerMessage fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** StickerMessage fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** StickerMessage mediaKey */ + mediaKey?: (Uint8Array|null); + + /** StickerMessage mimetype */ + mimetype?: (string|null); + + /** StickerMessage height */ + height?: (number|null); + + /** StickerMessage width */ + width?: (number|null); + + /** StickerMessage directPath */ + directPath?: (string|null); + + /** StickerMessage fileLength */ + fileLength?: (number|Long|null); + + /** StickerMessage mediaKeyTimestamp */ + mediaKeyTimestamp?: (number|Long|null); + + /** StickerMessage firstFrameLength */ + firstFrameLength?: (number|null); + + /** StickerMessage firstFrameSidecar */ + firstFrameSidecar?: (Uint8Array|null); + + /** StickerMessage isAnimated */ + isAnimated?: (boolean|null); + + /** StickerMessage pngThumbnail */ + pngThumbnail?: (Uint8Array|null); + + /** StickerMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** StickerMessage stickerSentTs */ + stickerSentTs?: (number|Long|null); + + /** StickerMessage isAvatar */ + isAvatar?: (boolean|null); + } + + /** Represents a StickerMessage. */ + class StickerMessage implements IStickerMessage { + + /** + * Constructs a new StickerMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IStickerMessage); + + /** StickerMessage url. */ + public url: string; + + /** StickerMessage fileSha256. */ + public fileSha256: Uint8Array; + + /** StickerMessage fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** StickerMessage mediaKey. */ + public mediaKey: Uint8Array; + + /** StickerMessage mimetype. */ + public mimetype: string; + + /** StickerMessage height. */ + public height: number; + + /** StickerMessage width. */ + public width: number; + + /** StickerMessage directPath. */ + public directPath: string; + + /** StickerMessage fileLength. */ + public fileLength: (number|Long); + + /** StickerMessage mediaKeyTimestamp. */ + public mediaKeyTimestamp: (number|Long); + + /** StickerMessage firstFrameLength. */ + public firstFrameLength: number; + + /** StickerMessage firstFrameSidecar. */ + public firstFrameSidecar: Uint8Array; + + /** StickerMessage isAnimated. */ + public isAnimated: boolean; + + /** StickerMessage pngThumbnail. */ + public pngThumbnail: Uint8Array; + + /** StickerMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** StickerMessage stickerSentTs. */ + public stickerSentTs: (number|Long); + + /** StickerMessage isAvatar. */ + public isAvatar: boolean; + + /** + * Creates a new StickerMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns StickerMessage instance + */ + public static create(properties?: proto.Message.IStickerMessage): proto.Message.StickerMessage; + + /** + * Encodes the specified StickerMessage message. Does not implicitly {@link proto.Message.StickerMessage.verify|verify} messages. + * @param message StickerMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IStickerMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StickerMessage message, length delimited. Does not implicitly {@link proto.Message.StickerMessage.verify|verify} messages. + * @param message StickerMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IStickerMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StickerMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StickerMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.StickerMessage; + + /** + * Decodes a StickerMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StickerMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.StickerMessage; + + /** + * Verifies a StickerMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StickerMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StickerMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.StickerMessage; + + /** + * Creates a plain object from a StickerMessage message. Also converts values to other types if specified. + * @param message StickerMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.StickerMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StickerMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a StickerSyncRMRMessage. */ + interface IStickerSyncRMRMessage { + + /** StickerSyncRMRMessage filehash */ + filehash?: (string[]|null); + + /** StickerSyncRMRMessage rmrSource */ + rmrSource?: (string|null); + + /** StickerSyncRMRMessage requestTimestamp */ + requestTimestamp?: (number|Long|null); + } + + /** Represents a StickerSyncRMRMessage. */ + class StickerSyncRMRMessage implements IStickerSyncRMRMessage { + + /** + * Constructs a new StickerSyncRMRMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IStickerSyncRMRMessage); + + /** StickerSyncRMRMessage filehash. */ + public filehash: string[]; + + /** StickerSyncRMRMessage rmrSource. */ + public rmrSource: string; + + /** StickerSyncRMRMessage requestTimestamp. */ + public requestTimestamp: (number|Long); + + /** + * Creates a new StickerSyncRMRMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns StickerSyncRMRMessage instance + */ + public static create(properties?: proto.Message.IStickerSyncRMRMessage): proto.Message.StickerSyncRMRMessage; + + /** + * Encodes the specified StickerSyncRMRMessage message. Does not implicitly {@link proto.Message.StickerSyncRMRMessage.verify|verify} messages. + * @param message StickerSyncRMRMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IStickerSyncRMRMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StickerSyncRMRMessage message, length delimited. Does not implicitly {@link proto.Message.StickerSyncRMRMessage.verify|verify} messages. + * @param message StickerSyncRMRMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IStickerSyncRMRMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StickerSyncRMRMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StickerSyncRMRMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.StickerSyncRMRMessage; + + /** + * Decodes a StickerSyncRMRMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StickerSyncRMRMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.StickerSyncRMRMessage; + + /** + * Verifies a StickerSyncRMRMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StickerSyncRMRMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StickerSyncRMRMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.StickerSyncRMRMessage; + + /** + * Creates a plain object from a StickerSyncRMRMessage message. Also converts values to other types if specified. + * @param message StickerSyncRMRMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.StickerSyncRMRMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StickerSyncRMRMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a TemplateButtonReplyMessage. */ + interface ITemplateButtonReplyMessage { + + /** TemplateButtonReplyMessage selectedId */ + selectedId?: (string|null); + + /** TemplateButtonReplyMessage selectedDisplayText */ + selectedDisplayText?: (string|null); + + /** TemplateButtonReplyMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** TemplateButtonReplyMessage selectedIndex */ + selectedIndex?: (number|null); + } + + /** Represents a TemplateButtonReplyMessage. */ + class TemplateButtonReplyMessage implements ITemplateButtonReplyMessage { + + /** + * Constructs a new TemplateButtonReplyMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ITemplateButtonReplyMessage); + + /** TemplateButtonReplyMessage selectedId. */ + public selectedId: string; + + /** TemplateButtonReplyMessage selectedDisplayText. */ + public selectedDisplayText: string; + + /** TemplateButtonReplyMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** TemplateButtonReplyMessage selectedIndex. */ + public selectedIndex: number; + + /** + * Creates a new TemplateButtonReplyMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns TemplateButtonReplyMessage instance + */ + public static create(properties?: proto.Message.ITemplateButtonReplyMessage): proto.Message.TemplateButtonReplyMessage; + + /** + * Encodes the specified TemplateButtonReplyMessage message. Does not implicitly {@link proto.Message.TemplateButtonReplyMessage.verify|verify} messages. + * @param message TemplateButtonReplyMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ITemplateButtonReplyMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified TemplateButtonReplyMessage message, length delimited. Does not implicitly {@link proto.Message.TemplateButtonReplyMessage.verify|verify} messages. + * @param message TemplateButtonReplyMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ITemplateButtonReplyMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a TemplateButtonReplyMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns TemplateButtonReplyMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.TemplateButtonReplyMessage; + + /** + * Decodes a TemplateButtonReplyMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns TemplateButtonReplyMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.TemplateButtonReplyMessage; + + /** + * Verifies a TemplateButtonReplyMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a TemplateButtonReplyMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns TemplateButtonReplyMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.TemplateButtonReplyMessage; + + /** + * Creates a plain object from a TemplateButtonReplyMessage message. Also converts values to other types if specified. + * @param message TemplateButtonReplyMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.TemplateButtonReplyMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this TemplateButtonReplyMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a TemplateMessage. */ + interface ITemplateMessage { + + /** TemplateMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** TemplateMessage hydratedTemplate */ + hydratedTemplate?: (proto.Message.TemplateMessage.IHydratedFourRowTemplate|null); + + /** TemplateMessage templateId */ + templateId?: (string|null); + + /** TemplateMessage fourRowTemplate */ + fourRowTemplate?: (proto.Message.TemplateMessage.IFourRowTemplate|null); + + /** TemplateMessage hydratedFourRowTemplate */ + hydratedFourRowTemplate?: (proto.Message.TemplateMessage.IHydratedFourRowTemplate|null); + + /** TemplateMessage interactiveMessageTemplate */ + interactiveMessageTemplate?: (proto.Message.IInteractiveMessage|null); + } + + /** Represents a TemplateMessage. */ + class TemplateMessage implements ITemplateMessage { + + /** + * Constructs a new TemplateMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.ITemplateMessage); + + /** TemplateMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** TemplateMessage hydratedTemplate. */ + public hydratedTemplate?: (proto.Message.TemplateMessage.IHydratedFourRowTemplate|null); + + /** TemplateMessage templateId. */ + public templateId: string; + + /** TemplateMessage fourRowTemplate. */ + public fourRowTemplate?: (proto.Message.TemplateMessage.IFourRowTemplate|null); + + /** TemplateMessage hydratedFourRowTemplate. */ + public hydratedFourRowTemplate?: (proto.Message.TemplateMessage.IHydratedFourRowTemplate|null); + + /** TemplateMessage interactiveMessageTemplate. */ + public interactiveMessageTemplate?: (proto.Message.IInteractiveMessage|null); + + /** TemplateMessage format. */ + public format?: ("fourRowTemplate"|"hydratedFourRowTemplate"|"interactiveMessageTemplate"); + + /** + * Creates a new TemplateMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns TemplateMessage instance + */ + public static create(properties?: proto.Message.ITemplateMessage): proto.Message.TemplateMessage; + + /** + * Encodes the specified TemplateMessage message. Does not implicitly {@link proto.Message.TemplateMessage.verify|verify} messages. + * @param message TemplateMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.ITemplateMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified TemplateMessage message, length delimited. Does not implicitly {@link proto.Message.TemplateMessage.verify|verify} messages. + * @param message TemplateMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.ITemplateMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a TemplateMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns TemplateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.TemplateMessage; + + /** + * Decodes a TemplateMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns TemplateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.TemplateMessage; + + /** + * Verifies a TemplateMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a TemplateMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns TemplateMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.TemplateMessage; + + /** + * Creates a plain object from a TemplateMessage message. Also converts values to other types if specified. + * @param message TemplateMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.TemplateMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this TemplateMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace TemplateMessage { + + /** Properties of a FourRowTemplate. */ + interface IFourRowTemplate { + + /** FourRowTemplate content */ + content?: (proto.Message.IHighlyStructuredMessage|null); + + /** FourRowTemplate footer */ + footer?: (proto.Message.IHighlyStructuredMessage|null); + + /** FourRowTemplate buttons */ + buttons?: (proto.ITemplateButton[]|null); + + /** FourRowTemplate documentMessage */ + documentMessage?: (proto.Message.IDocumentMessage|null); + + /** FourRowTemplate highlyStructuredMessage */ + highlyStructuredMessage?: (proto.Message.IHighlyStructuredMessage|null); + + /** FourRowTemplate imageMessage */ + imageMessage?: (proto.Message.IImageMessage|null); + + /** FourRowTemplate videoMessage */ + videoMessage?: (proto.Message.IVideoMessage|null); + + /** FourRowTemplate locationMessage */ + locationMessage?: (proto.Message.ILocationMessage|null); + } + + /** Represents a FourRowTemplate. */ + class FourRowTemplate implements IFourRowTemplate { + + /** + * Constructs a new FourRowTemplate. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.TemplateMessage.IFourRowTemplate); + + /** FourRowTemplate content. */ + public content?: (proto.Message.IHighlyStructuredMessage|null); + + /** FourRowTemplate footer. */ + public footer?: (proto.Message.IHighlyStructuredMessage|null); + + /** FourRowTemplate buttons. */ + public buttons: proto.ITemplateButton[]; + + /** FourRowTemplate documentMessage. */ + public documentMessage?: (proto.Message.IDocumentMessage|null); + + /** FourRowTemplate highlyStructuredMessage. */ + public highlyStructuredMessage?: (proto.Message.IHighlyStructuredMessage|null); + + /** FourRowTemplate imageMessage. */ + public imageMessage?: (proto.Message.IImageMessage|null); + + /** FourRowTemplate videoMessage. */ + public videoMessage?: (proto.Message.IVideoMessage|null); + + /** FourRowTemplate locationMessage. */ + public locationMessage?: (proto.Message.ILocationMessage|null); + + /** FourRowTemplate title. */ + public title?: ("documentMessage"|"highlyStructuredMessage"|"imageMessage"|"videoMessage"|"locationMessage"); + + /** + * Creates a new FourRowTemplate instance using the specified properties. + * @param [properties] Properties to set + * @returns FourRowTemplate instance + */ + public static create(properties?: proto.Message.TemplateMessage.IFourRowTemplate): proto.Message.TemplateMessage.FourRowTemplate; + + /** + * Encodes the specified FourRowTemplate message. Does not implicitly {@link proto.Message.TemplateMessage.FourRowTemplate.verify|verify} messages. + * @param message FourRowTemplate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.TemplateMessage.IFourRowTemplate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified FourRowTemplate message, length delimited. Does not implicitly {@link proto.Message.TemplateMessage.FourRowTemplate.verify|verify} messages. + * @param message FourRowTemplate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.TemplateMessage.IFourRowTemplate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a FourRowTemplate message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns FourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.TemplateMessage.FourRowTemplate; + + /** + * Decodes a FourRowTemplate message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns FourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.TemplateMessage.FourRowTemplate; + + /** + * Verifies a FourRowTemplate message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a FourRowTemplate message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns FourRowTemplate + */ + public static fromObject(object: { [k: string]: any }): proto.Message.TemplateMessage.FourRowTemplate; + + /** + * Creates a plain object from a FourRowTemplate message. Also converts values to other types if specified. + * @param message FourRowTemplate + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.TemplateMessage.FourRowTemplate, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this FourRowTemplate to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a HydratedFourRowTemplate. */ + interface IHydratedFourRowTemplate { + + /** HydratedFourRowTemplate hydratedContentText */ + hydratedContentText?: (string|null); + + /** HydratedFourRowTemplate hydratedFooterText */ + hydratedFooterText?: (string|null); + + /** HydratedFourRowTemplate hydratedButtons */ + hydratedButtons?: (proto.IHydratedTemplateButton[]|null); + + /** HydratedFourRowTemplate templateId */ + templateId?: (string|null); + + /** HydratedFourRowTemplate documentMessage */ + documentMessage?: (proto.Message.IDocumentMessage|null); + + /** HydratedFourRowTemplate hydratedTitleText */ + hydratedTitleText?: (string|null); + + /** HydratedFourRowTemplate imageMessage */ + imageMessage?: (proto.Message.IImageMessage|null); + + /** HydratedFourRowTemplate videoMessage */ + videoMessage?: (proto.Message.IVideoMessage|null); + + /** HydratedFourRowTemplate locationMessage */ + locationMessage?: (proto.Message.ILocationMessage|null); + } + + /** Represents a HydratedFourRowTemplate. */ + class HydratedFourRowTemplate implements IHydratedFourRowTemplate { + + /** + * Constructs a new HydratedFourRowTemplate. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.TemplateMessage.IHydratedFourRowTemplate); + + /** HydratedFourRowTemplate hydratedContentText. */ + public hydratedContentText: string; + + /** HydratedFourRowTemplate hydratedFooterText. */ + public hydratedFooterText: string; + + /** HydratedFourRowTemplate hydratedButtons. */ + public hydratedButtons: proto.IHydratedTemplateButton[]; + + /** HydratedFourRowTemplate templateId. */ + public templateId: string; + + /** HydratedFourRowTemplate documentMessage. */ + public documentMessage?: (proto.Message.IDocumentMessage|null); + + /** HydratedFourRowTemplate hydratedTitleText. */ + public hydratedTitleText?: (string|null); + + /** HydratedFourRowTemplate imageMessage. */ + public imageMessage?: (proto.Message.IImageMessage|null); + + /** HydratedFourRowTemplate videoMessage. */ + public videoMessage?: (proto.Message.IVideoMessage|null); + + /** HydratedFourRowTemplate locationMessage. */ + public locationMessage?: (proto.Message.ILocationMessage|null); + + /** HydratedFourRowTemplate title. */ + public title?: ("documentMessage"|"hydratedTitleText"|"imageMessage"|"videoMessage"|"locationMessage"); + + /** + * Creates a new HydratedFourRowTemplate instance using the specified properties. + * @param [properties] Properties to set + * @returns HydratedFourRowTemplate instance + */ + public static create(properties?: proto.Message.TemplateMessage.IHydratedFourRowTemplate): proto.Message.TemplateMessage.HydratedFourRowTemplate; + + /** + * Encodes the specified HydratedFourRowTemplate message. Does not implicitly {@link proto.Message.TemplateMessage.HydratedFourRowTemplate.verify|verify} messages. + * @param message HydratedFourRowTemplate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.TemplateMessage.IHydratedFourRowTemplate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified HydratedFourRowTemplate message, length delimited. Does not implicitly {@link proto.Message.TemplateMessage.HydratedFourRowTemplate.verify|verify} messages. + * @param message HydratedFourRowTemplate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.TemplateMessage.IHydratedFourRowTemplate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a HydratedFourRowTemplate message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns HydratedFourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.TemplateMessage.HydratedFourRowTemplate; + + /** + * Decodes a HydratedFourRowTemplate message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns HydratedFourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.TemplateMessage.HydratedFourRowTemplate; + + /** + * Verifies a HydratedFourRowTemplate message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a HydratedFourRowTemplate message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns HydratedFourRowTemplate + */ + public static fromObject(object: { [k: string]: any }): proto.Message.TemplateMessage.HydratedFourRowTemplate; + + /** + * Creates a plain object from a HydratedFourRowTemplate message. Also converts values to other types if specified. + * @param message HydratedFourRowTemplate + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.TemplateMessage.HydratedFourRowTemplate, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this HydratedFourRowTemplate to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a VideoMessage. */ + interface IVideoMessage { + + /** VideoMessage url */ + url?: (string|null); + + /** VideoMessage mimetype */ + mimetype?: (string|null); + + /** VideoMessage fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** VideoMessage fileLength */ + fileLength?: (number|Long|null); + + /** VideoMessage seconds */ + seconds?: (number|null); + + /** VideoMessage mediaKey */ + mediaKey?: (Uint8Array|null); + + /** VideoMessage caption */ + caption?: (string|null); + + /** VideoMessage gifPlayback */ + gifPlayback?: (boolean|null); + + /** VideoMessage height */ + height?: (number|null); + + /** VideoMessage width */ + width?: (number|null); + + /** VideoMessage fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** VideoMessage interactiveAnnotations */ + interactiveAnnotations?: (proto.IInteractiveAnnotation[]|null); + + /** VideoMessage directPath */ + directPath?: (string|null); + + /** VideoMessage mediaKeyTimestamp */ + mediaKeyTimestamp?: (number|Long|null); + + /** VideoMessage jpegThumbnail */ + jpegThumbnail?: (Uint8Array|null); + + /** VideoMessage contextInfo */ + contextInfo?: (proto.IContextInfo|null); + + /** VideoMessage streamingSidecar */ + streamingSidecar?: (Uint8Array|null); + + /** VideoMessage gifAttribution */ + gifAttribution?: (proto.Message.VideoMessage.Attribution|null); + + /** VideoMessage viewOnce */ + viewOnce?: (boolean|null); + + /** VideoMessage thumbnailDirectPath */ + thumbnailDirectPath?: (string|null); + + /** VideoMessage thumbnailSha256 */ + thumbnailSha256?: (Uint8Array|null); + + /** VideoMessage thumbnailEncSha256 */ + thumbnailEncSha256?: (Uint8Array|null); + + /** VideoMessage staticUrl */ + staticUrl?: (string|null); + } + + /** Represents a VideoMessage. */ + class VideoMessage implements IVideoMessage { + + /** + * Constructs a new VideoMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.Message.IVideoMessage); + + /** VideoMessage url. */ + public url: string; + + /** VideoMessage mimetype. */ + public mimetype: string; + + /** VideoMessage fileSha256. */ + public fileSha256: Uint8Array; + + /** VideoMessage fileLength. */ + public fileLength: (number|Long); + + /** VideoMessage seconds. */ + public seconds: number; + + /** VideoMessage mediaKey. */ + public mediaKey: Uint8Array; + + /** VideoMessage caption. */ + public caption: string; + + /** VideoMessage gifPlayback. */ + public gifPlayback: boolean; + + /** VideoMessage height. */ + public height: number; + + /** VideoMessage width. */ + public width: number; + + /** VideoMessage fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** VideoMessage interactiveAnnotations. */ + public interactiveAnnotations: proto.IInteractiveAnnotation[]; + + /** VideoMessage directPath. */ + public directPath: string; + + /** VideoMessage mediaKeyTimestamp. */ + public mediaKeyTimestamp: (number|Long); + + /** VideoMessage jpegThumbnail. */ + public jpegThumbnail: Uint8Array; + + /** VideoMessage contextInfo. */ + public contextInfo?: (proto.IContextInfo|null); + + /** VideoMessage streamingSidecar. */ + public streamingSidecar: Uint8Array; + + /** VideoMessage gifAttribution. */ + public gifAttribution: proto.Message.VideoMessage.Attribution; + + /** VideoMessage viewOnce. */ + public viewOnce: boolean; + + /** VideoMessage thumbnailDirectPath. */ + public thumbnailDirectPath: string; + + /** VideoMessage thumbnailSha256. */ + public thumbnailSha256: Uint8Array; + + /** VideoMessage thumbnailEncSha256. */ + public thumbnailEncSha256: Uint8Array; + + /** VideoMessage staticUrl. */ + public staticUrl: string; + + /** + * Creates a new VideoMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns VideoMessage instance + */ + public static create(properties?: proto.Message.IVideoMessage): proto.Message.VideoMessage; + + /** + * Encodes the specified VideoMessage message. Does not implicitly {@link proto.Message.VideoMessage.verify|verify} messages. + * @param message VideoMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.Message.IVideoMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VideoMessage message, length delimited. Does not implicitly {@link proto.Message.VideoMessage.verify|verify} messages. + * @param message VideoMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.Message.IVideoMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VideoMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VideoMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Message.VideoMessage; + + /** + * Decodes a VideoMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VideoMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Message.VideoMessage; + + /** + * Verifies a VideoMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VideoMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VideoMessage + */ + public static fromObject(object: { [k: string]: any }): proto.Message.VideoMessage; + + /** + * Creates a plain object from a VideoMessage message. Also converts values to other types if specified. + * @param message VideoMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Message.VideoMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VideoMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace VideoMessage { + + /** Attribution enum. */ + enum Attribution { + NONE = 0, + GIPHY = 1, + TENOR = 2 + } + } + } + + /** Properties of a MessageContextInfo. */ + interface IMessageContextInfo { + + /** MessageContextInfo deviceListMetadata */ + deviceListMetadata?: (proto.IDeviceListMetadata|null); + + /** MessageContextInfo deviceListMetadataVersion */ + deviceListMetadataVersion?: (number|null); + + /** MessageContextInfo messageSecret */ + messageSecret?: (Uint8Array|null); + + /** MessageContextInfo paddingBytes */ + paddingBytes?: (Uint8Array|null); + } + + /** Represents a MessageContextInfo. */ + class MessageContextInfo implements IMessageContextInfo { + + /** + * Constructs a new MessageContextInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMessageContextInfo); + + /** MessageContextInfo deviceListMetadata. */ + public deviceListMetadata?: (proto.IDeviceListMetadata|null); + + /** MessageContextInfo deviceListMetadataVersion. */ + public deviceListMetadataVersion: number; + + /** MessageContextInfo messageSecret. */ + public messageSecret: Uint8Array; + + /** MessageContextInfo paddingBytes. */ + public paddingBytes: Uint8Array; + + /** + * Creates a new MessageContextInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns MessageContextInfo instance + */ + public static create(properties?: proto.IMessageContextInfo): proto.MessageContextInfo; + + /** + * Encodes the specified MessageContextInfo message. Does not implicitly {@link proto.MessageContextInfo.verify|verify} messages. + * @param message MessageContextInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMessageContextInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MessageContextInfo message, length delimited. Does not implicitly {@link proto.MessageContextInfo.verify|verify} messages. + * @param message MessageContextInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMessageContextInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MessageContextInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MessageContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.MessageContextInfo; + + /** + * Decodes a MessageContextInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MessageContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.MessageContextInfo; + + /** + * Verifies a MessageContextInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MessageContextInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MessageContextInfo + */ + public static fromObject(object: { [k: string]: any }): proto.MessageContextInfo; + + /** + * Creates a plain object from a MessageContextInfo message. Also converts values to other types if specified. + * @param message MessageContextInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.MessageContextInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MessageContextInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a MessageKey. */ + interface IMessageKey { + + /** MessageKey remoteJid */ + remoteJid?: (string|null); + + /** MessageKey fromMe */ + fromMe?: (boolean|null); + + /** MessageKey id */ + id?: (string|null); + + /** MessageKey participant */ + participant?: (string|null); + } + + /** Represents a MessageKey. */ + class MessageKey implements IMessageKey { + + /** + * Constructs a new MessageKey. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMessageKey); + + /** MessageKey remoteJid. */ + public remoteJid: string; + + /** MessageKey fromMe. */ + public fromMe: boolean; + + /** MessageKey id. */ + public id: string; + + /** MessageKey participant. */ + public participant: string; + + /** + * Creates a new MessageKey instance using the specified properties. + * @param [properties] Properties to set + * @returns MessageKey instance + */ + public static create(properties?: proto.IMessageKey): proto.MessageKey; + + /** + * Encodes the specified MessageKey message. Does not implicitly {@link proto.MessageKey.verify|verify} messages. + * @param message MessageKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMessageKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MessageKey message, length delimited. Does not implicitly {@link proto.MessageKey.verify|verify} messages. + * @param message MessageKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMessageKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MessageKey message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.MessageKey; + + /** + * Decodes a MessageKey message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.MessageKey; + + /** + * Verifies a MessageKey message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MessageKey message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MessageKey + */ + public static fromObject(object: { [k: string]: any }): proto.MessageKey; + + /** + * Creates a plain object from a MessageKey message. Also converts values to other types if specified. + * @param message MessageKey + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.MessageKey, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MessageKey to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Money. */ + interface IMoney { + + /** Money value */ + value?: (number|Long|null); + + /** Money offset */ + offset?: (number|null); + + /** Money currencyCode */ + currencyCode?: (string|null); + } + + /** Represents a Money. */ + class Money implements IMoney { + + /** + * Constructs a new Money. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMoney); + + /** Money value. */ + public value: (number|Long); + + /** Money offset. */ + public offset: number; + + /** Money currencyCode. */ + public currencyCode: string; + + /** + * Creates a new Money instance using the specified properties. + * @param [properties] Properties to set + * @returns Money instance + */ + public static create(properties?: proto.IMoney): proto.Money; + + /** + * Encodes the specified Money message. Does not implicitly {@link proto.Money.verify|verify} messages. + * @param message Money message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMoney, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Money message, length delimited. Does not implicitly {@link proto.Money.verify|verify} messages. + * @param message Money message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMoney, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Money message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Money + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Money; + + /** + * Decodes a Money message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Money + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Money; + + /** + * Verifies a Money message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Money message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Money + */ + public static fromObject(object: { [k: string]: any }): proto.Money; + + /** + * Creates a plain object from a Money message. Also converts values to other types if specified. + * @param message Money + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Money, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Money to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a MsgOpaqueData. */ + interface IMsgOpaqueData { + + /** MsgOpaqueData body */ + body?: (string|null); + + /** MsgOpaqueData caption */ + caption?: (string|null); + + /** MsgOpaqueData lng */ + lng?: (number|null); + + /** MsgOpaqueData isLive */ + isLive?: (boolean|null); + + /** MsgOpaqueData lat */ + lat?: (number|null); + + /** MsgOpaqueData paymentAmount1000 */ + paymentAmount1000?: (number|null); + + /** MsgOpaqueData paymentNoteMsgBody */ + paymentNoteMsgBody?: (string|null); + + /** MsgOpaqueData canonicalUrl */ + canonicalUrl?: (string|null); + + /** MsgOpaqueData matchedText */ + matchedText?: (string|null); + + /** MsgOpaqueData title */ + title?: (string|null); + + /** MsgOpaqueData description */ + description?: (string|null); + + /** MsgOpaqueData futureproofBuffer */ + futureproofBuffer?: (Uint8Array|null); + + /** MsgOpaqueData clientUrl */ + clientUrl?: (string|null); + + /** MsgOpaqueData loc */ + loc?: (string|null); + + /** MsgOpaqueData pollName */ + pollName?: (string|null); + + /** MsgOpaqueData pollOptions */ + pollOptions?: (proto.MsgOpaqueData.IPollOption[]|null); + + /** MsgOpaqueData pollSelectableOptionsCount */ + pollSelectableOptionsCount?: (number|null); + + /** MsgOpaqueData messageSecret */ + messageSecret?: (Uint8Array|null); + + /** MsgOpaqueData originalSelfAuthor */ + originalSelfAuthor?: (string|null); + + /** MsgOpaqueData senderTimestampMs */ + senderTimestampMs?: (number|Long|null); + + /** MsgOpaqueData pollUpdateParentKey */ + pollUpdateParentKey?: (string|null); + + /** MsgOpaqueData encPollVote */ + encPollVote?: (proto.IPollEncValue|null); + } + + /** Represents a MsgOpaqueData. */ + class MsgOpaqueData implements IMsgOpaqueData { + + /** + * Constructs a new MsgOpaqueData. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMsgOpaqueData); + + /** MsgOpaqueData body. */ + public body: string; + + /** MsgOpaqueData caption. */ + public caption: string; + + /** MsgOpaqueData lng. */ + public lng: number; + + /** MsgOpaqueData isLive. */ + public isLive: boolean; + + /** MsgOpaqueData lat. */ + public lat: number; + + /** MsgOpaqueData paymentAmount1000. */ + public paymentAmount1000: number; + + /** MsgOpaqueData paymentNoteMsgBody. */ + public paymentNoteMsgBody: string; + + /** MsgOpaqueData canonicalUrl. */ + public canonicalUrl: string; + + /** MsgOpaqueData matchedText. */ + public matchedText: string; + + /** MsgOpaqueData title. */ + public title: string; + + /** MsgOpaqueData description. */ + public description: string; + + /** MsgOpaqueData futureproofBuffer. */ + public futureproofBuffer: Uint8Array; + + /** MsgOpaqueData clientUrl. */ + public clientUrl: string; + + /** MsgOpaqueData loc. */ + public loc: string; + + /** MsgOpaqueData pollName. */ + public pollName: string; + + /** MsgOpaqueData pollOptions. */ + public pollOptions: proto.MsgOpaqueData.IPollOption[]; + + /** MsgOpaqueData pollSelectableOptionsCount. */ + public pollSelectableOptionsCount: number; + + /** MsgOpaqueData messageSecret. */ + public messageSecret: Uint8Array; + + /** MsgOpaqueData originalSelfAuthor. */ + public originalSelfAuthor: string; + + /** MsgOpaqueData senderTimestampMs. */ + public senderTimestampMs: (number|Long); + + /** MsgOpaqueData pollUpdateParentKey. */ + public pollUpdateParentKey: string; + + /** MsgOpaqueData encPollVote. */ + public encPollVote?: (proto.IPollEncValue|null); + + /** + * Creates a new MsgOpaqueData instance using the specified properties. + * @param [properties] Properties to set + * @returns MsgOpaqueData instance + */ + public static create(properties?: proto.IMsgOpaqueData): proto.MsgOpaqueData; + + /** + * Encodes the specified MsgOpaqueData message. Does not implicitly {@link proto.MsgOpaqueData.verify|verify} messages. + * @param message MsgOpaqueData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMsgOpaqueData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MsgOpaqueData message, length delimited. Does not implicitly {@link proto.MsgOpaqueData.verify|verify} messages. + * @param message MsgOpaqueData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMsgOpaqueData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MsgOpaqueData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MsgOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.MsgOpaqueData; + + /** + * Decodes a MsgOpaqueData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MsgOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.MsgOpaqueData; + + /** + * Verifies a MsgOpaqueData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MsgOpaqueData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MsgOpaqueData + */ + public static fromObject(object: { [k: string]: any }): proto.MsgOpaqueData; + + /** + * Creates a plain object from a MsgOpaqueData message. Also converts values to other types if specified. + * @param message MsgOpaqueData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.MsgOpaqueData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MsgOpaqueData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace MsgOpaqueData { + + /** Properties of a PollOption. */ + interface IPollOption { + + /** PollOption name */ + name?: (string|null); + } + + /** Represents a PollOption. */ + class PollOption implements IPollOption { + + /** + * Constructs a new PollOption. + * @param [properties] Properties to set + */ + constructor(properties?: proto.MsgOpaqueData.IPollOption); + + /** PollOption name. */ + public name: string; + + /** + * Creates a new PollOption instance using the specified properties. + * @param [properties] Properties to set + * @returns PollOption instance + */ + public static create(properties?: proto.MsgOpaqueData.IPollOption): proto.MsgOpaqueData.PollOption; + + /** + * Encodes the specified PollOption message. Does not implicitly {@link proto.MsgOpaqueData.PollOption.verify|verify} messages. + * @param message PollOption message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.MsgOpaqueData.IPollOption, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollOption message, length delimited. Does not implicitly {@link proto.MsgOpaqueData.PollOption.verify|verify} messages. + * @param message PollOption message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.MsgOpaqueData.IPollOption, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollOption message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollOption + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.MsgOpaqueData.PollOption; + + /** + * Decodes a PollOption message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollOption + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.MsgOpaqueData.PollOption; + + /** + * Verifies a PollOption message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollOption message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollOption + */ + public static fromObject(object: { [k: string]: any }): proto.MsgOpaqueData.PollOption; + + /** + * Creates a plain object from a PollOption message. Also converts values to other types if specified. + * @param message PollOption + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.MsgOpaqueData.PollOption, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollOption to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a MsgRowOpaqueData. */ + interface IMsgRowOpaqueData { + + /** MsgRowOpaqueData currentMsg */ + currentMsg?: (proto.IMsgOpaqueData|null); + + /** MsgRowOpaqueData quotedMsg */ + quotedMsg?: (proto.IMsgOpaqueData|null); + } + + /** Represents a MsgRowOpaqueData. */ + class MsgRowOpaqueData implements IMsgRowOpaqueData { + + /** + * Constructs a new MsgRowOpaqueData. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IMsgRowOpaqueData); + + /** MsgRowOpaqueData currentMsg. */ + public currentMsg?: (proto.IMsgOpaqueData|null); + + /** MsgRowOpaqueData quotedMsg. */ + public quotedMsg?: (proto.IMsgOpaqueData|null); + + /** + * Creates a new MsgRowOpaqueData instance using the specified properties. + * @param [properties] Properties to set + * @returns MsgRowOpaqueData instance + */ + public static create(properties?: proto.IMsgRowOpaqueData): proto.MsgRowOpaqueData; + + /** + * Encodes the specified MsgRowOpaqueData message. Does not implicitly {@link proto.MsgRowOpaqueData.verify|verify} messages. + * @param message MsgRowOpaqueData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IMsgRowOpaqueData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MsgRowOpaqueData message, length delimited. Does not implicitly {@link proto.MsgRowOpaqueData.verify|verify} messages. + * @param message MsgRowOpaqueData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IMsgRowOpaqueData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MsgRowOpaqueData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MsgRowOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.MsgRowOpaqueData; + + /** + * Decodes a MsgRowOpaqueData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MsgRowOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.MsgRowOpaqueData; + + /** + * Verifies a MsgRowOpaqueData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MsgRowOpaqueData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MsgRowOpaqueData + */ + public static fromObject(object: { [k: string]: any }): proto.MsgRowOpaqueData; + + /** + * Creates a plain object from a MsgRowOpaqueData message. Also converts values to other types if specified. + * @param message MsgRowOpaqueData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.MsgRowOpaqueData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MsgRowOpaqueData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a NoiseCertificate. */ + interface INoiseCertificate { + + /** NoiseCertificate details */ + details?: (Uint8Array|null); + + /** NoiseCertificate signature */ + signature?: (Uint8Array|null); + } + + /** Represents a NoiseCertificate. */ + class NoiseCertificate implements INoiseCertificate { + + /** + * Constructs a new NoiseCertificate. + * @param [properties] Properties to set + */ + constructor(properties?: proto.INoiseCertificate); + + /** NoiseCertificate details. */ + public details: Uint8Array; + + /** NoiseCertificate signature. */ + public signature: Uint8Array; + + /** + * Creates a new NoiseCertificate instance using the specified properties. + * @param [properties] Properties to set + * @returns NoiseCertificate instance + */ + public static create(properties?: proto.INoiseCertificate): proto.NoiseCertificate; + + /** + * Encodes the specified NoiseCertificate message. Does not implicitly {@link proto.NoiseCertificate.verify|verify} messages. + * @param message NoiseCertificate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.INoiseCertificate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NoiseCertificate message, length delimited. Does not implicitly {@link proto.NoiseCertificate.verify|verify} messages. + * @param message NoiseCertificate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.INoiseCertificate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.NoiseCertificate; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.NoiseCertificate; + + /** + * Verifies a NoiseCertificate message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NoiseCertificate message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NoiseCertificate + */ + public static fromObject(object: { [k: string]: any }): proto.NoiseCertificate; + + /** + * Creates a plain object from a NoiseCertificate message. Also converts values to other types if specified. + * @param message NoiseCertificate + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.NoiseCertificate, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NoiseCertificate to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace NoiseCertificate { + + /** Properties of a Details. */ + interface IDetails { + + /** Details serial */ + serial?: (number|null); + + /** Details issuer */ + issuer?: (string|null); + + /** Details expires */ + expires?: (number|Long|null); + + /** Details subject */ + subject?: (string|null); + + /** Details key */ + key?: (Uint8Array|null); + } + + /** Represents a Details. */ + class Details implements IDetails { + + /** + * Constructs a new Details. + * @param [properties] Properties to set + */ + constructor(properties?: proto.NoiseCertificate.IDetails); + + /** Details serial. */ + public serial: number; + + /** Details issuer. */ + public issuer: string; + + /** Details expires. */ + public expires: (number|Long); + + /** Details subject. */ + public subject: string; + + /** Details key. */ + public key: Uint8Array; + + /** + * Creates a new Details instance using the specified properties. + * @param [properties] Properties to set + * @returns Details instance + */ + public static create(properties?: proto.NoiseCertificate.IDetails): proto.NoiseCertificate.Details; + + /** + * Encodes the specified Details message. Does not implicitly {@link proto.NoiseCertificate.Details.verify|verify} messages. + * @param message Details message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.NoiseCertificate.IDetails, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Details message, length delimited. Does not implicitly {@link proto.NoiseCertificate.Details.verify|verify} messages. + * @param message Details message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.NoiseCertificate.IDetails, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Details message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.NoiseCertificate.Details; + + /** + * Decodes a Details message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.NoiseCertificate.Details; + + /** + * Verifies a Details message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Details message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Details + */ + public static fromObject(object: { [k: string]: any }): proto.NoiseCertificate.Details; + + /** + * Creates a plain object from a Details message. Also converts values to other types if specified. + * @param message Details + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.NoiseCertificate.Details, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Details to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a NotificationMessageInfo. */ + interface INotificationMessageInfo { + + /** NotificationMessageInfo key */ + key?: (proto.IMessageKey|null); + + /** NotificationMessageInfo message */ + message?: (proto.IMessage|null); + + /** NotificationMessageInfo messageTimestamp */ + messageTimestamp?: (number|Long|null); + + /** NotificationMessageInfo participant */ + participant?: (string|null); + } + + /** Represents a NotificationMessageInfo. */ + class NotificationMessageInfo implements INotificationMessageInfo { + + /** + * Constructs a new NotificationMessageInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.INotificationMessageInfo); + + /** NotificationMessageInfo key. */ + public key?: (proto.IMessageKey|null); + + /** NotificationMessageInfo message. */ + public message?: (proto.IMessage|null); + + /** NotificationMessageInfo messageTimestamp. */ + public messageTimestamp: (number|Long); + + /** NotificationMessageInfo participant. */ + public participant: string; + + /** + * Creates a new NotificationMessageInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns NotificationMessageInfo instance + */ + public static create(properties?: proto.INotificationMessageInfo): proto.NotificationMessageInfo; + + /** + * Encodes the specified NotificationMessageInfo message. Does not implicitly {@link proto.NotificationMessageInfo.verify|verify} messages. + * @param message NotificationMessageInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.INotificationMessageInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NotificationMessageInfo message, length delimited. Does not implicitly {@link proto.NotificationMessageInfo.verify|verify} messages. + * @param message NotificationMessageInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.INotificationMessageInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NotificationMessageInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NotificationMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.NotificationMessageInfo; + + /** + * Decodes a NotificationMessageInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NotificationMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.NotificationMessageInfo; + + /** + * Verifies a NotificationMessageInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NotificationMessageInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NotificationMessageInfo + */ + public static fromObject(object: { [k: string]: any }): proto.NotificationMessageInfo; + + /** + * Creates a plain object from a NotificationMessageInfo message. Also converts values to other types if specified. + * @param message NotificationMessageInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.NotificationMessageInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NotificationMessageInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PastParticipant. */ + interface IPastParticipant { + + /** PastParticipant userJid */ + userJid?: (string|null); + + /** PastParticipant leaveReason */ + leaveReason?: (proto.PastParticipant.LeaveReason|null); + + /** PastParticipant leaveTs */ + leaveTs?: (number|Long|null); + } + + /** Represents a PastParticipant. */ + class PastParticipant implements IPastParticipant { + + /** + * Constructs a new PastParticipant. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPastParticipant); + + /** PastParticipant userJid. */ + public userJid: string; + + /** PastParticipant leaveReason. */ + public leaveReason: proto.PastParticipant.LeaveReason; + + /** PastParticipant leaveTs. */ + public leaveTs: (number|Long); + + /** + * Creates a new PastParticipant instance using the specified properties. + * @param [properties] Properties to set + * @returns PastParticipant instance + */ + public static create(properties?: proto.IPastParticipant): proto.PastParticipant; + + /** + * Encodes the specified PastParticipant message. Does not implicitly {@link proto.PastParticipant.verify|verify} messages. + * @param message PastParticipant message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPastParticipant, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PastParticipant message, length delimited. Does not implicitly {@link proto.PastParticipant.verify|verify} messages. + * @param message PastParticipant message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPastParticipant, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PastParticipant message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PastParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PastParticipant; + + /** + * Decodes a PastParticipant message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PastParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PastParticipant; + + /** + * Verifies a PastParticipant message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PastParticipant message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PastParticipant + */ + public static fromObject(object: { [k: string]: any }): proto.PastParticipant; + + /** + * Creates a plain object from a PastParticipant message. Also converts values to other types if specified. + * @param message PastParticipant + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PastParticipant, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PastParticipant to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PastParticipant { + + /** LeaveReason enum. */ + enum LeaveReason { + LEFT = 0, + REMOVED = 1 + } + } + + /** Properties of a PastParticipants. */ + interface IPastParticipants { + + /** PastParticipants groupJid */ + groupJid?: (string|null); + + /** PastParticipants pastParticipants */ + pastParticipants?: (proto.IPastParticipant[]|null); + } + + /** Represents a PastParticipants. */ + class PastParticipants implements IPastParticipants { + + /** + * Constructs a new PastParticipants. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPastParticipants); + + /** PastParticipants groupJid. */ + public groupJid: string; + + /** PastParticipants pastParticipants. */ + public pastParticipants: proto.IPastParticipant[]; + + /** + * Creates a new PastParticipants instance using the specified properties. + * @param [properties] Properties to set + * @returns PastParticipants instance + */ + public static create(properties?: proto.IPastParticipants): proto.PastParticipants; + + /** + * Encodes the specified PastParticipants message. Does not implicitly {@link proto.PastParticipants.verify|verify} messages. + * @param message PastParticipants message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPastParticipants, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PastParticipants message, length delimited. Does not implicitly {@link proto.PastParticipants.verify|verify} messages. + * @param message PastParticipants message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPastParticipants, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PastParticipants message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PastParticipants + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PastParticipants; + + /** + * Decodes a PastParticipants message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PastParticipants + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PastParticipants; + + /** + * Verifies a PastParticipants message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PastParticipants message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PastParticipants + */ + public static fromObject(object: { [k: string]: any }): proto.PastParticipants; + + /** + * Creates a plain object from a PastParticipants message. Also converts values to other types if specified. + * @param message PastParticipants + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PastParticipants, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PastParticipants to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PaymentBackground. */ + interface IPaymentBackground { + + /** PaymentBackground id */ + id?: (string|null); + + /** PaymentBackground fileLength */ + fileLength?: (number|Long|null); + + /** PaymentBackground width */ + width?: (number|null); + + /** PaymentBackground height */ + height?: (number|null); + + /** PaymentBackground mimetype */ + mimetype?: (string|null); + + /** PaymentBackground placeholderArgb */ + placeholderArgb?: (number|null); + + /** PaymentBackground textArgb */ + textArgb?: (number|null); + + /** PaymentBackground subtextArgb */ + subtextArgb?: (number|null); + + /** PaymentBackground mediaData */ + mediaData?: (proto.PaymentBackground.IMediaData|null); + + /** PaymentBackground type */ + type?: (proto.PaymentBackground.Type|null); + } + + /** Represents a PaymentBackground. */ + class PaymentBackground implements IPaymentBackground { + + /** + * Constructs a new PaymentBackground. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPaymentBackground); + + /** PaymentBackground id. */ + public id: string; + + /** PaymentBackground fileLength. */ + public fileLength: (number|Long); + + /** PaymentBackground width. */ + public width: number; + + /** PaymentBackground height. */ + public height: number; + + /** PaymentBackground mimetype. */ + public mimetype: string; + + /** PaymentBackground placeholderArgb. */ + public placeholderArgb: number; + + /** PaymentBackground textArgb. */ + public textArgb: number; + + /** PaymentBackground subtextArgb. */ + public subtextArgb: number; + + /** PaymentBackground mediaData. */ + public mediaData?: (proto.PaymentBackground.IMediaData|null); + + /** PaymentBackground type. */ + public type: proto.PaymentBackground.Type; + + /** + * Creates a new PaymentBackground instance using the specified properties. + * @param [properties] Properties to set + * @returns PaymentBackground instance + */ + public static create(properties?: proto.IPaymentBackground): proto.PaymentBackground; + + /** + * Encodes the specified PaymentBackground message. Does not implicitly {@link proto.PaymentBackground.verify|verify} messages. + * @param message PaymentBackground message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPaymentBackground, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PaymentBackground message, length delimited. Does not implicitly {@link proto.PaymentBackground.verify|verify} messages. + * @param message PaymentBackground message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPaymentBackground, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PaymentBackground message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PaymentBackground + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PaymentBackground; + + /** + * Decodes a PaymentBackground message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PaymentBackground + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PaymentBackground; + + /** + * Verifies a PaymentBackground message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PaymentBackground message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PaymentBackground + */ + public static fromObject(object: { [k: string]: any }): proto.PaymentBackground; + + /** + * Creates a plain object from a PaymentBackground message. Also converts values to other types if specified. + * @param message PaymentBackground + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PaymentBackground, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PaymentBackground to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PaymentBackground { + + /** Properties of a MediaData. */ + interface IMediaData { + + /** MediaData mediaKey */ + mediaKey?: (Uint8Array|null); + + /** MediaData mediaKeyTimestamp */ + mediaKeyTimestamp?: (number|Long|null); + + /** MediaData fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** MediaData fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** MediaData directPath */ + directPath?: (string|null); + } + + /** Represents a MediaData. */ + class MediaData implements IMediaData { + + /** + * Constructs a new MediaData. + * @param [properties] Properties to set + */ + constructor(properties?: proto.PaymentBackground.IMediaData); + + /** MediaData mediaKey. */ + public mediaKey: Uint8Array; + + /** MediaData mediaKeyTimestamp. */ + public mediaKeyTimestamp: (number|Long); + + /** MediaData fileSha256. */ + public fileSha256: Uint8Array; + + /** MediaData fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** MediaData directPath. */ + public directPath: string; + + /** + * Creates a new MediaData instance using the specified properties. + * @param [properties] Properties to set + * @returns MediaData instance + */ + public static create(properties?: proto.PaymentBackground.IMediaData): proto.PaymentBackground.MediaData; + + /** + * Encodes the specified MediaData message. Does not implicitly {@link proto.PaymentBackground.MediaData.verify|verify} messages. + * @param message MediaData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.PaymentBackground.IMediaData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MediaData message, length delimited. Does not implicitly {@link proto.PaymentBackground.MediaData.verify|verify} messages. + * @param message MediaData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.PaymentBackground.IMediaData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MediaData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PaymentBackground.MediaData; + + /** + * Decodes a MediaData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PaymentBackground.MediaData; + + /** + * Verifies a MediaData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MediaData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MediaData + */ + public static fromObject(object: { [k: string]: any }): proto.PaymentBackground.MediaData; + + /** + * Creates a plain object from a MediaData message. Also converts values to other types if specified. + * @param message MediaData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PaymentBackground.MediaData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MediaData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Type enum. */ + enum Type { + UNKNOWN = 0, + DEFAULT = 1 + } + } + + /** Properties of a PaymentInfo. */ + interface IPaymentInfo { + + /** PaymentInfo currencyDeprecated */ + currencyDeprecated?: (proto.PaymentInfo.Currency|null); + + /** PaymentInfo amount1000 */ + amount1000?: (number|Long|null); + + /** PaymentInfo receiverJid */ + receiverJid?: (string|null); + + /** PaymentInfo status */ + status?: (proto.PaymentInfo.Status|null); + + /** PaymentInfo transactionTimestamp */ + transactionTimestamp?: (number|Long|null); + + /** PaymentInfo requestMessageKey */ + requestMessageKey?: (proto.IMessageKey|null); + + /** PaymentInfo expiryTimestamp */ + expiryTimestamp?: (number|Long|null); + + /** PaymentInfo futureproofed */ + futureproofed?: (boolean|null); + + /** PaymentInfo currency */ + currency?: (string|null); + + /** PaymentInfo txnStatus */ + txnStatus?: (proto.PaymentInfo.TxnStatus|null); + + /** PaymentInfo useNoviFiatFormat */ + useNoviFiatFormat?: (boolean|null); + + /** PaymentInfo primaryAmount */ + primaryAmount?: (proto.IMoney|null); + + /** PaymentInfo exchangeAmount */ + exchangeAmount?: (proto.IMoney|null); + } + + /** Represents a PaymentInfo. */ + class PaymentInfo implements IPaymentInfo { + + /** + * Constructs a new PaymentInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPaymentInfo); + + /** PaymentInfo currencyDeprecated. */ + public currencyDeprecated: proto.PaymentInfo.Currency; + + /** PaymentInfo amount1000. */ + public amount1000: (number|Long); + + /** PaymentInfo receiverJid. */ + public receiverJid: string; + + /** PaymentInfo status. */ + public status: proto.PaymentInfo.Status; + + /** PaymentInfo transactionTimestamp. */ + public transactionTimestamp: (number|Long); + + /** PaymentInfo requestMessageKey. */ + public requestMessageKey?: (proto.IMessageKey|null); + + /** PaymentInfo expiryTimestamp. */ + public expiryTimestamp: (number|Long); + + /** PaymentInfo futureproofed. */ + public futureproofed: boolean; + + /** PaymentInfo currency. */ + public currency: string; + + /** PaymentInfo txnStatus. */ + public txnStatus: proto.PaymentInfo.TxnStatus; + + /** PaymentInfo useNoviFiatFormat. */ + public useNoviFiatFormat: boolean; + + /** PaymentInfo primaryAmount. */ + public primaryAmount?: (proto.IMoney|null); + + /** PaymentInfo exchangeAmount. */ + public exchangeAmount?: (proto.IMoney|null); + + /** + * Creates a new PaymentInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns PaymentInfo instance + */ + public static create(properties?: proto.IPaymentInfo): proto.PaymentInfo; + + /** + * Encodes the specified PaymentInfo message. Does not implicitly {@link proto.PaymentInfo.verify|verify} messages. + * @param message PaymentInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPaymentInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PaymentInfo message, length delimited. Does not implicitly {@link proto.PaymentInfo.verify|verify} messages. + * @param message PaymentInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPaymentInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PaymentInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PaymentInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PaymentInfo; + + /** + * Decodes a PaymentInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PaymentInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PaymentInfo; + + /** + * Verifies a PaymentInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PaymentInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PaymentInfo + */ + public static fromObject(object: { [k: string]: any }): proto.PaymentInfo; + + /** + * Creates a plain object from a PaymentInfo message. Also converts values to other types if specified. + * @param message PaymentInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PaymentInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PaymentInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace PaymentInfo { + + /** Currency enum. */ + enum Currency { + UNKNOWN_CURRENCY = 0, + INR = 1 + } + + /** Status enum. */ + enum Status { + UNKNOWN_STATUS = 0, + PROCESSING = 1, + SENT = 2, + NEED_TO_ACCEPT = 3, + COMPLETE = 4, + COULD_NOT_COMPLETE = 5, + REFUNDED = 6, + EXPIRED = 7, + REJECTED = 8, + CANCELLED = 9, + WAITING_FOR_PAYER = 10, + WAITING = 11 + } + + /** TxnStatus enum. */ + enum TxnStatus { + UNKNOWN = 0, + PENDING_SETUP = 1, + PENDING_RECEIVER_SETUP = 2, + INIT = 3, + SUCCESS = 4, + COMPLETED = 5, + FAILED = 6, + FAILED_RISK = 7, + FAILED_PROCESSING = 8, + FAILED_RECEIVER_PROCESSING = 9, + FAILED_DA = 10, + FAILED_DA_FINAL = 11, + REFUNDED_TXN = 12, + REFUND_FAILED = 13, + REFUND_FAILED_PROCESSING = 14, + REFUND_FAILED_DA = 15, + EXPIRED_TXN = 16, + AUTH_CANCELED = 17, + AUTH_CANCEL_FAILED_PROCESSING = 18, + AUTH_CANCEL_FAILED = 19, + COLLECT_INIT = 20, + COLLECT_SUCCESS = 21, + COLLECT_FAILED = 22, + COLLECT_FAILED_RISK = 23, + COLLECT_REJECTED = 24, + COLLECT_EXPIRED = 25, + COLLECT_CANCELED = 26, + COLLECT_CANCELLING = 27, + IN_REVIEW = 28, + REVERSAL_SUCCESS = 29, + REVERSAL_PENDING = 30, + REFUND_PENDING = 31 + } + } + + /** Properties of a PendingKeyExchange. */ + interface IPendingKeyExchange { + + /** PendingKeyExchange sequence */ + sequence?: (number|null); + + /** PendingKeyExchange localBaseKey */ + localBaseKey?: (Uint8Array|null); + + /** PendingKeyExchange localBaseKeyPrivate */ + localBaseKeyPrivate?: (Uint8Array|null); + + /** PendingKeyExchange localRatchetKey */ + localRatchetKey?: (Uint8Array|null); + + /** PendingKeyExchange localRatchetKeyPrivate */ + localRatchetKeyPrivate?: (Uint8Array|null); + + /** PendingKeyExchange localIdentityKey */ + localIdentityKey?: (Uint8Array|null); + + /** PendingKeyExchange localIdentityKeyPrivate */ + localIdentityKeyPrivate?: (Uint8Array|null); + } + + /** Represents a PendingKeyExchange. */ + class PendingKeyExchange implements IPendingKeyExchange { + + /** + * Constructs a new PendingKeyExchange. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPendingKeyExchange); + + /** PendingKeyExchange sequence. */ + public sequence: number; + + /** PendingKeyExchange localBaseKey. */ + public localBaseKey: Uint8Array; + + /** PendingKeyExchange localBaseKeyPrivate. */ + public localBaseKeyPrivate: Uint8Array; + + /** PendingKeyExchange localRatchetKey. */ + public localRatchetKey: Uint8Array; + + /** PendingKeyExchange localRatchetKeyPrivate. */ + public localRatchetKeyPrivate: Uint8Array; + + /** PendingKeyExchange localIdentityKey. */ + public localIdentityKey: Uint8Array; + + /** PendingKeyExchange localIdentityKeyPrivate. */ + public localIdentityKeyPrivate: Uint8Array; + + /** + * Creates a new PendingKeyExchange instance using the specified properties. + * @param [properties] Properties to set + * @returns PendingKeyExchange instance + */ + public static create(properties?: proto.IPendingKeyExchange): proto.PendingKeyExchange; + + /** + * Encodes the specified PendingKeyExchange message. Does not implicitly {@link proto.PendingKeyExchange.verify|verify} messages. + * @param message PendingKeyExchange message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPendingKeyExchange, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PendingKeyExchange message, length delimited. Does not implicitly {@link proto.PendingKeyExchange.verify|verify} messages. + * @param message PendingKeyExchange message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPendingKeyExchange, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PendingKeyExchange message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PendingKeyExchange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PendingKeyExchange; + + /** + * Decodes a PendingKeyExchange message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PendingKeyExchange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PendingKeyExchange; + + /** + * Verifies a PendingKeyExchange message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PendingKeyExchange message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PendingKeyExchange + */ + public static fromObject(object: { [k: string]: any }): proto.PendingKeyExchange; + + /** + * Creates a plain object from a PendingKeyExchange message. Also converts values to other types if specified. + * @param message PendingKeyExchange + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PendingKeyExchange, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PendingKeyExchange to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PendingPreKey. */ + interface IPendingPreKey { + + /** PendingPreKey preKeyId */ + preKeyId?: (number|null); + + /** PendingPreKey signedPreKeyId */ + signedPreKeyId?: (number|null); + + /** PendingPreKey baseKey */ + baseKey?: (Uint8Array|null); + } + + /** Represents a PendingPreKey. */ + class PendingPreKey implements IPendingPreKey { + + /** + * Constructs a new PendingPreKey. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPendingPreKey); + + /** PendingPreKey preKeyId. */ + public preKeyId: number; + + /** PendingPreKey signedPreKeyId. */ + public signedPreKeyId: number; + + /** PendingPreKey baseKey. */ + public baseKey: Uint8Array; + + /** + * Creates a new PendingPreKey instance using the specified properties. + * @param [properties] Properties to set + * @returns PendingPreKey instance + */ + public static create(properties?: proto.IPendingPreKey): proto.PendingPreKey; + + /** + * Encodes the specified PendingPreKey message. Does not implicitly {@link proto.PendingPreKey.verify|verify} messages. + * @param message PendingPreKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPendingPreKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PendingPreKey message, length delimited. Does not implicitly {@link proto.PendingPreKey.verify|verify} messages. + * @param message PendingPreKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPendingPreKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PendingPreKey message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PendingPreKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PendingPreKey; + + /** + * Decodes a PendingPreKey message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PendingPreKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PendingPreKey; + + /** + * Verifies a PendingPreKey message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PendingPreKey message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PendingPreKey + */ + public static fromObject(object: { [k: string]: any }): proto.PendingPreKey; + + /** + * Creates a plain object from a PendingPreKey message. Also converts values to other types if specified. + * @param message PendingPreKey + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PendingPreKey, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PendingPreKey to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PhotoChange. */ + interface IPhotoChange { + + /** PhotoChange oldPhoto */ + oldPhoto?: (Uint8Array|null); + + /** PhotoChange newPhoto */ + newPhoto?: (Uint8Array|null); + + /** PhotoChange newPhotoId */ + newPhotoId?: (number|null); + } + + /** Represents a PhotoChange. */ + class PhotoChange implements IPhotoChange { + + /** + * Constructs a new PhotoChange. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPhotoChange); + + /** PhotoChange oldPhoto. */ + public oldPhoto: Uint8Array; + + /** PhotoChange newPhoto. */ + public newPhoto: Uint8Array; + + /** PhotoChange newPhotoId. */ + public newPhotoId: number; + + /** + * Creates a new PhotoChange instance using the specified properties. + * @param [properties] Properties to set + * @returns PhotoChange instance + */ + public static create(properties?: proto.IPhotoChange): proto.PhotoChange; + + /** + * Encodes the specified PhotoChange message. Does not implicitly {@link proto.PhotoChange.verify|verify} messages. + * @param message PhotoChange message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPhotoChange, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PhotoChange message, length delimited. Does not implicitly {@link proto.PhotoChange.verify|verify} messages. + * @param message PhotoChange message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPhotoChange, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PhotoChange message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PhotoChange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PhotoChange; + + /** + * Decodes a PhotoChange message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PhotoChange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PhotoChange; + + /** + * Verifies a PhotoChange message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PhotoChange message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PhotoChange + */ + public static fromObject(object: { [k: string]: any }): proto.PhotoChange; + + /** + * Creates a plain object from a PhotoChange message. Also converts values to other types if specified. + * @param message PhotoChange + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PhotoChange, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PhotoChange to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Point. */ + interface IPoint { + + /** Point xDeprecated */ + xDeprecated?: (number|null); + + /** Point yDeprecated */ + yDeprecated?: (number|null); + + /** Point x */ + x?: (number|null); + + /** Point y */ + y?: (number|null); + } + + /** Represents a Point. */ + class Point implements IPoint { + + /** + * Constructs a new Point. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPoint); + + /** Point xDeprecated. */ + public xDeprecated: number; + + /** Point yDeprecated. */ + public yDeprecated: number; + + /** Point x. */ + public x: number; + + /** Point y. */ + public y: number; + + /** + * Creates a new Point instance using the specified properties. + * @param [properties] Properties to set + * @returns Point instance + */ + public static create(properties?: proto.IPoint): proto.Point; + + /** + * Encodes the specified Point message. Does not implicitly {@link proto.Point.verify|verify} messages. + * @param message Point message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPoint, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Point message, length delimited. Does not implicitly {@link proto.Point.verify|verify} messages. + * @param message Point message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPoint, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Point message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Point + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Point; + + /** + * Decodes a Point message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Point + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Point; + + /** + * Verifies a Point message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Point message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Point + */ + public static fromObject(object: { [k: string]: any }): proto.Point; + + /** + * Creates a plain object from a Point message. Also converts values to other types if specified. + * @param message Point + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Point, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Point to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PollAdditionalMetadata. */ + interface IPollAdditionalMetadata { + + /** PollAdditionalMetadata pollInvalidated */ + pollInvalidated?: (boolean|null); + } + + /** Represents a PollAdditionalMetadata. */ + class PollAdditionalMetadata implements IPollAdditionalMetadata { + + /** + * Constructs a new PollAdditionalMetadata. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPollAdditionalMetadata); + + /** PollAdditionalMetadata pollInvalidated. */ + public pollInvalidated: boolean; + + /** + * Creates a new PollAdditionalMetadata instance using the specified properties. + * @param [properties] Properties to set + * @returns PollAdditionalMetadata instance + */ + public static create(properties?: proto.IPollAdditionalMetadata): proto.PollAdditionalMetadata; + + /** + * Encodes the specified PollAdditionalMetadata message. Does not implicitly {@link proto.PollAdditionalMetadata.verify|verify} messages. + * @param message PollAdditionalMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPollAdditionalMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollAdditionalMetadata message, length delimited. Does not implicitly {@link proto.PollAdditionalMetadata.verify|verify} messages. + * @param message PollAdditionalMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPollAdditionalMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollAdditionalMetadata message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollAdditionalMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PollAdditionalMetadata; + + /** + * Decodes a PollAdditionalMetadata message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollAdditionalMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PollAdditionalMetadata; + + /** + * Verifies a PollAdditionalMetadata message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollAdditionalMetadata message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollAdditionalMetadata + */ + public static fromObject(object: { [k: string]: any }): proto.PollAdditionalMetadata; + + /** + * Creates a plain object from a PollAdditionalMetadata message. Also converts values to other types if specified. + * @param message PollAdditionalMetadata + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PollAdditionalMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollAdditionalMetadata to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PollEncValue. */ + interface IPollEncValue { + + /** PollEncValue encPayload */ + encPayload?: (Uint8Array|null); + + /** PollEncValue encIv */ + encIv?: (Uint8Array|null); + } + + /** Represents a PollEncValue. */ + class PollEncValue implements IPollEncValue { + + /** + * Constructs a new PollEncValue. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPollEncValue); + + /** PollEncValue encPayload. */ + public encPayload: Uint8Array; + + /** PollEncValue encIv. */ + public encIv: Uint8Array; + + /** + * Creates a new PollEncValue instance using the specified properties. + * @param [properties] Properties to set + * @returns PollEncValue instance + */ + public static create(properties?: proto.IPollEncValue): proto.PollEncValue; + + /** + * Encodes the specified PollEncValue message. Does not implicitly {@link proto.PollEncValue.verify|verify} messages. + * @param message PollEncValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPollEncValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollEncValue message, length delimited. Does not implicitly {@link proto.PollEncValue.verify|verify} messages. + * @param message PollEncValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPollEncValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollEncValue message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PollEncValue; + + /** + * Decodes a PollEncValue message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PollEncValue; + + /** + * Verifies a PollEncValue message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollEncValue message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollEncValue + */ + public static fromObject(object: { [k: string]: any }): proto.PollEncValue; + + /** + * Creates a plain object from a PollEncValue message. Also converts values to other types if specified. + * @param message PollEncValue + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PollEncValue, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollEncValue to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PollUpdate. */ + interface IPollUpdate { + + /** PollUpdate pollUpdateMessageKey */ + pollUpdateMessageKey?: (proto.IMessageKey|null); + + /** PollUpdate vote */ + vote?: (proto.Message.IPollVoteMessage|null); + + /** PollUpdate senderTimestampMs */ + senderTimestampMs?: (number|Long|null); + } + + /** Represents a PollUpdate. */ + class PollUpdate implements IPollUpdate { + + /** + * Constructs a new PollUpdate. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPollUpdate); + + /** PollUpdate pollUpdateMessageKey. */ + public pollUpdateMessageKey?: (proto.IMessageKey|null); + + /** PollUpdate vote. */ + public vote?: (proto.Message.IPollVoteMessage|null); + + /** PollUpdate senderTimestampMs. */ + public senderTimestampMs: (number|Long); + + /** + * Creates a new PollUpdate instance using the specified properties. + * @param [properties] Properties to set + * @returns PollUpdate instance + */ + public static create(properties?: proto.IPollUpdate): proto.PollUpdate; + + /** + * Encodes the specified PollUpdate message. Does not implicitly {@link proto.PollUpdate.verify|verify} messages. + * @param message PollUpdate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPollUpdate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PollUpdate message, length delimited. Does not implicitly {@link proto.PollUpdate.verify|verify} messages. + * @param message PollUpdate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPollUpdate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PollUpdate message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PollUpdate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PollUpdate; + + /** + * Decodes a PollUpdate message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PollUpdate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PollUpdate; + + /** + * Verifies a PollUpdate message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PollUpdate message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PollUpdate + */ + public static fromObject(object: { [k: string]: any }): proto.PollUpdate; + + /** + * Creates a plain object from a PollUpdate message. Also converts values to other types if specified. + * @param message PollUpdate + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PollUpdate, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PollUpdate to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PreKeyRecordStructure. */ + interface IPreKeyRecordStructure { + + /** PreKeyRecordStructure id */ + id?: (number|null); + + /** PreKeyRecordStructure publicKey */ + publicKey?: (Uint8Array|null); + + /** PreKeyRecordStructure privateKey */ + privateKey?: (Uint8Array|null); + } + + /** Represents a PreKeyRecordStructure. */ + class PreKeyRecordStructure implements IPreKeyRecordStructure { + + /** + * Constructs a new PreKeyRecordStructure. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPreKeyRecordStructure); + + /** PreKeyRecordStructure id. */ + public id: number; + + /** PreKeyRecordStructure publicKey. */ + public publicKey: Uint8Array; + + /** PreKeyRecordStructure privateKey. */ + public privateKey: Uint8Array; + + /** + * Creates a new PreKeyRecordStructure instance using the specified properties. + * @param [properties] Properties to set + * @returns PreKeyRecordStructure instance + */ + public static create(properties?: proto.IPreKeyRecordStructure): proto.PreKeyRecordStructure; + + /** + * Encodes the specified PreKeyRecordStructure message. Does not implicitly {@link proto.PreKeyRecordStructure.verify|verify} messages. + * @param message PreKeyRecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPreKeyRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PreKeyRecordStructure message, length delimited. Does not implicitly {@link proto.PreKeyRecordStructure.verify|verify} messages. + * @param message PreKeyRecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPreKeyRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PreKeyRecordStructure message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.PreKeyRecordStructure; + + /** + * Decodes a PreKeyRecordStructure message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.PreKeyRecordStructure; + + /** + * Verifies a PreKeyRecordStructure message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PreKeyRecordStructure message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PreKeyRecordStructure + */ + public static fromObject(object: { [k: string]: any }): proto.PreKeyRecordStructure; + + /** + * Creates a plain object from a PreKeyRecordStructure message. Also converts values to other types if specified. + * @param message PreKeyRecordStructure + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.PreKeyRecordStructure, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PreKeyRecordStructure to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Pushname. */ + interface IPushname { + + /** Pushname id */ + id?: (string|null); + + /** Pushname pushname */ + pushname?: (string|null); + } + + /** Represents a Pushname. */ + class Pushname implements IPushname { + + /** + * Constructs a new Pushname. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IPushname); + + /** Pushname id. */ + public id: string; + + /** Pushname pushname. */ + public pushname: string; + + /** + * Creates a new Pushname instance using the specified properties. + * @param [properties] Properties to set + * @returns Pushname instance + */ + public static create(properties?: proto.IPushname): proto.Pushname; + + /** + * Encodes the specified Pushname message. Does not implicitly {@link proto.Pushname.verify|verify} messages. + * @param message Pushname message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IPushname, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Pushname message, length delimited. Does not implicitly {@link proto.Pushname.verify|verify} messages. + * @param message Pushname message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IPushname, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Pushname message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Pushname + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Pushname; + + /** + * Decodes a Pushname message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Pushname + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Pushname; + + /** + * Verifies a Pushname message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Pushname message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Pushname + */ + public static fromObject(object: { [k: string]: any }): proto.Pushname; + + /** + * Creates a plain object from a Pushname message. Also converts values to other types if specified. + * @param message Pushname + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Pushname, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Pushname to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a Reaction. */ + interface IReaction { + + /** Reaction key */ + key?: (proto.IMessageKey|null); + + /** Reaction text */ + text?: (string|null); + + /** Reaction groupingKey */ + groupingKey?: (string|null); + + /** Reaction senderTimestampMs */ + senderTimestampMs?: (number|Long|null); + + /** Reaction unread */ + unread?: (boolean|null); + } + + /** Represents a Reaction. */ + class Reaction implements IReaction { + + /** + * Constructs a new Reaction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IReaction); + + /** Reaction key. */ + public key?: (proto.IMessageKey|null); + + /** Reaction text. */ + public text: string; + + /** Reaction groupingKey. */ + public groupingKey: string; + + /** Reaction senderTimestampMs. */ + public senderTimestampMs: (number|Long); + + /** Reaction unread. */ + public unread: boolean; + + /** + * Creates a new Reaction instance using the specified properties. + * @param [properties] Properties to set + * @returns Reaction instance + */ + public static create(properties?: proto.IReaction): proto.Reaction; + + /** + * Encodes the specified Reaction message. Does not implicitly {@link proto.Reaction.verify|verify} messages. + * @param message Reaction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IReaction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Reaction message, length delimited. Does not implicitly {@link proto.Reaction.verify|verify} messages. + * @param message Reaction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IReaction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Reaction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Reaction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.Reaction; + + /** + * Decodes a Reaction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Reaction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.Reaction; + + /** + * Verifies a Reaction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Reaction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Reaction + */ + public static fromObject(object: { [k: string]: any }): proto.Reaction; + + /** + * Creates a plain object from a Reaction message. Also converts values to other types if specified. + * @param message Reaction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.Reaction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Reaction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a RecentEmojiWeight. */ + interface IRecentEmojiWeight { + + /** RecentEmojiWeight emoji */ + emoji?: (string|null); + + /** RecentEmojiWeight weight */ + weight?: (number|null); + } + + /** Represents a RecentEmojiWeight. */ + class RecentEmojiWeight implements IRecentEmojiWeight { + + /** + * Constructs a new RecentEmojiWeight. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IRecentEmojiWeight); + + /** RecentEmojiWeight emoji. */ + public emoji: string; + + /** RecentEmojiWeight weight. */ + public weight: number; + + /** + * Creates a new RecentEmojiWeight instance using the specified properties. + * @param [properties] Properties to set + * @returns RecentEmojiWeight instance + */ + public static create(properties?: proto.IRecentEmojiWeight): proto.RecentEmojiWeight; + + /** + * Encodes the specified RecentEmojiWeight message. Does not implicitly {@link proto.RecentEmojiWeight.verify|verify} messages. + * @param message RecentEmojiWeight message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IRecentEmojiWeight, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RecentEmojiWeight message, length delimited. Does not implicitly {@link proto.RecentEmojiWeight.verify|verify} messages. + * @param message RecentEmojiWeight message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IRecentEmojiWeight, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RecentEmojiWeight message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RecentEmojiWeight + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.RecentEmojiWeight; + + /** + * Decodes a RecentEmojiWeight message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RecentEmojiWeight + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.RecentEmojiWeight; + + /** + * Verifies a RecentEmojiWeight message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RecentEmojiWeight message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RecentEmojiWeight + */ + public static fromObject(object: { [k: string]: any }): proto.RecentEmojiWeight; + + /** + * Creates a plain object from a RecentEmojiWeight message. Also converts values to other types if specified. + * @param message RecentEmojiWeight + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.RecentEmojiWeight, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RecentEmojiWeight to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a RecordStructure. */ + interface IRecordStructure { + + /** RecordStructure currentSession */ + currentSession?: (proto.ISessionStructure|null); + + /** RecordStructure previousSessions */ + previousSessions?: (proto.ISessionStructure[]|null); + } + + /** Represents a RecordStructure. */ + class RecordStructure implements IRecordStructure { + + /** + * Constructs a new RecordStructure. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IRecordStructure); + + /** RecordStructure currentSession. */ + public currentSession?: (proto.ISessionStructure|null); + + /** RecordStructure previousSessions. */ + public previousSessions: proto.ISessionStructure[]; + + /** + * Creates a new RecordStructure instance using the specified properties. + * @param [properties] Properties to set + * @returns RecordStructure instance + */ + public static create(properties?: proto.IRecordStructure): proto.RecordStructure; + + /** + * Encodes the specified RecordStructure message. Does not implicitly {@link proto.RecordStructure.verify|verify} messages. + * @param message RecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RecordStructure message, length delimited. Does not implicitly {@link proto.RecordStructure.verify|verify} messages. + * @param message RecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RecordStructure message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.RecordStructure; + + /** + * Decodes a RecordStructure message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.RecordStructure; + + /** + * Verifies a RecordStructure message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RecordStructure message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RecordStructure + */ + public static fromObject(object: { [k: string]: any }): proto.RecordStructure; + + /** + * Creates a plain object from a RecordStructure message. Also converts values to other types if specified. + * @param message RecordStructure + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.RecordStructure, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RecordStructure to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SenderChainKey. */ + interface ISenderChainKey { + + /** SenderChainKey iteration */ + iteration?: (number|null); + + /** SenderChainKey seed */ + seed?: (Uint8Array|null); + } + + /** Represents a SenderChainKey. */ + class SenderChainKey implements ISenderChainKey { + + /** + * Constructs a new SenderChainKey. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISenderChainKey); + + /** SenderChainKey iteration. */ + public iteration: number; + + /** SenderChainKey seed. */ + public seed: Uint8Array; + + /** + * Creates a new SenderChainKey instance using the specified properties. + * @param [properties] Properties to set + * @returns SenderChainKey instance + */ + public static create(properties?: proto.ISenderChainKey): proto.SenderChainKey; + + /** + * Encodes the specified SenderChainKey message. Does not implicitly {@link proto.SenderChainKey.verify|verify} messages. + * @param message SenderChainKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISenderChainKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SenderChainKey message, length delimited. Does not implicitly {@link proto.SenderChainKey.verify|verify} messages. + * @param message SenderChainKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISenderChainKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SenderChainKey message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SenderChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SenderChainKey; + + /** + * Decodes a SenderChainKey message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SenderChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SenderChainKey; + + /** + * Verifies a SenderChainKey message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SenderChainKey message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SenderChainKey + */ + public static fromObject(object: { [k: string]: any }): proto.SenderChainKey; + + /** + * Creates a plain object from a SenderChainKey message. Also converts values to other types if specified. + * @param message SenderChainKey + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SenderChainKey, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SenderChainKey to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SenderKeyRecordStructure. */ + interface ISenderKeyRecordStructure { + + /** SenderKeyRecordStructure senderKeyStates */ + senderKeyStates?: (proto.ISenderKeyStateStructure[]|null); + } + + /** Represents a SenderKeyRecordStructure. */ + class SenderKeyRecordStructure implements ISenderKeyRecordStructure { + + /** + * Constructs a new SenderKeyRecordStructure. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISenderKeyRecordStructure); + + /** SenderKeyRecordStructure senderKeyStates. */ + public senderKeyStates: proto.ISenderKeyStateStructure[]; + + /** + * Creates a new SenderKeyRecordStructure instance using the specified properties. + * @param [properties] Properties to set + * @returns SenderKeyRecordStructure instance + */ + public static create(properties?: proto.ISenderKeyRecordStructure): proto.SenderKeyRecordStructure; + + /** + * Encodes the specified SenderKeyRecordStructure message. Does not implicitly {@link proto.SenderKeyRecordStructure.verify|verify} messages. + * @param message SenderKeyRecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISenderKeyRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SenderKeyRecordStructure message, length delimited. Does not implicitly {@link proto.SenderKeyRecordStructure.verify|verify} messages. + * @param message SenderKeyRecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISenderKeyRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SenderKeyRecordStructure message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SenderKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SenderKeyRecordStructure; + + /** + * Decodes a SenderKeyRecordStructure message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SenderKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SenderKeyRecordStructure; + + /** + * Verifies a SenderKeyRecordStructure message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SenderKeyRecordStructure message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SenderKeyRecordStructure + */ + public static fromObject(object: { [k: string]: any }): proto.SenderKeyRecordStructure; + + /** + * Creates a plain object from a SenderKeyRecordStructure message. Also converts values to other types if specified. + * @param message SenderKeyRecordStructure + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SenderKeyRecordStructure, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SenderKeyRecordStructure to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SenderKeyStateStructure. */ + interface ISenderKeyStateStructure { + + /** SenderKeyStateStructure senderKeyId */ + senderKeyId?: (number|null); + + /** SenderKeyStateStructure senderChainKey */ + senderChainKey?: (proto.ISenderChainKey|null); + + /** SenderKeyStateStructure senderSigningKey */ + senderSigningKey?: (proto.ISenderSigningKey|null); + + /** SenderKeyStateStructure senderMessageKeys */ + senderMessageKeys?: (proto.ISenderMessageKey[]|null); + } + + /** Represents a SenderKeyStateStructure. */ + class SenderKeyStateStructure implements ISenderKeyStateStructure { + + /** + * Constructs a new SenderKeyStateStructure. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISenderKeyStateStructure); + + /** SenderKeyStateStructure senderKeyId. */ + public senderKeyId: number; + + /** SenderKeyStateStructure senderChainKey. */ + public senderChainKey?: (proto.ISenderChainKey|null); + + /** SenderKeyStateStructure senderSigningKey. */ + public senderSigningKey?: (proto.ISenderSigningKey|null); + + /** SenderKeyStateStructure senderMessageKeys. */ + public senderMessageKeys: proto.ISenderMessageKey[]; + + /** + * Creates a new SenderKeyStateStructure instance using the specified properties. + * @param [properties] Properties to set + * @returns SenderKeyStateStructure instance + */ + public static create(properties?: proto.ISenderKeyStateStructure): proto.SenderKeyStateStructure; + + /** + * Encodes the specified SenderKeyStateStructure message. Does not implicitly {@link proto.SenderKeyStateStructure.verify|verify} messages. + * @param message SenderKeyStateStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISenderKeyStateStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SenderKeyStateStructure message, length delimited. Does not implicitly {@link proto.SenderKeyStateStructure.verify|verify} messages. + * @param message SenderKeyStateStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISenderKeyStateStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SenderKeyStateStructure message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SenderKeyStateStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SenderKeyStateStructure; + + /** + * Decodes a SenderKeyStateStructure message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SenderKeyStateStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SenderKeyStateStructure; + + /** + * Verifies a SenderKeyStateStructure message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SenderKeyStateStructure message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SenderKeyStateStructure + */ + public static fromObject(object: { [k: string]: any }): proto.SenderKeyStateStructure; + + /** + * Creates a plain object from a SenderKeyStateStructure message. Also converts values to other types if specified. + * @param message SenderKeyStateStructure + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SenderKeyStateStructure, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SenderKeyStateStructure to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SenderMessageKey. */ + interface ISenderMessageKey { + + /** SenderMessageKey iteration */ + iteration?: (number|null); + + /** SenderMessageKey seed */ + seed?: (Uint8Array|null); + } + + /** Represents a SenderMessageKey. */ + class SenderMessageKey implements ISenderMessageKey { + + /** + * Constructs a new SenderMessageKey. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISenderMessageKey); + + /** SenderMessageKey iteration. */ + public iteration: number; + + /** SenderMessageKey seed. */ + public seed: Uint8Array; + + /** + * Creates a new SenderMessageKey instance using the specified properties. + * @param [properties] Properties to set + * @returns SenderMessageKey instance + */ + public static create(properties?: proto.ISenderMessageKey): proto.SenderMessageKey; + + /** + * Encodes the specified SenderMessageKey message. Does not implicitly {@link proto.SenderMessageKey.verify|verify} messages. + * @param message SenderMessageKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISenderMessageKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SenderMessageKey message, length delimited. Does not implicitly {@link proto.SenderMessageKey.verify|verify} messages. + * @param message SenderMessageKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISenderMessageKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SenderMessageKey message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SenderMessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SenderMessageKey; + + /** + * Decodes a SenderMessageKey message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SenderMessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SenderMessageKey; + + /** + * Verifies a SenderMessageKey message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SenderMessageKey message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SenderMessageKey + */ + public static fromObject(object: { [k: string]: any }): proto.SenderMessageKey; + + /** + * Creates a plain object from a SenderMessageKey message. Also converts values to other types if specified. + * @param message SenderMessageKey + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SenderMessageKey, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SenderMessageKey to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SenderSigningKey. */ + interface ISenderSigningKey { + + /** SenderSigningKey public */ + "public"?: (Uint8Array|null); + + /** SenderSigningKey private */ + "private"?: (Uint8Array|null); + } + + /** Represents a SenderSigningKey. */ + class SenderSigningKey implements ISenderSigningKey { + + /** + * Constructs a new SenderSigningKey. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISenderSigningKey); + + /** SenderSigningKey public. */ + public public: Uint8Array; + + /** SenderSigningKey private. */ + public private: Uint8Array; + + /** + * Creates a new SenderSigningKey instance using the specified properties. + * @param [properties] Properties to set + * @returns SenderSigningKey instance + */ + public static create(properties?: proto.ISenderSigningKey): proto.SenderSigningKey; + + /** + * Encodes the specified SenderSigningKey message. Does not implicitly {@link proto.SenderSigningKey.verify|verify} messages. + * @param message SenderSigningKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISenderSigningKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SenderSigningKey message, length delimited. Does not implicitly {@link proto.SenderSigningKey.verify|verify} messages. + * @param message SenderSigningKey message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISenderSigningKey, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SenderSigningKey message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SenderSigningKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SenderSigningKey; + + /** + * Decodes a SenderSigningKey message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SenderSigningKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SenderSigningKey; + + /** + * Verifies a SenderSigningKey message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SenderSigningKey message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SenderSigningKey + */ + public static fromObject(object: { [k: string]: any }): proto.SenderSigningKey; + + /** + * Creates a plain object from a SenderSigningKey message. Also converts values to other types if specified. + * @param message SenderSigningKey + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SenderSigningKey, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SenderSigningKey to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ServerErrorReceipt. */ + interface IServerErrorReceipt { + + /** ServerErrorReceipt stanzaId */ + stanzaId?: (string|null); + } + + /** Represents a ServerErrorReceipt. */ + class ServerErrorReceipt implements IServerErrorReceipt { + + /** + * Constructs a new ServerErrorReceipt. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IServerErrorReceipt); + + /** ServerErrorReceipt stanzaId. */ + public stanzaId: string; + + /** + * Creates a new ServerErrorReceipt instance using the specified properties. + * @param [properties] Properties to set + * @returns ServerErrorReceipt instance + */ + public static create(properties?: proto.IServerErrorReceipt): proto.ServerErrorReceipt; + + /** + * Encodes the specified ServerErrorReceipt message. Does not implicitly {@link proto.ServerErrorReceipt.verify|verify} messages. + * @param message ServerErrorReceipt message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IServerErrorReceipt, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ServerErrorReceipt message, length delimited. Does not implicitly {@link proto.ServerErrorReceipt.verify|verify} messages. + * @param message ServerErrorReceipt message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IServerErrorReceipt, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ServerErrorReceipt message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ServerErrorReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.ServerErrorReceipt; + + /** + * Decodes a ServerErrorReceipt message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ServerErrorReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.ServerErrorReceipt; + + /** + * Verifies a ServerErrorReceipt message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ServerErrorReceipt message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ServerErrorReceipt + */ + public static fromObject(object: { [k: string]: any }): proto.ServerErrorReceipt; + + /** + * Creates a plain object from a ServerErrorReceipt message. Also converts values to other types if specified. + * @param message ServerErrorReceipt + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.ServerErrorReceipt, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ServerErrorReceipt to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SessionStructure. */ + interface ISessionStructure { + + /** SessionStructure sessionVersion */ + sessionVersion?: (number|null); + + /** SessionStructure localIdentityPublic */ + localIdentityPublic?: (Uint8Array|null); + + /** SessionStructure remoteIdentityPublic */ + remoteIdentityPublic?: (Uint8Array|null); + + /** SessionStructure rootKey */ + rootKey?: (Uint8Array|null); + + /** SessionStructure previousCounter */ + previousCounter?: (number|null); + + /** SessionStructure senderChain */ + senderChain?: (proto.IChain|null); + + /** SessionStructure receiverChains */ + receiverChains?: (proto.IChain[]|null); + + /** SessionStructure pendingKeyExchange */ + pendingKeyExchange?: (proto.IPendingKeyExchange|null); + + /** SessionStructure pendingPreKey */ + pendingPreKey?: (proto.IPendingPreKey|null); + + /** SessionStructure remoteRegistrationId */ + remoteRegistrationId?: (number|null); + + /** SessionStructure localRegistrationId */ + localRegistrationId?: (number|null); + + /** SessionStructure needsRefresh */ + needsRefresh?: (boolean|null); + + /** SessionStructure aliceBaseKey */ + aliceBaseKey?: (Uint8Array|null); + } + + /** Represents a SessionStructure. */ + class SessionStructure implements ISessionStructure { + + /** + * Constructs a new SessionStructure. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISessionStructure); + + /** SessionStructure sessionVersion. */ + public sessionVersion: number; + + /** SessionStructure localIdentityPublic. */ + public localIdentityPublic: Uint8Array; + + /** SessionStructure remoteIdentityPublic. */ + public remoteIdentityPublic: Uint8Array; + + /** SessionStructure rootKey. */ + public rootKey: Uint8Array; + + /** SessionStructure previousCounter. */ + public previousCounter: number; + + /** SessionStructure senderChain. */ + public senderChain?: (proto.IChain|null); + + /** SessionStructure receiverChains. */ + public receiverChains: proto.IChain[]; + + /** SessionStructure pendingKeyExchange. */ + public pendingKeyExchange?: (proto.IPendingKeyExchange|null); + + /** SessionStructure pendingPreKey. */ + public pendingPreKey?: (proto.IPendingPreKey|null); + + /** SessionStructure remoteRegistrationId. */ + public remoteRegistrationId: number; + + /** SessionStructure localRegistrationId. */ + public localRegistrationId: number; + + /** SessionStructure needsRefresh. */ + public needsRefresh: boolean; + + /** SessionStructure aliceBaseKey. */ + public aliceBaseKey: Uint8Array; + + /** + * Creates a new SessionStructure instance using the specified properties. + * @param [properties] Properties to set + * @returns SessionStructure instance + */ + public static create(properties?: proto.ISessionStructure): proto.SessionStructure; + + /** + * Encodes the specified SessionStructure message. Does not implicitly {@link proto.SessionStructure.verify|verify} messages. + * @param message SessionStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISessionStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SessionStructure message, length delimited. Does not implicitly {@link proto.SessionStructure.verify|verify} messages. + * @param message SessionStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISessionStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SessionStructure message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SessionStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SessionStructure; + + /** + * Decodes a SessionStructure message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SessionStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SessionStructure; + + /** + * Verifies a SessionStructure message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SessionStructure message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SessionStructure + */ + public static fromObject(object: { [k: string]: any }): proto.SessionStructure; + + /** + * Creates a plain object from a SessionStructure message. Also converts values to other types if specified. + * @param message SessionStructure + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SessionStructure, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SessionStructure to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SignedPreKeyRecordStructure. */ + interface ISignedPreKeyRecordStructure { + + /** SignedPreKeyRecordStructure id */ + id?: (number|null); + + /** SignedPreKeyRecordStructure publicKey */ + publicKey?: (Uint8Array|null); + + /** SignedPreKeyRecordStructure privateKey */ + privateKey?: (Uint8Array|null); + + /** SignedPreKeyRecordStructure signature */ + signature?: (Uint8Array|null); + + /** SignedPreKeyRecordStructure timestamp */ + timestamp?: (number|Long|null); + } + + /** Represents a SignedPreKeyRecordStructure. */ + class SignedPreKeyRecordStructure implements ISignedPreKeyRecordStructure { + + /** + * Constructs a new SignedPreKeyRecordStructure. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISignedPreKeyRecordStructure); + + /** SignedPreKeyRecordStructure id. */ + public id: number; + + /** SignedPreKeyRecordStructure publicKey. */ + public publicKey: Uint8Array; + + /** SignedPreKeyRecordStructure privateKey. */ + public privateKey: Uint8Array; + + /** SignedPreKeyRecordStructure signature. */ + public signature: Uint8Array; + + /** SignedPreKeyRecordStructure timestamp. */ + public timestamp: (number|Long); + + /** + * Creates a new SignedPreKeyRecordStructure instance using the specified properties. + * @param [properties] Properties to set + * @returns SignedPreKeyRecordStructure instance + */ + public static create(properties?: proto.ISignedPreKeyRecordStructure): proto.SignedPreKeyRecordStructure; + + /** + * Encodes the specified SignedPreKeyRecordStructure message. Does not implicitly {@link proto.SignedPreKeyRecordStructure.verify|verify} messages. + * @param message SignedPreKeyRecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISignedPreKeyRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SignedPreKeyRecordStructure message, length delimited. Does not implicitly {@link proto.SignedPreKeyRecordStructure.verify|verify} messages. + * @param message SignedPreKeyRecordStructure message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISignedPreKeyRecordStructure, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SignedPreKeyRecordStructure message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SignedPreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SignedPreKeyRecordStructure; + + /** + * Decodes a SignedPreKeyRecordStructure message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SignedPreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SignedPreKeyRecordStructure; + + /** + * Verifies a SignedPreKeyRecordStructure message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SignedPreKeyRecordStructure message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SignedPreKeyRecordStructure + */ + public static fromObject(object: { [k: string]: any }): proto.SignedPreKeyRecordStructure; + + /** + * Creates a plain object from a SignedPreKeyRecordStructure message. Also converts values to other types if specified. + * @param message SignedPreKeyRecordStructure + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SignedPreKeyRecordStructure, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SignedPreKeyRecordStructure to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a StatusPSA. */ + interface IStatusPSA { + + /** StatusPSA campaignId */ + campaignId: (number|Long); + + /** StatusPSA campaignExpirationTimestamp */ + campaignExpirationTimestamp?: (number|Long|null); + } + + /** Represents a StatusPSA. */ + class StatusPSA implements IStatusPSA { + + /** + * Constructs a new StatusPSA. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IStatusPSA); + + /** StatusPSA campaignId. */ + public campaignId: (number|Long); + + /** StatusPSA campaignExpirationTimestamp. */ + public campaignExpirationTimestamp: (number|Long); + + /** + * Creates a new StatusPSA instance using the specified properties. + * @param [properties] Properties to set + * @returns StatusPSA instance + */ + public static create(properties?: proto.IStatusPSA): proto.StatusPSA; + + /** + * Encodes the specified StatusPSA message. Does not implicitly {@link proto.StatusPSA.verify|verify} messages. + * @param message StatusPSA message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IStatusPSA, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StatusPSA message, length delimited. Does not implicitly {@link proto.StatusPSA.verify|verify} messages. + * @param message StatusPSA message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IStatusPSA, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StatusPSA message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StatusPSA + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.StatusPSA; + + /** + * Decodes a StatusPSA message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StatusPSA + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.StatusPSA; + + /** + * Verifies a StatusPSA message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StatusPSA message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StatusPSA + */ + public static fromObject(object: { [k: string]: any }): proto.StatusPSA; + + /** + * Creates a plain object from a StatusPSA message. Also converts values to other types if specified. + * @param message StatusPSA + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.StatusPSA, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StatusPSA to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a StickerMetadata. */ + interface IStickerMetadata { + + /** StickerMetadata url */ + url?: (string|null); + + /** StickerMetadata fileSha256 */ + fileSha256?: (Uint8Array|null); + + /** StickerMetadata fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** StickerMetadata mediaKey */ + mediaKey?: (Uint8Array|null); + + /** StickerMetadata mimetype */ + mimetype?: (string|null); + + /** StickerMetadata height */ + height?: (number|null); + + /** StickerMetadata width */ + width?: (number|null); + + /** StickerMetadata directPath */ + directPath?: (string|null); + + /** StickerMetadata fileLength */ + fileLength?: (number|Long|null); + + /** StickerMetadata weight */ + weight?: (number|null); + + /** StickerMetadata lastStickerSentTs */ + lastStickerSentTs?: (number|Long|null); + } + + /** Represents a StickerMetadata. */ + class StickerMetadata implements IStickerMetadata { + + /** + * Constructs a new StickerMetadata. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IStickerMetadata); + + /** StickerMetadata url. */ + public url: string; + + /** StickerMetadata fileSha256. */ + public fileSha256: Uint8Array; + + /** StickerMetadata fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** StickerMetadata mediaKey. */ + public mediaKey: Uint8Array; + + /** StickerMetadata mimetype. */ + public mimetype: string; + + /** StickerMetadata height. */ + public height: number; + + /** StickerMetadata width. */ + public width: number; + + /** StickerMetadata directPath. */ + public directPath: string; + + /** StickerMetadata fileLength. */ + public fileLength: (number|Long); + + /** StickerMetadata weight. */ + public weight: number; + + /** StickerMetadata lastStickerSentTs. */ + public lastStickerSentTs: (number|Long); + + /** + * Creates a new StickerMetadata instance using the specified properties. + * @param [properties] Properties to set + * @returns StickerMetadata instance + */ + public static create(properties?: proto.IStickerMetadata): proto.StickerMetadata; + + /** + * Encodes the specified StickerMetadata message. Does not implicitly {@link proto.StickerMetadata.verify|verify} messages. + * @param message StickerMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IStickerMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StickerMetadata message, length delimited. Does not implicitly {@link proto.StickerMetadata.verify|verify} messages. + * @param message StickerMetadata message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IStickerMetadata, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StickerMetadata message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StickerMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.StickerMetadata; + + /** + * Decodes a StickerMetadata message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StickerMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.StickerMetadata; + + /** + * Verifies a StickerMetadata message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StickerMetadata message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StickerMetadata + */ + public static fromObject(object: { [k: string]: any }): proto.StickerMetadata; + + /** + * Creates a plain object from a StickerMetadata message. Also converts values to other types if specified. + * @param message StickerMetadata + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.StickerMetadata, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StickerMetadata to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncActionData. */ + interface ISyncActionData { + + /** SyncActionData index */ + index?: (Uint8Array|null); + + /** SyncActionData value */ + value?: (proto.ISyncActionValue|null); + + /** SyncActionData padding */ + padding?: (Uint8Array|null); + + /** SyncActionData version */ + version?: (number|null); + } + + /** Represents a SyncActionData. */ + class SyncActionData implements ISyncActionData { + + /** + * Constructs a new SyncActionData. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncActionData); + + /** SyncActionData index. */ + public index: Uint8Array; + + /** SyncActionData value. */ + public value?: (proto.ISyncActionValue|null); + + /** SyncActionData padding. */ + public padding: Uint8Array; + + /** SyncActionData version. */ + public version: number; + + /** + * Creates a new SyncActionData instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncActionData instance + */ + public static create(properties?: proto.ISyncActionData): proto.SyncActionData; + + /** + * Encodes the specified SyncActionData message. Does not implicitly {@link proto.SyncActionData.verify|verify} messages. + * @param message SyncActionData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncActionData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncActionData message, length delimited. Does not implicitly {@link proto.SyncActionData.verify|verify} messages. + * @param message SyncActionData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncActionData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncActionData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncActionData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionData; + + /** + * Decodes a SyncActionData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncActionData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionData; + + /** + * Verifies a SyncActionData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncActionData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncActionData + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionData; + + /** + * Creates a plain object from a SyncActionData message. Also converts values to other types if specified. + * @param message SyncActionData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncActionData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncActionValue. */ + interface ISyncActionValue { + + /** SyncActionValue timestamp */ + timestamp?: (number|Long|null); + + /** SyncActionValue starAction */ + starAction?: (proto.SyncActionValue.IStarAction|null); + + /** SyncActionValue contactAction */ + contactAction?: (proto.SyncActionValue.IContactAction|null); + + /** SyncActionValue muteAction */ + muteAction?: (proto.SyncActionValue.IMuteAction|null); + + /** SyncActionValue pinAction */ + pinAction?: (proto.SyncActionValue.IPinAction|null); + + /** SyncActionValue securityNotificationSetting */ + securityNotificationSetting?: (proto.SyncActionValue.ISecurityNotificationSetting|null); + + /** SyncActionValue pushNameSetting */ + pushNameSetting?: (proto.SyncActionValue.IPushNameSetting|null); + + /** SyncActionValue quickReplyAction */ + quickReplyAction?: (proto.SyncActionValue.IQuickReplyAction|null); + + /** SyncActionValue recentEmojiWeightsAction */ + recentEmojiWeightsAction?: (proto.SyncActionValue.IRecentEmojiWeightsAction|null); + + /** SyncActionValue labelEditAction */ + labelEditAction?: (proto.SyncActionValue.ILabelEditAction|null); + + /** SyncActionValue labelAssociationAction */ + labelAssociationAction?: (proto.SyncActionValue.ILabelAssociationAction|null); + + /** SyncActionValue localeSetting */ + localeSetting?: (proto.SyncActionValue.ILocaleSetting|null); + + /** SyncActionValue archiveChatAction */ + archiveChatAction?: (proto.SyncActionValue.IArchiveChatAction|null); + + /** SyncActionValue deleteMessageForMeAction */ + deleteMessageForMeAction?: (proto.SyncActionValue.IDeleteMessageForMeAction|null); + + /** SyncActionValue keyExpiration */ + keyExpiration?: (proto.SyncActionValue.IKeyExpiration|null); + + /** SyncActionValue markChatAsReadAction */ + markChatAsReadAction?: (proto.SyncActionValue.IMarkChatAsReadAction|null); + + /** SyncActionValue clearChatAction */ + clearChatAction?: (proto.SyncActionValue.IClearChatAction|null); + + /** SyncActionValue deleteChatAction */ + deleteChatAction?: (proto.SyncActionValue.IDeleteChatAction|null); + + /** SyncActionValue unarchiveChatsSetting */ + unarchiveChatsSetting?: (proto.SyncActionValue.IUnarchiveChatsSetting|null); + + /** SyncActionValue primaryFeature */ + primaryFeature?: (proto.SyncActionValue.IPrimaryFeature|null); + + /** SyncActionValue androidUnsupportedActions */ + androidUnsupportedActions?: (proto.SyncActionValue.IAndroidUnsupportedActions|null); + + /** SyncActionValue agentAction */ + agentAction?: (proto.SyncActionValue.IAgentAction|null); + + /** SyncActionValue subscriptionAction */ + subscriptionAction?: (proto.SyncActionValue.ISubscriptionAction|null); + + /** SyncActionValue userStatusMuteAction */ + userStatusMuteAction?: (proto.SyncActionValue.IUserStatusMuteAction|null); + + /** SyncActionValue timeFormatAction */ + timeFormatAction?: (proto.SyncActionValue.ITimeFormatAction|null); + + /** SyncActionValue nuxAction */ + nuxAction?: (proto.SyncActionValue.INuxAction|null); + + /** SyncActionValue primaryVersionAction */ + primaryVersionAction?: (proto.SyncActionValue.IPrimaryVersionAction|null); + + /** SyncActionValue stickerAction */ + stickerAction?: (proto.SyncActionValue.IStickerAction|null); + + /** SyncActionValue removeRecentStickerAction */ + removeRecentStickerAction?: (proto.SyncActionValue.IRemoveRecentStickerAction|null); + + /** SyncActionValue chatAssignment */ + chatAssignment?: (proto.SyncActionValue.IChatAssignmentAction|null); + + /** SyncActionValue chatAssignmentOpenedStatus */ + chatAssignmentOpenedStatus?: (proto.SyncActionValue.IChatAssignmentOpenedStatusAction|null); + } + + /** Represents a SyncActionValue. */ + class SyncActionValue implements ISyncActionValue { + + /** + * Constructs a new SyncActionValue. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncActionValue); + + /** SyncActionValue timestamp. */ + public timestamp: (number|Long); + + /** SyncActionValue starAction. */ + public starAction?: (proto.SyncActionValue.IStarAction|null); + + /** SyncActionValue contactAction. */ + public contactAction?: (proto.SyncActionValue.IContactAction|null); + + /** SyncActionValue muteAction. */ + public muteAction?: (proto.SyncActionValue.IMuteAction|null); + + /** SyncActionValue pinAction. */ + public pinAction?: (proto.SyncActionValue.IPinAction|null); + + /** SyncActionValue securityNotificationSetting. */ + public securityNotificationSetting?: (proto.SyncActionValue.ISecurityNotificationSetting|null); + + /** SyncActionValue pushNameSetting. */ + public pushNameSetting?: (proto.SyncActionValue.IPushNameSetting|null); + + /** SyncActionValue quickReplyAction. */ + public quickReplyAction?: (proto.SyncActionValue.IQuickReplyAction|null); + + /** SyncActionValue recentEmojiWeightsAction. */ + public recentEmojiWeightsAction?: (proto.SyncActionValue.IRecentEmojiWeightsAction|null); + + /** SyncActionValue labelEditAction. */ + public labelEditAction?: (proto.SyncActionValue.ILabelEditAction|null); + + /** SyncActionValue labelAssociationAction. */ + public labelAssociationAction?: (proto.SyncActionValue.ILabelAssociationAction|null); + + /** SyncActionValue localeSetting. */ + public localeSetting?: (proto.SyncActionValue.ILocaleSetting|null); + + /** SyncActionValue archiveChatAction. */ + public archiveChatAction?: (proto.SyncActionValue.IArchiveChatAction|null); + + /** SyncActionValue deleteMessageForMeAction. */ + public deleteMessageForMeAction?: (proto.SyncActionValue.IDeleteMessageForMeAction|null); + + /** SyncActionValue keyExpiration. */ + public keyExpiration?: (proto.SyncActionValue.IKeyExpiration|null); + + /** SyncActionValue markChatAsReadAction. */ + public markChatAsReadAction?: (proto.SyncActionValue.IMarkChatAsReadAction|null); + + /** SyncActionValue clearChatAction. */ + public clearChatAction?: (proto.SyncActionValue.IClearChatAction|null); + + /** SyncActionValue deleteChatAction. */ + public deleteChatAction?: (proto.SyncActionValue.IDeleteChatAction|null); + + /** SyncActionValue unarchiveChatsSetting. */ + public unarchiveChatsSetting?: (proto.SyncActionValue.IUnarchiveChatsSetting|null); + + /** SyncActionValue primaryFeature. */ + public primaryFeature?: (proto.SyncActionValue.IPrimaryFeature|null); + + /** SyncActionValue androidUnsupportedActions. */ + public androidUnsupportedActions?: (proto.SyncActionValue.IAndroidUnsupportedActions|null); + + /** SyncActionValue agentAction. */ + public agentAction?: (proto.SyncActionValue.IAgentAction|null); + + /** SyncActionValue subscriptionAction. */ + public subscriptionAction?: (proto.SyncActionValue.ISubscriptionAction|null); + + /** SyncActionValue userStatusMuteAction. */ + public userStatusMuteAction?: (proto.SyncActionValue.IUserStatusMuteAction|null); + + /** SyncActionValue timeFormatAction. */ + public timeFormatAction?: (proto.SyncActionValue.ITimeFormatAction|null); + + /** SyncActionValue nuxAction. */ + public nuxAction?: (proto.SyncActionValue.INuxAction|null); + + /** SyncActionValue primaryVersionAction. */ + public primaryVersionAction?: (proto.SyncActionValue.IPrimaryVersionAction|null); + + /** SyncActionValue stickerAction. */ + public stickerAction?: (proto.SyncActionValue.IStickerAction|null); + + /** SyncActionValue removeRecentStickerAction. */ + public removeRecentStickerAction?: (proto.SyncActionValue.IRemoveRecentStickerAction|null); + + /** SyncActionValue chatAssignment. */ + public chatAssignment?: (proto.SyncActionValue.IChatAssignmentAction|null); + + /** SyncActionValue chatAssignmentOpenedStatus. */ + public chatAssignmentOpenedStatus?: (proto.SyncActionValue.IChatAssignmentOpenedStatusAction|null); + + /** + * Creates a new SyncActionValue instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncActionValue instance + */ + public static create(properties?: proto.ISyncActionValue): proto.SyncActionValue; + + /** + * Encodes the specified SyncActionValue message. Does not implicitly {@link proto.SyncActionValue.verify|verify} messages. + * @param message SyncActionValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncActionValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncActionValue message, length delimited. Does not implicitly {@link proto.SyncActionValue.verify|verify} messages. + * @param message SyncActionValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncActionValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncActionValue message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncActionValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue; + + /** + * Decodes a SyncActionValue message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncActionValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue; + + /** + * Verifies a SyncActionValue message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncActionValue message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncActionValue + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue; + + /** + * Creates a plain object from a SyncActionValue message. Also converts values to other types if specified. + * @param message SyncActionValue + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncActionValue to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace SyncActionValue { + + /** Properties of an AgentAction. */ + interface IAgentAction { + + /** AgentAction name */ + name?: (string|null); + + /** AgentAction deviceID */ + deviceID?: (number|null); + + /** AgentAction isDeleted */ + isDeleted?: (boolean|null); + } + + /** Represents an AgentAction. */ + class AgentAction implements IAgentAction { + + /** + * Constructs a new AgentAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IAgentAction); + + /** AgentAction name. */ + public name: string; + + /** AgentAction deviceID. */ + public deviceID: number; + + /** AgentAction isDeleted. */ + public isDeleted: boolean; + + /** + * Creates a new AgentAction instance using the specified properties. + * @param [properties] Properties to set + * @returns AgentAction instance + */ + public static create(properties?: proto.SyncActionValue.IAgentAction): proto.SyncActionValue.AgentAction; + + /** + * Encodes the specified AgentAction message. Does not implicitly {@link proto.SyncActionValue.AgentAction.verify|verify} messages. + * @param message AgentAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IAgentAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AgentAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.AgentAction.verify|verify} messages. + * @param message AgentAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IAgentAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AgentAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AgentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.AgentAction; + + /** + * Decodes an AgentAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AgentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.AgentAction; + + /** + * Verifies an AgentAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AgentAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AgentAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.AgentAction; + + /** + * Creates a plain object from an AgentAction message. Also converts values to other types if specified. + * @param message AgentAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.AgentAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AgentAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an AndroidUnsupportedActions. */ + interface IAndroidUnsupportedActions { + + /** AndroidUnsupportedActions allowed */ + allowed?: (boolean|null); + } + + /** Represents an AndroidUnsupportedActions. */ + class AndroidUnsupportedActions implements IAndroidUnsupportedActions { + + /** + * Constructs a new AndroidUnsupportedActions. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IAndroidUnsupportedActions); + + /** AndroidUnsupportedActions allowed. */ + public allowed: boolean; + + /** + * Creates a new AndroidUnsupportedActions instance using the specified properties. + * @param [properties] Properties to set + * @returns AndroidUnsupportedActions instance + */ + public static create(properties?: proto.SyncActionValue.IAndroidUnsupportedActions): proto.SyncActionValue.AndroidUnsupportedActions; + + /** + * Encodes the specified AndroidUnsupportedActions message. Does not implicitly {@link proto.SyncActionValue.AndroidUnsupportedActions.verify|verify} messages. + * @param message AndroidUnsupportedActions message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IAndroidUnsupportedActions, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified AndroidUnsupportedActions message, length delimited. Does not implicitly {@link proto.SyncActionValue.AndroidUnsupportedActions.verify|verify} messages. + * @param message AndroidUnsupportedActions message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IAndroidUnsupportedActions, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an AndroidUnsupportedActions message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns AndroidUnsupportedActions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.AndroidUnsupportedActions; + + /** + * Decodes an AndroidUnsupportedActions message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns AndroidUnsupportedActions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.AndroidUnsupportedActions; + + /** + * Verifies an AndroidUnsupportedActions message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an AndroidUnsupportedActions message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns AndroidUnsupportedActions + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.AndroidUnsupportedActions; + + /** + * Creates a plain object from an AndroidUnsupportedActions message. Also converts values to other types if specified. + * @param message AndroidUnsupportedActions + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.AndroidUnsupportedActions, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this AndroidUnsupportedActions to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an ArchiveChatAction. */ + interface IArchiveChatAction { + + /** ArchiveChatAction archived */ + archived?: (boolean|null); + + /** ArchiveChatAction messageRange */ + messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + } + + /** Represents an ArchiveChatAction. */ + class ArchiveChatAction implements IArchiveChatAction { + + /** + * Constructs a new ArchiveChatAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IArchiveChatAction); + + /** ArchiveChatAction archived. */ + public archived: boolean; + + /** ArchiveChatAction messageRange. */ + public messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + + /** + * Creates a new ArchiveChatAction instance using the specified properties. + * @param [properties] Properties to set + * @returns ArchiveChatAction instance + */ + public static create(properties?: proto.SyncActionValue.IArchiveChatAction): proto.SyncActionValue.ArchiveChatAction; + + /** + * Encodes the specified ArchiveChatAction message. Does not implicitly {@link proto.SyncActionValue.ArchiveChatAction.verify|verify} messages. + * @param message ArchiveChatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IArchiveChatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ArchiveChatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ArchiveChatAction.verify|verify} messages. + * @param message ArchiveChatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IArchiveChatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an ArchiveChatAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ArchiveChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.ArchiveChatAction; + + /** + * Decodes an ArchiveChatAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ArchiveChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.ArchiveChatAction; + + /** + * Verifies an ArchiveChatAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an ArchiveChatAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ArchiveChatAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.ArchiveChatAction; + + /** + * Creates a plain object from an ArchiveChatAction message. Also converts values to other types if specified. + * @param message ArchiveChatAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.ArchiveChatAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ArchiveChatAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ChatAssignmentAction. */ + interface IChatAssignmentAction { + + /** ChatAssignmentAction deviceAgentID */ + deviceAgentID?: (string|null); + } + + /** Represents a ChatAssignmentAction. */ + class ChatAssignmentAction implements IChatAssignmentAction { + + /** + * Constructs a new ChatAssignmentAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IChatAssignmentAction); + + /** ChatAssignmentAction deviceAgentID. */ + public deviceAgentID: string; + + /** + * Creates a new ChatAssignmentAction instance using the specified properties. + * @param [properties] Properties to set + * @returns ChatAssignmentAction instance + */ + public static create(properties?: proto.SyncActionValue.IChatAssignmentAction): proto.SyncActionValue.ChatAssignmentAction; + + /** + * Encodes the specified ChatAssignmentAction message. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentAction.verify|verify} messages. + * @param message ChatAssignmentAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IChatAssignmentAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ChatAssignmentAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentAction.verify|verify} messages. + * @param message ChatAssignmentAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IChatAssignmentAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ChatAssignmentAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ChatAssignmentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.ChatAssignmentAction; + + /** + * Decodes a ChatAssignmentAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ChatAssignmentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.ChatAssignmentAction; + + /** + * Verifies a ChatAssignmentAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ChatAssignmentAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ChatAssignmentAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.ChatAssignmentAction; + + /** + * Creates a plain object from a ChatAssignmentAction message. Also converts values to other types if specified. + * @param message ChatAssignmentAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.ChatAssignmentAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ChatAssignmentAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ChatAssignmentOpenedStatusAction. */ + interface IChatAssignmentOpenedStatusAction { + + /** ChatAssignmentOpenedStatusAction chatOpened */ + chatOpened?: (boolean|null); + } + + /** Represents a ChatAssignmentOpenedStatusAction. */ + class ChatAssignmentOpenedStatusAction implements IChatAssignmentOpenedStatusAction { + + /** + * Constructs a new ChatAssignmentOpenedStatusAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IChatAssignmentOpenedStatusAction); + + /** ChatAssignmentOpenedStatusAction chatOpened. */ + public chatOpened: boolean; + + /** + * Creates a new ChatAssignmentOpenedStatusAction instance using the specified properties. + * @param [properties] Properties to set + * @returns ChatAssignmentOpenedStatusAction instance + */ + public static create(properties?: proto.SyncActionValue.IChatAssignmentOpenedStatusAction): proto.SyncActionValue.ChatAssignmentOpenedStatusAction; + + /** + * Encodes the specified ChatAssignmentOpenedStatusAction message. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentOpenedStatusAction.verify|verify} messages. + * @param message ChatAssignmentOpenedStatusAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IChatAssignmentOpenedStatusAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ChatAssignmentOpenedStatusAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentOpenedStatusAction.verify|verify} messages. + * @param message ChatAssignmentOpenedStatusAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IChatAssignmentOpenedStatusAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ChatAssignmentOpenedStatusAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ChatAssignmentOpenedStatusAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.ChatAssignmentOpenedStatusAction; + + /** + * Decodes a ChatAssignmentOpenedStatusAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ChatAssignmentOpenedStatusAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.ChatAssignmentOpenedStatusAction; + + /** + * Verifies a ChatAssignmentOpenedStatusAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ChatAssignmentOpenedStatusAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ChatAssignmentOpenedStatusAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.ChatAssignmentOpenedStatusAction; + + /** + * Creates a plain object from a ChatAssignmentOpenedStatusAction message. Also converts values to other types if specified. + * @param message ChatAssignmentOpenedStatusAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.ChatAssignmentOpenedStatusAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ChatAssignmentOpenedStatusAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ClearChatAction. */ + interface IClearChatAction { + + /** ClearChatAction messageRange */ + messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + } + + /** Represents a ClearChatAction. */ + class ClearChatAction implements IClearChatAction { + + /** + * Constructs a new ClearChatAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IClearChatAction); + + /** ClearChatAction messageRange. */ + public messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + + /** + * Creates a new ClearChatAction instance using the specified properties. + * @param [properties] Properties to set + * @returns ClearChatAction instance + */ + public static create(properties?: proto.SyncActionValue.IClearChatAction): proto.SyncActionValue.ClearChatAction; + + /** + * Encodes the specified ClearChatAction message. Does not implicitly {@link proto.SyncActionValue.ClearChatAction.verify|verify} messages. + * @param message ClearChatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IClearChatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ClearChatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ClearChatAction.verify|verify} messages. + * @param message ClearChatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IClearChatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ClearChatAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ClearChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.ClearChatAction; + + /** + * Decodes a ClearChatAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ClearChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.ClearChatAction; + + /** + * Verifies a ClearChatAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ClearChatAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ClearChatAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.ClearChatAction; + + /** + * Creates a plain object from a ClearChatAction message. Also converts values to other types if specified. + * @param message ClearChatAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.ClearChatAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ClearChatAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ContactAction. */ + interface IContactAction { + + /** ContactAction fullName */ + fullName?: (string|null); + + /** ContactAction firstName */ + firstName?: (string|null); + + /** ContactAction lidJid */ + lidJid?: (string|null); + } + + /** Represents a ContactAction. */ + class ContactAction implements IContactAction { + + /** + * Constructs a new ContactAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IContactAction); + + /** ContactAction fullName. */ + public fullName: string; + + /** ContactAction firstName. */ + public firstName: string; + + /** ContactAction lidJid. */ + public lidJid: string; + + /** + * Creates a new ContactAction instance using the specified properties. + * @param [properties] Properties to set + * @returns ContactAction instance + */ + public static create(properties?: proto.SyncActionValue.IContactAction): proto.SyncActionValue.ContactAction; + + /** + * Encodes the specified ContactAction message. Does not implicitly {@link proto.SyncActionValue.ContactAction.verify|verify} messages. + * @param message ContactAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IContactAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ContactAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ContactAction.verify|verify} messages. + * @param message ContactAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IContactAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ContactAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ContactAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.ContactAction; + + /** + * Decodes a ContactAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ContactAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.ContactAction; + + /** + * Verifies a ContactAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ContactAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ContactAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.ContactAction; + + /** + * Creates a plain object from a ContactAction message. Also converts values to other types if specified. + * @param message ContactAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.ContactAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ContactAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a DeleteChatAction. */ + interface IDeleteChatAction { + + /** DeleteChatAction messageRange */ + messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + } + + /** Represents a DeleteChatAction. */ + class DeleteChatAction implements IDeleteChatAction { + + /** + * Constructs a new DeleteChatAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IDeleteChatAction); + + /** DeleteChatAction messageRange. */ + public messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + + /** + * Creates a new DeleteChatAction instance using the specified properties. + * @param [properties] Properties to set + * @returns DeleteChatAction instance + */ + public static create(properties?: proto.SyncActionValue.IDeleteChatAction): proto.SyncActionValue.DeleteChatAction; + + /** + * Encodes the specified DeleteChatAction message. Does not implicitly {@link proto.SyncActionValue.DeleteChatAction.verify|verify} messages. + * @param message DeleteChatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IDeleteChatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeleteChatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.DeleteChatAction.verify|verify} messages. + * @param message DeleteChatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IDeleteChatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeleteChatAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeleteChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.DeleteChatAction; + + /** + * Decodes a DeleteChatAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeleteChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.DeleteChatAction; + + /** + * Verifies a DeleteChatAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeleteChatAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeleteChatAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.DeleteChatAction; + + /** + * Creates a plain object from a DeleteChatAction message. Also converts values to other types if specified. + * @param message DeleteChatAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.DeleteChatAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeleteChatAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a DeleteMessageForMeAction. */ + interface IDeleteMessageForMeAction { + + /** DeleteMessageForMeAction deleteMedia */ + deleteMedia?: (boolean|null); + + /** DeleteMessageForMeAction messageTimestamp */ + messageTimestamp?: (number|Long|null); + } + + /** Represents a DeleteMessageForMeAction. */ + class DeleteMessageForMeAction implements IDeleteMessageForMeAction { + + /** + * Constructs a new DeleteMessageForMeAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IDeleteMessageForMeAction); + + /** DeleteMessageForMeAction deleteMedia. */ + public deleteMedia: boolean; + + /** DeleteMessageForMeAction messageTimestamp. */ + public messageTimestamp: (number|Long); + + /** + * Creates a new DeleteMessageForMeAction instance using the specified properties. + * @param [properties] Properties to set + * @returns DeleteMessageForMeAction instance + */ + public static create(properties?: proto.SyncActionValue.IDeleteMessageForMeAction): proto.SyncActionValue.DeleteMessageForMeAction; + + /** + * Encodes the specified DeleteMessageForMeAction message. Does not implicitly {@link proto.SyncActionValue.DeleteMessageForMeAction.verify|verify} messages. + * @param message DeleteMessageForMeAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IDeleteMessageForMeAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DeleteMessageForMeAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.DeleteMessageForMeAction.verify|verify} messages. + * @param message DeleteMessageForMeAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IDeleteMessageForMeAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DeleteMessageForMeAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DeleteMessageForMeAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.DeleteMessageForMeAction; + + /** + * Decodes a DeleteMessageForMeAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DeleteMessageForMeAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.DeleteMessageForMeAction; + + /** + * Verifies a DeleteMessageForMeAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DeleteMessageForMeAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DeleteMessageForMeAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.DeleteMessageForMeAction; + + /** + * Creates a plain object from a DeleteMessageForMeAction message. Also converts values to other types if specified. + * @param message DeleteMessageForMeAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.DeleteMessageForMeAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DeleteMessageForMeAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a KeyExpiration. */ + interface IKeyExpiration { + + /** KeyExpiration expiredKeyEpoch */ + expiredKeyEpoch?: (number|null); + } + + /** Represents a KeyExpiration. */ + class KeyExpiration implements IKeyExpiration { + + /** + * Constructs a new KeyExpiration. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IKeyExpiration); + + /** KeyExpiration expiredKeyEpoch. */ + public expiredKeyEpoch: number; + + /** + * Creates a new KeyExpiration instance using the specified properties. + * @param [properties] Properties to set + * @returns KeyExpiration instance + */ + public static create(properties?: proto.SyncActionValue.IKeyExpiration): proto.SyncActionValue.KeyExpiration; + + /** + * Encodes the specified KeyExpiration message. Does not implicitly {@link proto.SyncActionValue.KeyExpiration.verify|verify} messages. + * @param message KeyExpiration message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IKeyExpiration, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified KeyExpiration message, length delimited. Does not implicitly {@link proto.SyncActionValue.KeyExpiration.verify|verify} messages. + * @param message KeyExpiration message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IKeyExpiration, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a KeyExpiration message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns KeyExpiration + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.KeyExpiration; + + /** + * Decodes a KeyExpiration message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns KeyExpiration + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.KeyExpiration; + + /** + * Verifies a KeyExpiration message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a KeyExpiration message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns KeyExpiration + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.KeyExpiration; + + /** + * Creates a plain object from a KeyExpiration message. Also converts values to other types if specified. + * @param message KeyExpiration + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.KeyExpiration, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this KeyExpiration to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a LabelAssociationAction. */ + interface ILabelAssociationAction { + + /** LabelAssociationAction labeled */ + labeled?: (boolean|null); + } + + /** Represents a LabelAssociationAction. */ + class LabelAssociationAction implements ILabelAssociationAction { + + /** + * Constructs a new LabelAssociationAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ILabelAssociationAction); + + /** LabelAssociationAction labeled. */ + public labeled: boolean; + + /** + * Creates a new LabelAssociationAction instance using the specified properties. + * @param [properties] Properties to set + * @returns LabelAssociationAction instance + */ + public static create(properties?: proto.SyncActionValue.ILabelAssociationAction): proto.SyncActionValue.LabelAssociationAction; + + /** + * Encodes the specified LabelAssociationAction message. Does not implicitly {@link proto.SyncActionValue.LabelAssociationAction.verify|verify} messages. + * @param message LabelAssociationAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ILabelAssociationAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LabelAssociationAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.LabelAssociationAction.verify|verify} messages. + * @param message LabelAssociationAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ILabelAssociationAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LabelAssociationAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LabelAssociationAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.LabelAssociationAction; + + /** + * Decodes a LabelAssociationAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LabelAssociationAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.LabelAssociationAction; + + /** + * Verifies a LabelAssociationAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LabelAssociationAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LabelAssociationAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.LabelAssociationAction; + + /** + * Creates a plain object from a LabelAssociationAction message. Also converts values to other types if specified. + * @param message LabelAssociationAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.LabelAssociationAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LabelAssociationAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a LabelEditAction. */ + interface ILabelEditAction { + + /** LabelEditAction name */ + name?: (string|null); + + /** LabelEditAction color */ + color?: (number|null); + + /** LabelEditAction predefinedId */ + predefinedId?: (number|null); + + /** LabelEditAction deleted */ + deleted?: (boolean|null); + } + + /** Represents a LabelEditAction. */ + class LabelEditAction implements ILabelEditAction { + + /** + * Constructs a new LabelEditAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ILabelEditAction); + + /** LabelEditAction name. */ + public name: string; + + /** LabelEditAction color. */ + public color: number; + + /** LabelEditAction predefinedId. */ + public predefinedId: number; + + /** LabelEditAction deleted. */ + public deleted: boolean; + + /** + * Creates a new LabelEditAction instance using the specified properties. + * @param [properties] Properties to set + * @returns LabelEditAction instance + */ + public static create(properties?: proto.SyncActionValue.ILabelEditAction): proto.SyncActionValue.LabelEditAction; + + /** + * Encodes the specified LabelEditAction message. Does not implicitly {@link proto.SyncActionValue.LabelEditAction.verify|verify} messages. + * @param message LabelEditAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ILabelEditAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LabelEditAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.LabelEditAction.verify|verify} messages. + * @param message LabelEditAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ILabelEditAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LabelEditAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LabelEditAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.LabelEditAction; + + /** + * Decodes a LabelEditAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LabelEditAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.LabelEditAction; + + /** + * Verifies a LabelEditAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LabelEditAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LabelEditAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.LabelEditAction; + + /** + * Creates a plain object from a LabelEditAction message. Also converts values to other types if specified. + * @param message LabelEditAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.LabelEditAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LabelEditAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a LocaleSetting. */ + interface ILocaleSetting { + + /** LocaleSetting locale */ + locale?: (string|null); + } + + /** Represents a LocaleSetting. */ + class LocaleSetting implements ILocaleSetting { + + /** + * Constructs a new LocaleSetting. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ILocaleSetting); + + /** LocaleSetting locale. */ + public locale: string; + + /** + * Creates a new LocaleSetting instance using the specified properties. + * @param [properties] Properties to set + * @returns LocaleSetting instance + */ + public static create(properties?: proto.SyncActionValue.ILocaleSetting): proto.SyncActionValue.LocaleSetting; + + /** + * Encodes the specified LocaleSetting message. Does not implicitly {@link proto.SyncActionValue.LocaleSetting.verify|verify} messages. + * @param message LocaleSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ILocaleSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified LocaleSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.LocaleSetting.verify|verify} messages. + * @param message LocaleSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ILocaleSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a LocaleSetting message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns LocaleSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.LocaleSetting; + + /** + * Decodes a LocaleSetting message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns LocaleSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.LocaleSetting; + + /** + * Verifies a LocaleSetting message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a LocaleSetting message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns LocaleSetting + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.LocaleSetting; + + /** + * Creates a plain object from a LocaleSetting message. Also converts values to other types if specified. + * @param message LocaleSetting + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.LocaleSetting, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this LocaleSetting to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a MarkChatAsReadAction. */ + interface IMarkChatAsReadAction { + + /** MarkChatAsReadAction read */ + read?: (boolean|null); + + /** MarkChatAsReadAction messageRange */ + messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + } + + /** Represents a MarkChatAsReadAction. */ + class MarkChatAsReadAction implements IMarkChatAsReadAction { + + /** + * Constructs a new MarkChatAsReadAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IMarkChatAsReadAction); + + /** MarkChatAsReadAction read. */ + public read: boolean; + + /** MarkChatAsReadAction messageRange. */ + public messageRange?: (proto.SyncActionValue.ISyncActionMessageRange|null); + + /** + * Creates a new MarkChatAsReadAction instance using the specified properties. + * @param [properties] Properties to set + * @returns MarkChatAsReadAction instance + */ + public static create(properties?: proto.SyncActionValue.IMarkChatAsReadAction): proto.SyncActionValue.MarkChatAsReadAction; + + /** + * Encodes the specified MarkChatAsReadAction message. Does not implicitly {@link proto.SyncActionValue.MarkChatAsReadAction.verify|verify} messages. + * @param message MarkChatAsReadAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IMarkChatAsReadAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MarkChatAsReadAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.MarkChatAsReadAction.verify|verify} messages. + * @param message MarkChatAsReadAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IMarkChatAsReadAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MarkChatAsReadAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MarkChatAsReadAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.MarkChatAsReadAction; + + /** + * Decodes a MarkChatAsReadAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MarkChatAsReadAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.MarkChatAsReadAction; + + /** + * Verifies a MarkChatAsReadAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MarkChatAsReadAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MarkChatAsReadAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.MarkChatAsReadAction; + + /** + * Creates a plain object from a MarkChatAsReadAction message. Also converts values to other types if specified. + * @param message MarkChatAsReadAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.MarkChatAsReadAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MarkChatAsReadAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a MuteAction. */ + interface IMuteAction { + + /** MuteAction muted */ + muted?: (boolean|null); + + /** MuteAction muteEndTimestamp */ + muteEndTimestamp?: (number|Long|null); + + /** MuteAction autoMuted */ + autoMuted?: (boolean|null); + } + + /** Represents a MuteAction. */ + class MuteAction implements IMuteAction { + + /** + * Constructs a new MuteAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IMuteAction); + + /** MuteAction muted. */ + public muted: boolean; + + /** MuteAction muteEndTimestamp. */ + public muteEndTimestamp: (number|Long); + + /** MuteAction autoMuted. */ + public autoMuted: boolean; + + /** + * Creates a new MuteAction instance using the specified properties. + * @param [properties] Properties to set + * @returns MuteAction instance + */ + public static create(properties?: proto.SyncActionValue.IMuteAction): proto.SyncActionValue.MuteAction; + + /** + * Encodes the specified MuteAction message. Does not implicitly {@link proto.SyncActionValue.MuteAction.verify|verify} messages. + * @param message MuteAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IMuteAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified MuteAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.MuteAction.verify|verify} messages. + * @param message MuteAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IMuteAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a MuteAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns MuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.MuteAction; + + /** + * Decodes a MuteAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns MuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.MuteAction; + + /** + * Verifies a MuteAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a MuteAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns MuteAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.MuteAction; + + /** + * Creates a plain object from a MuteAction message. Also converts values to other types if specified. + * @param message MuteAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.MuteAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this MuteAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a NuxAction. */ + interface INuxAction { + + /** NuxAction acknowledged */ + acknowledged?: (boolean|null); + } + + /** Represents a NuxAction. */ + class NuxAction implements INuxAction { + + /** + * Constructs a new NuxAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.INuxAction); + + /** NuxAction acknowledged. */ + public acknowledged: boolean; + + /** + * Creates a new NuxAction instance using the specified properties. + * @param [properties] Properties to set + * @returns NuxAction instance + */ + public static create(properties?: proto.SyncActionValue.INuxAction): proto.SyncActionValue.NuxAction; + + /** + * Encodes the specified NuxAction message. Does not implicitly {@link proto.SyncActionValue.NuxAction.verify|verify} messages. + * @param message NuxAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.INuxAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified NuxAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.NuxAction.verify|verify} messages. + * @param message NuxAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.INuxAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a NuxAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns NuxAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.NuxAction; + + /** + * Decodes a NuxAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns NuxAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.NuxAction; + + /** + * Verifies a NuxAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a NuxAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns NuxAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.NuxAction; + + /** + * Creates a plain object from a NuxAction message. Also converts values to other types if specified. + * @param message NuxAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.NuxAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this NuxAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PinAction. */ + interface IPinAction { + + /** PinAction pinned */ + pinned?: (boolean|null); + } + + /** Represents a PinAction. */ + class PinAction implements IPinAction { + + /** + * Constructs a new PinAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IPinAction); + + /** PinAction pinned. */ + public pinned: boolean; + + /** + * Creates a new PinAction instance using the specified properties. + * @param [properties] Properties to set + * @returns PinAction instance + */ + public static create(properties?: proto.SyncActionValue.IPinAction): proto.SyncActionValue.PinAction; + + /** + * Encodes the specified PinAction message. Does not implicitly {@link proto.SyncActionValue.PinAction.verify|verify} messages. + * @param message PinAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IPinAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PinAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.PinAction.verify|verify} messages. + * @param message PinAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IPinAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PinAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PinAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.PinAction; + + /** + * Decodes a PinAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PinAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.PinAction; + + /** + * Verifies a PinAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PinAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PinAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.PinAction; + + /** + * Creates a plain object from a PinAction message. Also converts values to other types if specified. + * @param message PinAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.PinAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PinAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PrimaryFeature. */ + interface IPrimaryFeature { + + /** PrimaryFeature flags */ + flags?: (string[]|null); + } + + /** Represents a PrimaryFeature. */ + class PrimaryFeature implements IPrimaryFeature { + + /** + * Constructs a new PrimaryFeature. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IPrimaryFeature); + + /** PrimaryFeature flags. */ + public flags: string[]; + + /** + * Creates a new PrimaryFeature instance using the specified properties. + * @param [properties] Properties to set + * @returns PrimaryFeature instance + */ + public static create(properties?: proto.SyncActionValue.IPrimaryFeature): proto.SyncActionValue.PrimaryFeature; + + /** + * Encodes the specified PrimaryFeature message. Does not implicitly {@link proto.SyncActionValue.PrimaryFeature.verify|verify} messages. + * @param message PrimaryFeature message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IPrimaryFeature, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PrimaryFeature message, length delimited. Does not implicitly {@link proto.SyncActionValue.PrimaryFeature.verify|verify} messages. + * @param message PrimaryFeature message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IPrimaryFeature, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PrimaryFeature message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PrimaryFeature + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.PrimaryFeature; + + /** + * Decodes a PrimaryFeature message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PrimaryFeature + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.PrimaryFeature; + + /** + * Verifies a PrimaryFeature message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PrimaryFeature message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PrimaryFeature + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.PrimaryFeature; + + /** + * Creates a plain object from a PrimaryFeature message. Also converts values to other types if specified. + * @param message PrimaryFeature + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.PrimaryFeature, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PrimaryFeature to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PrimaryVersionAction. */ + interface IPrimaryVersionAction { + + /** PrimaryVersionAction version */ + version?: (string|null); + } + + /** Represents a PrimaryVersionAction. */ + class PrimaryVersionAction implements IPrimaryVersionAction { + + /** + * Constructs a new PrimaryVersionAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IPrimaryVersionAction); + + /** PrimaryVersionAction version. */ + public version: string; + + /** + * Creates a new PrimaryVersionAction instance using the specified properties. + * @param [properties] Properties to set + * @returns PrimaryVersionAction instance + */ + public static create(properties?: proto.SyncActionValue.IPrimaryVersionAction): proto.SyncActionValue.PrimaryVersionAction; + + /** + * Encodes the specified PrimaryVersionAction message. Does not implicitly {@link proto.SyncActionValue.PrimaryVersionAction.verify|verify} messages. + * @param message PrimaryVersionAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IPrimaryVersionAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PrimaryVersionAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.PrimaryVersionAction.verify|verify} messages. + * @param message PrimaryVersionAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IPrimaryVersionAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PrimaryVersionAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PrimaryVersionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.PrimaryVersionAction; + + /** + * Decodes a PrimaryVersionAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PrimaryVersionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.PrimaryVersionAction; + + /** + * Verifies a PrimaryVersionAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PrimaryVersionAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PrimaryVersionAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.PrimaryVersionAction; + + /** + * Creates a plain object from a PrimaryVersionAction message. Also converts values to other types if specified. + * @param message PrimaryVersionAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.PrimaryVersionAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PrimaryVersionAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a PushNameSetting. */ + interface IPushNameSetting { + + /** PushNameSetting name */ + name?: (string|null); + } + + /** Represents a PushNameSetting. */ + class PushNameSetting implements IPushNameSetting { + + /** + * Constructs a new PushNameSetting. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IPushNameSetting); + + /** PushNameSetting name. */ + public name: string; + + /** + * Creates a new PushNameSetting instance using the specified properties. + * @param [properties] Properties to set + * @returns PushNameSetting instance + */ + public static create(properties?: proto.SyncActionValue.IPushNameSetting): proto.SyncActionValue.PushNameSetting; + + /** + * Encodes the specified PushNameSetting message. Does not implicitly {@link proto.SyncActionValue.PushNameSetting.verify|verify} messages. + * @param message PushNameSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IPushNameSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified PushNameSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.PushNameSetting.verify|verify} messages. + * @param message PushNameSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IPushNameSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a PushNameSetting message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns PushNameSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.PushNameSetting; + + /** + * Decodes a PushNameSetting message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns PushNameSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.PushNameSetting; + + /** + * Verifies a PushNameSetting message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a PushNameSetting message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns PushNameSetting + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.PushNameSetting; + + /** + * Creates a plain object from a PushNameSetting message. Also converts values to other types if specified. + * @param message PushNameSetting + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.PushNameSetting, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this PushNameSetting to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a QuickReplyAction. */ + interface IQuickReplyAction { + + /** QuickReplyAction shortcut */ + shortcut?: (string|null); + + /** QuickReplyAction message */ + message?: (string|null); + + /** QuickReplyAction keywords */ + keywords?: (string[]|null); + + /** QuickReplyAction count */ + count?: (number|null); + + /** QuickReplyAction deleted */ + deleted?: (boolean|null); + } + + /** Represents a QuickReplyAction. */ + class QuickReplyAction implements IQuickReplyAction { + + /** + * Constructs a new QuickReplyAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IQuickReplyAction); + + /** QuickReplyAction shortcut. */ + public shortcut: string; + + /** QuickReplyAction message. */ + public message: string; + + /** QuickReplyAction keywords. */ + public keywords: string[]; + + /** QuickReplyAction count. */ + public count: number; + + /** QuickReplyAction deleted. */ + public deleted: boolean; + + /** + * Creates a new QuickReplyAction instance using the specified properties. + * @param [properties] Properties to set + * @returns QuickReplyAction instance + */ + public static create(properties?: proto.SyncActionValue.IQuickReplyAction): proto.SyncActionValue.QuickReplyAction; + + /** + * Encodes the specified QuickReplyAction message. Does not implicitly {@link proto.SyncActionValue.QuickReplyAction.verify|verify} messages. + * @param message QuickReplyAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IQuickReplyAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified QuickReplyAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.QuickReplyAction.verify|verify} messages. + * @param message QuickReplyAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IQuickReplyAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a QuickReplyAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns QuickReplyAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.QuickReplyAction; + + /** + * Decodes a QuickReplyAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns QuickReplyAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.QuickReplyAction; + + /** + * Verifies a QuickReplyAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a QuickReplyAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns QuickReplyAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.QuickReplyAction; + + /** + * Creates a plain object from a QuickReplyAction message. Also converts values to other types if specified. + * @param message QuickReplyAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.QuickReplyAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this QuickReplyAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a RecentEmojiWeightsAction. */ + interface IRecentEmojiWeightsAction { + + /** RecentEmojiWeightsAction weights */ + weights?: (proto.IRecentEmojiWeight[]|null); + } + + /** Represents a RecentEmojiWeightsAction. */ + class RecentEmojiWeightsAction implements IRecentEmojiWeightsAction { + + /** + * Constructs a new RecentEmojiWeightsAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IRecentEmojiWeightsAction); + + /** RecentEmojiWeightsAction weights. */ + public weights: proto.IRecentEmojiWeight[]; + + /** + * Creates a new RecentEmojiWeightsAction instance using the specified properties. + * @param [properties] Properties to set + * @returns RecentEmojiWeightsAction instance + */ + public static create(properties?: proto.SyncActionValue.IRecentEmojiWeightsAction): proto.SyncActionValue.RecentEmojiWeightsAction; + + /** + * Encodes the specified RecentEmojiWeightsAction message. Does not implicitly {@link proto.SyncActionValue.RecentEmojiWeightsAction.verify|verify} messages. + * @param message RecentEmojiWeightsAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IRecentEmojiWeightsAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RecentEmojiWeightsAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.RecentEmojiWeightsAction.verify|verify} messages. + * @param message RecentEmojiWeightsAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IRecentEmojiWeightsAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RecentEmojiWeightsAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RecentEmojiWeightsAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.RecentEmojiWeightsAction; + + /** + * Decodes a RecentEmojiWeightsAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RecentEmojiWeightsAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.RecentEmojiWeightsAction; + + /** + * Verifies a RecentEmojiWeightsAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RecentEmojiWeightsAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RecentEmojiWeightsAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.RecentEmojiWeightsAction; + + /** + * Creates a plain object from a RecentEmojiWeightsAction message. Also converts values to other types if specified. + * @param message RecentEmojiWeightsAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.RecentEmojiWeightsAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RecentEmojiWeightsAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a RemoveRecentStickerAction. */ + interface IRemoveRecentStickerAction { + + /** RemoveRecentStickerAction lastStickerSentTs */ + lastStickerSentTs?: (number|Long|null); + } + + /** Represents a RemoveRecentStickerAction. */ + class RemoveRecentStickerAction implements IRemoveRecentStickerAction { + + /** + * Constructs a new RemoveRecentStickerAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IRemoveRecentStickerAction); + + /** RemoveRecentStickerAction lastStickerSentTs. */ + public lastStickerSentTs: (number|Long); + + /** + * Creates a new RemoveRecentStickerAction instance using the specified properties. + * @param [properties] Properties to set + * @returns RemoveRecentStickerAction instance + */ + public static create(properties?: proto.SyncActionValue.IRemoveRecentStickerAction): proto.SyncActionValue.RemoveRecentStickerAction; + + /** + * Encodes the specified RemoveRecentStickerAction message. Does not implicitly {@link proto.SyncActionValue.RemoveRecentStickerAction.verify|verify} messages. + * @param message RemoveRecentStickerAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IRemoveRecentStickerAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RemoveRecentStickerAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.RemoveRecentStickerAction.verify|verify} messages. + * @param message RemoveRecentStickerAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IRemoveRecentStickerAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RemoveRecentStickerAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RemoveRecentStickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.RemoveRecentStickerAction; + + /** + * Decodes a RemoveRecentStickerAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RemoveRecentStickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.RemoveRecentStickerAction; + + /** + * Verifies a RemoveRecentStickerAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RemoveRecentStickerAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RemoveRecentStickerAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.RemoveRecentStickerAction; + + /** + * Creates a plain object from a RemoveRecentStickerAction message. Also converts values to other types if specified. + * @param message RemoveRecentStickerAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.RemoveRecentStickerAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RemoveRecentStickerAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SecurityNotificationSetting. */ + interface ISecurityNotificationSetting { + + /** SecurityNotificationSetting showNotification */ + showNotification?: (boolean|null); + } + + /** Represents a SecurityNotificationSetting. */ + class SecurityNotificationSetting implements ISecurityNotificationSetting { + + /** + * Constructs a new SecurityNotificationSetting. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ISecurityNotificationSetting); + + /** SecurityNotificationSetting showNotification. */ + public showNotification: boolean; + + /** + * Creates a new SecurityNotificationSetting instance using the specified properties. + * @param [properties] Properties to set + * @returns SecurityNotificationSetting instance + */ + public static create(properties?: proto.SyncActionValue.ISecurityNotificationSetting): proto.SyncActionValue.SecurityNotificationSetting; + + /** + * Encodes the specified SecurityNotificationSetting message. Does not implicitly {@link proto.SyncActionValue.SecurityNotificationSetting.verify|verify} messages. + * @param message SecurityNotificationSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ISecurityNotificationSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SecurityNotificationSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.SecurityNotificationSetting.verify|verify} messages. + * @param message SecurityNotificationSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ISecurityNotificationSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SecurityNotificationSetting message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SecurityNotificationSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.SecurityNotificationSetting; + + /** + * Decodes a SecurityNotificationSetting message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SecurityNotificationSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.SecurityNotificationSetting; + + /** + * Verifies a SecurityNotificationSetting message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SecurityNotificationSetting message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SecurityNotificationSetting + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.SecurityNotificationSetting; + + /** + * Creates a plain object from a SecurityNotificationSetting message. Also converts values to other types if specified. + * @param message SecurityNotificationSetting + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.SecurityNotificationSetting, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SecurityNotificationSetting to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a StarAction. */ + interface IStarAction { + + /** StarAction starred */ + starred?: (boolean|null); + } + + /** Represents a StarAction. */ + class StarAction implements IStarAction { + + /** + * Constructs a new StarAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IStarAction); + + /** StarAction starred. */ + public starred: boolean; + + /** + * Creates a new StarAction instance using the specified properties. + * @param [properties] Properties to set + * @returns StarAction instance + */ + public static create(properties?: proto.SyncActionValue.IStarAction): proto.SyncActionValue.StarAction; + + /** + * Encodes the specified StarAction message. Does not implicitly {@link proto.SyncActionValue.StarAction.verify|verify} messages. + * @param message StarAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IStarAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StarAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.StarAction.verify|verify} messages. + * @param message StarAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IStarAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StarAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StarAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.StarAction; + + /** + * Decodes a StarAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StarAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.StarAction; + + /** + * Verifies a StarAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StarAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StarAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.StarAction; + + /** + * Creates a plain object from a StarAction message. Also converts values to other types if specified. + * @param message StarAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.StarAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StarAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a StickerAction. */ + interface IStickerAction { + + /** StickerAction url */ + url?: (string|null); + + /** StickerAction fileEncSha256 */ + fileEncSha256?: (Uint8Array|null); + + /** StickerAction mediaKey */ + mediaKey?: (Uint8Array|null); + + /** StickerAction mimetype */ + mimetype?: (string|null); + + /** StickerAction height */ + height?: (number|null); + + /** StickerAction width */ + width?: (number|null); + + /** StickerAction directPath */ + directPath?: (string|null); + + /** StickerAction fileLength */ + fileLength?: (number|Long|null); + + /** StickerAction isFavorite */ + isFavorite?: (boolean|null); + + /** StickerAction deviceIdHint */ + deviceIdHint?: (number|null); + } + + /** Represents a StickerAction. */ + class StickerAction implements IStickerAction { + + /** + * Constructs a new StickerAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IStickerAction); + + /** StickerAction url. */ + public url: string; + + /** StickerAction fileEncSha256. */ + public fileEncSha256: Uint8Array; + + /** StickerAction mediaKey. */ + public mediaKey: Uint8Array; + + /** StickerAction mimetype. */ + public mimetype: string; + + /** StickerAction height. */ + public height: number; + + /** StickerAction width. */ + public width: number; + + /** StickerAction directPath. */ + public directPath: string; + + /** StickerAction fileLength. */ + public fileLength: (number|Long); + + /** StickerAction isFavorite. */ + public isFavorite: boolean; + + /** StickerAction deviceIdHint. */ + public deviceIdHint: number; + + /** + * Creates a new StickerAction instance using the specified properties. + * @param [properties] Properties to set + * @returns StickerAction instance + */ + public static create(properties?: proto.SyncActionValue.IStickerAction): proto.SyncActionValue.StickerAction; + + /** + * Encodes the specified StickerAction message. Does not implicitly {@link proto.SyncActionValue.StickerAction.verify|verify} messages. + * @param message StickerAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IStickerAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StickerAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.StickerAction.verify|verify} messages. + * @param message StickerAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IStickerAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StickerAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.StickerAction; + + /** + * Decodes a StickerAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.StickerAction; + + /** + * Verifies a StickerAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StickerAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StickerAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.StickerAction; + + /** + * Creates a plain object from a StickerAction message. Also converts values to other types if specified. + * @param message StickerAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.StickerAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StickerAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SubscriptionAction. */ + interface ISubscriptionAction { + + /** SubscriptionAction isDeactivated */ + isDeactivated?: (boolean|null); + + /** SubscriptionAction isAutoRenewing */ + isAutoRenewing?: (boolean|null); + + /** SubscriptionAction expirationDate */ + expirationDate?: (number|Long|null); + } + + /** Represents a SubscriptionAction. */ + class SubscriptionAction implements ISubscriptionAction { + + /** + * Constructs a new SubscriptionAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ISubscriptionAction); + + /** SubscriptionAction isDeactivated. */ + public isDeactivated: boolean; + + /** SubscriptionAction isAutoRenewing. */ + public isAutoRenewing: boolean; + + /** SubscriptionAction expirationDate. */ + public expirationDate: (number|Long); + + /** + * Creates a new SubscriptionAction instance using the specified properties. + * @param [properties] Properties to set + * @returns SubscriptionAction instance + */ + public static create(properties?: proto.SyncActionValue.ISubscriptionAction): proto.SyncActionValue.SubscriptionAction; + + /** + * Encodes the specified SubscriptionAction message. Does not implicitly {@link proto.SyncActionValue.SubscriptionAction.verify|verify} messages. + * @param message SubscriptionAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ISubscriptionAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SubscriptionAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.SubscriptionAction.verify|verify} messages. + * @param message SubscriptionAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ISubscriptionAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SubscriptionAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SubscriptionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.SubscriptionAction; + + /** + * Decodes a SubscriptionAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SubscriptionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.SubscriptionAction; + + /** + * Verifies a SubscriptionAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SubscriptionAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SubscriptionAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.SubscriptionAction; + + /** + * Creates a plain object from a SubscriptionAction message. Also converts values to other types if specified. + * @param message SubscriptionAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.SubscriptionAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SubscriptionAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncActionMessage. */ + interface ISyncActionMessage { + + /** SyncActionMessage key */ + key?: (proto.IMessageKey|null); + + /** SyncActionMessage timestamp */ + timestamp?: (number|Long|null); + } + + /** Represents a SyncActionMessage. */ + class SyncActionMessage implements ISyncActionMessage { + + /** + * Constructs a new SyncActionMessage. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ISyncActionMessage); + + /** SyncActionMessage key. */ + public key?: (proto.IMessageKey|null); + + /** SyncActionMessage timestamp. */ + public timestamp: (number|Long); + + /** + * Creates a new SyncActionMessage instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncActionMessage instance + */ + public static create(properties?: proto.SyncActionValue.ISyncActionMessage): proto.SyncActionValue.SyncActionMessage; + + /** + * Encodes the specified SyncActionMessage message. Does not implicitly {@link proto.SyncActionValue.SyncActionMessage.verify|verify} messages. + * @param message SyncActionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ISyncActionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncActionMessage message, length delimited. Does not implicitly {@link proto.SyncActionValue.SyncActionMessage.verify|verify} messages. + * @param message SyncActionMessage message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ISyncActionMessage, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncActionMessage message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncActionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.SyncActionMessage; + + /** + * Decodes a SyncActionMessage message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncActionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.SyncActionMessage; + + /** + * Verifies a SyncActionMessage message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncActionMessage message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncActionMessage + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.SyncActionMessage; + + /** + * Creates a plain object from a SyncActionMessage message. Also converts values to other types if specified. + * @param message SyncActionMessage + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.SyncActionMessage, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncActionMessage to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncActionMessageRange. */ + interface ISyncActionMessageRange { + + /** SyncActionMessageRange lastMessageTimestamp */ + lastMessageTimestamp?: (number|Long|null); + + /** SyncActionMessageRange lastSystemMessageTimestamp */ + lastSystemMessageTimestamp?: (number|Long|null); + + /** SyncActionMessageRange messages */ + messages?: (proto.SyncActionValue.ISyncActionMessage[]|null); + } + + /** Represents a SyncActionMessageRange. */ + class SyncActionMessageRange implements ISyncActionMessageRange { + + /** + * Constructs a new SyncActionMessageRange. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ISyncActionMessageRange); + + /** SyncActionMessageRange lastMessageTimestamp. */ + public lastMessageTimestamp: (number|Long); + + /** SyncActionMessageRange lastSystemMessageTimestamp. */ + public lastSystemMessageTimestamp: (number|Long); + + /** SyncActionMessageRange messages. */ + public messages: proto.SyncActionValue.ISyncActionMessage[]; + + /** + * Creates a new SyncActionMessageRange instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncActionMessageRange instance + */ + public static create(properties?: proto.SyncActionValue.ISyncActionMessageRange): proto.SyncActionValue.SyncActionMessageRange; + + /** + * Encodes the specified SyncActionMessageRange message. Does not implicitly {@link proto.SyncActionValue.SyncActionMessageRange.verify|verify} messages. + * @param message SyncActionMessageRange message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ISyncActionMessageRange, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncActionMessageRange message, length delimited. Does not implicitly {@link proto.SyncActionValue.SyncActionMessageRange.verify|verify} messages. + * @param message SyncActionMessageRange message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ISyncActionMessageRange, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncActionMessageRange message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncActionMessageRange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.SyncActionMessageRange; + + /** + * Decodes a SyncActionMessageRange message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncActionMessageRange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.SyncActionMessageRange; + + /** + * Verifies a SyncActionMessageRange message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncActionMessageRange message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncActionMessageRange + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.SyncActionMessageRange; + + /** + * Creates a plain object from a SyncActionMessageRange message. Also converts values to other types if specified. + * @param message SyncActionMessageRange + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.SyncActionMessageRange, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncActionMessageRange to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a TimeFormatAction. */ + interface ITimeFormatAction { + + /** TimeFormatAction isTwentyFourHourFormatEnabled */ + isTwentyFourHourFormatEnabled?: (boolean|null); + } + + /** Represents a TimeFormatAction. */ + class TimeFormatAction implements ITimeFormatAction { + + /** + * Constructs a new TimeFormatAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.ITimeFormatAction); + + /** TimeFormatAction isTwentyFourHourFormatEnabled. */ + public isTwentyFourHourFormatEnabled: boolean; + + /** + * Creates a new TimeFormatAction instance using the specified properties. + * @param [properties] Properties to set + * @returns TimeFormatAction instance + */ + public static create(properties?: proto.SyncActionValue.ITimeFormatAction): proto.SyncActionValue.TimeFormatAction; + + /** + * Encodes the specified TimeFormatAction message. Does not implicitly {@link proto.SyncActionValue.TimeFormatAction.verify|verify} messages. + * @param message TimeFormatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.ITimeFormatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified TimeFormatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.TimeFormatAction.verify|verify} messages. + * @param message TimeFormatAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.ITimeFormatAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a TimeFormatAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns TimeFormatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.TimeFormatAction; + + /** + * Decodes a TimeFormatAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns TimeFormatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.TimeFormatAction; + + /** + * Verifies a TimeFormatAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a TimeFormatAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns TimeFormatAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.TimeFormatAction; + + /** + * Creates a plain object from a TimeFormatAction message. Also converts values to other types if specified. + * @param message TimeFormatAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.TimeFormatAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this TimeFormatAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of an UnarchiveChatsSetting. */ + interface IUnarchiveChatsSetting { + + /** UnarchiveChatsSetting unarchiveChats */ + unarchiveChats?: (boolean|null); + } + + /** Represents an UnarchiveChatsSetting. */ + class UnarchiveChatsSetting implements IUnarchiveChatsSetting { + + /** + * Constructs a new UnarchiveChatsSetting. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IUnarchiveChatsSetting); + + /** UnarchiveChatsSetting unarchiveChats. */ + public unarchiveChats: boolean; + + /** + * Creates a new UnarchiveChatsSetting instance using the specified properties. + * @param [properties] Properties to set + * @returns UnarchiveChatsSetting instance + */ + public static create(properties?: proto.SyncActionValue.IUnarchiveChatsSetting): proto.SyncActionValue.UnarchiveChatsSetting; + + /** + * Encodes the specified UnarchiveChatsSetting message. Does not implicitly {@link proto.SyncActionValue.UnarchiveChatsSetting.verify|verify} messages. + * @param message UnarchiveChatsSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IUnarchiveChatsSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified UnarchiveChatsSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.UnarchiveChatsSetting.verify|verify} messages. + * @param message UnarchiveChatsSetting message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IUnarchiveChatsSetting, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an UnarchiveChatsSetting message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns UnarchiveChatsSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.UnarchiveChatsSetting; + + /** + * Decodes an UnarchiveChatsSetting message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns UnarchiveChatsSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.UnarchiveChatsSetting; + + /** + * Verifies an UnarchiveChatsSetting message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an UnarchiveChatsSetting message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns UnarchiveChatsSetting + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.UnarchiveChatsSetting; + + /** + * Creates a plain object from an UnarchiveChatsSetting message. Also converts values to other types if specified. + * @param message UnarchiveChatsSetting + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.UnarchiveChatsSetting, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this UnarchiveChatsSetting to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a UserStatusMuteAction. */ + interface IUserStatusMuteAction { + + /** UserStatusMuteAction muted */ + muted?: (boolean|null); + } + + /** Represents a UserStatusMuteAction. */ + class UserStatusMuteAction implements IUserStatusMuteAction { + + /** + * Constructs a new UserStatusMuteAction. + * @param [properties] Properties to set + */ + constructor(properties?: proto.SyncActionValue.IUserStatusMuteAction); + + /** UserStatusMuteAction muted. */ + public muted: boolean; + + /** + * Creates a new UserStatusMuteAction instance using the specified properties. + * @param [properties] Properties to set + * @returns UserStatusMuteAction instance + */ + public static create(properties?: proto.SyncActionValue.IUserStatusMuteAction): proto.SyncActionValue.UserStatusMuteAction; + + /** + * Encodes the specified UserStatusMuteAction message. Does not implicitly {@link proto.SyncActionValue.UserStatusMuteAction.verify|verify} messages. + * @param message UserStatusMuteAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.SyncActionValue.IUserStatusMuteAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified UserStatusMuteAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.UserStatusMuteAction.verify|verify} messages. + * @param message UserStatusMuteAction message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.SyncActionValue.IUserStatusMuteAction, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a UserStatusMuteAction message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns UserStatusMuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncActionValue.UserStatusMuteAction; + + /** + * Decodes a UserStatusMuteAction message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns UserStatusMuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncActionValue.UserStatusMuteAction; + + /** + * Verifies a UserStatusMuteAction message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a UserStatusMuteAction message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns UserStatusMuteAction + */ + public static fromObject(object: { [k: string]: any }): proto.SyncActionValue.UserStatusMuteAction; + + /** + * Creates a plain object from a UserStatusMuteAction message. Also converts values to other types if specified. + * @param message UserStatusMuteAction + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncActionValue.UserStatusMuteAction, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this UserStatusMuteAction to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a SyncdIndex. */ + interface ISyncdIndex { + + /** SyncdIndex blob */ + blob?: (Uint8Array|null); + } + + /** Represents a SyncdIndex. */ + class SyncdIndex implements ISyncdIndex { + + /** + * Constructs a new SyncdIndex. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdIndex); + + /** SyncdIndex blob. */ + public blob: Uint8Array; + + /** + * Creates a new SyncdIndex instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdIndex instance + */ + public static create(properties?: proto.ISyncdIndex): proto.SyncdIndex; + + /** + * Encodes the specified SyncdIndex message. Does not implicitly {@link proto.SyncdIndex.verify|verify} messages. + * @param message SyncdIndex message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdIndex, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdIndex message, length delimited. Does not implicitly {@link proto.SyncdIndex.verify|verify} messages. + * @param message SyncdIndex message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdIndex, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdIndex message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdIndex + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdIndex; + + /** + * Decodes a SyncdIndex message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdIndex + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdIndex; + + /** + * Verifies a SyncdIndex message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdIndex message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdIndex + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdIndex; + + /** + * Creates a plain object from a SyncdIndex message. Also converts values to other types if specified. + * @param message SyncdIndex + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdIndex, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdIndex to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncdMutation. */ + interface ISyncdMutation { + + /** SyncdMutation operation */ + operation?: (proto.SyncdMutation.SyncdOperation|null); + + /** SyncdMutation record */ + record?: (proto.ISyncdRecord|null); + } + + /** Represents a SyncdMutation. */ + class SyncdMutation implements ISyncdMutation { + + /** + * Constructs a new SyncdMutation. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdMutation); + + /** SyncdMutation operation. */ + public operation: proto.SyncdMutation.SyncdOperation; + + /** SyncdMutation record. */ + public record?: (proto.ISyncdRecord|null); + + /** + * Creates a new SyncdMutation instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdMutation instance + */ + public static create(properties?: proto.ISyncdMutation): proto.SyncdMutation; + + /** + * Encodes the specified SyncdMutation message. Does not implicitly {@link proto.SyncdMutation.verify|verify} messages. + * @param message SyncdMutation message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdMutation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdMutation message, length delimited. Does not implicitly {@link proto.SyncdMutation.verify|verify} messages. + * @param message SyncdMutation message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdMutation, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdMutation message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdMutation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdMutation; + + /** + * Decodes a SyncdMutation message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdMutation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdMutation; + + /** + * Verifies a SyncdMutation message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdMutation message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdMutation + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdMutation; + + /** + * Creates a plain object from a SyncdMutation message. Also converts values to other types if specified. + * @param message SyncdMutation + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdMutation, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdMutation to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace SyncdMutation { + + /** SyncdOperation enum. */ + enum SyncdOperation { + SET = 0, + REMOVE = 1 + } + } + + /** Properties of a SyncdMutations. */ + interface ISyncdMutations { + + /** SyncdMutations mutations */ + mutations?: (proto.ISyncdMutation[]|null); + } + + /** Represents a SyncdMutations. */ + class SyncdMutations implements ISyncdMutations { + + /** + * Constructs a new SyncdMutations. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdMutations); + + /** SyncdMutations mutations. */ + public mutations: proto.ISyncdMutation[]; + + /** + * Creates a new SyncdMutations instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdMutations instance + */ + public static create(properties?: proto.ISyncdMutations): proto.SyncdMutations; + + /** + * Encodes the specified SyncdMutations message. Does not implicitly {@link proto.SyncdMutations.verify|verify} messages. + * @param message SyncdMutations message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdMutations, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdMutations message, length delimited. Does not implicitly {@link proto.SyncdMutations.verify|verify} messages. + * @param message SyncdMutations message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdMutations, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdMutations message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdMutations + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdMutations; + + /** + * Decodes a SyncdMutations message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdMutations + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdMutations; + + /** + * Verifies a SyncdMutations message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdMutations message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdMutations + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdMutations; + + /** + * Creates a plain object from a SyncdMutations message. Also converts values to other types if specified. + * @param message SyncdMutations + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdMutations, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdMutations to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncdPatch. */ + interface ISyncdPatch { + + /** SyncdPatch version */ + version?: (proto.ISyncdVersion|null); + + /** SyncdPatch mutations */ + mutations?: (proto.ISyncdMutation[]|null); + + /** SyncdPatch externalMutations */ + externalMutations?: (proto.IExternalBlobReference|null); + + /** SyncdPatch snapshotMac */ + snapshotMac?: (Uint8Array|null); + + /** SyncdPatch patchMac */ + patchMac?: (Uint8Array|null); + + /** SyncdPatch keyId */ + keyId?: (proto.IKeyId|null); + + /** SyncdPatch exitCode */ + exitCode?: (proto.IExitCode|null); + + /** SyncdPatch deviceIndex */ + deviceIndex?: (number|null); + } + + /** Represents a SyncdPatch. */ + class SyncdPatch implements ISyncdPatch { + + /** + * Constructs a new SyncdPatch. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdPatch); + + /** SyncdPatch version. */ + public version?: (proto.ISyncdVersion|null); + + /** SyncdPatch mutations. */ + public mutations: proto.ISyncdMutation[]; + + /** SyncdPatch externalMutations. */ + public externalMutations?: (proto.IExternalBlobReference|null); + + /** SyncdPatch snapshotMac. */ + public snapshotMac: Uint8Array; + + /** SyncdPatch patchMac. */ + public patchMac: Uint8Array; + + /** SyncdPatch keyId. */ + public keyId?: (proto.IKeyId|null); + + /** SyncdPatch exitCode. */ + public exitCode?: (proto.IExitCode|null); + + /** SyncdPatch deviceIndex. */ + public deviceIndex: number; + + /** + * Creates a new SyncdPatch instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdPatch instance + */ + public static create(properties?: proto.ISyncdPatch): proto.SyncdPatch; + + /** + * Encodes the specified SyncdPatch message. Does not implicitly {@link proto.SyncdPatch.verify|verify} messages. + * @param message SyncdPatch message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdPatch, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdPatch message, length delimited. Does not implicitly {@link proto.SyncdPatch.verify|verify} messages. + * @param message SyncdPatch message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdPatch, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdPatch message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdPatch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdPatch; + + /** + * Decodes a SyncdPatch message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdPatch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdPatch; + + /** + * Verifies a SyncdPatch message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdPatch message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdPatch + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdPatch; + + /** + * Creates a plain object from a SyncdPatch message. Also converts values to other types if specified. + * @param message SyncdPatch + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdPatch, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdPatch to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncdRecord. */ + interface ISyncdRecord { + + /** SyncdRecord index */ + index?: (proto.ISyncdIndex|null); + + /** SyncdRecord value */ + value?: (proto.ISyncdValue|null); + + /** SyncdRecord keyId */ + keyId?: (proto.IKeyId|null); + } + + /** Represents a SyncdRecord. */ + class SyncdRecord implements ISyncdRecord { + + /** + * Constructs a new SyncdRecord. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdRecord); + + /** SyncdRecord index. */ + public index?: (proto.ISyncdIndex|null); + + /** SyncdRecord value. */ + public value?: (proto.ISyncdValue|null); + + /** SyncdRecord keyId. */ + public keyId?: (proto.IKeyId|null); + + /** + * Creates a new SyncdRecord instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdRecord instance + */ + public static create(properties?: proto.ISyncdRecord): proto.SyncdRecord; + + /** + * Encodes the specified SyncdRecord message. Does not implicitly {@link proto.SyncdRecord.verify|verify} messages. + * @param message SyncdRecord message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdRecord, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdRecord message, length delimited. Does not implicitly {@link proto.SyncdRecord.verify|verify} messages. + * @param message SyncdRecord message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdRecord, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdRecord message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdRecord + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdRecord; + + /** + * Decodes a SyncdRecord message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdRecord + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdRecord; + + /** + * Verifies a SyncdRecord message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdRecord message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdRecord + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdRecord; + + /** + * Creates a plain object from a SyncdRecord message. Also converts values to other types if specified. + * @param message SyncdRecord + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdRecord, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdRecord to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncdSnapshot. */ + interface ISyncdSnapshot { + + /** SyncdSnapshot version */ + version?: (proto.ISyncdVersion|null); + + /** SyncdSnapshot records */ + records?: (proto.ISyncdRecord[]|null); + + /** SyncdSnapshot mac */ + mac?: (Uint8Array|null); + + /** SyncdSnapshot keyId */ + keyId?: (proto.IKeyId|null); + } + + /** Represents a SyncdSnapshot. */ + class SyncdSnapshot implements ISyncdSnapshot { + + /** + * Constructs a new SyncdSnapshot. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdSnapshot); + + /** SyncdSnapshot version. */ + public version?: (proto.ISyncdVersion|null); + + /** SyncdSnapshot records. */ + public records: proto.ISyncdRecord[]; + + /** SyncdSnapshot mac. */ + public mac: Uint8Array; + + /** SyncdSnapshot keyId. */ + public keyId?: (proto.IKeyId|null); + + /** + * Creates a new SyncdSnapshot instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdSnapshot instance + */ + public static create(properties?: proto.ISyncdSnapshot): proto.SyncdSnapshot; + + /** + * Encodes the specified SyncdSnapshot message. Does not implicitly {@link proto.SyncdSnapshot.verify|verify} messages. + * @param message SyncdSnapshot message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdSnapshot, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdSnapshot message, length delimited. Does not implicitly {@link proto.SyncdSnapshot.verify|verify} messages. + * @param message SyncdSnapshot message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdSnapshot, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdSnapshot message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdSnapshot; + + /** + * Decodes a SyncdSnapshot message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdSnapshot; + + /** + * Verifies a SyncdSnapshot message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdSnapshot message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdSnapshot + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdSnapshot; + + /** + * Creates a plain object from a SyncdSnapshot message. Also converts values to other types if specified. + * @param message SyncdSnapshot + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdSnapshot, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdSnapshot to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncdValue. */ + interface ISyncdValue { + + /** SyncdValue blob */ + blob?: (Uint8Array|null); + } + + /** Represents a SyncdValue. */ + class SyncdValue implements ISyncdValue { + + /** + * Constructs a new SyncdValue. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdValue); + + /** SyncdValue blob. */ + public blob: Uint8Array; + + /** + * Creates a new SyncdValue instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdValue instance + */ + public static create(properties?: proto.ISyncdValue): proto.SyncdValue; + + /** + * Encodes the specified SyncdValue message. Does not implicitly {@link proto.SyncdValue.verify|verify} messages. + * @param message SyncdValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdValue message, length delimited. Does not implicitly {@link proto.SyncdValue.verify|verify} messages. + * @param message SyncdValue message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdValue, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdValue message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdValue; + + /** + * Decodes a SyncdValue message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdValue; + + /** + * Verifies a SyncdValue message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdValue message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdValue + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdValue; + + /** + * Creates a plain object from a SyncdValue message. Also converts values to other types if specified. + * @param message SyncdValue + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdValue, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdValue to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a SyncdVersion. */ + interface ISyncdVersion { + + /** SyncdVersion version */ + version?: (number|Long|null); + } + + /** Represents a SyncdVersion. */ + class SyncdVersion implements ISyncdVersion { + + /** + * Constructs a new SyncdVersion. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ISyncdVersion); + + /** SyncdVersion version. */ + public version: (number|Long); + + /** + * Creates a new SyncdVersion instance using the specified properties. + * @param [properties] Properties to set + * @returns SyncdVersion instance + */ + public static create(properties?: proto.ISyncdVersion): proto.SyncdVersion; + + /** + * Encodes the specified SyncdVersion message. Does not implicitly {@link proto.SyncdVersion.verify|verify} messages. + * @param message SyncdVersion message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ISyncdVersion, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified SyncdVersion message, length delimited. Does not implicitly {@link proto.SyncdVersion.verify|verify} messages. + * @param message SyncdVersion message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ISyncdVersion, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a SyncdVersion message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns SyncdVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.SyncdVersion; + + /** + * Decodes a SyncdVersion message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns SyncdVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.SyncdVersion; + + /** + * Verifies a SyncdVersion message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a SyncdVersion message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns SyncdVersion + */ + public static fromObject(object: { [k: string]: any }): proto.SyncdVersion; + + /** + * Creates a plain object from a SyncdVersion message. Also converts values to other types if specified. + * @param message SyncdVersion + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.SyncdVersion, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this SyncdVersion to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a TemplateButton. */ + interface ITemplateButton { + + /** TemplateButton index */ + index?: (number|null); + + /** TemplateButton quickReplyButton */ + quickReplyButton?: (proto.TemplateButton.IQuickReplyButton|null); + + /** TemplateButton urlButton */ + urlButton?: (proto.TemplateButton.IURLButton|null); + + /** TemplateButton callButton */ + callButton?: (proto.TemplateButton.ICallButton|null); + } + + /** Represents a TemplateButton. */ + class TemplateButton implements ITemplateButton { + + /** + * Constructs a new TemplateButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.ITemplateButton); + + /** TemplateButton index. */ + public index: number; + + /** TemplateButton quickReplyButton. */ + public quickReplyButton?: (proto.TemplateButton.IQuickReplyButton|null); + + /** TemplateButton urlButton. */ + public urlButton?: (proto.TemplateButton.IURLButton|null); + + /** TemplateButton callButton. */ + public callButton?: (proto.TemplateButton.ICallButton|null); + + /** TemplateButton button. */ + public button?: ("quickReplyButton"|"urlButton"|"callButton"); + + /** + * Creates a new TemplateButton instance using the specified properties. + * @param [properties] Properties to set + * @returns TemplateButton instance + */ + public static create(properties?: proto.ITemplateButton): proto.TemplateButton; + + /** + * Encodes the specified TemplateButton message. Does not implicitly {@link proto.TemplateButton.verify|verify} messages. + * @param message TemplateButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.ITemplateButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified TemplateButton message, length delimited. Does not implicitly {@link proto.TemplateButton.verify|verify} messages. + * @param message TemplateButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.ITemplateButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a TemplateButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns TemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.TemplateButton; + + /** + * Decodes a TemplateButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns TemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.TemplateButton; + + /** + * Verifies a TemplateButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a TemplateButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns TemplateButton + */ + public static fromObject(object: { [k: string]: any }): proto.TemplateButton; + + /** + * Creates a plain object from a TemplateButton message. Also converts values to other types if specified. + * @param message TemplateButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.TemplateButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this TemplateButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace TemplateButton { + + /** Properties of a CallButton. */ + interface ICallButton { + + /** CallButton displayText */ + displayText?: (proto.Message.IHighlyStructuredMessage|null); + + /** CallButton phoneNumber */ + phoneNumber?: (proto.Message.IHighlyStructuredMessage|null); + } + + /** Represents a CallButton. */ + class CallButton implements ICallButton { + + /** + * Constructs a new CallButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.TemplateButton.ICallButton); + + /** CallButton displayText. */ + public displayText?: (proto.Message.IHighlyStructuredMessage|null); + + /** CallButton phoneNumber. */ + public phoneNumber?: (proto.Message.IHighlyStructuredMessage|null); + + /** + * Creates a new CallButton instance using the specified properties. + * @param [properties] Properties to set + * @returns CallButton instance + */ + public static create(properties?: proto.TemplateButton.ICallButton): proto.TemplateButton.CallButton; + + /** + * Encodes the specified CallButton message. Does not implicitly {@link proto.TemplateButton.CallButton.verify|verify} messages. + * @param message CallButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.TemplateButton.ICallButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified CallButton message, length delimited. Does not implicitly {@link proto.TemplateButton.CallButton.verify|verify} messages. + * @param message CallButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.TemplateButton.ICallButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a CallButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns CallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.TemplateButton.CallButton; + + /** + * Decodes a CallButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns CallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.TemplateButton.CallButton; + + /** + * Verifies a CallButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a CallButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns CallButton + */ + public static fromObject(object: { [k: string]: any }): proto.TemplateButton.CallButton; + + /** + * Creates a plain object from a CallButton message. Also converts values to other types if specified. + * @param message CallButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.TemplateButton.CallButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this CallButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a QuickReplyButton. */ + interface IQuickReplyButton { + + /** QuickReplyButton displayText */ + displayText?: (proto.Message.IHighlyStructuredMessage|null); + + /** QuickReplyButton id */ + id?: (string|null); + } + + /** Represents a QuickReplyButton. */ + class QuickReplyButton implements IQuickReplyButton { + + /** + * Constructs a new QuickReplyButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.TemplateButton.IQuickReplyButton); + + /** QuickReplyButton displayText. */ + public displayText?: (proto.Message.IHighlyStructuredMessage|null); + + /** QuickReplyButton id. */ + public id: string; + + /** + * Creates a new QuickReplyButton instance using the specified properties. + * @param [properties] Properties to set + * @returns QuickReplyButton instance + */ + public static create(properties?: proto.TemplateButton.IQuickReplyButton): proto.TemplateButton.QuickReplyButton; + + /** + * Encodes the specified QuickReplyButton message. Does not implicitly {@link proto.TemplateButton.QuickReplyButton.verify|verify} messages. + * @param message QuickReplyButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.TemplateButton.IQuickReplyButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified QuickReplyButton message, length delimited. Does not implicitly {@link proto.TemplateButton.QuickReplyButton.verify|verify} messages. + * @param message QuickReplyButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.TemplateButton.IQuickReplyButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a QuickReplyButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns QuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.TemplateButton.QuickReplyButton; + + /** + * Decodes a QuickReplyButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns QuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.TemplateButton.QuickReplyButton; + + /** + * Verifies a QuickReplyButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a QuickReplyButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns QuickReplyButton + */ + public static fromObject(object: { [k: string]: any }): proto.TemplateButton.QuickReplyButton; + + /** + * Creates a plain object from a QuickReplyButton message. Also converts values to other types if specified. + * @param message QuickReplyButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.TemplateButton.QuickReplyButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this QuickReplyButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a URLButton. */ + interface IURLButton { + + /** URLButton displayText */ + displayText?: (proto.Message.IHighlyStructuredMessage|null); + + /** URLButton url */ + url?: (proto.Message.IHighlyStructuredMessage|null); + } + + /** Represents a URLButton. */ + class URLButton implements IURLButton { + + /** + * Constructs a new URLButton. + * @param [properties] Properties to set + */ + constructor(properties?: proto.TemplateButton.IURLButton); + + /** URLButton displayText. */ + public displayText?: (proto.Message.IHighlyStructuredMessage|null); + + /** URLButton url. */ + public url?: (proto.Message.IHighlyStructuredMessage|null); + + /** + * Creates a new URLButton instance using the specified properties. + * @param [properties] Properties to set + * @returns URLButton instance + */ + public static create(properties?: proto.TemplateButton.IURLButton): proto.TemplateButton.URLButton; + + /** + * Encodes the specified URLButton message. Does not implicitly {@link proto.TemplateButton.URLButton.verify|verify} messages. + * @param message URLButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.TemplateButton.IURLButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified URLButton message, length delimited. Does not implicitly {@link proto.TemplateButton.URLButton.verify|verify} messages. + * @param message URLButton message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.TemplateButton.IURLButton, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a URLButton message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns URLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.TemplateButton.URLButton; + + /** + * Decodes a URLButton message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns URLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.TemplateButton.URLButton; + + /** + * Verifies a URLButton message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a URLButton message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns URLButton + */ + public static fromObject(object: { [k: string]: any }): proto.TemplateButton.URLButton; + + /** + * Creates a plain object from a URLButton message. Also converts values to other types if specified. + * @param message URLButton + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.TemplateButton.URLButton, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this URLButton to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a UserReceipt. */ + interface IUserReceipt { + + /** UserReceipt userJid */ + userJid: string; + + /** UserReceipt receiptTimestamp */ + receiptTimestamp?: (number|Long|null); + + /** UserReceipt readTimestamp */ + readTimestamp?: (number|Long|null); + + /** UserReceipt playedTimestamp */ + playedTimestamp?: (number|Long|null); + + /** UserReceipt pendingDeviceJid */ + pendingDeviceJid?: (string[]|null); + + /** UserReceipt deliveredDeviceJid */ + deliveredDeviceJid?: (string[]|null); + } + + /** Represents a UserReceipt. */ + class UserReceipt implements IUserReceipt { + + /** + * Constructs a new UserReceipt. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IUserReceipt); + + /** UserReceipt userJid. */ + public userJid: string; + + /** UserReceipt receiptTimestamp. */ + public receiptTimestamp: (number|Long); + + /** UserReceipt readTimestamp. */ + public readTimestamp: (number|Long); + + /** UserReceipt playedTimestamp. */ + public playedTimestamp: (number|Long); + + /** UserReceipt pendingDeviceJid. */ + public pendingDeviceJid: string[]; + + /** UserReceipt deliveredDeviceJid. */ + public deliveredDeviceJid: string[]; + + /** + * Creates a new UserReceipt instance using the specified properties. + * @param [properties] Properties to set + * @returns UserReceipt instance + */ + public static create(properties?: proto.IUserReceipt): proto.UserReceipt; + + /** + * Encodes the specified UserReceipt message. Does not implicitly {@link proto.UserReceipt.verify|verify} messages. + * @param message UserReceipt message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IUserReceipt, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified UserReceipt message, length delimited. Does not implicitly {@link proto.UserReceipt.verify|verify} messages. + * @param message UserReceipt message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IUserReceipt, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a UserReceipt message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns UserReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.UserReceipt; + + /** + * Decodes a UserReceipt message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns UserReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.UserReceipt; + + /** + * Verifies a UserReceipt message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a UserReceipt message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns UserReceipt + */ + public static fromObject(object: { [k: string]: any }): proto.UserReceipt; + + /** + * Creates a plain object from a UserReceipt message. Also converts values to other types if specified. + * @param message UserReceipt + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.UserReceipt, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this UserReceipt to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a VerifiedNameCertificate. */ + interface IVerifiedNameCertificate { + + /** VerifiedNameCertificate details */ + details?: (Uint8Array|null); + + /** VerifiedNameCertificate signature */ + signature?: (Uint8Array|null); + + /** VerifiedNameCertificate serverSignature */ + serverSignature?: (Uint8Array|null); + } + + /** Represents a VerifiedNameCertificate. */ + class VerifiedNameCertificate implements IVerifiedNameCertificate { + + /** + * Constructs a new VerifiedNameCertificate. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IVerifiedNameCertificate); + + /** VerifiedNameCertificate details. */ + public details: Uint8Array; + + /** VerifiedNameCertificate signature. */ + public signature: Uint8Array; + + /** VerifiedNameCertificate serverSignature. */ + public serverSignature: Uint8Array; + + /** + * Creates a new VerifiedNameCertificate instance using the specified properties. + * @param [properties] Properties to set + * @returns VerifiedNameCertificate instance + */ + public static create(properties?: proto.IVerifiedNameCertificate): proto.VerifiedNameCertificate; + + /** + * Encodes the specified VerifiedNameCertificate message. Does not implicitly {@link proto.VerifiedNameCertificate.verify|verify} messages. + * @param message VerifiedNameCertificate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IVerifiedNameCertificate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified VerifiedNameCertificate message, length delimited. Does not implicitly {@link proto.VerifiedNameCertificate.verify|verify} messages. + * @param message VerifiedNameCertificate message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IVerifiedNameCertificate, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a VerifiedNameCertificate message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns VerifiedNameCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.VerifiedNameCertificate; + + /** + * Decodes a VerifiedNameCertificate message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns VerifiedNameCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.VerifiedNameCertificate; + + /** + * Verifies a VerifiedNameCertificate message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a VerifiedNameCertificate message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns VerifiedNameCertificate + */ + public static fromObject(object: { [k: string]: any }): proto.VerifiedNameCertificate; + + /** + * Creates a plain object from a VerifiedNameCertificate message. Also converts values to other types if specified. + * @param message VerifiedNameCertificate + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.VerifiedNameCertificate, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this VerifiedNameCertificate to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace VerifiedNameCertificate { + + /** Properties of a Details. */ + interface IDetails { + + /** Details serial */ + serial?: (number|Long|null); + + /** Details issuer */ + issuer?: (string|null); + + /** Details verifiedName */ + verifiedName?: (string|null); + + /** Details localizedNames */ + localizedNames?: (proto.ILocalizedName[]|null); + + /** Details issueTime */ + issueTime?: (number|Long|null); + } + + /** Represents a Details. */ + class Details implements IDetails { + + /** + * Constructs a new Details. + * @param [properties] Properties to set + */ + constructor(properties?: proto.VerifiedNameCertificate.IDetails); + + /** Details serial. */ + public serial: (number|Long); + + /** Details issuer. */ + public issuer: string; + + /** Details verifiedName. */ + public verifiedName: string; + + /** Details localizedNames. */ + public localizedNames: proto.ILocalizedName[]; + + /** Details issueTime. */ + public issueTime: (number|Long); + + /** + * Creates a new Details instance using the specified properties. + * @param [properties] Properties to set + * @returns Details instance + */ + public static create(properties?: proto.VerifiedNameCertificate.IDetails): proto.VerifiedNameCertificate.Details; + + /** + * Encodes the specified Details message. Does not implicitly {@link proto.VerifiedNameCertificate.Details.verify|verify} messages. + * @param message Details message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.VerifiedNameCertificate.IDetails, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Details message, length delimited. Does not implicitly {@link proto.VerifiedNameCertificate.Details.verify|verify} messages. + * @param message Details message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.VerifiedNameCertificate.IDetails, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Details message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.VerifiedNameCertificate.Details; + + /** + * Decodes a Details message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.VerifiedNameCertificate.Details; + + /** + * Verifies a Details message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Details message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Details + */ + public static fromObject(object: { [k: string]: any }): proto.VerifiedNameCertificate.Details; + + /** + * Creates a plain object from a Details message. Also converts values to other types if specified. + * @param message Details + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.VerifiedNameCertificate.Details, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Details to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + } + + /** Properties of a WallpaperSettings. */ + interface IWallpaperSettings { + + /** WallpaperSettings filename */ + filename?: (string|null); + + /** WallpaperSettings opacity */ + opacity?: (number|null); + } + + /** Represents a WallpaperSettings. */ + class WallpaperSettings implements IWallpaperSettings { + + /** + * Constructs a new WallpaperSettings. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IWallpaperSettings); + + /** WallpaperSettings filename. */ + public filename: string; + + /** WallpaperSettings opacity. */ + public opacity: number; + + /** + * Creates a new WallpaperSettings instance using the specified properties. + * @param [properties] Properties to set + * @returns WallpaperSettings instance + */ + public static create(properties?: proto.IWallpaperSettings): proto.WallpaperSettings; + + /** + * Encodes the specified WallpaperSettings message. Does not implicitly {@link proto.WallpaperSettings.verify|verify} messages. + * @param message WallpaperSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IWallpaperSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WallpaperSettings message, length delimited. Does not implicitly {@link proto.WallpaperSettings.verify|verify} messages. + * @param message WallpaperSettings message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IWallpaperSettings, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WallpaperSettings message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WallpaperSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.WallpaperSettings; + + /** + * Decodes a WallpaperSettings message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WallpaperSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.WallpaperSettings; + + /** + * Verifies a WallpaperSettings message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WallpaperSettings message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WallpaperSettings + */ + public static fromObject(object: { [k: string]: any }): proto.WallpaperSettings; + + /** + * Creates a plain object from a WallpaperSettings message. Also converts values to other types if specified. + * @param message WallpaperSettings + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.WallpaperSettings, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WallpaperSettings to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a WebFeatures. */ + interface IWebFeatures { + + /** WebFeatures labelsDisplay */ + labelsDisplay?: (proto.WebFeatures.Flag|null); + + /** WebFeatures voipIndividualOutgoing */ + voipIndividualOutgoing?: (proto.WebFeatures.Flag|null); + + /** WebFeatures groupsV3 */ + groupsV3?: (proto.WebFeatures.Flag|null); + + /** WebFeatures groupsV3Create */ + groupsV3Create?: (proto.WebFeatures.Flag|null); + + /** WebFeatures changeNumberV2 */ + changeNumberV2?: (proto.WebFeatures.Flag|null); + + /** WebFeatures queryStatusV3Thumbnail */ + queryStatusV3Thumbnail?: (proto.WebFeatures.Flag|null); + + /** WebFeatures liveLocations */ + liveLocations?: (proto.WebFeatures.Flag|null); + + /** WebFeatures queryVname */ + queryVname?: (proto.WebFeatures.Flag|null); + + /** WebFeatures voipIndividualIncoming */ + voipIndividualIncoming?: (proto.WebFeatures.Flag|null); + + /** WebFeatures quickRepliesQuery */ + quickRepliesQuery?: (proto.WebFeatures.Flag|null); + + /** WebFeatures payments */ + payments?: (proto.WebFeatures.Flag|null); + + /** WebFeatures stickerPackQuery */ + stickerPackQuery?: (proto.WebFeatures.Flag|null); + + /** WebFeatures liveLocationsFinal */ + liveLocationsFinal?: (proto.WebFeatures.Flag|null); + + /** WebFeatures labelsEdit */ + labelsEdit?: (proto.WebFeatures.Flag|null); + + /** WebFeatures mediaUpload */ + mediaUpload?: (proto.WebFeatures.Flag|null); + + /** WebFeatures mediaUploadRichQuickReplies */ + mediaUploadRichQuickReplies?: (proto.WebFeatures.Flag|null); + + /** WebFeatures vnameV2 */ + vnameV2?: (proto.WebFeatures.Flag|null); + + /** WebFeatures videoPlaybackUrl */ + videoPlaybackUrl?: (proto.WebFeatures.Flag|null); + + /** WebFeatures statusRanking */ + statusRanking?: (proto.WebFeatures.Flag|null); + + /** WebFeatures voipIndividualVideo */ + voipIndividualVideo?: (proto.WebFeatures.Flag|null); + + /** WebFeatures thirdPartyStickers */ + thirdPartyStickers?: (proto.WebFeatures.Flag|null); + + /** WebFeatures frequentlyForwardedSetting */ + frequentlyForwardedSetting?: (proto.WebFeatures.Flag|null); + + /** WebFeatures groupsV4JoinPermission */ + groupsV4JoinPermission?: (proto.WebFeatures.Flag|null); + + /** WebFeatures recentStickers */ + recentStickers?: (proto.WebFeatures.Flag|null); + + /** WebFeatures catalog */ + catalog?: (proto.WebFeatures.Flag|null); + + /** WebFeatures starredStickers */ + starredStickers?: (proto.WebFeatures.Flag|null); + + /** WebFeatures voipGroupCall */ + voipGroupCall?: (proto.WebFeatures.Flag|null); + + /** WebFeatures templateMessage */ + templateMessage?: (proto.WebFeatures.Flag|null); + + /** WebFeatures templateMessageInteractivity */ + templateMessageInteractivity?: (proto.WebFeatures.Flag|null); + + /** WebFeatures ephemeralMessages */ + ephemeralMessages?: (proto.WebFeatures.Flag|null); + + /** WebFeatures e2ENotificationSync */ + e2ENotificationSync?: (proto.WebFeatures.Flag|null); + + /** WebFeatures recentStickersV2 */ + recentStickersV2?: (proto.WebFeatures.Flag|null); + + /** WebFeatures recentStickersV3 */ + recentStickersV3?: (proto.WebFeatures.Flag|null); + + /** WebFeatures userNotice */ + userNotice?: (proto.WebFeatures.Flag|null); + + /** WebFeatures support */ + support?: (proto.WebFeatures.Flag|null); + + /** WebFeatures groupUiiCleanup */ + groupUiiCleanup?: (proto.WebFeatures.Flag|null); + + /** WebFeatures groupDogfoodingInternalOnly */ + groupDogfoodingInternalOnly?: (proto.WebFeatures.Flag|null); + + /** WebFeatures settingsSync */ + settingsSync?: (proto.WebFeatures.Flag|null); + + /** WebFeatures archiveV2 */ + archiveV2?: (proto.WebFeatures.Flag|null); + + /** WebFeatures ephemeralAllowGroupMembers */ + ephemeralAllowGroupMembers?: (proto.WebFeatures.Flag|null); + + /** WebFeatures ephemeral24HDuration */ + ephemeral24HDuration?: (proto.WebFeatures.Flag|null); + + /** WebFeatures mdForceUpgrade */ + mdForceUpgrade?: (proto.WebFeatures.Flag|null); + + /** WebFeatures disappearingMode */ + disappearingMode?: (proto.WebFeatures.Flag|null); + + /** WebFeatures externalMdOptInAvailable */ + externalMdOptInAvailable?: (proto.WebFeatures.Flag|null); + + /** WebFeatures noDeleteMessageTimeLimit */ + noDeleteMessageTimeLimit?: (proto.WebFeatures.Flag|null); + } + + /** Represents a WebFeatures. */ + class WebFeatures implements IWebFeatures { + + /** + * Constructs a new WebFeatures. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IWebFeatures); + + /** WebFeatures labelsDisplay. */ + public labelsDisplay: proto.WebFeatures.Flag; + + /** WebFeatures voipIndividualOutgoing. */ + public voipIndividualOutgoing: proto.WebFeatures.Flag; + + /** WebFeatures groupsV3. */ + public groupsV3: proto.WebFeatures.Flag; + + /** WebFeatures groupsV3Create. */ + public groupsV3Create: proto.WebFeatures.Flag; + + /** WebFeatures changeNumberV2. */ + public changeNumberV2: proto.WebFeatures.Flag; + + /** WebFeatures queryStatusV3Thumbnail. */ + public queryStatusV3Thumbnail: proto.WebFeatures.Flag; + + /** WebFeatures liveLocations. */ + public liveLocations: proto.WebFeatures.Flag; + + /** WebFeatures queryVname. */ + public queryVname: proto.WebFeatures.Flag; + + /** WebFeatures voipIndividualIncoming. */ + public voipIndividualIncoming: proto.WebFeatures.Flag; + + /** WebFeatures quickRepliesQuery. */ + public quickRepliesQuery: proto.WebFeatures.Flag; + + /** WebFeatures payments. */ + public payments: proto.WebFeatures.Flag; + + /** WebFeatures stickerPackQuery. */ + public stickerPackQuery: proto.WebFeatures.Flag; + + /** WebFeatures liveLocationsFinal. */ + public liveLocationsFinal: proto.WebFeatures.Flag; + + /** WebFeatures labelsEdit. */ + public labelsEdit: proto.WebFeatures.Flag; + + /** WebFeatures mediaUpload. */ + public mediaUpload: proto.WebFeatures.Flag; + + /** WebFeatures mediaUploadRichQuickReplies. */ + public mediaUploadRichQuickReplies: proto.WebFeatures.Flag; + + /** WebFeatures vnameV2. */ + public vnameV2: proto.WebFeatures.Flag; + + /** WebFeatures videoPlaybackUrl. */ + public videoPlaybackUrl: proto.WebFeatures.Flag; + + /** WebFeatures statusRanking. */ + public statusRanking: proto.WebFeatures.Flag; + + /** WebFeatures voipIndividualVideo. */ + public voipIndividualVideo: proto.WebFeatures.Flag; + + /** WebFeatures thirdPartyStickers. */ + public thirdPartyStickers: proto.WebFeatures.Flag; + + /** WebFeatures frequentlyForwardedSetting. */ + public frequentlyForwardedSetting: proto.WebFeatures.Flag; + + /** WebFeatures groupsV4JoinPermission. */ + public groupsV4JoinPermission: proto.WebFeatures.Flag; + + /** WebFeatures recentStickers. */ + public recentStickers: proto.WebFeatures.Flag; + + /** WebFeatures catalog. */ + public catalog: proto.WebFeatures.Flag; + + /** WebFeatures starredStickers. */ + public starredStickers: proto.WebFeatures.Flag; + + /** WebFeatures voipGroupCall. */ + public voipGroupCall: proto.WebFeatures.Flag; + + /** WebFeatures templateMessage. */ + public templateMessage: proto.WebFeatures.Flag; + + /** WebFeatures templateMessageInteractivity. */ + public templateMessageInteractivity: proto.WebFeatures.Flag; + + /** WebFeatures ephemeralMessages. */ + public ephemeralMessages: proto.WebFeatures.Flag; + + /** WebFeatures e2ENotificationSync. */ + public e2ENotificationSync: proto.WebFeatures.Flag; + + /** WebFeatures recentStickersV2. */ + public recentStickersV2: proto.WebFeatures.Flag; + + /** WebFeatures recentStickersV3. */ + public recentStickersV3: proto.WebFeatures.Flag; + + /** WebFeatures userNotice. */ + public userNotice: proto.WebFeatures.Flag; + + /** WebFeatures support. */ + public support: proto.WebFeatures.Flag; + + /** WebFeatures groupUiiCleanup. */ + public groupUiiCleanup: proto.WebFeatures.Flag; + + /** WebFeatures groupDogfoodingInternalOnly. */ + public groupDogfoodingInternalOnly: proto.WebFeatures.Flag; + + /** WebFeatures settingsSync. */ + public settingsSync: proto.WebFeatures.Flag; + + /** WebFeatures archiveV2. */ + public archiveV2: proto.WebFeatures.Flag; + + /** WebFeatures ephemeralAllowGroupMembers. */ + public ephemeralAllowGroupMembers: proto.WebFeatures.Flag; + + /** WebFeatures ephemeral24HDuration. */ + public ephemeral24HDuration: proto.WebFeatures.Flag; + + /** WebFeatures mdForceUpgrade. */ + public mdForceUpgrade: proto.WebFeatures.Flag; + + /** WebFeatures disappearingMode. */ + public disappearingMode: proto.WebFeatures.Flag; + + /** WebFeatures externalMdOptInAvailable. */ + public externalMdOptInAvailable: proto.WebFeatures.Flag; + + /** WebFeatures noDeleteMessageTimeLimit. */ + public noDeleteMessageTimeLimit: proto.WebFeatures.Flag; + + /** + * Creates a new WebFeatures instance using the specified properties. + * @param [properties] Properties to set + * @returns WebFeatures instance + */ + public static create(properties?: proto.IWebFeatures): proto.WebFeatures; + + /** + * Encodes the specified WebFeatures message. Does not implicitly {@link proto.WebFeatures.verify|verify} messages. + * @param message WebFeatures message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IWebFeatures, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WebFeatures message, length delimited. Does not implicitly {@link proto.WebFeatures.verify|verify} messages. + * @param message WebFeatures message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IWebFeatures, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WebFeatures message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WebFeatures + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.WebFeatures; + + /** + * Decodes a WebFeatures message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WebFeatures + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.WebFeatures; + + /** + * Verifies a WebFeatures message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WebFeatures message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WebFeatures + */ + public static fromObject(object: { [k: string]: any }): proto.WebFeatures; + + /** + * Creates a plain object from a WebFeatures message. Also converts values to other types if specified. + * @param message WebFeatures + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.WebFeatures, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WebFeatures to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace WebFeatures { + + /** Flag enum. */ + enum Flag { + NOT_STARTED = 0, + FORCE_UPGRADE = 1, + DEVELOPMENT = 2, + PRODUCTION = 3 + } + } + + /** Properties of a WebMessageInfo. */ + interface IWebMessageInfo { + + /** WebMessageInfo key */ + key: proto.IMessageKey; + + /** WebMessageInfo message */ + message?: (proto.IMessage|null); + + /** WebMessageInfo messageTimestamp */ + messageTimestamp?: (number|Long|null); + + /** WebMessageInfo status */ + status?: (proto.WebMessageInfo.Status|null); + + /** WebMessageInfo participant */ + participant?: (string|null); + + /** WebMessageInfo messageC2STimestamp */ + messageC2STimestamp?: (number|Long|null); + + /** WebMessageInfo ignore */ + ignore?: (boolean|null); + + /** WebMessageInfo starred */ + starred?: (boolean|null); + + /** WebMessageInfo broadcast */ + broadcast?: (boolean|null); + + /** WebMessageInfo pushName */ + pushName?: (string|null); + + /** WebMessageInfo mediaCiphertextSha256 */ + mediaCiphertextSha256?: (Uint8Array|null); + + /** WebMessageInfo multicast */ + multicast?: (boolean|null); + + /** WebMessageInfo urlText */ + urlText?: (boolean|null); + + /** WebMessageInfo urlNumber */ + urlNumber?: (boolean|null); + + /** WebMessageInfo messageStubType */ + messageStubType?: (proto.WebMessageInfo.StubType|null); + + /** WebMessageInfo clearMedia */ + clearMedia?: (boolean|null); + + /** WebMessageInfo messageStubParameters */ + messageStubParameters?: (string[]|null); + + /** WebMessageInfo duration */ + duration?: (number|null); + + /** WebMessageInfo labels */ + labels?: (string[]|null); + + /** WebMessageInfo paymentInfo */ + paymentInfo?: (proto.IPaymentInfo|null); + + /** WebMessageInfo finalLiveLocation */ + finalLiveLocation?: (proto.Message.ILiveLocationMessage|null); + + /** WebMessageInfo quotedPaymentInfo */ + quotedPaymentInfo?: (proto.IPaymentInfo|null); + + /** WebMessageInfo ephemeralStartTimestamp */ + ephemeralStartTimestamp?: (number|Long|null); + + /** WebMessageInfo ephemeralDuration */ + ephemeralDuration?: (number|null); + + /** WebMessageInfo ephemeralOffToOn */ + ephemeralOffToOn?: (boolean|null); + + /** WebMessageInfo ephemeralOutOfSync */ + ephemeralOutOfSync?: (boolean|null); + + /** WebMessageInfo bizPrivacyStatus */ + bizPrivacyStatus?: (proto.WebMessageInfo.BizPrivacyStatus|null); + + /** WebMessageInfo verifiedBizName */ + verifiedBizName?: (string|null); + + /** WebMessageInfo mediaData */ + mediaData?: (proto.IMediaData|null); + + /** WebMessageInfo photoChange */ + photoChange?: (proto.IPhotoChange|null); + + /** WebMessageInfo userReceipt */ + userReceipt?: (proto.IUserReceipt[]|null); + + /** WebMessageInfo reactions */ + reactions?: (proto.IReaction[]|null); + + /** WebMessageInfo quotedStickerData */ + quotedStickerData?: (proto.IMediaData|null); + + /** WebMessageInfo futureproofData */ + futureproofData?: (Uint8Array|null); + + /** WebMessageInfo statusPsa */ + statusPsa?: (proto.IStatusPSA|null); + + /** WebMessageInfo pollUpdates */ + pollUpdates?: (proto.IPollUpdate[]|null); + + /** WebMessageInfo pollAdditionalMetadata */ + pollAdditionalMetadata?: (proto.IPollAdditionalMetadata|null); + + /** WebMessageInfo agentId */ + agentId?: (string|null); + + /** WebMessageInfo statusAlreadyViewed */ + statusAlreadyViewed?: (boolean|null); + + /** WebMessageInfo messageSecret */ + messageSecret?: (Uint8Array|null); + + /** WebMessageInfo keepInChat */ + keepInChat?: (proto.IKeepInChat|null); + + /** WebMessageInfo originalSelfAuthorUserJidString */ + originalSelfAuthorUserJidString?: (string|null); + + /** WebMessageInfo revokeMessageTimestamp */ + revokeMessageTimestamp?: (number|Long|null); + } + + /** Represents a WebMessageInfo. */ + class WebMessageInfo implements IWebMessageInfo { + + /** + * Constructs a new WebMessageInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IWebMessageInfo); + + /** WebMessageInfo key. */ + public key: proto.IMessageKey; + + /** WebMessageInfo message. */ + public message?: (proto.IMessage|null); + + /** WebMessageInfo messageTimestamp. */ + public messageTimestamp: (number|Long); + + /** WebMessageInfo status. */ + public status: proto.WebMessageInfo.Status; + + /** WebMessageInfo participant. */ + public participant: string; + + /** WebMessageInfo messageC2STimestamp. */ + public messageC2STimestamp: (number|Long); + + /** WebMessageInfo ignore. */ + public ignore: boolean; + + /** WebMessageInfo starred. */ + public starred: boolean; + + /** WebMessageInfo broadcast. */ + public broadcast: boolean; + + /** WebMessageInfo pushName. */ + public pushName: string; + + /** WebMessageInfo mediaCiphertextSha256. */ + public mediaCiphertextSha256: Uint8Array; + + /** WebMessageInfo multicast. */ + public multicast: boolean; + + /** WebMessageInfo urlText. */ + public urlText: boolean; + + /** WebMessageInfo urlNumber. */ + public urlNumber: boolean; + + /** WebMessageInfo messageStubType. */ + public messageStubType: proto.WebMessageInfo.StubType; + + /** WebMessageInfo clearMedia. */ + public clearMedia: boolean; + + /** WebMessageInfo messageStubParameters. */ + public messageStubParameters: string[]; + + /** WebMessageInfo duration. */ + public duration: number; + + /** WebMessageInfo labels. */ + public labels: string[]; + + /** WebMessageInfo paymentInfo. */ + public paymentInfo?: (proto.IPaymentInfo|null); + + /** WebMessageInfo finalLiveLocation. */ + public finalLiveLocation?: (proto.Message.ILiveLocationMessage|null); + + /** WebMessageInfo quotedPaymentInfo. */ + public quotedPaymentInfo?: (proto.IPaymentInfo|null); + + /** WebMessageInfo ephemeralStartTimestamp. */ + public ephemeralStartTimestamp: (number|Long); + + /** WebMessageInfo ephemeralDuration. */ + public ephemeralDuration: number; + + /** WebMessageInfo ephemeralOffToOn. */ + public ephemeralOffToOn: boolean; + + /** WebMessageInfo ephemeralOutOfSync. */ + public ephemeralOutOfSync: boolean; + + /** WebMessageInfo bizPrivacyStatus. */ + public bizPrivacyStatus: proto.WebMessageInfo.BizPrivacyStatus; + + /** WebMessageInfo verifiedBizName. */ + public verifiedBizName: string; + + /** WebMessageInfo mediaData. */ + public mediaData?: (proto.IMediaData|null); + + /** WebMessageInfo photoChange. */ + public photoChange?: (proto.IPhotoChange|null); + + /** WebMessageInfo userReceipt. */ + public userReceipt: proto.IUserReceipt[]; + + /** WebMessageInfo reactions. */ + public reactions: proto.IReaction[]; + + /** WebMessageInfo quotedStickerData. */ + public quotedStickerData?: (proto.IMediaData|null); + + /** WebMessageInfo futureproofData. */ + public futureproofData: Uint8Array; + + /** WebMessageInfo statusPsa. */ + public statusPsa?: (proto.IStatusPSA|null); + + /** WebMessageInfo pollUpdates. */ + public pollUpdates: proto.IPollUpdate[]; + + /** WebMessageInfo pollAdditionalMetadata. */ + public pollAdditionalMetadata?: (proto.IPollAdditionalMetadata|null); + + /** WebMessageInfo agentId. */ + public agentId: string; + + /** WebMessageInfo statusAlreadyViewed. */ + public statusAlreadyViewed: boolean; + + /** WebMessageInfo messageSecret. */ + public messageSecret: Uint8Array; + + /** WebMessageInfo keepInChat. */ + public keepInChat?: (proto.IKeepInChat|null); + + /** WebMessageInfo originalSelfAuthorUserJidString. */ + public originalSelfAuthorUserJidString: string; + + /** WebMessageInfo revokeMessageTimestamp. */ + public revokeMessageTimestamp: (number|Long); + + /** + * Creates a new WebMessageInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns WebMessageInfo instance + */ + public static create(properties?: proto.IWebMessageInfo): proto.WebMessageInfo; + + /** + * Encodes the specified WebMessageInfo message. Does not implicitly {@link proto.WebMessageInfo.verify|verify} messages. + * @param message WebMessageInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IWebMessageInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WebMessageInfo message, length delimited. Does not implicitly {@link proto.WebMessageInfo.verify|verify} messages. + * @param message WebMessageInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IWebMessageInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WebMessageInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WebMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.WebMessageInfo; + + /** + * Decodes a WebMessageInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WebMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.WebMessageInfo; + + /** + * Verifies a WebMessageInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WebMessageInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WebMessageInfo + */ + public static fromObject(object: { [k: string]: any }): proto.WebMessageInfo; + + /** + * Creates a plain object from a WebMessageInfo message. Also converts values to other types if specified. + * @param message WebMessageInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.WebMessageInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WebMessageInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + namespace WebMessageInfo { + + /** BizPrivacyStatus enum. */ + enum BizPrivacyStatus { + E2EE = 0, + FB = 2, + BSP = 1, + BSP_AND_FB = 3 + } + + /** Status enum. */ + enum Status { + ERROR = 0, + PENDING = 1, + SERVER_ACK = 2, + DELIVERY_ACK = 3, + READ = 4, + PLAYED = 5 + } + + /** StubType enum. */ + enum StubType { + UNKNOWN = 0, + REVOKE = 1, + CIPHERTEXT = 2, + FUTUREPROOF = 3, + NON_VERIFIED_TRANSITION = 4, + UNVERIFIED_TRANSITION = 5, + VERIFIED_TRANSITION = 6, + VERIFIED_LOW_UNKNOWN = 7, + VERIFIED_HIGH = 8, + VERIFIED_INITIAL_UNKNOWN = 9, + VERIFIED_INITIAL_LOW = 10, + VERIFIED_INITIAL_HIGH = 11, + VERIFIED_TRANSITION_ANY_TO_NONE = 12, + VERIFIED_TRANSITION_ANY_TO_HIGH = 13, + VERIFIED_TRANSITION_HIGH_TO_LOW = 14, + VERIFIED_TRANSITION_HIGH_TO_UNKNOWN = 15, + VERIFIED_TRANSITION_UNKNOWN_TO_LOW = 16, + VERIFIED_TRANSITION_LOW_TO_UNKNOWN = 17, + VERIFIED_TRANSITION_NONE_TO_LOW = 18, + VERIFIED_TRANSITION_NONE_TO_UNKNOWN = 19, + GROUP_CREATE = 20, + GROUP_CHANGE_SUBJECT = 21, + GROUP_CHANGE_ICON = 22, + GROUP_CHANGE_INVITE_LINK = 23, + GROUP_CHANGE_DESCRIPTION = 24, + GROUP_CHANGE_RESTRICT = 25, + GROUP_CHANGE_ANNOUNCE = 26, + GROUP_PARTICIPANT_ADD = 27, + GROUP_PARTICIPANT_REMOVE = 28, + GROUP_PARTICIPANT_PROMOTE = 29, + GROUP_PARTICIPANT_DEMOTE = 30, + GROUP_PARTICIPANT_INVITE = 31, + GROUP_PARTICIPANT_LEAVE = 32, + GROUP_PARTICIPANT_CHANGE_NUMBER = 33, + BROADCAST_CREATE = 34, + BROADCAST_ADD = 35, + BROADCAST_REMOVE = 36, + GENERIC_NOTIFICATION = 37, + E2E_IDENTITY_CHANGED = 38, + E2E_ENCRYPTED = 39, + CALL_MISSED_VOICE = 40, + CALL_MISSED_VIDEO = 41, + INDIVIDUAL_CHANGE_NUMBER = 42, + GROUP_DELETE = 43, + GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE = 44, + CALL_MISSED_GROUP_VOICE = 45, + CALL_MISSED_GROUP_VIDEO = 46, + PAYMENT_CIPHERTEXT = 47, + PAYMENT_FUTUREPROOF = 48, + PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED = 49, + PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED = 50, + PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED = 51, + PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP = 52, + PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP = 53, + PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER = 54, + PAYMENT_ACTION_SEND_PAYMENT_REMINDER = 55, + PAYMENT_ACTION_SEND_PAYMENT_INVITATION = 56, + PAYMENT_ACTION_REQUEST_DECLINED = 57, + PAYMENT_ACTION_REQUEST_EXPIRED = 58, + PAYMENT_ACTION_REQUEST_CANCELLED = 59, + BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM = 60, + BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP = 61, + BIZ_INTRO_TOP = 62, + BIZ_INTRO_BOTTOM = 63, + BIZ_NAME_CHANGE = 64, + BIZ_MOVE_TO_CONSUMER_APP = 65, + BIZ_TWO_TIER_MIGRATION_TOP = 66, + BIZ_TWO_TIER_MIGRATION_BOTTOM = 67, + OVERSIZED = 68, + GROUP_CHANGE_NO_FREQUENTLY_FORWARDED = 69, + GROUP_V4_ADD_INVITE_SENT = 70, + GROUP_PARTICIPANT_ADD_REQUEST_JOIN = 71, + CHANGE_EPHEMERAL_SETTING = 72, + E2E_DEVICE_CHANGED = 73, + VIEWED_ONCE = 74, + E2E_ENCRYPTED_NOW = 75, + BLUE_MSG_BSP_FB_TO_BSP_PREMISE = 76, + BLUE_MSG_BSP_FB_TO_SELF_FB = 77, + BLUE_MSG_BSP_FB_TO_SELF_PREMISE = 78, + BLUE_MSG_BSP_FB_UNVERIFIED = 79, + BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 80, + BLUE_MSG_BSP_FB_VERIFIED = 81, + BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 82, + BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE = 83, + BLUE_MSG_BSP_PREMISE_UNVERIFIED = 84, + BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 85, + BLUE_MSG_BSP_PREMISE_VERIFIED = 86, + BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 87, + BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED = 88, + BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED = 89, + BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED = 90, + BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED = 91, + BLUE_MSG_SELF_FB_TO_BSP_PREMISE = 92, + BLUE_MSG_SELF_FB_TO_SELF_PREMISE = 93, + BLUE_MSG_SELF_FB_UNVERIFIED = 94, + BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED = 95, + BLUE_MSG_SELF_FB_VERIFIED = 96, + BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED = 97, + BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE = 98, + BLUE_MSG_SELF_PREMISE_UNVERIFIED = 99, + BLUE_MSG_SELF_PREMISE_VERIFIED = 100, + BLUE_MSG_TO_BSP_FB = 101, + BLUE_MSG_TO_CONSUMER = 102, + BLUE_MSG_TO_SELF_FB = 103, + BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED = 104, + BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 105, + BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED = 106, + BLUE_MSG_UNVERIFIED_TO_VERIFIED = 107, + BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED = 108, + BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 109, + BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED = 110, + BLUE_MSG_VERIFIED_TO_UNVERIFIED = 111, + BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 112, + BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED = 113, + BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 114, + BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED = 115, + BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED = 116, + BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED = 117, + E2E_IDENTITY_UNAVAILABLE = 118, + GROUP_CREATING = 119, + GROUP_CREATE_FAILED = 120, + GROUP_BOUNCED = 121, + BLOCK_CONTACT = 122, + EPHEMERAL_SETTING_NOT_APPLIED = 123, + SYNC_FAILED = 124, + SYNCING = 125, + BIZ_PRIVACY_MODE_INIT_FB = 126, + BIZ_PRIVACY_MODE_INIT_BSP = 127, + BIZ_PRIVACY_MODE_TO_FB = 128, + BIZ_PRIVACY_MODE_TO_BSP = 129, + DISAPPEARING_MODE = 130, + E2E_DEVICE_FETCH_FAILED = 131, + ADMIN_REVOKE = 132, + GROUP_INVITE_LINK_GROWTH_LOCKED = 133, + COMMUNITY_LINK_PARENT_GROUP = 134, + COMMUNITY_LINK_SIBLING_GROUP = 135, + COMMUNITY_LINK_SUB_GROUP = 136, + COMMUNITY_UNLINK_PARENT_GROUP = 137, + COMMUNITY_UNLINK_SIBLING_GROUP = 138, + COMMUNITY_UNLINK_SUB_GROUP = 139, + GROUP_PARTICIPANT_ACCEPT = 140, + GROUP_PARTICIPANT_LINKED_GROUP_JOIN = 141, + COMMUNITY_CREATE = 142, + EPHEMERAL_KEEP_IN_CHAT = 143, + GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST = 144, + GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE = 145, + INTEGRITY_UNLINK_PARENT_GROUP = 146, + COMMUNITY_PARTICIPANT_PROMOTE = 147, + COMMUNITY_PARTICIPANT_DEMOTE = 148, + COMMUNITY_PARENT_GROUP_DELETED = 149, + COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL = 150, + GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP = 151, + MASKED_THREAD_CREATED = 152, + MASKED_THREAD_UNMASKED = 153, + BIZ_CHAT_ASSIGNMENT = 154, + CHAT_PSA = 155, + CHAT_POLL_CREATION_MESSAGE = 156, + CAG_MASKED_THREAD_CREATED = 157, + COMMUNITY_PARENT_GROUP_SUBJECT_CHANGED = 158, + CAG_INVITE_AUTO_ADD = 159, + BIZ_CHAT_ASSIGNMENT_UNASSIGN = 160, + CAG_INVITE_AUTO_JOINED = 161 + } + } + + /** Properties of a WebNotificationsInfo. */ + interface IWebNotificationsInfo { + + /** WebNotificationsInfo timestamp */ + timestamp?: (number|Long|null); + + /** WebNotificationsInfo unreadChats */ + unreadChats?: (number|null); + + /** WebNotificationsInfo notifyMessageCount */ + notifyMessageCount?: (number|null); + + /** WebNotificationsInfo notifyMessages */ + notifyMessages?: (proto.IWebMessageInfo[]|null); + } + + /** Represents a WebNotificationsInfo. */ + class WebNotificationsInfo implements IWebNotificationsInfo { + + /** + * Constructs a new WebNotificationsInfo. + * @param [properties] Properties to set + */ + constructor(properties?: proto.IWebNotificationsInfo); + + /** WebNotificationsInfo timestamp. */ + public timestamp: (number|Long); + + /** WebNotificationsInfo unreadChats. */ + public unreadChats: number; + + /** WebNotificationsInfo notifyMessageCount. */ + public notifyMessageCount: number; + + /** WebNotificationsInfo notifyMessages. */ + public notifyMessages: proto.IWebMessageInfo[]; + + /** + * Creates a new WebNotificationsInfo instance using the specified properties. + * @param [properties] Properties to set + * @returns WebNotificationsInfo instance + */ + public static create(properties?: proto.IWebNotificationsInfo): proto.WebNotificationsInfo; + + /** + * Encodes the specified WebNotificationsInfo message. Does not implicitly {@link proto.WebNotificationsInfo.verify|verify} messages. + * @param message WebNotificationsInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: proto.IWebNotificationsInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified WebNotificationsInfo message, length delimited. Does not implicitly {@link proto.WebNotificationsInfo.verify|verify} messages. + * @param message WebNotificationsInfo message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: proto.IWebNotificationsInfo, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a WebNotificationsInfo message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns WebNotificationsInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): proto.WebNotificationsInfo; + + /** + * Decodes a WebNotificationsInfo message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns WebNotificationsInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): proto.WebNotificationsInfo; + + /** + * Verifies a WebNotificationsInfo message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a WebNotificationsInfo message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns WebNotificationsInfo + */ + public static fromObject(object: { [k: string]: any }): proto.WebNotificationsInfo; + + /** + * Creates a plain object from a WebNotificationsInfo message. Also converts values to other types if specified. + * @param message WebNotificationsInfo + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: proto.WebNotificationsInfo, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this WebNotificationsInfo to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } +} diff --git a/whatsapp_addon/Baileys/WAProto/index.js b/whatsapp_addon/Baileys/WAProto/index.js new file mode 100644 index 0000000..bca23b3 --- /dev/null +++ b/whatsapp_addon/Baileys/WAProto/index.js @@ -0,0 +1,75638 @@ +/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ +"use strict"; + +var $protobuf = require("protobufjs/minimal"); + +// Common aliases +var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; + +// Exported root namespace +var $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); + +$root.proto = (function() { + + /** + * Namespace proto. + * @exports proto + * @namespace + */ + var proto = {}; + + proto.ADVDeviceIdentity = (function() { + + /** + * Properties of a ADVDeviceIdentity. + * @memberof proto + * @interface IADVDeviceIdentity + * @property {number|null} [rawId] ADVDeviceIdentity rawId + * @property {number|Long|null} [timestamp] ADVDeviceIdentity timestamp + * @property {number|null} [keyIndex] ADVDeviceIdentity keyIndex + */ + + /** + * Constructs a new ADVDeviceIdentity. + * @memberof proto + * @classdesc Represents a ADVDeviceIdentity. + * @implements IADVDeviceIdentity + * @constructor + * @param {proto.IADVDeviceIdentity=} [properties] Properties to set + */ + function ADVDeviceIdentity(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ADVDeviceIdentity rawId. + * @member {number} rawId + * @memberof proto.ADVDeviceIdentity + * @instance + */ + ADVDeviceIdentity.prototype.rawId = 0; + + /** + * ADVDeviceIdentity timestamp. + * @member {number|Long} timestamp + * @memberof proto.ADVDeviceIdentity + * @instance + */ + ADVDeviceIdentity.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ADVDeviceIdentity keyIndex. + * @member {number} keyIndex + * @memberof proto.ADVDeviceIdentity + * @instance + */ + ADVDeviceIdentity.prototype.keyIndex = 0; + + /** + * Creates a new ADVDeviceIdentity instance using the specified properties. + * @function create + * @memberof proto.ADVDeviceIdentity + * @static + * @param {proto.IADVDeviceIdentity=} [properties] Properties to set + * @returns {proto.ADVDeviceIdentity} ADVDeviceIdentity instance + */ + ADVDeviceIdentity.create = function create(properties) { + return new ADVDeviceIdentity(properties); + }; + + /** + * Encodes the specified ADVDeviceIdentity message. Does not implicitly {@link proto.ADVDeviceIdentity.verify|verify} messages. + * @function encode + * @memberof proto.ADVDeviceIdentity + * @static + * @param {proto.IADVDeviceIdentity} message ADVDeviceIdentity message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVDeviceIdentity.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.rawId != null && Object.hasOwnProperty.call(message, "rawId")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.rawId); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); + if (message.keyIndex != null && Object.hasOwnProperty.call(message, "keyIndex")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.keyIndex); + return writer; + }; + + /** + * Encodes the specified ADVDeviceIdentity message, length delimited. Does not implicitly {@link proto.ADVDeviceIdentity.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ADVDeviceIdentity + * @static + * @param {proto.IADVDeviceIdentity} message ADVDeviceIdentity message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVDeviceIdentity.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ADVDeviceIdentity message from the specified reader or buffer. + * @function decode + * @memberof proto.ADVDeviceIdentity + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ADVDeviceIdentity} ADVDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVDeviceIdentity.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ADVDeviceIdentity(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.rawId = reader.uint32(); + break; + case 2: + message.timestamp = reader.uint64(); + break; + case 3: + message.keyIndex = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ADVDeviceIdentity message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ADVDeviceIdentity + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ADVDeviceIdentity} ADVDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVDeviceIdentity.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ADVDeviceIdentity message. + * @function verify + * @memberof proto.ADVDeviceIdentity + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ADVDeviceIdentity.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.rawId != null && message.hasOwnProperty("rawId")) + if (!$util.isInteger(message.rawId)) + return "rawId: integer expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + if (message.keyIndex != null && message.hasOwnProperty("keyIndex")) + if (!$util.isInteger(message.keyIndex)) + return "keyIndex: integer expected"; + return null; + }; + + /** + * Creates a ADVDeviceIdentity message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ADVDeviceIdentity + * @static + * @param {Object.} object Plain object + * @returns {proto.ADVDeviceIdentity} ADVDeviceIdentity + */ + ADVDeviceIdentity.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ADVDeviceIdentity) + return object; + var message = new $root.proto.ADVDeviceIdentity(); + if (object.rawId != null) + message.rawId = object.rawId >>> 0; + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = true; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true); + if (object.keyIndex != null) + message.keyIndex = object.keyIndex >>> 0; + return message; + }; + + /** + * Creates a plain object from a ADVDeviceIdentity message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ADVDeviceIdentity + * @static + * @param {proto.ADVDeviceIdentity} message ADVDeviceIdentity + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ADVDeviceIdentity.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.rawId = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + object.keyIndex = 0; + } + if (message.rawId != null && message.hasOwnProperty("rawId")) + object.rawId = message.rawId; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp; + if (message.keyIndex != null && message.hasOwnProperty("keyIndex")) + object.keyIndex = message.keyIndex; + return object; + }; + + /** + * Converts this ADVDeviceIdentity to JSON. + * @function toJSON + * @memberof proto.ADVDeviceIdentity + * @instance + * @returns {Object.} JSON object + */ + ADVDeviceIdentity.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ADVDeviceIdentity; + })(); + + proto.ADVKeyIndexList = (function() { + + /** + * Properties of a ADVKeyIndexList. + * @memberof proto + * @interface IADVKeyIndexList + * @property {number|null} [rawId] ADVKeyIndexList rawId + * @property {number|Long|null} [timestamp] ADVKeyIndexList timestamp + * @property {number|null} [currentIndex] ADVKeyIndexList currentIndex + * @property {Array.|null} [validIndexes] ADVKeyIndexList validIndexes + */ + + /** + * Constructs a new ADVKeyIndexList. + * @memberof proto + * @classdesc Represents a ADVKeyIndexList. + * @implements IADVKeyIndexList + * @constructor + * @param {proto.IADVKeyIndexList=} [properties] Properties to set + */ + function ADVKeyIndexList(properties) { + this.validIndexes = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ADVKeyIndexList rawId. + * @member {number} rawId + * @memberof proto.ADVKeyIndexList + * @instance + */ + ADVKeyIndexList.prototype.rawId = 0; + + /** + * ADVKeyIndexList timestamp. + * @member {number|Long} timestamp + * @memberof proto.ADVKeyIndexList + * @instance + */ + ADVKeyIndexList.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ADVKeyIndexList currentIndex. + * @member {number} currentIndex + * @memberof proto.ADVKeyIndexList + * @instance + */ + ADVKeyIndexList.prototype.currentIndex = 0; + + /** + * ADVKeyIndexList validIndexes. + * @member {Array.} validIndexes + * @memberof proto.ADVKeyIndexList + * @instance + */ + ADVKeyIndexList.prototype.validIndexes = $util.emptyArray; + + /** + * Creates a new ADVKeyIndexList instance using the specified properties. + * @function create + * @memberof proto.ADVKeyIndexList + * @static + * @param {proto.IADVKeyIndexList=} [properties] Properties to set + * @returns {proto.ADVKeyIndexList} ADVKeyIndexList instance + */ + ADVKeyIndexList.create = function create(properties) { + return new ADVKeyIndexList(properties); + }; + + /** + * Encodes the specified ADVKeyIndexList message. Does not implicitly {@link proto.ADVKeyIndexList.verify|verify} messages. + * @function encode + * @memberof proto.ADVKeyIndexList + * @static + * @param {proto.IADVKeyIndexList} message ADVKeyIndexList message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVKeyIndexList.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.rawId != null && Object.hasOwnProperty.call(message, "rawId")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.rawId); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); + if (message.currentIndex != null && Object.hasOwnProperty.call(message, "currentIndex")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.currentIndex); + if (message.validIndexes != null && message.validIndexes.length) { + writer.uint32(/* id 4, wireType 2 =*/34).fork(); + for (var i = 0; i < message.validIndexes.length; ++i) + writer.uint32(message.validIndexes[i]); + writer.ldelim(); + } + return writer; + }; + + /** + * Encodes the specified ADVKeyIndexList message, length delimited. Does not implicitly {@link proto.ADVKeyIndexList.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ADVKeyIndexList + * @static + * @param {proto.IADVKeyIndexList} message ADVKeyIndexList message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVKeyIndexList.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ADVKeyIndexList message from the specified reader or buffer. + * @function decode + * @memberof proto.ADVKeyIndexList + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ADVKeyIndexList} ADVKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVKeyIndexList.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ADVKeyIndexList(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.rawId = reader.uint32(); + break; + case 2: + message.timestamp = reader.uint64(); + break; + case 3: + message.currentIndex = reader.uint32(); + break; + case 4: + if (!(message.validIndexes && message.validIndexes.length)) + message.validIndexes = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.validIndexes.push(reader.uint32()); + } else + message.validIndexes.push(reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ADVKeyIndexList message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ADVKeyIndexList + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ADVKeyIndexList} ADVKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVKeyIndexList.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ADVKeyIndexList message. + * @function verify + * @memberof proto.ADVKeyIndexList + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ADVKeyIndexList.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.rawId != null && message.hasOwnProperty("rawId")) + if (!$util.isInteger(message.rawId)) + return "rawId: integer expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + if (message.currentIndex != null && message.hasOwnProperty("currentIndex")) + if (!$util.isInteger(message.currentIndex)) + return "currentIndex: integer expected"; + if (message.validIndexes != null && message.hasOwnProperty("validIndexes")) { + if (!Array.isArray(message.validIndexes)) + return "validIndexes: array expected"; + for (var i = 0; i < message.validIndexes.length; ++i) + if (!$util.isInteger(message.validIndexes[i])) + return "validIndexes: integer[] expected"; + } + return null; + }; + + /** + * Creates a ADVKeyIndexList message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ADVKeyIndexList + * @static + * @param {Object.} object Plain object + * @returns {proto.ADVKeyIndexList} ADVKeyIndexList + */ + ADVKeyIndexList.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ADVKeyIndexList) + return object; + var message = new $root.proto.ADVKeyIndexList(); + if (object.rawId != null) + message.rawId = object.rawId >>> 0; + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = true; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true); + if (object.currentIndex != null) + message.currentIndex = object.currentIndex >>> 0; + if (object.validIndexes) { + if (!Array.isArray(object.validIndexes)) + throw TypeError(".proto.ADVKeyIndexList.validIndexes: array expected"); + message.validIndexes = []; + for (var i = 0; i < object.validIndexes.length; ++i) + message.validIndexes[i] = object.validIndexes[i] >>> 0; + } + return message; + }; + + /** + * Creates a plain object from a ADVKeyIndexList message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ADVKeyIndexList + * @static + * @param {proto.ADVKeyIndexList} message ADVKeyIndexList + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ADVKeyIndexList.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.validIndexes = []; + if (options.defaults) { + object.rawId = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + object.currentIndex = 0; + } + if (message.rawId != null && message.hasOwnProperty("rawId")) + object.rawId = message.rawId; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp; + if (message.currentIndex != null && message.hasOwnProperty("currentIndex")) + object.currentIndex = message.currentIndex; + if (message.validIndexes && message.validIndexes.length) { + object.validIndexes = []; + for (var j = 0; j < message.validIndexes.length; ++j) + object.validIndexes[j] = message.validIndexes[j]; + } + return object; + }; + + /** + * Converts this ADVKeyIndexList to JSON. + * @function toJSON + * @memberof proto.ADVKeyIndexList + * @instance + * @returns {Object.} JSON object + */ + ADVKeyIndexList.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ADVKeyIndexList; + })(); + + proto.ADVSignedDeviceIdentity = (function() { + + /** + * Properties of a ADVSignedDeviceIdentity. + * @memberof proto + * @interface IADVSignedDeviceIdentity + * @property {Uint8Array|null} [details] ADVSignedDeviceIdentity details + * @property {Uint8Array|null} [accountSignatureKey] ADVSignedDeviceIdentity accountSignatureKey + * @property {Uint8Array|null} [accountSignature] ADVSignedDeviceIdentity accountSignature + * @property {Uint8Array|null} [deviceSignature] ADVSignedDeviceIdentity deviceSignature + */ + + /** + * Constructs a new ADVSignedDeviceIdentity. + * @memberof proto + * @classdesc Represents a ADVSignedDeviceIdentity. + * @implements IADVSignedDeviceIdentity + * @constructor + * @param {proto.IADVSignedDeviceIdentity=} [properties] Properties to set + */ + function ADVSignedDeviceIdentity(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ADVSignedDeviceIdentity details. + * @member {Uint8Array} details + * @memberof proto.ADVSignedDeviceIdentity + * @instance + */ + ADVSignedDeviceIdentity.prototype.details = $util.newBuffer([]); + + /** + * ADVSignedDeviceIdentity accountSignatureKey. + * @member {Uint8Array} accountSignatureKey + * @memberof proto.ADVSignedDeviceIdentity + * @instance + */ + ADVSignedDeviceIdentity.prototype.accountSignatureKey = $util.newBuffer([]); + + /** + * ADVSignedDeviceIdentity accountSignature. + * @member {Uint8Array} accountSignature + * @memberof proto.ADVSignedDeviceIdentity + * @instance + */ + ADVSignedDeviceIdentity.prototype.accountSignature = $util.newBuffer([]); + + /** + * ADVSignedDeviceIdentity deviceSignature. + * @member {Uint8Array} deviceSignature + * @memberof proto.ADVSignedDeviceIdentity + * @instance + */ + ADVSignedDeviceIdentity.prototype.deviceSignature = $util.newBuffer([]); + + /** + * Creates a new ADVSignedDeviceIdentity instance using the specified properties. + * @function create + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {proto.IADVSignedDeviceIdentity=} [properties] Properties to set + * @returns {proto.ADVSignedDeviceIdentity} ADVSignedDeviceIdentity instance + */ + ADVSignedDeviceIdentity.create = function create(properties) { + return new ADVSignedDeviceIdentity(properties); + }; + + /** + * Encodes the specified ADVSignedDeviceIdentity message. Does not implicitly {@link proto.ADVSignedDeviceIdentity.verify|verify} messages. + * @function encode + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {proto.IADVSignedDeviceIdentity} message ADVSignedDeviceIdentity message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVSignedDeviceIdentity.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.details != null && Object.hasOwnProperty.call(message, "details")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.details); + if (message.accountSignatureKey != null && Object.hasOwnProperty.call(message, "accountSignatureKey")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.accountSignatureKey); + if (message.accountSignature != null && Object.hasOwnProperty.call(message, "accountSignature")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.accountSignature); + if (message.deviceSignature != null && Object.hasOwnProperty.call(message, "deviceSignature")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.deviceSignature); + return writer; + }; + + /** + * Encodes the specified ADVSignedDeviceIdentity message, length delimited. Does not implicitly {@link proto.ADVSignedDeviceIdentity.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {proto.IADVSignedDeviceIdentity} message ADVSignedDeviceIdentity message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVSignedDeviceIdentity.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ADVSignedDeviceIdentity message from the specified reader or buffer. + * @function decode + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ADVSignedDeviceIdentity} ADVSignedDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVSignedDeviceIdentity.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ADVSignedDeviceIdentity(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.details = reader.bytes(); + break; + case 2: + message.accountSignatureKey = reader.bytes(); + break; + case 3: + message.accountSignature = reader.bytes(); + break; + case 4: + message.deviceSignature = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ADVSignedDeviceIdentity message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ADVSignedDeviceIdentity} ADVSignedDeviceIdentity + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVSignedDeviceIdentity.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ADVSignedDeviceIdentity message. + * @function verify + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ADVSignedDeviceIdentity.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.details != null && message.hasOwnProperty("details")) + if (!(message.details && typeof message.details.length === "number" || $util.isString(message.details))) + return "details: buffer expected"; + if (message.accountSignatureKey != null && message.hasOwnProperty("accountSignatureKey")) + if (!(message.accountSignatureKey && typeof message.accountSignatureKey.length === "number" || $util.isString(message.accountSignatureKey))) + return "accountSignatureKey: buffer expected"; + if (message.accountSignature != null && message.hasOwnProperty("accountSignature")) + if (!(message.accountSignature && typeof message.accountSignature.length === "number" || $util.isString(message.accountSignature))) + return "accountSignature: buffer expected"; + if (message.deviceSignature != null && message.hasOwnProperty("deviceSignature")) + if (!(message.deviceSignature && typeof message.deviceSignature.length === "number" || $util.isString(message.deviceSignature))) + return "deviceSignature: buffer expected"; + return null; + }; + + /** + * Creates a ADVSignedDeviceIdentity message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {Object.} object Plain object + * @returns {proto.ADVSignedDeviceIdentity} ADVSignedDeviceIdentity + */ + ADVSignedDeviceIdentity.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ADVSignedDeviceIdentity) + return object; + var message = new $root.proto.ADVSignedDeviceIdentity(); + if (object.details != null) + if (typeof object.details === "string") + $util.base64.decode(object.details, message.details = $util.newBuffer($util.base64.length(object.details)), 0); + else if (object.details.length) + message.details = object.details; + if (object.accountSignatureKey != null) + if (typeof object.accountSignatureKey === "string") + $util.base64.decode(object.accountSignatureKey, message.accountSignatureKey = $util.newBuffer($util.base64.length(object.accountSignatureKey)), 0); + else if (object.accountSignatureKey.length) + message.accountSignatureKey = object.accountSignatureKey; + if (object.accountSignature != null) + if (typeof object.accountSignature === "string") + $util.base64.decode(object.accountSignature, message.accountSignature = $util.newBuffer($util.base64.length(object.accountSignature)), 0); + else if (object.accountSignature.length) + message.accountSignature = object.accountSignature; + if (object.deviceSignature != null) + if (typeof object.deviceSignature === "string") + $util.base64.decode(object.deviceSignature, message.deviceSignature = $util.newBuffer($util.base64.length(object.deviceSignature)), 0); + else if (object.deviceSignature.length) + message.deviceSignature = object.deviceSignature; + return message; + }; + + /** + * Creates a plain object from a ADVSignedDeviceIdentity message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ADVSignedDeviceIdentity + * @static + * @param {proto.ADVSignedDeviceIdentity} message ADVSignedDeviceIdentity + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ADVSignedDeviceIdentity.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.details = ""; + else { + object.details = []; + if (options.bytes !== Array) + object.details = $util.newBuffer(object.details); + } + if (options.bytes === String) + object.accountSignatureKey = ""; + else { + object.accountSignatureKey = []; + if (options.bytes !== Array) + object.accountSignatureKey = $util.newBuffer(object.accountSignatureKey); + } + if (options.bytes === String) + object.accountSignature = ""; + else { + object.accountSignature = []; + if (options.bytes !== Array) + object.accountSignature = $util.newBuffer(object.accountSignature); + } + if (options.bytes === String) + object.deviceSignature = ""; + else { + object.deviceSignature = []; + if (options.bytes !== Array) + object.deviceSignature = $util.newBuffer(object.deviceSignature); + } + } + if (message.details != null && message.hasOwnProperty("details")) + object.details = options.bytes === String ? $util.base64.encode(message.details, 0, message.details.length) : options.bytes === Array ? Array.prototype.slice.call(message.details) : message.details; + if (message.accountSignatureKey != null && message.hasOwnProperty("accountSignatureKey")) + object.accountSignatureKey = options.bytes === String ? $util.base64.encode(message.accountSignatureKey, 0, message.accountSignatureKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.accountSignatureKey) : message.accountSignatureKey; + if (message.accountSignature != null && message.hasOwnProperty("accountSignature")) + object.accountSignature = options.bytes === String ? $util.base64.encode(message.accountSignature, 0, message.accountSignature.length) : options.bytes === Array ? Array.prototype.slice.call(message.accountSignature) : message.accountSignature; + if (message.deviceSignature != null && message.hasOwnProperty("deviceSignature")) + object.deviceSignature = options.bytes === String ? $util.base64.encode(message.deviceSignature, 0, message.deviceSignature.length) : options.bytes === Array ? Array.prototype.slice.call(message.deviceSignature) : message.deviceSignature; + return object; + }; + + /** + * Converts this ADVSignedDeviceIdentity to JSON. + * @function toJSON + * @memberof proto.ADVSignedDeviceIdentity + * @instance + * @returns {Object.} JSON object + */ + ADVSignedDeviceIdentity.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ADVSignedDeviceIdentity; + })(); + + proto.ADVSignedDeviceIdentityHMAC = (function() { + + /** + * Properties of a ADVSignedDeviceIdentityHMAC. + * @memberof proto + * @interface IADVSignedDeviceIdentityHMAC + * @property {Uint8Array|null} [details] ADVSignedDeviceIdentityHMAC details + * @property {Uint8Array|null} [hmac] ADVSignedDeviceIdentityHMAC hmac + */ + + /** + * Constructs a new ADVSignedDeviceIdentityHMAC. + * @memberof proto + * @classdesc Represents a ADVSignedDeviceIdentityHMAC. + * @implements IADVSignedDeviceIdentityHMAC + * @constructor + * @param {proto.IADVSignedDeviceIdentityHMAC=} [properties] Properties to set + */ + function ADVSignedDeviceIdentityHMAC(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ADVSignedDeviceIdentityHMAC details. + * @member {Uint8Array} details + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @instance + */ + ADVSignedDeviceIdentityHMAC.prototype.details = $util.newBuffer([]); + + /** + * ADVSignedDeviceIdentityHMAC hmac. + * @member {Uint8Array} hmac + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @instance + */ + ADVSignedDeviceIdentityHMAC.prototype.hmac = $util.newBuffer([]); + + /** + * Creates a new ADVSignedDeviceIdentityHMAC instance using the specified properties. + * @function create + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {proto.IADVSignedDeviceIdentityHMAC=} [properties] Properties to set + * @returns {proto.ADVSignedDeviceIdentityHMAC} ADVSignedDeviceIdentityHMAC instance + */ + ADVSignedDeviceIdentityHMAC.create = function create(properties) { + return new ADVSignedDeviceIdentityHMAC(properties); + }; + + /** + * Encodes the specified ADVSignedDeviceIdentityHMAC message. Does not implicitly {@link proto.ADVSignedDeviceIdentityHMAC.verify|verify} messages. + * @function encode + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {proto.IADVSignedDeviceIdentityHMAC} message ADVSignedDeviceIdentityHMAC message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVSignedDeviceIdentityHMAC.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.details != null && Object.hasOwnProperty.call(message, "details")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.details); + if (message.hmac != null && Object.hasOwnProperty.call(message, "hmac")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.hmac); + return writer; + }; + + /** + * Encodes the specified ADVSignedDeviceIdentityHMAC message, length delimited. Does not implicitly {@link proto.ADVSignedDeviceIdentityHMAC.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {proto.IADVSignedDeviceIdentityHMAC} message ADVSignedDeviceIdentityHMAC message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVSignedDeviceIdentityHMAC.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ADVSignedDeviceIdentityHMAC message from the specified reader or buffer. + * @function decode + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ADVSignedDeviceIdentityHMAC} ADVSignedDeviceIdentityHMAC + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVSignedDeviceIdentityHMAC.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ADVSignedDeviceIdentityHMAC(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.details = reader.bytes(); + break; + case 2: + message.hmac = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ADVSignedDeviceIdentityHMAC message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ADVSignedDeviceIdentityHMAC} ADVSignedDeviceIdentityHMAC + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVSignedDeviceIdentityHMAC.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ADVSignedDeviceIdentityHMAC message. + * @function verify + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ADVSignedDeviceIdentityHMAC.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.details != null && message.hasOwnProperty("details")) + if (!(message.details && typeof message.details.length === "number" || $util.isString(message.details))) + return "details: buffer expected"; + if (message.hmac != null && message.hasOwnProperty("hmac")) + if (!(message.hmac && typeof message.hmac.length === "number" || $util.isString(message.hmac))) + return "hmac: buffer expected"; + return null; + }; + + /** + * Creates a ADVSignedDeviceIdentityHMAC message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {Object.} object Plain object + * @returns {proto.ADVSignedDeviceIdentityHMAC} ADVSignedDeviceIdentityHMAC + */ + ADVSignedDeviceIdentityHMAC.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ADVSignedDeviceIdentityHMAC) + return object; + var message = new $root.proto.ADVSignedDeviceIdentityHMAC(); + if (object.details != null) + if (typeof object.details === "string") + $util.base64.decode(object.details, message.details = $util.newBuffer($util.base64.length(object.details)), 0); + else if (object.details.length) + message.details = object.details; + if (object.hmac != null) + if (typeof object.hmac === "string") + $util.base64.decode(object.hmac, message.hmac = $util.newBuffer($util.base64.length(object.hmac)), 0); + else if (object.hmac.length) + message.hmac = object.hmac; + return message; + }; + + /** + * Creates a plain object from a ADVSignedDeviceIdentityHMAC message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @static + * @param {proto.ADVSignedDeviceIdentityHMAC} message ADVSignedDeviceIdentityHMAC + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ADVSignedDeviceIdentityHMAC.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.details = ""; + else { + object.details = []; + if (options.bytes !== Array) + object.details = $util.newBuffer(object.details); + } + if (options.bytes === String) + object.hmac = ""; + else { + object.hmac = []; + if (options.bytes !== Array) + object.hmac = $util.newBuffer(object.hmac); + } + } + if (message.details != null && message.hasOwnProperty("details")) + object.details = options.bytes === String ? $util.base64.encode(message.details, 0, message.details.length) : options.bytes === Array ? Array.prototype.slice.call(message.details) : message.details; + if (message.hmac != null && message.hasOwnProperty("hmac")) + object.hmac = options.bytes === String ? $util.base64.encode(message.hmac, 0, message.hmac.length) : options.bytes === Array ? Array.prototype.slice.call(message.hmac) : message.hmac; + return object; + }; + + /** + * Converts this ADVSignedDeviceIdentityHMAC to JSON. + * @function toJSON + * @memberof proto.ADVSignedDeviceIdentityHMAC + * @instance + * @returns {Object.} JSON object + */ + ADVSignedDeviceIdentityHMAC.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ADVSignedDeviceIdentityHMAC; + })(); + + proto.ADVSignedKeyIndexList = (function() { + + /** + * Properties of a ADVSignedKeyIndexList. + * @memberof proto + * @interface IADVSignedKeyIndexList + * @property {Uint8Array|null} [details] ADVSignedKeyIndexList details + * @property {Uint8Array|null} [accountSignature] ADVSignedKeyIndexList accountSignature + */ + + /** + * Constructs a new ADVSignedKeyIndexList. + * @memberof proto + * @classdesc Represents a ADVSignedKeyIndexList. + * @implements IADVSignedKeyIndexList + * @constructor + * @param {proto.IADVSignedKeyIndexList=} [properties] Properties to set + */ + function ADVSignedKeyIndexList(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ADVSignedKeyIndexList details. + * @member {Uint8Array} details + * @memberof proto.ADVSignedKeyIndexList + * @instance + */ + ADVSignedKeyIndexList.prototype.details = $util.newBuffer([]); + + /** + * ADVSignedKeyIndexList accountSignature. + * @member {Uint8Array} accountSignature + * @memberof proto.ADVSignedKeyIndexList + * @instance + */ + ADVSignedKeyIndexList.prototype.accountSignature = $util.newBuffer([]); + + /** + * Creates a new ADVSignedKeyIndexList instance using the specified properties. + * @function create + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {proto.IADVSignedKeyIndexList=} [properties] Properties to set + * @returns {proto.ADVSignedKeyIndexList} ADVSignedKeyIndexList instance + */ + ADVSignedKeyIndexList.create = function create(properties) { + return new ADVSignedKeyIndexList(properties); + }; + + /** + * Encodes the specified ADVSignedKeyIndexList message. Does not implicitly {@link proto.ADVSignedKeyIndexList.verify|verify} messages. + * @function encode + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {proto.IADVSignedKeyIndexList} message ADVSignedKeyIndexList message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVSignedKeyIndexList.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.details != null && Object.hasOwnProperty.call(message, "details")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.details); + if (message.accountSignature != null && Object.hasOwnProperty.call(message, "accountSignature")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.accountSignature); + return writer; + }; + + /** + * Encodes the specified ADVSignedKeyIndexList message, length delimited. Does not implicitly {@link proto.ADVSignedKeyIndexList.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {proto.IADVSignedKeyIndexList} message ADVSignedKeyIndexList message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ADVSignedKeyIndexList.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ADVSignedKeyIndexList message from the specified reader or buffer. + * @function decode + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ADVSignedKeyIndexList} ADVSignedKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVSignedKeyIndexList.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ADVSignedKeyIndexList(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.details = reader.bytes(); + break; + case 2: + message.accountSignature = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ADVSignedKeyIndexList message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ADVSignedKeyIndexList} ADVSignedKeyIndexList + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ADVSignedKeyIndexList.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ADVSignedKeyIndexList message. + * @function verify + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ADVSignedKeyIndexList.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.details != null && message.hasOwnProperty("details")) + if (!(message.details && typeof message.details.length === "number" || $util.isString(message.details))) + return "details: buffer expected"; + if (message.accountSignature != null && message.hasOwnProperty("accountSignature")) + if (!(message.accountSignature && typeof message.accountSignature.length === "number" || $util.isString(message.accountSignature))) + return "accountSignature: buffer expected"; + return null; + }; + + /** + * Creates a ADVSignedKeyIndexList message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {Object.} object Plain object + * @returns {proto.ADVSignedKeyIndexList} ADVSignedKeyIndexList + */ + ADVSignedKeyIndexList.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ADVSignedKeyIndexList) + return object; + var message = new $root.proto.ADVSignedKeyIndexList(); + if (object.details != null) + if (typeof object.details === "string") + $util.base64.decode(object.details, message.details = $util.newBuffer($util.base64.length(object.details)), 0); + else if (object.details.length) + message.details = object.details; + if (object.accountSignature != null) + if (typeof object.accountSignature === "string") + $util.base64.decode(object.accountSignature, message.accountSignature = $util.newBuffer($util.base64.length(object.accountSignature)), 0); + else if (object.accountSignature.length) + message.accountSignature = object.accountSignature; + return message; + }; + + /** + * Creates a plain object from a ADVSignedKeyIndexList message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ADVSignedKeyIndexList + * @static + * @param {proto.ADVSignedKeyIndexList} message ADVSignedKeyIndexList + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ADVSignedKeyIndexList.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.details = ""; + else { + object.details = []; + if (options.bytes !== Array) + object.details = $util.newBuffer(object.details); + } + if (options.bytes === String) + object.accountSignature = ""; + else { + object.accountSignature = []; + if (options.bytes !== Array) + object.accountSignature = $util.newBuffer(object.accountSignature); + } + } + if (message.details != null && message.hasOwnProperty("details")) + object.details = options.bytes === String ? $util.base64.encode(message.details, 0, message.details.length) : options.bytes === Array ? Array.prototype.slice.call(message.details) : message.details; + if (message.accountSignature != null && message.hasOwnProperty("accountSignature")) + object.accountSignature = options.bytes === String ? $util.base64.encode(message.accountSignature, 0, message.accountSignature.length) : options.bytes === Array ? Array.prototype.slice.call(message.accountSignature) : message.accountSignature; + return object; + }; + + /** + * Converts this ADVSignedKeyIndexList to JSON. + * @function toJSON + * @memberof proto.ADVSignedKeyIndexList + * @instance + * @returns {Object.} JSON object + */ + ADVSignedKeyIndexList.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ADVSignedKeyIndexList; + })(); + + proto.ActionLink = (function() { + + /** + * Properties of an ActionLink. + * @memberof proto + * @interface IActionLink + * @property {string|null} [url] ActionLink url + * @property {string|null} [buttonTitle] ActionLink buttonTitle + */ + + /** + * Constructs a new ActionLink. + * @memberof proto + * @classdesc Represents an ActionLink. + * @implements IActionLink + * @constructor + * @param {proto.IActionLink=} [properties] Properties to set + */ + function ActionLink(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ActionLink url. + * @member {string} url + * @memberof proto.ActionLink + * @instance + */ + ActionLink.prototype.url = ""; + + /** + * ActionLink buttonTitle. + * @member {string} buttonTitle + * @memberof proto.ActionLink + * @instance + */ + ActionLink.prototype.buttonTitle = ""; + + /** + * Creates a new ActionLink instance using the specified properties. + * @function create + * @memberof proto.ActionLink + * @static + * @param {proto.IActionLink=} [properties] Properties to set + * @returns {proto.ActionLink} ActionLink instance + */ + ActionLink.create = function create(properties) { + return new ActionLink(properties); + }; + + /** + * Encodes the specified ActionLink message. Does not implicitly {@link proto.ActionLink.verify|verify} messages. + * @function encode + * @memberof proto.ActionLink + * @static + * @param {proto.IActionLink} message ActionLink message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ActionLink.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.buttonTitle != null && Object.hasOwnProperty.call(message, "buttonTitle")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.buttonTitle); + return writer; + }; + + /** + * Encodes the specified ActionLink message, length delimited. Does not implicitly {@link proto.ActionLink.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ActionLink + * @static + * @param {proto.IActionLink} message ActionLink message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ActionLink.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ActionLink message from the specified reader or buffer. + * @function decode + * @memberof proto.ActionLink + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ActionLink} ActionLink + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ActionLink.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ActionLink(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.buttonTitle = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ActionLink message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ActionLink + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ActionLink} ActionLink + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ActionLink.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ActionLink message. + * @function verify + * @memberof proto.ActionLink + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ActionLink.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.buttonTitle != null && message.hasOwnProperty("buttonTitle")) + if (!$util.isString(message.buttonTitle)) + return "buttonTitle: string expected"; + return null; + }; + + /** + * Creates an ActionLink message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ActionLink + * @static + * @param {Object.} object Plain object + * @returns {proto.ActionLink} ActionLink + */ + ActionLink.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ActionLink) + return object; + var message = new $root.proto.ActionLink(); + if (object.url != null) + message.url = String(object.url); + if (object.buttonTitle != null) + message.buttonTitle = String(object.buttonTitle); + return message; + }; + + /** + * Creates a plain object from an ActionLink message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ActionLink + * @static + * @param {proto.ActionLink} message ActionLink + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ActionLink.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = ""; + object.buttonTitle = ""; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.buttonTitle != null && message.hasOwnProperty("buttonTitle")) + object.buttonTitle = message.buttonTitle; + return object; + }; + + /** + * Converts this ActionLink to JSON. + * @function toJSON + * @memberof proto.ActionLink + * @instance + * @returns {Object.} JSON object + */ + ActionLink.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ActionLink; + })(); + + proto.AutoDownloadSettings = (function() { + + /** + * Properties of an AutoDownloadSettings. + * @memberof proto + * @interface IAutoDownloadSettings + * @property {boolean|null} [downloadImages] AutoDownloadSettings downloadImages + * @property {boolean|null} [downloadAudio] AutoDownloadSettings downloadAudio + * @property {boolean|null} [downloadVideo] AutoDownloadSettings downloadVideo + * @property {boolean|null} [downloadDocuments] AutoDownloadSettings downloadDocuments + */ + + /** + * Constructs a new AutoDownloadSettings. + * @memberof proto + * @classdesc Represents an AutoDownloadSettings. + * @implements IAutoDownloadSettings + * @constructor + * @param {proto.IAutoDownloadSettings=} [properties] Properties to set + */ + function AutoDownloadSettings(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AutoDownloadSettings downloadImages. + * @member {boolean} downloadImages + * @memberof proto.AutoDownloadSettings + * @instance + */ + AutoDownloadSettings.prototype.downloadImages = false; + + /** + * AutoDownloadSettings downloadAudio. + * @member {boolean} downloadAudio + * @memberof proto.AutoDownloadSettings + * @instance + */ + AutoDownloadSettings.prototype.downloadAudio = false; + + /** + * AutoDownloadSettings downloadVideo. + * @member {boolean} downloadVideo + * @memberof proto.AutoDownloadSettings + * @instance + */ + AutoDownloadSettings.prototype.downloadVideo = false; + + /** + * AutoDownloadSettings downloadDocuments. + * @member {boolean} downloadDocuments + * @memberof proto.AutoDownloadSettings + * @instance + */ + AutoDownloadSettings.prototype.downloadDocuments = false; + + /** + * Creates a new AutoDownloadSettings instance using the specified properties. + * @function create + * @memberof proto.AutoDownloadSettings + * @static + * @param {proto.IAutoDownloadSettings=} [properties] Properties to set + * @returns {proto.AutoDownloadSettings} AutoDownloadSettings instance + */ + AutoDownloadSettings.create = function create(properties) { + return new AutoDownloadSettings(properties); + }; + + /** + * Encodes the specified AutoDownloadSettings message. Does not implicitly {@link proto.AutoDownloadSettings.verify|verify} messages. + * @function encode + * @memberof proto.AutoDownloadSettings + * @static + * @param {proto.IAutoDownloadSettings} message AutoDownloadSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AutoDownloadSettings.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.downloadImages != null && Object.hasOwnProperty.call(message, "downloadImages")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.downloadImages); + if (message.downloadAudio != null && Object.hasOwnProperty.call(message, "downloadAudio")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.downloadAudio); + if (message.downloadVideo != null && Object.hasOwnProperty.call(message, "downloadVideo")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.downloadVideo); + if (message.downloadDocuments != null && Object.hasOwnProperty.call(message, "downloadDocuments")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.downloadDocuments); + return writer; + }; + + /** + * Encodes the specified AutoDownloadSettings message, length delimited. Does not implicitly {@link proto.AutoDownloadSettings.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.AutoDownloadSettings + * @static + * @param {proto.IAutoDownloadSettings} message AutoDownloadSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AutoDownloadSettings.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AutoDownloadSettings message from the specified reader or buffer. + * @function decode + * @memberof proto.AutoDownloadSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.AutoDownloadSettings} AutoDownloadSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AutoDownloadSettings.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.AutoDownloadSettings(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.downloadImages = reader.bool(); + break; + case 2: + message.downloadAudio = reader.bool(); + break; + case 3: + message.downloadVideo = reader.bool(); + break; + case 4: + message.downloadDocuments = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AutoDownloadSettings message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.AutoDownloadSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.AutoDownloadSettings} AutoDownloadSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AutoDownloadSettings.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AutoDownloadSettings message. + * @function verify + * @memberof proto.AutoDownloadSettings + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AutoDownloadSettings.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.downloadImages != null && message.hasOwnProperty("downloadImages")) + if (typeof message.downloadImages !== "boolean") + return "downloadImages: boolean expected"; + if (message.downloadAudio != null && message.hasOwnProperty("downloadAudio")) + if (typeof message.downloadAudio !== "boolean") + return "downloadAudio: boolean expected"; + if (message.downloadVideo != null && message.hasOwnProperty("downloadVideo")) + if (typeof message.downloadVideo !== "boolean") + return "downloadVideo: boolean expected"; + if (message.downloadDocuments != null && message.hasOwnProperty("downloadDocuments")) + if (typeof message.downloadDocuments !== "boolean") + return "downloadDocuments: boolean expected"; + return null; + }; + + /** + * Creates an AutoDownloadSettings message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.AutoDownloadSettings + * @static + * @param {Object.} object Plain object + * @returns {proto.AutoDownloadSettings} AutoDownloadSettings + */ + AutoDownloadSettings.fromObject = function fromObject(object) { + if (object instanceof $root.proto.AutoDownloadSettings) + return object; + var message = new $root.proto.AutoDownloadSettings(); + if (object.downloadImages != null) + message.downloadImages = Boolean(object.downloadImages); + if (object.downloadAudio != null) + message.downloadAudio = Boolean(object.downloadAudio); + if (object.downloadVideo != null) + message.downloadVideo = Boolean(object.downloadVideo); + if (object.downloadDocuments != null) + message.downloadDocuments = Boolean(object.downloadDocuments); + return message; + }; + + /** + * Creates a plain object from an AutoDownloadSettings message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.AutoDownloadSettings + * @static + * @param {proto.AutoDownloadSettings} message AutoDownloadSettings + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AutoDownloadSettings.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.downloadImages = false; + object.downloadAudio = false; + object.downloadVideo = false; + object.downloadDocuments = false; + } + if (message.downloadImages != null && message.hasOwnProperty("downloadImages")) + object.downloadImages = message.downloadImages; + if (message.downloadAudio != null && message.hasOwnProperty("downloadAudio")) + object.downloadAudio = message.downloadAudio; + if (message.downloadVideo != null && message.hasOwnProperty("downloadVideo")) + object.downloadVideo = message.downloadVideo; + if (message.downloadDocuments != null && message.hasOwnProperty("downloadDocuments")) + object.downloadDocuments = message.downloadDocuments; + return object; + }; + + /** + * Converts this AutoDownloadSettings to JSON. + * @function toJSON + * @memberof proto.AutoDownloadSettings + * @instance + * @returns {Object.} JSON object + */ + AutoDownloadSettings.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AutoDownloadSettings; + })(); + + proto.AvatarUserSettings = (function() { + + /** + * Properties of an AvatarUserSettings. + * @memberof proto + * @interface IAvatarUserSettings + * @property {string|null} [fbid] AvatarUserSettings fbid + * @property {string|null} [password] AvatarUserSettings password + */ + + /** + * Constructs a new AvatarUserSettings. + * @memberof proto + * @classdesc Represents an AvatarUserSettings. + * @implements IAvatarUserSettings + * @constructor + * @param {proto.IAvatarUserSettings=} [properties] Properties to set + */ + function AvatarUserSettings(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AvatarUserSettings fbid. + * @member {string} fbid + * @memberof proto.AvatarUserSettings + * @instance + */ + AvatarUserSettings.prototype.fbid = ""; + + /** + * AvatarUserSettings password. + * @member {string} password + * @memberof proto.AvatarUserSettings + * @instance + */ + AvatarUserSettings.prototype.password = ""; + + /** + * Creates a new AvatarUserSettings instance using the specified properties. + * @function create + * @memberof proto.AvatarUserSettings + * @static + * @param {proto.IAvatarUserSettings=} [properties] Properties to set + * @returns {proto.AvatarUserSettings} AvatarUserSettings instance + */ + AvatarUserSettings.create = function create(properties) { + return new AvatarUserSettings(properties); + }; + + /** + * Encodes the specified AvatarUserSettings message. Does not implicitly {@link proto.AvatarUserSettings.verify|verify} messages. + * @function encode + * @memberof proto.AvatarUserSettings + * @static + * @param {proto.IAvatarUserSettings} message AvatarUserSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AvatarUserSettings.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.fbid != null && Object.hasOwnProperty.call(message, "fbid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.fbid); + if (message.password != null && Object.hasOwnProperty.call(message, "password")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.password); + return writer; + }; + + /** + * Encodes the specified AvatarUserSettings message, length delimited. Does not implicitly {@link proto.AvatarUserSettings.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.AvatarUserSettings + * @static + * @param {proto.IAvatarUserSettings} message AvatarUserSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AvatarUserSettings.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AvatarUserSettings message from the specified reader or buffer. + * @function decode + * @memberof proto.AvatarUserSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.AvatarUserSettings} AvatarUserSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AvatarUserSettings.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.AvatarUserSettings(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fbid = reader.string(); + break; + case 2: + message.password = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AvatarUserSettings message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.AvatarUserSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.AvatarUserSettings} AvatarUserSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AvatarUserSettings.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AvatarUserSettings message. + * @function verify + * @memberof proto.AvatarUserSettings + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AvatarUserSettings.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.fbid != null && message.hasOwnProperty("fbid")) + if (!$util.isString(message.fbid)) + return "fbid: string expected"; + if (message.password != null && message.hasOwnProperty("password")) + if (!$util.isString(message.password)) + return "password: string expected"; + return null; + }; + + /** + * Creates an AvatarUserSettings message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.AvatarUserSettings + * @static + * @param {Object.} object Plain object + * @returns {proto.AvatarUserSettings} AvatarUserSettings + */ + AvatarUserSettings.fromObject = function fromObject(object) { + if (object instanceof $root.proto.AvatarUserSettings) + return object; + var message = new $root.proto.AvatarUserSettings(); + if (object.fbid != null) + message.fbid = String(object.fbid); + if (object.password != null) + message.password = String(object.password); + return message; + }; + + /** + * Creates a plain object from an AvatarUserSettings message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.AvatarUserSettings + * @static + * @param {proto.AvatarUserSettings} message AvatarUserSettings + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AvatarUserSettings.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.fbid = ""; + object.password = ""; + } + if (message.fbid != null && message.hasOwnProperty("fbid")) + object.fbid = message.fbid; + if (message.password != null && message.hasOwnProperty("password")) + object.password = message.password; + return object; + }; + + /** + * Converts this AvatarUserSettings to JSON. + * @function toJSON + * @memberof proto.AvatarUserSettings + * @instance + * @returns {Object.} JSON object + */ + AvatarUserSettings.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AvatarUserSettings; + })(); + + proto.BizAccountLinkInfo = (function() { + + /** + * Properties of a BizAccountLinkInfo. + * @memberof proto + * @interface IBizAccountLinkInfo + * @property {number|Long|null} [whatsappBizAcctFbid] BizAccountLinkInfo whatsappBizAcctFbid + * @property {string|null} [whatsappAcctNumber] BizAccountLinkInfo whatsappAcctNumber + * @property {number|Long|null} [issueTime] BizAccountLinkInfo issueTime + * @property {proto.BizAccountLinkInfo.HostStorageType|null} [hostStorage] BizAccountLinkInfo hostStorage + * @property {proto.BizAccountLinkInfo.AccountType|null} [accountType] BizAccountLinkInfo accountType + */ + + /** + * Constructs a new BizAccountLinkInfo. + * @memberof proto + * @classdesc Represents a BizAccountLinkInfo. + * @implements IBizAccountLinkInfo + * @constructor + * @param {proto.IBizAccountLinkInfo=} [properties] Properties to set + */ + function BizAccountLinkInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * BizAccountLinkInfo whatsappBizAcctFbid. + * @member {number|Long} whatsappBizAcctFbid + * @memberof proto.BizAccountLinkInfo + * @instance + */ + BizAccountLinkInfo.prototype.whatsappBizAcctFbid = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * BizAccountLinkInfo whatsappAcctNumber. + * @member {string} whatsappAcctNumber + * @memberof proto.BizAccountLinkInfo + * @instance + */ + BizAccountLinkInfo.prototype.whatsappAcctNumber = ""; + + /** + * BizAccountLinkInfo issueTime. + * @member {number|Long} issueTime + * @memberof proto.BizAccountLinkInfo + * @instance + */ + BizAccountLinkInfo.prototype.issueTime = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * BizAccountLinkInfo hostStorage. + * @member {proto.BizAccountLinkInfo.HostStorageType} hostStorage + * @memberof proto.BizAccountLinkInfo + * @instance + */ + BizAccountLinkInfo.prototype.hostStorage = 0; + + /** + * BizAccountLinkInfo accountType. + * @member {proto.BizAccountLinkInfo.AccountType} accountType + * @memberof proto.BizAccountLinkInfo + * @instance + */ + BizAccountLinkInfo.prototype.accountType = 0; + + /** + * Creates a new BizAccountLinkInfo instance using the specified properties. + * @function create + * @memberof proto.BizAccountLinkInfo + * @static + * @param {proto.IBizAccountLinkInfo=} [properties] Properties to set + * @returns {proto.BizAccountLinkInfo} BizAccountLinkInfo instance + */ + BizAccountLinkInfo.create = function create(properties) { + return new BizAccountLinkInfo(properties); + }; + + /** + * Encodes the specified BizAccountLinkInfo message. Does not implicitly {@link proto.BizAccountLinkInfo.verify|verify} messages. + * @function encode + * @memberof proto.BizAccountLinkInfo + * @static + * @param {proto.IBizAccountLinkInfo} message BizAccountLinkInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BizAccountLinkInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.whatsappBizAcctFbid != null && Object.hasOwnProperty.call(message, "whatsappBizAcctFbid")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.whatsappBizAcctFbid); + if (message.whatsappAcctNumber != null && Object.hasOwnProperty.call(message, "whatsappAcctNumber")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.whatsappAcctNumber); + if (message.issueTime != null && Object.hasOwnProperty.call(message, "issueTime")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.issueTime); + if (message.hostStorage != null && Object.hasOwnProperty.call(message, "hostStorage")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.hostStorage); + if (message.accountType != null && Object.hasOwnProperty.call(message, "accountType")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.accountType); + return writer; + }; + + /** + * Encodes the specified BizAccountLinkInfo message, length delimited. Does not implicitly {@link proto.BizAccountLinkInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.BizAccountLinkInfo + * @static + * @param {proto.IBizAccountLinkInfo} message BizAccountLinkInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BizAccountLinkInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BizAccountLinkInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.BizAccountLinkInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.BizAccountLinkInfo} BizAccountLinkInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BizAccountLinkInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.BizAccountLinkInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.whatsappBizAcctFbid = reader.uint64(); + break; + case 2: + message.whatsappAcctNumber = reader.string(); + break; + case 3: + message.issueTime = reader.uint64(); + break; + case 4: + message.hostStorage = reader.int32(); + break; + case 5: + message.accountType = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BizAccountLinkInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.BizAccountLinkInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.BizAccountLinkInfo} BizAccountLinkInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BizAccountLinkInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BizAccountLinkInfo message. + * @function verify + * @memberof proto.BizAccountLinkInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BizAccountLinkInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.whatsappBizAcctFbid != null && message.hasOwnProperty("whatsappBizAcctFbid")) + if (!$util.isInteger(message.whatsappBizAcctFbid) && !(message.whatsappBizAcctFbid && $util.isInteger(message.whatsappBizAcctFbid.low) && $util.isInteger(message.whatsappBizAcctFbid.high))) + return "whatsappBizAcctFbid: integer|Long expected"; + if (message.whatsappAcctNumber != null && message.hasOwnProperty("whatsappAcctNumber")) + if (!$util.isString(message.whatsappAcctNumber)) + return "whatsappAcctNumber: string expected"; + if (message.issueTime != null && message.hasOwnProperty("issueTime")) + if (!$util.isInteger(message.issueTime) && !(message.issueTime && $util.isInteger(message.issueTime.low) && $util.isInteger(message.issueTime.high))) + return "issueTime: integer|Long expected"; + if (message.hostStorage != null && message.hasOwnProperty("hostStorage")) + switch (message.hostStorage) { + default: + return "hostStorage: enum value expected"; + case 0: + case 1: + break; + } + if (message.accountType != null && message.hasOwnProperty("accountType")) + switch (message.accountType) { + default: + return "accountType: enum value expected"; + case 0: + break; + } + return null; + }; + + /** + * Creates a BizAccountLinkInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.BizAccountLinkInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.BizAccountLinkInfo} BizAccountLinkInfo + */ + BizAccountLinkInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.BizAccountLinkInfo) + return object; + var message = new $root.proto.BizAccountLinkInfo(); + if (object.whatsappBizAcctFbid != null) + if ($util.Long) + (message.whatsappBizAcctFbid = $util.Long.fromValue(object.whatsappBizAcctFbid)).unsigned = true; + else if (typeof object.whatsappBizAcctFbid === "string") + message.whatsappBizAcctFbid = parseInt(object.whatsappBizAcctFbid, 10); + else if (typeof object.whatsappBizAcctFbid === "number") + message.whatsappBizAcctFbid = object.whatsappBizAcctFbid; + else if (typeof object.whatsappBizAcctFbid === "object") + message.whatsappBizAcctFbid = new $util.LongBits(object.whatsappBizAcctFbid.low >>> 0, object.whatsappBizAcctFbid.high >>> 0).toNumber(true); + if (object.whatsappAcctNumber != null) + message.whatsappAcctNumber = String(object.whatsappAcctNumber); + if (object.issueTime != null) + if ($util.Long) + (message.issueTime = $util.Long.fromValue(object.issueTime)).unsigned = true; + else if (typeof object.issueTime === "string") + message.issueTime = parseInt(object.issueTime, 10); + else if (typeof object.issueTime === "number") + message.issueTime = object.issueTime; + else if (typeof object.issueTime === "object") + message.issueTime = new $util.LongBits(object.issueTime.low >>> 0, object.issueTime.high >>> 0).toNumber(true); + switch (object.hostStorage) { + case "ON_PREMISE": + case 0: + message.hostStorage = 0; + break; + case "FACEBOOK": + case 1: + message.hostStorage = 1; + break; + } + switch (object.accountType) { + case "ENTERPRISE": + case 0: + message.accountType = 0; + break; + } + return message; + }; + + /** + * Creates a plain object from a BizAccountLinkInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.BizAccountLinkInfo + * @static + * @param {proto.BizAccountLinkInfo} message BizAccountLinkInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + BizAccountLinkInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.whatsappBizAcctFbid = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.whatsappBizAcctFbid = options.longs === String ? "0" : 0; + object.whatsappAcctNumber = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.issueTime = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.issueTime = options.longs === String ? "0" : 0; + object.hostStorage = options.enums === String ? "ON_PREMISE" : 0; + object.accountType = options.enums === String ? "ENTERPRISE" : 0; + } + if (message.whatsappBizAcctFbid != null && message.hasOwnProperty("whatsappBizAcctFbid")) + if (typeof message.whatsappBizAcctFbid === "number") + object.whatsappBizAcctFbid = options.longs === String ? String(message.whatsappBizAcctFbid) : message.whatsappBizAcctFbid; + else + object.whatsappBizAcctFbid = options.longs === String ? $util.Long.prototype.toString.call(message.whatsappBizAcctFbid) : options.longs === Number ? new $util.LongBits(message.whatsappBizAcctFbid.low >>> 0, message.whatsappBizAcctFbid.high >>> 0).toNumber(true) : message.whatsappBizAcctFbid; + if (message.whatsappAcctNumber != null && message.hasOwnProperty("whatsappAcctNumber")) + object.whatsappAcctNumber = message.whatsappAcctNumber; + if (message.issueTime != null && message.hasOwnProperty("issueTime")) + if (typeof message.issueTime === "number") + object.issueTime = options.longs === String ? String(message.issueTime) : message.issueTime; + else + object.issueTime = options.longs === String ? $util.Long.prototype.toString.call(message.issueTime) : options.longs === Number ? new $util.LongBits(message.issueTime.low >>> 0, message.issueTime.high >>> 0).toNumber(true) : message.issueTime; + if (message.hostStorage != null && message.hasOwnProperty("hostStorage")) + object.hostStorage = options.enums === String ? $root.proto.BizAccountLinkInfo.HostStorageType[message.hostStorage] : message.hostStorage; + if (message.accountType != null && message.hasOwnProperty("accountType")) + object.accountType = options.enums === String ? $root.proto.BizAccountLinkInfo.AccountType[message.accountType] : message.accountType; + return object; + }; + + /** + * Converts this BizAccountLinkInfo to JSON. + * @function toJSON + * @memberof proto.BizAccountLinkInfo + * @instance + * @returns {Object.} JSON object + */ + BizAccountLinkInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * AccountType enum. + * @name proto.BizAccountLinkInfo.AccountType + * @enum {number} + * @property {number} ENTERPRISE=0 ENTERPRISE value + */ + BizAccountLinkInfo.AccountType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ENTERPRISE"] = 0; + return values; + })(); + + /** + * HostStorageType enum. + * @name proto.BizAccountLinkInfo.HostStorageType + * @enum {number} + * @property {number} ON_PREMISE=0 ON_PREMISE value + * @property {number} FACEBOOK=1 FACEBOOK value + */ + BizAccountLinkInfo.HostStorageType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ON_PREMISE"] = 0; + values[valuesById[1] = "FACEBOOK"] = 1; + return values; + })(); + + return BizAccountLinkInfo; + })(); + + proto.BizAccountPayload = (function() { + + /** + * Properties of a BizAccountPayload. + * @memberof proto + * @interface IBizAccountPayload + * @property {proto.IVerifiedNameCertificate|null} [vnameCert] BizAccountPayload vnameCert + * @property {Uint8Array|null} [bizAcctLinkInfo] BizAccountPayload bizAcctLinkInfo + */ + + /** + * Constructs a new BizAccountPayload. + * @memberof proto + * @classdesc Represents a BizAccountPayload. + * @implements IBizAccountPayload + * @constructor + * @param {proto.IBizAccountPayload=} [properties] Properties to set + */ + function BizAccountPayload(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * BizAccountPayload vnameCert. + * @member {proto.IVerifiedNameCertificate|null|undefined} vnameCert + * @memberof proto.BizAccountPayload + * @instance + */ + BizAccountPayload.prototype.vnameCert = null; + + /** + * BizAccountPayload bizAcctLinkInfo. + * @member {Uint8Array} bizAcctLinkInfo + * @memberof proto.BizAccountPayload + * @instance + */ + BizAccountPayload.prototype.bizAcctLinkInfo = $util.newBuffer([]); + + /** + * Creates a new BizAccountPayload instance using the specified properties. + * @function create + * @memberof proto.BizAccountPayload + * @static + * @param {proto.IBizAccountPayload=} [properties] Properties to set + * @returns {proto.BizAccountPayload} BizAccountPayload instance + */ + BizAccountPayload.create = function create(properties) { + return new BizAccountPayload(properties); + }; + + /** + * Encodes the specified BizAccountPayload message. Does not implicitly {@link proto.BizAccountPayload.verify|verify} messages. + * @function encode + * @memberof proto.BizAccountPayload + * @static + * @param {proto.IBizAccountPayload} message BizAccountPayload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BizAccountPayload.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.vnameCert != null && Object.hasOwnProperty.call(message, "vnameCert")) + $root.proto.VerifiedNameCertificate.encode(message.vnameCert, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.bizAcctLinkInfo != null && Object.hasOwnProperty.call(message, "bizAcctLinkInfo")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.bizAcctLinkInfo); + return writer; + }; + + /** + * Encodes the specified BizAccountPayload message, length delimited. Does not implicitly {@link proto.BizAccountPayload.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.BizAccountPayload + * @static + * @param {proto.IBizAccountPayload} message BizAccountPayload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BizAccountPayload.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BizAccountPayload message from the specified reader or buffer. + * @function decode + * @memberof proto.BizAccountPayload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.BizAccountPayload} BizAccountPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BizAccountPayload.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.BizAccountPayload(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.vnameCert = $root.proto.VerifiedNameCertificate.decode(reader, reader.uint32()); + break; + case 2: + message.bizAcctLinkInfo = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BizAccountPayload message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.BizAccountPayload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.BizAccountPayload} BizAccountPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BizAccountPayload.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BizAccountPayload message. + * @function verify + * @memberof proto.BizAccountPayload + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BizAccountPayload.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.vnameCert != null && message.hasOwnProperty("vnameCert")) { + var error = $root.proto.VerifiedNameCertificate.verify(message.vnameCert); + if (error) + return "vnameCert." + error; + } + if (message.bizAcctLinkInfo != null && message.hasOwnProperty("bizAcctLinkInfo")) + if (!(message.bizAcctLinkInfo && typeof message.bizAcctLinkInfo.length === "number" || $util.isString(message.bizAcctLinkInfo))) + return "bizAcctLinkInfo: buffer expected"; + return null; + }; + + /** + * Creates a BizAccountPayload message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.BizAccountPayload + * @static + * @param {Object.} object Plain object + * @returns {proto.BizAccountPayload} BizAccountPayload + */ + BizAccountPayload.fromObject = function fromObject(object) { + if (object instanceof $root.proto.BizAccountPayload) + return object; + var message = new $root.proto.BizAccountPayload(); + if (object.vnameCert != null) { + if (typeof object.vnameCert !== "object") + throw TypeError(".proto.BizAccountPayload.vnameCert: object expected"); + message.vnameCert = $root.proto.VerifiedNameCertificate.fromObject(object.vnameCert); + } + if (object.bizAcctLinkInfo != null) + if (typeof object.bizAcctLinkInfo === "string") + $util.base64.decode(object.bizAcctLinkInfo, message.bizAcctLinkInfo = $util.newBuffer($util.base64.length(object.bizAcctLinkInfo)), 0); + else if (object.bizAcctLinkInfo.length) + message.bizAcctLinkInfo = object.bizAcctLinkInfo; + return message; + }; + + /** + * Creates a plain object from a BizAccountPayload message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.BizAccountPayload + * @static + * @param {proto.BizAccountPayload} message BizAccountPayload + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + BizAccountPayload.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.vnameCert = null; + if (options.bytes === String) + object.bizAcctLinkInfo = ""; + else { + object.bizAcctLinkInfo = []; + if (options.bytes !== Array) + object.bizAcctLinkInfo = $util.newBuffer(object.bizAcctLinkInfo); + } + } + if (message.vnameCert != null && message.hasOwnProperty("vnameCert")) + object.vnameCert = $root.proto.VerifiedNameCertificate.toObject(message.vnameCert, options); + if (message.bizAcctLinkInfo != null && message.hasOwnProperty("bizAcctLinkInfo")) + object.bizAcctLinkInfo = options.bytes === String ? $util.base64.encode(message.bizAcctLinkInfo, 0, message.bizAcctLinkInfo.length) : options.bytes === Array ? Array.prototype.slice.call(message.bizAcctLinkInfo) : message.bizAcctLinkInfo; + return object; + }; + + /** + * Converts this BizAccountPayload to JSON. + * @function toJSON + * @memberof proto.BizAccountPayload + * @instance + * @returns {Object.} JSON object + */ + BizAccountPayload.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return BizAccountPayload; + })(); + + proto.BizIdentityInfo = (function() { + + /** + * Properties of a BizIdentityInfo. + * @memberof proto + * @interface IBizIdentityInfo + * @property {proto.BizIdentityInfo.VerifiedLevelValue|null} [vlevel] BizIdentityInfo vlevel + * @property {proto.IVerifiedNameCertificate|null} [vnameCert] BizIdentityInfo vnameCert + * @property {boolean|null} [signed] BizIdentityInfo signed + * @property {boolean|null} [revoked] BizIdentityInfo revoked + * @property {proto.BizIdentityInfo.HostStorageType|null} [hostStorage] BizIdentityInfo hostStorage + * @property {proto.BizIdentityInfo.ActualActorsType|null} [actualActors] BizIdentityInfo actualActors + * @property {number|Long|null} [privacyModeTs] BizIdentityInfo privacyModeTs + * @property {number|Long|null} [featureControls] BizIdentityInfo featureControls + */ + + /** + * Constructs a new BizIdentityInfo. + * @memberof proto + * @classdesc Represents a BizIdentityInfo. + * @implements IBizIdentityInfo + * @constructor + * @param {proto.IBizIdentityInfo=} [properties] Properties to set + */ + function BizIdentityInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * BizIdentityInfo vlevel. + * @member {proto.BizIdentityInfo.VerifiedLevelValue} vlevel + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.vlevel = 0; + + /** + * BizIdentityInfo vnameCert. + * @member {proto.IVerifiedNameCertificate|null|undefined} vnameCert + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.vnameCert = null; + + /** + * BizIdentityInfo signed. + * @member {boolean} signed + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.signed = false; + + /** + * BizIdentityInfo revoked. + * @member {boolean} revoked + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.revoked = false; + + /** + * BizIdentityInfo hostStorage. + * @member {proto.BizIdentityInfo.HostStorageType} hostStorage + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.hostStorage = 0; + + /** + * BizIdentityInfo actualActors. + * @member {proto.BizIdentityInfo.ActualActorsType} actualActors + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.actualActors = 0; + + /** + * BizIdentityInfo privacyModeTs. + * @member {number|Long} privacyModeTs + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.privacyModeTs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * BizIdentityInfo featureControls. + * @member {number|Long} featureControls + * @memberof proto.BizIdentityInfo + * @instance + */ + BizIdentityInfo.prototype.featureControls = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new BizIdentityInfo instance using the specified properties. + * @function create + * @memberof proto.BizIdentityInfo + * @static + * @param {proto.IBizIdentityInfo=} [properties] Properties to set + * @returns {proto.BizIdentityInfo} BizIdentityInfo instance + */ + BizIdentityInfo.create = function create(properties) { + return new BizIdentityInfo(properties); + }; + + /** + * Encodes the specified BizIdentityInfo message. Does not implicitly {@link proto.BizIdentityInfo.verify|verify} messages. + * @function encode + * @memberof proto.BizIdentityInfo + * @static + * @param {proto.IBizIdentityInfo} message BizIdentityInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BizIdentityInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.vlevel != null && Object.hasOwnProperty.call(message, "vlevel")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.vlevel); + if (message.vnameCert != null && Object.hasOwnProperty.call(message, "vnameCert")) + $root.proto.VerifiedNameCertificate.encode(message.vnameCert, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.signed != null && Object.hasOwnProperty.call(message, "signed")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.signed); + if (message.revoked != null && Object.hasOwnProperty.call(message, "revoked")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.revoked); + if (message.hostStorage != null && Object.hasOwnProperty.call(message, "hostStorage")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.hostStorage); + if (message.actualActors != null && Object.hasOwnProperty.call(message, "actualActors")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.actualActors); + if (message.privacyModeTs != null && Object.hasOwnProperty.call(message, "privacyModeTs")) + writer.uint32(/* id 7, wireType 0 =*/56).uint64(message.privacyModeTs); + if (message.featureControls != null && Object.hasOwnProperty.call(message, "featureControls")) + writer.uint32(/* id 8, wireType 0 =*/64).uint64(message.featureControls); + return writer; + }; + + /** + * Encodes the specified BizIdentityInfo message, length delimited. Does not implicitly {@link proto.BizIdentityInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.BizIdentityInfo + * @static + * @param {proto.IBizIdentityInfo} message BizIdentityInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BizIdentityInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BizIdentityInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.BizIdentityInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.BizIdentityInfo} BizIdentityInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BizIdentityInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.BizIdentityInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.vlevel = reader.int32(); + break; + case 2: + message.vnameCert = $root.proto.VerifiedNameCertificate.decode(reader, reader.uint32()); + break; + case 3: + message.signed = reader.bool(); + break; + case 4: + message.revoked = reader.bool(); + break; + case 5: + message.hostStorage = reader.int32(); + break; + case 6: + message.actualActors = reader.int32(); + break; + case 7: + message.privacyModeTs = reader.uint64(); + break; + case 8: + message.featureControls = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BizIdentityInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.BizIdentityInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.BizIdentityInfo} BizIdentityInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BizIdentityInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BizIdentityInfo message. + * @function verify + * @memberof proto.BizIdentityInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BizIdentityInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.vlevel != null && message.hasOwnProperty("vlevel")) + switch (message.vlevel) { + default: + return "vlevel: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.vnameCert != null && message.hasOwnProperty("vnameCert")) { + var error = $root.proto.VerifiedNameCertificate.verify(message.vnameCert); + if (error) + return "vnameCert." + error; + } + if (message.signed != null && message.hasOwnProperty("signed")) + if (typeof message.signed !== "boolean") + return "signed: boolean expected"; + if (message.revoked != null && message.hasOwnProperty("revoked")) + if (typeof message.revoked !== "boolean") + return "revoked: boolean expected"; + if (message.hostStorage != null && message.hasOwnProperty("hostStorage")) + switch (message.hostStorage) { + default: + return "hostStorage: enum value expected"; + case 0: + case 1: + break; + } + if (message.actualActors != null && message.hasOwnProperty("actualActors")) + switch (message.actualActors) { + default: + return "actualActors: enum value expected"; + case 0: + case 1: + break; + } + if (message.privacyModeTs != null && message.hasOwnProperty("privacyModeTs")) + if (!$util.isInteger(message.privacyModeTs) && !(message.privacyModeTs && $util.isInteger(message.privacyModeTs.low) && $util.isInteger(message.privacyModeTs.high))) + return "privacyModeTs: integer|Long expected"; + if (message.featureControls != null && message.hasOwnProperty("featureControls")) + if (!$util.isInteger(message.featureControls) && !(message.featureControls && $util.isInteger(message.featureControls.low) && $util.isInteger(message.featureControls.high))) + return "featureControls: integer|Long expected"; + return null; + }; + + /** + * Creates a BizIdentityInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.BizIdentityInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.BizIdentityInfo} BizIdentityInfo + */ + BizIdentityInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.BizIdentityInfo) + return object; + var message = new $root.proto.BizIdentityInfo(); + switch (object.vlevel) { + case "UNKNOWN": + case 0: + message.vlevel = 0; + break; + case "LOW": + case 1: + message.vlevel = 1; + break; + case "HIGH": + case 2: + message.vlevel = 2; + break; + } + if (object.vnameCert != null) { + if (typeof object.vnameCert !== "object") + throw TypeError(".proto.BizIdentityInfo.vnameCert: object expected"); + message.vnameCert = $root.proto.VerifiedNameCertificate.fromObject(object.vnameCert); + } + if (object.signed != null) + message.signed = Boolean(object.signed); + if (object.revoked != null) + message.revoked = Boolean(object.revoked); + switch (object.hostStorage) { + case "ON_PREMISE": + case 0: + message.hostStorage = 0; + break; + case "FACEBOOK": + case 1: + message.hostStorage = 1; + break; + } + switch (object.actualActors) { + case "SELF": + case 0: + message.actualActors = 0; + break; + case "BSP": + case 1: + message.actualActors = 1; + break; + } + if (object.privacyModeTs != null) + if ($util.Long) + (message.privacyModeTs = $util.Long.fromValue(object.privacyModeTs)).unsigned = true; + else if (typeof object.privacyModeTs === "string") + message.privacyModeTs = parseInt(object.privacyModeTs, 10); + else if (typeof object.privacyModeTs === "number") + message.privacyModeTs = object.privacyModeTs; + else if (typeof object.privacyModeTs === "object") + message.privacyModeTs = new $util.LongBits(object.privacyModeTs.low >>> 0, object.privacyModeTs.high >>> 0).toNumber(true); + if (object.featureControls != null) + if ($util.Long) + (message.featureControls = $util.Long.fromValue(object.featureControls)).unsigned = true; + else if (typeof object.featureControls === "string") + message.featureControls = parseInt(object.featureControls, 10); + else if (typeof object.featureControls === "number") + message.featureControls = object.featureControls; + else if (typeof object.featureControls === "object") + message.featureControls = new $util.LongBits(object.featureControls.low >>> 0, object.featureControls.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a BizIdentityInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.BizIdentityInfo + * @static + * @param {proto.BizIdentityInfo} message BizIdentityInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + BizIdentityInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.vlevel = options.enums === String ? "UNKNOWN" : 0; + object.vnameCert = null; + object.signed = false; + object.revoked = false; + object.hostStorage = options.enums === String ? "ON_PREMISE" : 0; + object.actualActors = options.enums === String ? "SELF" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.privacyModeTs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.privacyModeTs = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.featureControls = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.featureControls = options.longs === String ? "0" : 0; + } + if (message.vlevel != null && message.hasOwnProperty("vlevel")) + object.vlevel = options.enums === String ? $root.proto.BizIdentityInfo.VerifiedLevelValue[message.vlevel] : message.vlevel; + if (message.vnameCert != null && message.hasOwnProperty("vnameCert")) + object.vnameCert = $root.proto.VerifiedNameCertificate.toObject(message.vnameCert, options); + if (message.signed != null && message.hasOwnProperty("signed")) + object.signed = message.signed; + if (message.revoked != null && message.hasOwnProperty("revoked")) + object.revoked = message.revoked; + if (message.hostStorage != null && message.hasOwnProperty("hostStorage")) + object.hostStorage = options.enums === String ? $root.proto.BizIdentityInfo.HostStorageType[message.hostStorage] : message.hostStorage; + if (message.actualActors != null && message.hasOwnProperty("actualActors")) + object.actualActors = options.enums === String ? $root.proto.BizIdentityInfo.ActualActorsType[message.actualActors] : message.actualActors; + if (message.privacyModeTs != null && message.hasOwnProperty("privacyModeTs")) + if (typeof message.privacyModeTs === "number") + object.privacyModeTs = options.longs === String ? String(message.privacyModeTs) : message.privacyModeTs; + else + object.privacyModeTs = options.longs === String ? $util.Long.prototype.toString.call(message.privacyModeTs) : options.longs === Number ? new $util.LongBits(message.privacyModeTs.low >>> 0, message.privacyModeTs.high >>> 0).toNumber(true) : message.privacyModeTs; + if (message.featureControls != null && message.hasOwnProperty("featureControls")) + if (typeof message.featureControls === "number") + object.featureControls = options.longs === String ? String(message.featureControls) : message.featureControls; + else + object.featureControls = options.longs === String ? $util.Long.prototype.toString.call(message.featureControls) : options.longs === Number ? new $util.LongBits(message.featureControls.low >>> 0, message.featureControls.high >>> 0).toNumber(true) : message.featureControls; + return object; + }; + + /** + * Converts this BizIdentityInfo to JSON. + * @function toJSON + * @memberof proto.BizIdentityInfo + * @instance + * @returns {Object.} JSON object + */ + BizIdentityInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ActualActorsType enum. + * @name proto.BizIdentityInfo.ActualActorsType + * @enum {number} + * @property {number} SELF=0 SELF value + * @property {number} BSP=1 BSP value + */ + BizIdentityInfo.ActualActorsType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "SELF"] = 0; + values[valuesById[1] = "BSP"] = 1; + return values; + })(); + + /** + * HostStorageType enum. + * @name proto.BizIdentityInfo.HostStorageType + * @enum {number} + * @property {number} ON_PREMISE=0 ON_PREMISE value + * @property {number} FACEBOOK=1 FACEBOOK value + */ + BizIdentityInfo.HostStorageType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ON_PREMISE"] = 0; + values[valuesById[1] = "FACEBOOK"] = 1; + return values; + })(); + + /** + * VerifiedLevelValue enum. + * @name proto.BizIdentityInfo.VerifiedLevelValue + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} LOW=1 LOW value + * @property {number} HIGH=2 HIGH value + */ + BizIdentityInfo.VerifiedLevelValue = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "LOW"] = 1; + values[valuesById[2] = "HIGH"] = 2; + return values; + })(); + + return BizIdentityInfo; + })(); + + proto.CertChain = (function() { + + /** + * Properties of a CertChain. + * @memberof proto + * @interface ICertChain + * @property {proto.CertChain.INoiseCertificate|null} [leaf] CertChain leaf + * @property {proto.CertChain.INoiseCertificate|null} [intermediate] CertChain intermediate + */ + + /** + * Constructs a new CertChain. + * @memberof proto + * @classdesc Represents a CertChain. + * @implements ICertChain + * @constructor + * @param {proto.ICertChain=} [properties] Properties to set + */ + function CertChain(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CertChain leaf. + * @member {proto.CertChain.INoiseCertificate|null|undefined} leaf + * @memberof proto.CertChain + * @instance + */ + CertChain.prototype.leaf = null; + + /** + * CertChain intermediate. + * @member {proto.CertChain.INoiseCertificate|null|undefined} intermediate + * @memberof proto.CertChain + * @instance + */ + CertChain.prototype.intermediate = null; + + /** + * Creates a new CertChain instance using the specified properties. + * @function create + * @memberof proto.CertChain + * @static + * @param {proto.ICertChain=} [properties] Properties to set + * @returns {proto.CertChain} CertChain instance + */ + CertChain.create = function create(properties) { + return new CertChain(properties); + }; + + /** + * Encodes the specified CertChain message. Does not implicitly {@link proto.CertChain.verify|verify} messages. + * @function encode + * @memberof proto.CertChain + * @static + * @param {proto.ICertChain} message CertChain message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CertChain.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.leaf != null && Object.hasOwnProperty.call(message, "leaf")) + $root.proto.CertChain.NoiseCertificate.encode(message.leaf, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.intermediate != null && Object.hasOwnProperty.call(message, "intermediate")) + $root.proto.CertChain.NoiseCertificate.encode(message.intermediate, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified CertChain message, length delimited. Does not implicitly {@link proto.CertChain.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.CertChain + * @static + * @param {proto.ICertChain} message CertChain message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CertChain.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CertChain message from the specified reader or buffer. + * @function decode + * @memberof proto.CertChain + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.CertChain} CertChain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CertChain.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.CertChain(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.leaf = $root.proto.CertChain.NoiseCertificate.decode(reader, reader.uint32()); + break; + case 2: + message.intermediate = $root.proto.CertChain.NoiseCertificate.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CertChain message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.CertChain + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.CertChain} CertChain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CertChain.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CertChain message. + * @function verify + * @memberof proto.CertChain + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CertChain.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.leaf != null && message.hasOwnProperty("leaf")) { + var error = $root.proto.CertChain.NoiseCertificate.verify(message.leaf); + if (error) + return "leaf." + error; + } + if (message.intermediate != null && message.hasOwnProperty("intermediate")) { + var error = $root.proto.CertChain.NoiseCertificate.verify(message.intermediate); + if (error) + return "intermediate." + error; + } + return null; + }; + + /** + * Creates a CertChain message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.CertChain + * @static + * @param {Object.} object Plain object + * @returns {proto.CertChain} CertChain + */ + CertChain.fromObject = function fromObject(object) { + if (object instanceof $root.proto.CertChain) + return object; + var message = new $root.proto.CertChain(); + if (object.leaf != null) { + if (typeof object.leaf !== "object") + throw TypeError(".proto.CertChain.leaf: object expected"); + message.leaf = $root.proto.CertChain.NoiseCertificate.fromObject(object.leaf); + } + if (object.intermediate != null) { + if (typeof object.intermediate !== "object") + throw TypeError(".proto.CertChain.intermediate: object expected"); + message.intermediate = $root.proto.CertChain.NoiseCertificate.fromObject(object.intermediate); + } + return message; + }; + + /** + * Creates a plain object from a CertChain message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.CertChain + * @static + * @param {proto.CertChain} message CertChain + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CertChain.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.leaf = null; + object.intermediate = null; + } + if (message.leaf != null && message.hasOwnProperty("leaf")) + object.leaf = $root.proto.CertChain.NoiseCertificate.toObject(message.leaf, options); + if (message.intermediate != null && message.hasOwnProperty("intermediate")) + object.intermediate = $root.proto.CertChain.NoiseCertificate.toObject(message.intermediate, options); + return object; + }; + + /** + * Converts this CertChain to JSON. + * @function toJSON + * @memberof proto.CertChain + * @instance + * @returns {Object.} JSON object + */ + CertChain.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + CertChain.NoiseCertificate = (function() { + + /** + * Properties of a NoiseCertificate. + * @memberof proto.CertChain + * @interface INoiseCertificate + * @property {Uint8Array|null} [details] NoiseCertificate details + * @property {Uint8Array|null} [signature] NoiseCertificate signature + */ + + /** + * Constructs a new NoiseCertificate. + * @memberof proto.CertChain + * @classdesc Represents a NoiseCertificate. + * @implements INoiseCertificate + * @constructor + * @param {proto.CertChain.INoiseCertificate=} [properties] Properties to set + */ + function NoiseCertificate(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NoiseCertificate details. + * @member {Uint8Array} details + * @memberof proto.CertChain.NoiseCertificate + * @instance + */ + NoiseCertificate.prototype.details = $util.newBuffer([]); + + /** + * NoiseCertificate signature. + * @member {Uint8Array} signature + * @memberof proto.CertChain.NoiseCertificate + * @instance + */ + NoiseCertificate.prototype.signature = $util.newBuffer([]); + + /** + * Creates a new NoiseCertificate instance using the specified properties. + * @function create + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {proto.CertChain.INoiseCertificate=} [properties] Properties to set + * @returns {proto.CertChain.NoiseCertificate} NoiseCertificate instance + */ + NoiseCertificate.create = function create(properties) { + return new NoiseCertificate(properties); + }; + + /** + * Encodes the specified NoiseCertificate message. Does not implicitly {@link proto.CertChain.NoiseCertificate.verify|verify} messages. + * @function encode + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {proto.CertChain.INoiseCertificate} message NoiseCertificate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NoiseCertificate.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.details != null && Object.hasOwnProperty.call(message, "details")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.details); + if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.signature); + return writer; + }; + + /** + * Encodes the specified NoiseCertificate message, length delimited. Does not implicitly {@link proto.CertChain.NoiseCertificate.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {proto.CertChain.INoiseCertificate} message NoiseCertificate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NoiseCertificate.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer. + * @function decode + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.CertChain.NoiseCertificate} NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NoiseCertificate.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.CertChain.NoiseCertificate(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.details = reader.bytes(); + break; + case 2: + message.signature = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.CertChain.NoiseCertificate} NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NoiseCertificate.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NoiseCertificate message. + * @function verify + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NoiseCertificate.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.details != null && message.hasOwnProperty("details")) + if (!(message.details && typeof message.details.length === "number" || $util.isString(message.details))) + return "details: buffer expected"; + if (message.signature != null && message.hasOwnProperty("signature")) + if (!(message.signature && typeof message.signature.length === "number" || $util.isString(message.signature))) + return "signature: buffer expected"; + return null; + }; + + /** + * Creates a NoiseCertificate message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {Object.} object Plain object + * @returns {proto.CertChain.NoiseCertificate} NoiseCertificate + */ + NoiseCertificate.fromObject = function fromObject(object) { + if (object instanceof $root.proto.CertChain.NoiseCertificate) + return object; + var message = new $root.proto.CertChain.NoiseCertificate(); + if (object.details != null) + if (typeof object.details === "string") + $util.base64.decode(object.details, message.details = $util.newBuffer($util.base64.length(object.details)), 0); + else if (object.details.length) + message.details = object.details; + if (object.signature != null) + if (typeof object.signature === "string") + $util.base64.decode(object.signature, message.signature = $util.newBuffer($util.base64.length(object.signature)), 0); + else if (object.signature.length) + message.signature = object.signature; + return message; + }; + + /** + * Creates a plain object from a NoiseCertificate message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.CertChain.NoiseCertificate + * @static + * @param {proto.CertChain.NoiseCertificate} message NoiseCertificate + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NoiseCertificate.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.details = ""; + else { + object.details = []; + if (options.bytes !== Array) + object.details = $util.newBuffer(object.details); + } + if (options.bytes === String) + object.signature = ""; + else { + object.signature = []; + if (options.bytes !== Array) + object.signature = $util.newBuffer(object.signature); + } + } + if (message.details != null && message.hasOwnProperty("details")) + object.details = options.bytes === String ? $util.base64.encode(message.details, 0, message.details.length) : options.bytes === Array ? Array.prototype.slice.call(message.details) : message.details; + if (message.signature != null && message.hasOwnProperty("signature")) + object.signature = options.bytes === String ? $util.base64.encode(message.signature, 0, message.signature.length) : options.bytes === Array ? Array.prototype.slice.call(message.signature) : message.signature; + return object; + }; + + /** + * Converts this NoiseCertificate to JSON. + * @function toJSON + * @memberof proto.CertChain.NoiseCertificate + * @instance + * @returns {Object.} JSON object + */ + NoiseCertificate.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + NoiseCertificate.Details = (function() { + + /** + * Properties of a Details. + * @memberof proto.CertChain.NoiseCertificate + * @interface IDetails + * @property {number|null} [serial] Details serial + * @property {number|null} [issuerSerial] Details issuerSerial + * @property {Uint8Array|null} [key] Details key + * @property {number|Long|null} [notBefore] Details notBefore + * @property {number|Long|null} [notAfter] Details notAfter + */ + + /** + * Constructs a new Details. + * @memberof proto.CertChain.NoiseCertificate + * @classdesc Represents a Details. + * @implements IDetails + * @constructor + * @param {proto.CertChain.NoiseCertificate.IDetails=} [properties] Properties to set + */ + function Details(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Details serial. + * @member {number} serial + * @memberof proto.CertChain.NoiseCertificate.Details + * @instance + */ + Details.prototype.serial = 0; + + /** + * Details issuerSerial. + * @member {number} issuerSerial + * @memberof proto.CertChain.NoiseCertificate.Details + * @instance + */ + Details.prototype.issuerSerial = 0; + + /** + * Details key. + * @member {Uint8Array} key + * @memberof proto.CertChain.NoiseCertificate.Details + * @instance + */ + Details.prototype.key = $util.newBuffer([]); + + /** + * Details notBefore. + * @member {number|Long} notBefore + * @memberof proto.CertChain.NoiseCertificate.Details + * @instance + */ + Details.prototype.notBefore = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Details notAfter. + * @member {number|Long} notAfter + * @memberof proto.CertChain.NoiseCertificate.Details + * @instance + */ + Details.prototype.notAfter = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new Details instance using the specified properties. + * @function create + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {proto.CertChain.NoiseCertificate.IDetails=} [properties] Properties to set + * @returns {proto.CertChain.NoiseCertificate.Details} Details instance + */ + Details.create = function create(properties) { + return new Details(properties); + }; + + /** + * Encodes the specified Details message. Does not implicitly {@link proto.CertChain.NoiseCertificate.Details.verify|verify} messages. + * @function encode + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {proto.CertChain.NoiseCertificate.IDetails} message Details message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Details.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.serial != null && Object.hasOwnProperty.call(message, "serial")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.serial); + if (message.issuerSerial != null && Object.hasOwnProperty.call(message, "issuerSerial")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.issuerSerial); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.key); + if (message.notBefore != null && Object.hasOwnProperty.call(message, "notBefore")) + writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.notBefore); + if (message.notAfter != null && Object.hasOwnProperty.call(message, "notAfter")) + writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.notAfter); + return writer; + }; + + /** + * Encodes the specified Details message, length delimited. Does not implicitly {@link proto.CertChain.NoiseCertificate.Details.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {proto.CertChain.NoiseCertificate.IDetails} message Details message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Details.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Details message from the specified reader or buffer. + * @function decode + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.CertChain.NoiseCertificate.Details} Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Details.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.CertChain.NoiseCertificate.Details(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.serial = reader.uint32(); + break; + case 2: + message.issuerSerial = reader.uint32(); + break; + case 3: + message.key = reader.bytes(); + break; + case 4: + message.notBefore = reader.uint64(); + break; + case 5: + message.notAfter = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Details message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.CertChain.NoiseCertificate.Details} Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Details.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Details message. + * @function verify + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Details.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.serial != null && message.hasOwnProperty("serial")) + if (!$util.isInteger(message.serial)) + return "serial: integer expected"; + if (message.issuerSerial != null && message.hasOwnProperty("issuerSerial")) + if (!$util.isInteger(message.issuerSerial)) + return "issuerSerial: integer expected"; + if (message.key != null && message.hasOwnProperty("key")) + if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key))) + return "key: buffer expected"; + if (message.notBefore != null && message.hasOwnProperty("notBefore")) + if (!$util.isInteger(message.notBefore) && !(message.notBefore && $util.isInteger(message.notBefore.low) && $util.isInteger(message.notBefore.high))) + return "notBefore: integer|Long expected"; + if (message.notAfter != null && message.hasOwnProperty("notAfter")) + if (!$util.isInteger(message.notAfter) && !(message.notAfter && $util.isInteger(message.notAfter.low) && $util.isInteger(message.notAfter.high))) + return "notAfter: integer|Long expected"; + return null; + }; + + /** + * Creates a Details message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {Object.} object Plain object + * @returns {proto.CertChain.NoiseCertificate.Details} Details + */ + Details.fromObject = function fromObject(object) { + if (object instanceof $root.proto.CertChain.NoiseCertificate.Details) + return object; + var message = new $root.proto.CertChain.NoiseCertificate.Details(); + if (object.serial != null) + message.serial = object.serial >>> 0; + if (object.issuerSerial != null) + message.issuerSerial = object.issuerSerial >>> 0; + if (object.key != null) + if (typeof object.key === "string") + $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0); + else if (object.key.length) + message.key = object.key; + if (object.notBefore != null) + if ($util.Long) + (message.notBefore = $util.Long.fromValue(object.notBefore)).unsigned = true; + else if (typeof object.notBefore === "string") + message.notBefore = parseInt(object.notBefore, 10); + else if (typeof object.notBefore === "number") + message.notBefore = object.notBefore; + else if (typeof object.notBefore === "object") + message.notBefore = new $util.LongBits(object.notBefore.low >>> 0, object.notBefore.high >>> 0).toNumber(true); + if (object.notAfter != null) + if ($util.Long) + (message.notAfter = $util.Long.fromValue(object.notAfter)).unsigned = true; + else if (typeof object.notAfter === "string") + message.notAfter = parseInt(object.notAfter, 10); + else if (typeof object.notAfter === "number") + message.notAfter = object.notAfter; + else if (typeof object.notAfter === "object") + message.notAfter = new $util.LongBits(object.notAfter.low >>> 0, object.notAfter.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a Details message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.CertChain.NoiseCertificate.Details + * @static + * @param {proto.CertChain.NoiseCertificate.Details} message Details + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Details.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.serial = 0; + object.issuerSerial = 0; + if (options.bytes === String) + object.key = ""; + else { + object.key = []; + if (options.bytes !== Array) + object.key = $util.newBuffer(object.key); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.notBefore = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.notBefore = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.notAfter = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.notAfter = options.longs === String ? "0" : 0; + } + if (message.serial != null && message.hasOwnProperty("serial")) + object.serial = message.serial; + if (message.issuerSerial != null && message.hasOwnProperty("issuerSerial")) + object.issuerSerial = message.issuerSerial; + if (message.key != null && message.hasOwnProperty("key")) + object.key = options.bytes === String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === Array ? Array.prototype.slice.call(message.key) : message.key; + if (message.notBefore != null && message.hasOwnProperty("notBefore")) + if (typeof message.notBefore === "number") + object.notBefore = options.longs === String ? String(message.notBefore) : message.notBefore; + else + object.notBefore = options.longs === String ? $util.Long.prototype.toString.call(message.notBefore) : options.longs === Number ? new $util.LongBits(message.notBefore.low >>> 0, message.notBefore.high >>> 0).toNumber(true) : message.notBefore; + if (message.notAfter != null && message.hasOwnProperty("notAfter")) + if (typeof message.notAfter === "number") + object.notAfter = options.longs === String ? String(message.notAfter) : message.notAfter; + else + object.notAfter = options.longs === String ? $util.Long.prototype.toString.call(message.notAfter) : options.longs === Number ? new $util.LongBits(message.notAfter.low >>> 0, message.notAfter.high >>> 0).toNumber(true) : message.notAfter; + return object; + }; + + /** + * Converts this Details to JSON. + * @function toJSON + * @memberof proto.CertChain.NoiseCertificate.Details + * @instance + * @returns {Object.} JSON object + */ + Details.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Details; + })(); + + return NoiseCertificate; + })(); + + return CertChain; + })(); + + proto.Chain = (function() { + + /** + * Properties of a Chain. + * @memberof proto + * @interface IChain + * @property {Uint8Array|null} [senderRatchetKey] Chain senderRatchetKey + * @property {Uint8Array|null} [senderRatchetKeyPrivate] Chain senderRatchetKeyPrivate + * @property {proto.IChainKey|null} [chainKey] Chain chainKey + * @property {Array.|null} [messageKeys] Chain messageKeys + */ + + /** + * Constructs a new Chain. + * @memberof proto + * @classdesc Represents a Chain. + * @implements IChain + * @constructor + * @param {proto.IChain=} [properties] Properties to set + */ + function Chain(properties) { + this.messageKeys = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Chain senderRatchetKey. + * @member {Uint8Array} senderRatchetKey + * @memberof proto.Chain + * @instance + */ + Chain.prototype.senderRatchetKey = $util.newBuffer([]); + + /** + * Chain senderRatchetKeyPrivate. + * @member {Uint8Array} senderRatchetKeyPrivate + * @memberof proto.Chain + * @instance + */ + Chain.prototype.senderRatchetKeyPrivate = $util.newBuffer([]); + + /** + * Chain chainKey. + * @member {proto.IChainKey|null|undefined} chainKey + * @memberof proto.Chain + * @instance + */ + Chain.prototype.chainKey = null; + + /** + * Chain messageKeys. + * @member {Array.} messageKeys + * @memberof proto.Chain + * @instance + */ + Chain.prototype.messageKeys = $util.emptyArray; + + /** + * Creates a new Chain instance using the specified properties. + * @function create + * @memberof proto.Chain + * @static + * @param {proto.IChain=} [properties] Properties to set + * @returns {proto.Chain} Chain instance + */ + Chain.create = function create(properties) { + return new Chain(properties); + }; + + /** + * Encodes the specified Chain message. Does not implicitly {@link proto.Chain.verify|verify} messages. + * @function encode + * @memberof proto.Chain + * @static + * @param {proto.IChain} message Chain message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Chain.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.senderRatchetKey != null && Object.hasOwnProperty.call(message, "senderRatchetKey")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.senderRatchetKey); + if (message.senderRatchetKeyPrivate != null && Object.hasOwnProperty.call(message, "senderRatchetKeyPrivate")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.senderRatchetKeyPrivate); + if (message.chainKey != null && Object.hasOwnProperty.call(message, "chainKey")) + $root.proto.ChainKey.encode(message.chainKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.messageKeys != null && message.messageKeys.length) + for (var i = 0; i < message.messageKeys.length; ++i) + $root.proto.MessageKey.encode(message.messageKeys[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Chain message, length delimited. Does not implicitly {@link proto.Chain.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Chain + * @static + * @param {proto.IChain} message Chain message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Chain.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Chain message from the specified reader or buffer. + * @function decode + * @memberof proto.Chain + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Chain} Chain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Chain.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Chain(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.senderRatchetKey = reader.bytes(); + break; + case 2: + message.senderRatchetKeyPrivate = reader.bytes(); + break; + case 3: + message.chainKey = $root.proto.ChainKey.decode(reader, reader.uint32()); + break; + case 4: + if (!(message.messageKeys && message.messageKeys.length)) + message.messageKeys = []; + message.messageKeys.push($root.proto.MessageKey.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Chain message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Chain + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Chain} Chain + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Chain.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Chain message. + * @function verify + * @memberof proto.Chain + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Chain.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.senderRatchetKey != null && message.hasOwnProperty("senderRatchetKey")) + if (!(message.senderRatchetKey && typeof message.senderRatchetKey.length === "number" || $util.isString(message.senderRatchetKey))) + return "senderRatchetKey: buffer expected"; + if (message.senderRatchetKeyPrivate != null && message.hasOwnProperty("senderRatchetKeyPrivate")) + if (!(message.senderRatchetKeyPrivate && typeof message.senderRatchetKeyPrivate.length === "number" || $util.isString(message.senderRatchetKeyPrivate))) + return "senderRatchetKeyPrivate: buffer expected"; + if (message.chainKey != null && message.hasOwnProperty("chainKey")) { + var error = $root.proto.ChainKey.verify(message.chainKey); + if (error) + return "chainKey." + error; + } + if (message.messageKeys != null && message.hasOwnProperty("messageKeys")) { + if (!Array.isArray(message.messageKeys)) + return "messageKeys: array expected"; + for (var i = 0; i < message.messageKeys.length; ++i) { + var error = $root.proto.MessageKey.verify(message.messageKeys[i]); + if (error) + return "messageKeys." + error; + } + } + return null; + }; + + /** + * Creates a Chain message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Chain + * @static + * @param {Object.} object Plain object + * @returns {proto.Chain} Chain + */ + Chain.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Chain) + return object; + var message = new $root.proto.Chain(); + if (object.senderRatchetKey != null) + if (typeof object.senderRatchetKey === "string") + $util.base64.decode(object.senderRatchetKey, message.senderRatchetKey = $util.newBuffer($util.base64.length(object.senderRatchetKey)), 0); + else if (object.senderRatchetKey.length) + message.senderRatchetKey = object.senderRatchetKey; + if (object.senderRatchetKeyPrivate != null) + if (typeof object.senderRatchetKeyPrivate === "string") + $util.base64.decode(object.senderRatchetKeyPrivate, message.senderRatchetKeyPrivate = $util.newBuffer($util.base64.length(object.senderRatchetKeyPrivate)), 0); + else if (object.senderRatchetKeyPrivate.length) + message.senderRatchetKeyPrivate = object.senderRatchetKeyPrivate; + if (object.chainKey != null) { + if (typeof object.chainKey !== "object") + throw TypeError(".proto.Chain.chainKey: object expected"); + message.chainKey = $root.proto.ChainKey.fromObject(object.chainKey); + } + if (object.messageKeys) { + if (!Array.isArray(object.messageKeys)) + throw TypeError(".proto.Chain.messageKeys: array expected"); + message.messageKeys = []; + for (var i = 0; i < object.messageKeys.length; ++i) { + if (typeof object.messageKeys[i] !== "object") + throw TypeError(".proto.Chain.messageKeys: object expected"); + message.messageKeys[i] = $root.proto.MessageKey.fromObject(object.messageKeys[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a Chain message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Chain + * @static + * @param {proto.Chain} message Chain + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Chain.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.messageKeys = []; + if (options.defaults) { + if (options.bytes === String) + object.senderRatchetKey = ""; + else { + object.senderRatchetKey = []; + if (options.bytes !== Array) + object.senderRatchetKey = $util.newBuffer(object.senderRatchetKey); + } + if (options.bytes === String) + object.senderRatchetKeyPrivate = ""; + else { + object.senderRatchetKeyPrivate = []; + if (options.bytes !== Array) + object.senderRatchetKeyPrivate = $util.newBuffer(object.senderRatchetKeyPrivate); + } + object.chainKey = null; + } + if (message.senderRatchetKey != null && message.hasOwnProperty("senderRatchetKey")) + object.senderRatchetKey = options.bytes === String ? $util.base64.encode(message.senderRatchetKey, 0, message.senderRatchetKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.senderRatchetKey) : message.senderRatchetKey; + if (message.senderRatchetKeyPrivate != null && message.hasOwnProperty("senderRatchetKeyPrivate")) + object.senderRatchetKeyPrivate = options.bytes === String ? $util.base64.encode(message.senderRatchetKeyPrivate, 0, message.senderRatchetKeyPrivate.length) : options.bytes === Array ? Array.prototype.slice.call(message.senderRatchetKeyPrivate) : message.senderRatchetKeyPrivate; + if (message.chainKey != null && message.hasOwnProperty("chainKey")) + object.chainKey = $root.proto.ChainKey.toObject(message.chainKey, options); + if (message.messageKeys && message.messageKeys.length) { + object.messageKeys = []; + for (var j = 0; j < message.messageKeys.length; ++j) + object.messageKeys[j] = $root.proto.MessageKey.toObject(message.messageKeys[j], options); + } + return object; + }; + + /** + * Converts this Chain to JSON. + * @function toJSON + * @memberof proto.Chain + * @instance + * @returns {Object.} JSON object + */ + Chain.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Chain; + })(); + + proto.ChainKey = (function() { + + /** + * Properties of a ChainKey. + * @memberof proto + * @interface IChainKey + * @property {number|null} [index] ChainKey index + * @property {Uint8Array|null} [key] ChainKey key + */ + + /** + * Constructs a new ChainKey. + * @memberof proto + * @classdesc Represents a ChainKey. + * @implements IChainKey + * @constructor + * @param {proto.IChainKey=} [properties] Properties to set + */ + function ChainKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ChainKey index. + * @member {number} index + * @memberof proto.ChainKey + * @instance + */ + ChainKey.prototype.index = 0; + + /** + * ChainKey key. + * @member {Uint8Array} key + * @memberof proto.ChainKey + * @instance + */ + ChainKey.prototype.key = $util.newBuffer([]); + + /** + * Creates a new ChainKey instance using the specified properties. + * @function create + * @memberof proto.ChainKey + * @static + * @param {proto.IChainKey=} [properties] Properties to set + * @returns {proto.ChainKey} ChainKey instance + */ + ChainKey.create = function create(properties) { + return new ChainKey(properties); + }; + + /** + * Encodes the specified ChainKey message. Does not implicitly {@link proto.ChainKey.verify|verify} messages. + * @function encode + * @memberof proto.ChainKey + * @static + * @param {proto.IChainKey} message ChainKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChainKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.index != null && Object.hasOwnProperty.call(message, "index")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.key); + return writer; + }; + + /** + * Encodes the specified ChainKey message, length delimited. Does not implicitly {@link proto.ChainKey.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ChainKey + * @static + * @param {proto.IChainKey} message ChainKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChainKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ChainKey message from the specified reader or buffer. + * @function decode + * @memberof proto.ChainKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ChainKey} ChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChainKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ChainKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.index = reader.uint32(); + break; + case 2: + message.key = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ChainKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ChainKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ChainKey} ChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChainKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ChainKey message. + * @function verify + * @memberof proto.ChainKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ChainKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.index != null && message.hasOwnProperty("index")) + if (!$util.isInteger(message.index)) + return "index: integer expected"; + if (message.key != null && message.hasOwnProperty("key")) + if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key))) + return "key: buffer expected"; + return null; + }; + + /** + * Creates a ChainKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ChainKey + * @static + * @param {Object.} object Plain object + * @returns {proto.ChainKey} ChainKey + */ + ChainKey.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ChainKey) + return object; + var message = new $root.proto.ChainKey(); + if (object.index != null) + message.index = object.index >>> 0; + if (object.key != null) + if (typeof object.key === "string") + $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0); + else if (object.key.length) + message.key = object.key; + return message; + }; + + /** + * Creates a plain object from a ChainKey message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ChainKey + * @static + * @param {proto.ChainKey} message ChainKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ChainKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.index = 0; + if (options.bytes === String) + object.key = ""; + else { + object.key = []; + if (options.bytes !== Array) + object.key = $util.newBuffer(object.key); + } + } + if (message.index != null && message.hasOwnProperty("index")) + object.index = message.index; + if (message.key != null && message.hasOwnProperty("key")) + object.key = options.bytes === String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === Array ? Array.prototype.slice.call(message.key) : message.key; + return object; + }; + + /** + * Converts this ChainKey to JSON. + * @function toJSON + * @memberof proto.ChainKey + * @instance + * @returns {Object.} JSON object + */ + ChainKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ChainKey; + })(); + + proto.ClientPayload = (function() { + + /** + * Properties of a ClientPayload. + * @memberof proto + * @interface IClientPayload + * @property {number|Long|null} [username] ClientPayload username + * @property {boolean|null} [passive] ClientPayload passive + * @property {proto.ClientPayload.IUserAgent|null} [userAgent] ClientPayload userAgent + * @property {proto.ClientPayload.IWebInfo|null} [webInfo] ClientPayload webInfo + * @property {string|null} [pushName] ClientPayload pushName + * @property {number|null} [sessionId] ClientPayload sessionId + * @property {boolean|null} [shortConnect] ClientPayload shortConnect + * @property {proto.ClientPayload.ConnectType|null} [connectType] ClientPayload connectType + * @property {proto.ClientPayload.ConnectReason|null} [connectReason] ClientPayload connectReason + * @property {Array.|null} [shards] ClientPayload shards + * @property {proto.ClientPayload.IDNSSource|null} [dnsSource] ClientPayload dnsSource + * @property {number|null} [connectAttemptCount] ClientPayload connectAttemptCount + * @property {number|null} [device] ClientPayload device + * @property {proto.ClientPayload.IDevicePairingRegistrationData|null} [devicePairingData] ClientPayload devicePairingData + * @property {proto.ClientPayload.Product|null} [product] ClientPayload product + * @property {Uint8Array|null} [fbCat] ClientPayload fbCat + * @property {Uint8Array|null} [fbUserAgent] ClientPayload fbUserAgent + * @property {boolean|null} [oc] ClientPayload oc + * @property {number|null} [lc] ClientPayload lc + * @property {proto.ClientPayload.IOSAppExtension|null} [iosAppExtension] ClientPayload iosAppExtension + * @property {number|Long|null} [fbAppId] ClientPayload fbAppId + * @property {Uint8Array|null} [fbDeviceId] ClientPayload fbDeviceId + * @property {boolean|null} [pull] ClientPayload pull + * @property {Uint8Array|null} [paddingBytes] ClientPayload paddingBytes + * @property {proto.ClientPayload.BizMarketSegment|null} [bizMarketSegment] ClientPayload bizMarketSegment + * @property {number|null} [yearClass] ClientPayload yearClass + * @property {number|null} [memClass] ClientPayload memClass + */ + + /** + * Constructs a new ClientPayload. + * @memberof proto + * @classdesc Represents a ClientPayload. + * @implements IClientPayload + * @constructor + * @param {proto.IClientPayload=} [properties] Properties to set + */ + function ClientPayload(properties) { + this.shards = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ClientPayload username. + * @member {number|Long} username + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.username = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ClientPayload passive. + * @member {boolean} passive + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.passive = false; + + /** + * ClientPayload userAgent. + * @member {proto.ClientPayload.IUserAgent|null|undefined} userAgent + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.userAgent = null; + + /** + * ClientPayload webInfo. + * @member {proto.ClientPayload.IWebInfo|null|undefined} webInfo + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.webInfo = null; + + /** + * ClientPayload pushName. + * @member {string} pushName + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.pushName = ""; + + /** + * ClientPayload sessionId. + * @member {number} sessionId + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.sessionId = 0; + + /** + * ClientPayload shortConnect. + * @member {boolean} shortConnect + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.shortConnect = false; + + /** + * ClientPayload connectType. + * @member {proto.ClientPayload.ConnectType} connectType + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.connectType = 0; + + /** + * ClientPayload connectReason. + * @member {proto.ClientPayload.ConnectReason} connectReason + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.connectReason = 0; + + /** + * ClientPayload shards. + * @member {Array.} shards + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.shards = $util.emptyArray; + + /** + * ClientPayload dnsSource. + * @member {proto.ClientPayload.IDNSSource|null|undefined} dnsSource + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.dnsSource = null; + + /** + * ClientPayload connectAttemptCount. + * @member {number} connectAttemptCount + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.connectAttemptCount = 0; + + /** + * ClientPayload device. + * @member {number} device + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.device = 0; + + /** + * ClientPayload devicePairingData. + * @member {proto.ClientPayload.IDevicePairingRegistrationData|null|undefined} devicePairingData + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.devicePairingData = null; + + /** + * ClientPayload product. + * @member {proto.ClientPayload.Product} product + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.product = 0; + + /** + * ClientPayload fbCat. + * @member {Uint8Array} fbCat + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.fbCat = $util.newBuffer([]); + + /** + * ClientPayload fbUserAgent. + * @member {Uint8Array} fbUserAgent + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.fbUserAgent = $util.newBuffer([]); + + /** + * ClientPayload oc. + * @member {boolean} oc + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.oc = false; + + /** + * ClientPayload lc. + * @member {number} lc + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.lc = 0; + + /** + * ClientPayload iosAppExtension. + * @member {proto.ClientPayload.IOSAppExtension} iosAppExtension + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.iosAppExtension = 0; + + /** + * ClientPayload fbAppId. + * @member {number|Long} fbAppId + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.fbAppId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ClientPayload fbDeviceId. + * @member {Uint8Array} fbDeviceId + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.fbDeviceId = $util.newBuffer([]); + + /** + * ClientPayload pull. + * @member {boolean} pull + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.pull = false; + + /** + * ClientPayload paddingBytes. + * @member {Uint8Array} paddingBytes + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.paddingBytes = $util.newBuffer([]); + + /** + * ClientPayload bizMarketSegment. + * @member {proto.ClientPayload.BizMarketSegment} bizMarketSegment + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.bizMarketSegment = 0; + + /** + * ClientPayload yearClass. + * @member {number} yearClass + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.yearClass = 0; + + /** + * ClientPayload memClass. + * @member {number} memClass + * @memberof proto.ClientPayload + * @instance + */ + ClientPayload.prototype.memClass = 0; + + /** + * Creates a new ClientPayload instance using the specified properties. + * @function create + * @memberof proto.ClientPayload + * @static + * @param {proto.IClientPayload=} [properties] Properties to set + * @returns {proto.ClientPayload} ClientPayload instance + */ + ClientPayload.create = function create(properties) { + return new ClientPayload(properties); + }; + + /** + * Encodes the specified ClientPayload message. Does not implicitly {@link proto.ClientPayload.verify|verify} messages. + * @function encode + * @memberof proto.ClientPayload + * @static + * @param {proto.IClientPayload} message ClientPayload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClientPayload.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.username != null && Object.hasOwnProperty.call(message, "username")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.username); + if (message.passive != null && Object.hasOwnProperty.call(message, "passive")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.passive); + if (message.userAgent != null && Object.hasOwnProperty.call(message, "userAgent")) + $root.proto.ClientPayload.UserAgent.encode(message.userAgent, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.webInfo != null && Object.hasOwnProperty.call(message, "webInfo")) + $root.proto.ClientPayload.WebInfo.encode(message.webInfo, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.pushName != null && Object.hasOwnProperty.call(message, "pushName")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.pushName); + if (message.sessionId != null && Object.hasOwnProperty.call(message, "sessionId")) + writer.uint32(/* id 9, wireType 5 =*/77).sfixed32(message.sessionId); + if (message.shortConnect != null && Object.hasOwnProperty.call(message, "shortConnect")) + writer.uint32(/* id 10, wireType 0 =*/80).bool(message.shortConnect); + if (message.connectType != null && Object.hasOwnProperty.call(message, "connectType")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.connectType); + if (message.connectReason != null && Object.hasOwnProperty.call(message, "connectReason")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.connectReason); + if (message.shards != null && message.shards.length) + for (var i = 0; i < message.shards.length; ++i) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.shards[i]); + if (message.dnsSource != null && Object.hasOwnProperty.call(message, "dnsSource")) + $root.proto.ClientPayload.DNSSource.encode(message.dnsSource, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); + if (message.connectAttemptCount != null && Object.hasOwnProperty.call(message, "connectAttemptCount")) + writer.uint32(/* id 16, wireType 0 =*/128).uint32(message.connectAttemptCount); + if (message.device != null && Object.hasOwnProperty.call(message, "device")) + writer.uint32(/* id 18, wireType 0 =*/144).uint32(message.device); + if (message.devicePairingData != null && Object.hasOwnProperty.call(message, "devicePairingData")) + $root.proto.ClientPayload.DevicePairingRegistrationData.encode(message.devicePairingData, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); + if (message.product != null && Object.hasOwnProperty.call(message, "product")) + writer.uint32(/* id 20, wireType 0 =*/160).int32(message.product); + if (message.fbCat != null && Object.hasOwnProperty.call(message, "fbCat")) + writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.fbCat); + if (message.fbUserAgent != null && Object.hasOwnProperty.call(message, "fbUserAgent")) + writer.uint32(/* id 22, wireType 2 =*/178).bytes(message.fbUserAgent); + if (message.oc != null && Object.hasOwnProperty.call(message, "oc")) + writer.uint32(/* id 23, wireType 0 =*/184).bool(message.oc); + if (message.lc != null && Object.hasOwnProperty.call(message, "lc")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.lc); + if (message.iosAppExtension != null && Object.hasOwnProperty.call(message, "iosAppExtension")) + writer.uint32(/* id 30, wireType 0 =*/240).int32(message.iosAppExtension); + if (message.fbAppId != null && Object.hasOwnProperty.call(message, "fbAppId")) + writer.uint32(/* id 31, wireType 0 =*/248).uint64(message.fbAppId); + if (message.fbDeviceId != null && Object.hasOwnProperty.call(message, "fbDeviceId")) + writer.uint32(/* id 32, wireType 2 =*/258).bytes(message.fbDeviceId); + if (message.pull != null && Object.hasOwnProperty.call(message, "pull")) + writer.uint32(/* id 33, wireType 0 =*/264).bool(message.pull); + if (message.paddingBytes != null && Object.hasOwnProperty.call(message, "paddingBytes")) + writer.uint32(/* id 34, wireType 2 =*/274).bytes(message.paddingBytes); + if (message.bizMarketSegment != null && Object.hasOwnProperty.call(message, "bizMarketSegment")) + writer.uint32(/* id 35, wireType 0 =*/280).int32(message.bizMarketSegment); + if (message.yearClass != null && Object.hasOwnProperty.call(message, "yearClass")) + writer.uint32(/* id 36, wireType 0 =*/288).int32(message.yearClass); + if (message.memClass != null && Object.hasOwnProperty.call(message, "memClass")) + writer.uint32(/* id 37, wireType 0 =*/296).int32(message.memClass); + return writer; + }; + + /** + * Encodes the specified ClientPayload message, length delimited. Does not implicitly {@link proto.ClientPayload.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ClientPayload + * @static + * @param {proto.IClientPayload} message ClientPayload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClientPayload.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ClientPayload message from the specified reader or buffer. + * @function decode + * @memberof proto.ClientPayload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ClientPayload} ClientPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClientPayload.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ClientPayload(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.username = reader.uint64(); + break; + case 3: + message.passive = reader.bool(); + break; + case 5: + message.userAgent = $root.proto.ClientPayload.UserAgent.decode(reader, reader.uint32()); + break; + case 6: + message.webInfo = $root.proto.ClientPayload.WebInfo.decode(reader, reader.uint32()); + break; + case 7: + message.pushName = reader.string(); + break; + case 9: + message.sessionId = reader.sfixed32(); + break; + case 10: + message.shortConnect = reader.bool(); + break; + case 12: + message.connectType = reader.int32(); + break; + case 13: + message.connectReason = reader.int32(); + break; + case 14: + if (!(message.shards && message.shards.length)) + message.shards = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.shards.push(reader.int32()); + } else + message.shards.push(reader.int32()); + break; + case 15: + message.dnsSource = $root.proto.ClientPayload.DNSSource.decode(reader, reader.uint32()); + break; + case 16: + message.connectAttemptCount = reader.uint32(); + break; + case 18: + message.device = reader.uint32(); + break; + case 19: + message.devicePairingData = $root.proto.ClientPayload.DevicePairingRegistrationData.decode(reader, reader.uint32()); + break; + case 20: + message.product = reader.int32(); + break; + case 21: + message.fbCat = reader.bytes(); + break; + case 22: + message.fbUserAgent = reader.bytes(); + break; + case 23: + message.oc = reader.bool(); + break; + case 24: + message.lc = reader.int32(); + break; + case 30: + message.iosAppExtension = reader.int32(); + break; + case 31: + message.fbAppId = reader.uint64(); + break; + case 32: + message.fbDeviceId = reader.bytes(); + break; + case 33: + message.pull = reader.bool(); + break; + case 34: + message.paddingBytes = reader.bytes(); + break; + case 35: + message.bizMarketSegment = reader.int32(); + break; + case 36: + message.yearClass = reader.int32(); + break; + case 37: + message.memClass = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ClientPayload message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ClientPayload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ClientPayload} ClientPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClientPayload.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ClientPayload message. + * @function verify + * @memberof proto.ClientPayload + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ClientPayload.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.username != null && message.hasOwnProperty("username")) + if (!$util.isInteger(message.username) && !(message.username && $util.isInteger(message.username.low) && $util.isInteger(message.username.high))) + return "username: integer|Long expected"; + if (message.passive != null && message.hasOwnProperty("passive")) + if (typeof message.passive !== "boolean") + return "passive: boolean expected"; + if (message.userAgent != null && message.hasOwnProperty("userAgent")) { + var error = $root.proto.ClientPayload.UserAgent.verify(message.userAgent); + if (error) + return "userAgent." + error; + } + if (message.webInfo != null && message.hasOwnProperty("webInfo")) { + var error = $root.proto.ClientPayload.WebInfo.verify(message.webInfo); + if (error) + return "webInfo." + error; + } + if (message.pushName != null && message.hasOwnProperty("pushName")) + if (!$util.isString(message.pushName)) + return "pushName: string expected"; + if (message.sessionId != null && message.hasOwnProperty("sessionId")) + if (!$util.isInteger(message.sessionId)) + return "sessionId: integer expected"; + if (message.shortConnect != null && message.hasOwnProperty("shortConnect")) + if (typeof message.shortConnect !== "boolean") + return "shortConnect: boolean expected"; + if (message.connectType != null && message.hasOwnProperty("connectType")) + switch (message.connectType) { + default: + return "connectType: enum value expected"; + case 0: + case 1: + case 100: + case 101: + case 102: + case 103: + case 104: + case 105: + case 106: + case 107: + case 108: + case 109: + case 110: + case 111: + case 112: + break; + } + if (message.connectReason != null && message.hasOwnProperty("connectReason")) + switch (message.connectReason) { + default: + return "connectReason: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } + if (message.shards != null && message.hasOwnProperty("shards")) { + if (!Array.isArray(message.shards)) + return "shards: array expected"; + for (var i = 0; i < message.shards.length; ++i) + if (!$util.isInteger(message.shards[i])) + return "shards: integer[] expected"; + } + if (message.dnsSource != null && message.hasOwnProperty("dnsSource")) { + var error = $root.proto.ClientPayload.DNSSource.verify(message.dnsSource); + if (error) + return "dnsSource." + error; + } + if (message.connectAttemptCount != null && message.hasOwnProperty("connectAttemptCount")) + if (!$util.isInteger(message.connectAttemptCount)) + return "connectAttemptCount: integer expected"; + if (message.device != null && message.hasOwnProperty("device")) + if (!$util.isInteger(message.device)) + return "device: integer expected"; + if (message.devicePairingData != null && message.hasOwnProperty("devicePairingData")) { + var error = $root.proto.ClientPayload.DevicePairingRegistrationData.verify(message.devicePairingData); + if (error) + return "devicePairingData." + error; + } + if (message.product != null && message.hasOwnProperty("product")) + switch (message.product) { + default: + return "product: enum value expected"; + case 0: + case 1: + break; + } + if (message.fbCat != null && message.hasOwnProperty("fbCat")) + if (!(message.fbCat && typeof message.fbCat.length === "number" || $util.isString(message.fbCat))) + return "fbCat: buffer expected"; + if (message.fbUserAgent != null && message.hasOwnProperty("fbUserAgent")) + if (!(message.fbUserAgent && typeof message.fbUserAgent.length === "number" || $util.isString(message.fbUserAgent))) + return "fbUserAgent: buffer expected"; + if (message.oc != null && message.hasOwnProperty("oc")) + if (typeof message.oc !== "boolean") + return "oc: boolean expected"; + if (message.lc != null && message.hasOwnProperty("lc")) + if (!$util.isInteger(message.lc)) + return "lc: integer expected"; + if (message.iosAppExtension != null && message.hasOwnProperty("iosAppExtension")) + switch (message.iosAppExtension) { + default: + return "iosAppExtension: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.fbAppId != null && message.hasOwnProperty("fbAppId")) + if (!$util.isInteger(message.fbAppId) && !(message.fbAppId && $util.isInteger(message.fbAppId.low) && $util.isInteger(message.fbAppId.high))) + return "fbAppId: integer|Long expected"; + if (message.fbDeviceId != null && message.hasOwnProperty("fbDeviceId")) + if (!(message.fbDeviceId && typeof message.fbDeviceId.length === "number" || $util.isString(message.fbDeviceId))) + return "fbDeviceId: buffer expected"; + if (message.pull != null && message.hasOwnProperty("pull")) + if (typeof message.pull !== "boolean") + return "pull: boolean expected"; + if (message.paddingBytes != null && message.hasOwnProperty("paddingBytes")) + if (!(message.paddingBytes && typeof message.paddingBytes.length === "number" || $util.isString(message.paddingBytes))) + return "paddingBytes: buffer expected"; + if (message.bizMarketSegment != null && message.hasOwnProperty("bizMarketSegment")) + switch (message.bizMarketSegment) { + default: + return "bizMarketSegment: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.yearClass != null && message.hasOwnProperty("yearClass")) + if (!$util.isInteger(message.yearClass)) + return "yearClass: integer expected"; + if (message.memClass != null && message.hasOwnProperty("memClass")) + if (!$util.isInteger(message.memClass)) + return "memClass: integer expected"; + return null; + }; + + /** + * Creates a ClientPayload message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ClientPayload + * @static + * @param {Object.} object Plain object + * @returns {proto.ClientPayload} ClientPayload + */ + ClientPayload.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ClientPayload) + return object; + var message = new $root.proto.ClientPayload(); + if (object.username != null) + if ($util.Long) + (message.username = $util.Long.fromValue(object.username)).unsigned = true; + else if (typeof object.username === "string") + message.username = parseInt(object.username, 10); + else if (typeof object.username === "number") + message.username = object.username; + else if (typeof object.username === "object") + message.username = new $util.LongBits(object.username.low >>> 0, object.username.high >>> 0).toNumber(true); + if (object.passive != null) + message.passive = Boolean(object.passive); + if (object.userAgent != null) { + if (typeof object.userAgent !== "object") + throw TypeError(".proto.ClientPayload.userAgent: object expected"); + message.userAgent = $root.proto.ClientPayload.UserAgent.fromObject(object.userAgent); + } + if (object.webInfo != null) { + if (typeof object.webInfo !== "object") + throw TypeError(".proto.ClientPayload.webInfo: object expected"); + message.webInfo = $root.proto.ClientPayload.WebInfo.fromObject(object.webInfo); + } + if (object.pushName != null) + message.pushName = String(object.pushName); + if (object.sessionId != null) + message.sessionId = object.sessionId | 0; + if (object.shortConnect != null) + message.shortConnect = Boolean(object.shortConnect); + switch (object.connectType) { + case "CELLULAR_UNKNOWN": + case 0: + message.connectType = 0; + break; + case "WIFI_UNKNOWN": + case 1: + message.connectType = 1; + break; + case "CELLULAR_EDGE": + case 100: + message.connectType = 100; + break; + case "CELLULAR_IDEN": + case 101: + message.connectType = 101; + break; + case "CELLULAR_UMTS": + case 102: + message.connectType = 102; + break; + case "CELLULAR_EVDO": + case 103: + message.connectType = 103; + break; + case "CELLULAR_GPRS": + case 104: + message.connectType = 104; + break; + case "CELLULAR_HSDPA": + case 105: + message.connectType = 105; + break; + case "CELLULAR_HSUPA": + case 106: + message.connectType = 106; + break; + case "CELLULAR_HSPA": + case 107: + message.connectType = 107; + break; + case "CELLULAR_CDMA": + case 108: + message.connectType = 108; + break; + case "CELLULAR_1XRTT": + case 109: + message.connectType = 109; + break; + case "CELLULAR_EHRPD": + case 110: + message.connectType = 110; + break; + case "CELLULAR_LTE": + case 111: + message.connectType = 111; + break; + case "CELLULAR_HSPAP": + case 112: + message.connectType = 112; + break; + } + switch (object.connectReason) { + case "PUSH": + case 0: + message.connectReason = 0; + break; + case "USER_ACTIVATED": + case 1: + message.connectReason = 1; + break; + case "SCHEDULED": + case 2: + message.connectReason = 2; + break; + case "ERROR_RECONNECT": + case 3: + message.connectReason = 3; + break; + case "NETWORK_SWITCH": + case 4: + message.connectReason = 4; + break; + case "PING_RECONNECT": + case 5: + message.connectReason = 5; + break; + } + if (object.shards) { + if (!Array.isArray(object.shards)) + throw TypeError(".proto.ClientPayload.shards: array expected"); + message.shards = []; + for (var i = 0; i < object.shards.length; ++i) + message.shards[i] = object.shards[i] | 0; + } + if (object.dnsSource != null) { + if (typeof object.dnsSource !== "object") + throw TypeError(".proto.ClientPayload.dnsSource: object expected"); + message.dnsSource = $root.proto.ClientPayload.DNSSource.fromObject(object.dnsSource); + } + if (object.connectAttemptCount != null) + message.connectAttemptCount = object.connectAttemptCount >>> 0; + if (object.device != null) + message.device = object.device >>> 0; + if (object.devicePairingData != null) { + if (typeof object.devicePairingData !== "object") + throw TypeError(".proto.ClientPayload.devicePairingData: object expected"); + message.devicePairingData = $root.proto.ClientPayload.DevicePairingRegistrationData.fromObject(object.devicePairingData); + } + switch (object.product) { + case "WHATSAPP": + case 0: + message.product = 0; + break; + case "MESSENGER": + case 1: + message.product = 1; + break; + } + if (object.fbCat != null) + if (typeof object.fbCat === "string") + $util.base64.decode(object.fbCat, message.fbCat = $util.newBuffer($util.base64.length(object.fbCat)), 0); + else if (object.fbCat.length) + message.fbCat = object.fbCat; + if (object.fbUserAgent != null) + if (typeof object.fbUserAgent === "string") + $util.base64.decode(object.fbUserAgent, message.fbUserAgent = $util.newBuffer($util.base64.length(object.fbUserAgent)), 0); + else if (object.fbUserAgent.length) + message.fbUserAgent = object.fbUserAgent; + if (object.oc != null) + message.oc = Boolean(object.oc); + if (object.lc != null) + message.lc = object.lc | 0; + switch (object.iosAppExtension) { + case "SHARE_EXTENSION": + case 0: + message.iosAppExtension = 0; + break; + case "SERVICE_EXTENSION": + case 1: + message.iosAppExtension = 1; + break; + case "INTENTS_EXTENSION": + case 2: + message.iosAppExtension = 2; + break; + } + if (object.fbAppId != null) + if ($util.Long) + (message.fbAppId = $util.Long.fromValue(object.fbAppId)).unsigned = true; + else if (typeof object.fbAppId === "string") + message.fbAppId = parseInt(object.fbAppId, 10); + else if (typeof object.fbAppId === "number") + message.fbAppId = object.fbAppId; + else if (typeof object.fbAppId === "object") + message.fbAppId = new $util.LongBits(object.fbAppId.low >>> 0, object.fbAppId.high >>> 0).toNumber(true); + if (object.fbDeviceId != null) + if (typeof object.fbDeviceId === "string") + $util.base64.decode(object.fbDeviceId, message.fbDeviceId = $util.newBuffer($util.base64.length(object.fbDeviceId)), 0); + else if (object.fbDeviceId.length) + message.fbDeviceId = object.fbDeviceId; + if (object.pull != null) + message.pull = Boolean(object.pull); + if (object.paddingBytes != null) + if (typeof object.paddingBytes === "string") + $util.base64.decode(object.paddingBytes, message.paddingBytes = $util.newBuffer($util.base64.length(object.paddingBytes)), 0); + else if (object.paddingBytes.length) + message.paddingBytes = object.paddingBytes; + switch (object.bizMarketSegment) { + case "DEFAULT": + case 0: + message.bizMarketSegment = 0; + break; + case "DEVX": + case 1: + message.bizMarketSegment = 1; + break; + case "INBOX": + case 2: + message.bizMarketSegment = 2; + break; + } + if (object.yearClass != null) + message.yearClass = object.yearClass | 0; + if (object.memClass != null) + message.memClass = object.memClass | 0; + return message; + }; + + /** + * Creates a plain object from a ClientPayload message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ClientPayload + * @static + * @param {proto.ClientPayload} message ClientPayload + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ClientPayload.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.shards = []; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.username = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.username = options.longs === String ? "0" : 0; + object.passive = false; + object.userAgent = null; + object.webInfo = null; + object.pushName = ""; + object.sessionId = 0; + object.shortConnect = false; + object.connectType = options.enums === String ? "CELLULAR_UNKNOWN" : 0; + object.connectReason = options.enums === String ? "PUSH" : 0; + object.dnsSource = null; + object.connectAttemptCount = 0; + object.device = 0; + object.devicePairingData = null; + object.product = options.enums === String ? "WHATSAPP" : 0; + if (options.bytes === String) + object.fbCat = ""; + else { + object.fbCat = []; + if (options.bytes !== Array) + object.fbCat = $util.newBuffer(object.fbCat); + } + if (options.bytes === String) + object.fbUserAgent = ""; + else { + object.fbUserAgent = []; + if (options.bytes !== Array) + object.fbUserAgent = $util.newBuffer(object.fbUserAgent); + } + object.oc = false; + object.lc = 0; + object.iosAppExtension = options.enums === String ? "SHARE_EXTENSION" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fbAppId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fbAppId = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.fbDeviceId = ""; + else { + object.fbDeviceId = []; + if (options.bytes !== Array) + object.fbDeviceId = $util.newBuffer(object.fbDeviceId); + } + object.pull = false; + if (options.bytes === String) + object.paddingBytes = ""; + else { + object.paddingBytes = []; + if (options.bytes !== Array) + object.paddingBytes = $util.newBuffer(object.paddingBytes); + } + object.bizMarketSegment = options.enums === String ? "DEFAULT" : 0; + object.yearClass = 0; + object.memClass = 0; + } + if (message.username != null && message.hasOwnProperty("username")) + if (typeof message.username === "number") + object.username = options.longs === String ? String(message.username) : message.username; + else + object.username = options.longs === String ? $util.Long.prototype.toString.call(message.username) : options.longs === Number ? new $util.LongBits(message.username.low >>> 0, message.username.high >>> 0).toNumber(true) : message.username; + if (message.passive != null && message.hasOwnProperty("passive")) + object.passive = message.passive; + if (message.userAgent != null && message.hasOwnProperty("userAgent")) + object.userAgent = $root.proto.ClientPayload.UserAgent.toObject(message.userAgent, options); + if (message.webInfo != null && message.hasOwnProperty("webInfo")) + object.webInfo = $root.proto.ClientPayload.WebInfo.toObject(message.webInfo, options); + if (message.pushName != null && message.hasOwnProperty("pushName")) + object.pushName = message.pushName; + if (message.sessionId != null && message.hasOwnProperty("sessionId")) + object.sessionId = message.sessionId; + if (message.shortConnect != null && message.hasOwnProperty("shortConnect")) + object.shortConnect = message.shortConnect; + if (message.connectType != null && message.hasOwnProperty("connectType")) + object.connectType = options.enums === String ? $root.proto.ClientPayload.ConnectType[message.connectType] : message.connectType; + if (message.connectReason != null && message.hasOwnProperty("connectReason")) + object.connectReason = options.enums === String ? $root.proto.ClientPayload.ConnectReason[message.connectReason] : message.connectReason; + if (message.shards && message.shards.length) { + object.shards = []; + for (var j = 0; j < message.shards.length; ++j) + object.shards[j] = message.shards[j]; + } + if (message.dnsSource != null && message.hasOwnProperty("dnsSource")) + object.dnsSource = $root.proto.ClientPayload.DNSSource.toObject(message.dnsSource, options); + if (message.connectAttemptCount != null && message.hasOwnProperty("connectAttemptCount")) + object.connectAttemptCount = message.connectAttemptCount; + if (message.device != null && message.hasOwnProperty("device")) + object.device = message.device; + if (message.devicePairingData != null && message.hasOwnProperty("devicePairingData")) + object.devicePairingData = $root.proto.ClientPayload.DevicePairingRegistrationData.toObject(message.devicePairingData, options); + if (message.product != null && message.hasOwnProperty("product")) + object.product = options.enums === String ? $root.proto.ClientPayload.Product[message.product] : message.product; + if (message.fbCat != null && message.hasOwnProperty("fbCat")) + object.fbCat = options.bytes === String ? $util.base64.encode(message.fbCat, 0, message.fbCat.length) : options.bytes === Array ? Array.prototype.slice.call(message.fbCat) : message.fbCat; + if (message.fbUserAgent != null && message.hasOwnProperty("fbUserAgent")) + object.fbUserAgent = options.bytes === String ? $util.base64.encode(message.fbUserAgent, 0, message.fbUserAgent.length) : options.bytes === Array ? Array.prototype.slice.call(message.fbUserAgent) : message.fbUserAgent; + if (message.oc != null && message.hasOwnProperty("oc")) + object.oc = message.oc; + if (message.lc != null && message.hasOwnProperty("lc")) + object.lc = message.lc; + if (message.iosAppExtension != null && message.hasOwnProperty("iosAppExtension")) + object.iosAppExtension = options.enums === String ? $root.proto.ClientPayload.IOSAppExtension[message.iosAppExtension] : message.iosAppExtension; + if (message.fbAppId != null && message.hasOwnProperty("fbAppId")) + if (typeof message.fbAppId === "number") + object.fbAppId = options.longs === String ? String(message.fbAppId) : message.fbAppId; + else + object.fbAppId = options.longs === String ? $util.Long.prototype.toString.call(message.fbAppId) : options.longs === Number ? new $util.LongBits(message.fbAppId.low >>> 0, message.fbAppId.high >>> 0).toNumber(true) : message.fbAppId; + if (message.fbDeviceId != null && message.hasOwnProperty("fbDeviceId")) + object.fbDeviceId = options.bytes === String ? $util.base64.encode(message.fbDeviceId, 0, message.fbDeviceId.length) : options.bytes === Array ? Array.prototype.slice.call(message.fbDeviceId) : message.fbDeviceId; + if (message.pull != null && message.hasOwnProperty("pull")) + object.pull = message.pull; + if (message.paddingBytes != null && message.hasOwnProperty("paddingBytes")) + object.paddingBytes = options.bytes === String ? $util.base64.encode(message.paddingBytes, 0, message.paddingBytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.paddingBytes) : message.paddingBytes; + if (message.bizMarketSegment != null && message.hasOwnProperty("bizMarketSegment")) + object.bizMarketSegment = options.enums === String ? $root.proto.ClientPayload.BizMarketSegment[message.bizMarketSegment] : message.bizMarketSegment; + if (message.yearClass != null && message.hasOwnProperty("yearClass")) + object.yearClass = message.yearClass; + if (message.memClass != null && message.hasOwnProperty("memClass")) + object.memClass = message.memClass; + return object; + }; + + /** + * Converts this ClientPayload to JSON. + * @function toJSON + * @memberof proto.ClientPayload + * @instance + * @returns {Object.} JSON object + */ + ClientPayload.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * BizMarketSegment enum. + * @name proto.ClientPayload.BizMarketSegment + * @enum {number} + * @property {number} DEFAULT=0 DEFAULT value + * @property {number} DEVX=1 DEVX value + * @property {number} INBOX=2 INBOX value + */ + ClientPayload.BizMarketSegment = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "DEFAULT"] = 0; + values[valuesById[1] = "DEVX"] = 1; + values[valuesById[2] = "INBOX"] = 2; + return values; + })(); + + /** + * ConnectReason enum. + * @name proto.ClientPayload.ConnectReason + * @enum {number} + * @property {number} PUSH=0 PUSH value + * @property {number} USER_ACTIVATED=1 USER_ACTIVATED value + * @property {number} SCHEDULED=2 SCHEDULED value + * @property {number} ERROR_RECONNECT=3 ERROR_RECONNECT value + * @property {number} NETWORK_SWITCH=4 NETWORK_SWITCH value + * @property {number} PING_RECONNECT=5 PING_RECONNECT value + */ + ClientPayload.ConnectReason = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "PUSH"] = 0; + values[valuesById[1] = "USER_ACTIVATED"] = 1; + values[valuesById[2] = "SCHEDULED"] = 2; + values[valuesById[3] = "ERROR_RECONNECT"] = 3; + values[valuesById[4] = "NETWORK_SWITCH"] = 4; + values[valuesById[5] = "PING_RECONNECT"] = 5; + return values; + })(); + + /** + * ConnectType enum. + * @name proto.ClientPayload.ConnectType + * @enum {number} + * @property {number} CELLULAR_UNKNOWN=0 CELLULAR_UNKNOWN value + * @property {number} WIFI_UNKNOWN=1 WIFI_UNKNOWN value + * @property {number} CELLULAR_EDGE=100 CELLULAR_EDGE value + * @property {number} CELLULAR_IDEN=101 CELLULAR_IDEN value + * @property {number} CELLULAR_UMTS=102 CELLULAR_UMTS value + * @property {number} CELLULAR_EVDO=103 CELLULAR_EVDO value + * @property {number} CELLULAR_GPRS=104 CELLULAR_GPRS value + * @property {number} CELLULAR_HSDPA=105 CELLULAR_HSDPA value + * @property {number} CELLULAR_HSUPA=106 CELLULAR_HSUPA value + * @property {number} CELLULAR_HSPA=107 CELLULAR_HSPA value + * @property {number} CELLULAR_CDMA=108 CELLULAR_CDMA value + * @property {number} CELLULAR_1XRTT=109 CELLULAR_1XRTT value + * @property {number} CELLULAR_EHRPD=110 CELLULAR_EHRPD value + * @property {number} CELLULAR_LTE=111 CELLULAR_LTE value + * @property {number} CELLULAR_HSPAP=112 CELLULAR_HSPAP value + */ + ClientPayload.ConnectType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "CELLULAR_UNKNOWN"] = 0; + values[valuesById[1] = "WIFI_UNKNOWN"] = 1; + values[valuesById[100] = "CELLULAR_EDGE"] = 100; + values[valuesById[101] = "CELLULAR_IDEN"] = 101; + values[valuesById[102] = "CELLULAR_UMTS"] = 102; + values[valuesById[103] = "CELLULAR_EVDO"] = 103; + values[valuesById[104] = "CELLULAR_GPRS"] = 104; + values[valuesById[105] = "CELLULAR_HSDPA"] = 105; + values[valuesById[106] = "CELLULAR_HSUPA"] = 106; + values[valuesById[107] = "CELLULAR_HSPA"] = 107; + values[valuesById[108] = "CELLULAR_CDMA"] = 108; + values[valuesById[109] = "CELLULAR_1XRTT"] = 109; + values[valuesById[110] = "CELLULAR_EHRPD"] = 110; + values[valuesById[111] = "CELLULAR_LTE"] = 111; + values[valuesById[112] = "CELLULAR_HSPAP"] = 112; + return values; + })(); + + ClientPayload.DNSSource = (function() { + + /** + * Properties of a DNSSource. + * @memberof proto.ClientPayload + * @interface IDNSSource + * @property {proto.ClientPayload.DNSSource.DNSResolutionMethod|null} [dnsMethod] DNSSource dnsMethod + * @property {boolean|null} [appCached] DNSSource appCached + */ + + /** + * Constructs a new DNSSource. + * @memberof proto.ClientPayload + * @classdesc Represents a DNSSource. + * @implements IDNSSource + * @constructor + * @param {proto.ClientPayload.IDNSSource=} [properties] Properties to set + */ + function DNSSource(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DNSSource dnsMethod. + * @member {proto.ClientPayload.DNSSource.DNSResolutionMethod} dnsMethod + * @memberof proto.ClientPayload.DNSSource + * @instance + */ + DNSSource.prototype.dnsMethod = 0; + + /** + * DNSSource appCached. + * @member {boolean} appCached + * @memberof proto.ClientPayload.DNSSource + * @instance + */ + DNSSource.prototype.appCached = false; + + /** + * Creates a new DNSSource instance using the specified properties. + * @function create + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {proto.ClientPayload.IDNSSource=} [properties] Properties to set + * @returns {proto.ClientPayload.DNSSource} DNSSource instance + */ + DNSSource.create = function create(properties) { + return new DNSSource(properties); + }; + + /** + * Encodes the specified DNSSource message. Does not implicitly {@link proto.ClientPayload.DNSSource.verify|verify} messages. + * @function encode + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {proto.ClientPayload.IDNSSource} message DNSSource message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DNSSource.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.dnsMethod != null && Object.hasOwnProperty.call(message, "dnsMethod")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.dnsMethod); + if (message.appCached != null && Object.hasOwnProperty.call(message, "appCached")) + writer.uint32(/* id 16, wireType 0 =*/128).bool(message.appCached); + return writer; + }; + + /** + * Encodes the specified DNSSource message, length delimited. Does not implicitly {@link proto.ClientPayload.DNSSource.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {proto.ClientPayload.IDNSSource} message DNSSource message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DNSSource.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DNSSource message from the specified reader or buffer. + * @function decode + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ClientPayload.DNSSource} DNSSource + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DNSSource.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ClientPayload.DNSSource(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 15: + message.dnsMethod = reader.int32(); + break; + case 16: + message.appCached = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DNSSource message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ClientPayload.DNSSource} DNSSource + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DNSSource.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DNSSource message. + * @function verify + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DNSSource.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.dnsMethod != null && message.hasOwnProperty("dnsMethod")) + switch (message.dnsMethod) { + default: + return "dnsMethod: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + break; + } + if (message.appCached != null && message.hasOwnProperty("appCached")) + if (typeof message.appCached !== "boolean") + return "appCached: boolean expected"; + return null; + }; + + /** + * Creates a DNSSource message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {Object.} object Plain object + * @returns {proto.ClientPayload.DNSSource} DNSSource + */ + DNSSource.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ClientPayload.DNSSource) + return object; + var message = new $root.proto.ClientPayload.DNSSource(); + switch (object.dnsMethod) { + case "SYSTEM": + case 0: + message.dnsMethod = 0; + break; + case "GOOGLE": + case 1: + message.dnsMethod = 1; + break; + case "HARDCODED": + case 2: + message.dnsMethod = 2; + break; + case "OVERRIDE": + case 3: + message.dnsMethod = 3; + break; + case "FALLBACK": + case 4: + message.dnsMethod = 4; + break; + } + if (object.appCached != null) + message.appCached = Boolean(object.appCached); + return message; + }; + + /** + * Creates a plain object from a DNSSource message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ClientPayload.DNSSource + * @static + * @param {proto.ClientPayload.DNSSource} message DNSSource + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DNSSource.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.dnsMethod = options.enums === String ? "SYSTEM" : 0; + object.appCached = false; + } + if (message.dnsMethod != null && message.hasOwnProperty("dnsMethod")) + object.dnsMethod = options.enums === String ? $root.proto.ClientPayload.DNSSource.DNSResolutionMethod[message.dnsMethod] : message.dnsMethod; + if (message.appCached != null && message.hasOwnProperty("appCached")) + object.appCached = message.appCached; + return object; + }; + + /** + * Converts this DNSSource to JSON. + * @function toJSON + * @memberof proto.ClientPayload.DNSSource + * @instance + * @returns {Object.} JSON object + */ + DNSSource.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * DNSResolutionMethod enum. + * @name proto.ClientPayload.DNSSource.DNSResolutionMethod + * @enum {number} + * @property {number} SYSTEM=0 SYSTEM value + * @property {number} GOOGLE=1 GOOGLE value + * @property {number} HARDCODED=2 HARDCODED value + * @property {number} OVERRIDE=3 OVERRIDE value + * @property {number} FALLBACK=4 FALLBACK value + */ + DNSSource.DNSResolutionMethod = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "SYSTEM"] = 0; + values[valuesById[1] = "GOOGLE"] = 1; + values[valuesById[2] = "HARDCODED"] = 2; + values[valuesById[3] = "OVERRIDE"] = 3; + values[valuesById[4] = "FALLBACK"] = 4; + return values; + })(); + + return DNSSource; + })(); + + ClientPayload.DevicePairingRegistrationData = (function() { + + /** + * Properties of a DevicePairingRegistrationData. + * @memberof proto.ClientPayload + * @interface IDevicePairingRegistrationData + * @property {Uint8Array|null} [eRegid] DevicePairingRegistrationData eRegid + * @property {Uint8Array|null} [eKeytype] DevicePairingRegistrationData eKeytype + * @property {Uint8Array|null} [eIdent] DevicePairingRegistrationData eIdent + * @property {Uint8Array|null} [eSkeyId] DevicePairingRegistrationData eSkeyId + * @property {Uint8Array|null} [eSkeyVal] DevicePairingRegistrationData eSkeyVal + * @property {Uint8Array|null} [eSkeySig] DevicePairingRegistrationData eSkeySig + * @property {Uint8Array|null} [buildHash] DevicePairingRegistrationData buildHash + * @property {Uint8Array|null} [deviceProps] DevicePairingRegistrationData deviceProps + */ + + /** + * Constructs a new DevicePairingRegistrationData. + * @memberof proto.ClientPayload + * @classdesc Represents a DevicePairingRegistrationData. + * @implements IDevicePairingRegistrationData + * @constructor + * @param {proto.ClientPayload.IDevicePairingRegistrationData=} [properties] Properties to set + */ + function DevicePairingRegistrationData(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DevicePairingRegistrationData eRegid. + * @member {Uint8Array} eRegid + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.eRegid = $util.newBuffer([]); + + /** + * DevicePairingRegistrationData eKeytype. + * @member {Uint8Array} eKeytype + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.eKeytype = $util.newBuffer([]); + + /** + * DevicePairingRegistrationData eIdent. + * @member {Uint8Array} eIdent + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.eIdent = $util.newBuffer([]); + + /** + * DevicePairingRegistrationData eSkeyId. + * @member {Uint8Array} eSkeyId + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.eSkeyId = $util.newBuffer([]); + + /** + * DevicePairingRegistrationData eSkeyVal. + * @member {Uint8Array} eSkeyVal + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.eSkeyVal = $util.newBuffer([]); + + /** + * DevicePairingRegistrationData eSkeySig. + * @member {Uint8Array} eSkeySig + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.eSkeySig = $util.newBuffer([]); + + /** + * DevicePairingRegistrationData buildHash. + * @member {Uint8Array} buildHash + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.buildHash = $util.newBuffer([]); + + /** + * DevicePairingRegistrationData deviceProps. + * @member {Uint8Array} deviceProps + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + */ + DevicePairingRegistrationData.prototype.deviceProps = $util.newBuffer([]); + + /** + * Creates a new DevicePairingRegistrationData instance using the specified properties. + * @function create + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {proto.ClientPayload.IDevicePairingRegistrationData=} [properties] Properties to set + * @returns {proto.ClientPayload.DevicePairingRegistrationData} DevicePairingRegistrationData instance + */ + DevicePairingRegistrationData.create = function create(properties) { + return new DevicePairingRegistrationData(properties); + }; + + /** + * Encodes the specified DevicePairingRegistrationData message. Does not implicitly {@link proto.ClientPayload.DevicePairingRegistrationData.verify|verify} messages. + * @function encode + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {proto.ClientPayload.IDevicePairingRegistrationData} message DevicePairingRegistrationData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DevicePairingRegistrationData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.eRegid != null && Object.hasOwnProperty.call(message, "eRegid")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.eRegid); + if (message.eKeytype != null && Object.hasOwnProperty.call(message, "eKeytype")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.eKeytype); + if (message.eIdent != null && Object.hasOwnProperty.call(message, "eIdent")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.eIdent); + if (message.eSkeyId != null && Object.hasOwnProperty.call(message, "eSkeyId")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.eSkeyId); + if (message.eSkeyVal != null && Object.hasOwnProperty.call(message, "eSkeyVal")) + writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.eSkeyVal); + if (message.eSkeySig != null && Object.hasOwnProperty.call(message, "eSkeySig")) + writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.eSkeySig); + if (message.buildHash != null && Object.hasOwnProperty.call(message, "buildHash")) + writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.buildHash); + if (message.deviceProps != null && Object.hasOwnProperty.call(message, "deviceProps")) + writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.deviceProps); + return writer; + }; + + /** + * Encodes the specified DevicePairingRegistrationData message, length delimited. Does not implicitly {@link proto.ClientPayload.DevicePairingRegistrationData.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {proto.ClientPayload.IDevicePairingRegistrationData} message DevicePairingRegistrationData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DevicePairingRegistrationData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DevicePairingRegistrationData message from the specified reader or buffer. + * @function decode + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ClientPayload.DevicePairingRegistrationData} DevicePairingRegistrationData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DevicePairingRegistrationData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ClientPayload.DevicePairingRegistrationData(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.eRegid = reader.bytes(); + break; + case 2: + message.eKeytype = reader.bytes(); + break; + case 3: + message.eIdent = reader.bytes(); + break; + case 4: + message.eSkeyId = reader.bytes(); + break; + case 5: + message.eSkeyVal = reader.bytes(); + break; + case 6: + message.eSkeySig = reader.bytes(); + break; + case 7: + message.buildHash = reader.bytes(); + break; + case 8: + message.deviceProps = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DevicePairingRegistrationData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ClientPayload.DevicePairingRegistrationData} DevicePairingRegistrationData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DevicePairingRegistrationData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DevicePairingRegistrationData message. + * @function verify + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DevicePairingRegistrationData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.eRegid != null && message.hasOwnProperty("eRegid")) + if (!(message.eRegid && typeof message.eRegid.length === "number" || $util.isString(message.eRegid))) + return "eRegid: buffer expected"; + if (message.eKeytype != null && message.hasOwnProperty("eKeytype")) + if (!(message.eKeytype && typeof message.eKeytype.length === "number" || $util.isString(message.eKeytype))) + return "eKeytype: buffer expected"; + if (message.eIdent != null && message.hasOwnProperty("eIdent")) + if (!(message.eIdent && typeof message.eIdent.length === "number" || $util.isString(message.eIdent))) + return "eIdent: buffer expected"; + if (message.eSkeyId != null && message.hasOwnProperty("eSkeyId")) + if (!(message.eSkeyId && typeof message.eSkeyId.length === "number" || $util.isString(message.eSkeyId))) + return "eSkeyId: buffer expected"; + if (message.eSkeyVal != null && message.hasOwnProperty("eSkeyVal")) + if (!(message.eSkeyVal && typeof message.eSkeyVal.length === "number" || $util.isString(message.eSkeyVal))) + return "eSkeyVal: buffer expected"; + if (message.eSkeySig != null && message.hasOwnProperty("eSkeySig")) + if (!(message.eSkeySig && typeof message.eSkeySig.length === "number" || $util.isString(message.eSkeySig))) + return "eSkeySig: buffer expected"; + if (message.buildHash != null && message.hasOwnProperty("buildHash")) + if (!(message.buildHash && typeof message.buildHash.length === "number" || $util.isString(message.buildHash))) + return "buildHash: buffer expected"; + if (message.deviceProps != null && message.hasOwnProperty("deviceProps")) + if (!(message.deviceProps && typeof message.deviceProps.length === "number" || $util.isString(message.deviceProps))) + return "deviceProps: buffer expected"; + return null; + }; + + /** + * Creates a DevicePairingRegistrationData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {Object.} object Plain object + * @returns {proto.ClientPayload.DevicePairingRegistrationData} DevicePairingRegistrationData + */ + DevicePairingRegistrationData.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ClientPayload.DevicePairingRegistrationData) + return object; + var message = new $root.proto.ClientPayload.DevicePairingRegistrationData(); + if (object.eRegid != null) + if (typeof object.eRegid === "string") + $util.base64.decode(object.eRegid, message.eRegid = $util.newBuffer($util.base64.length(object.eRegid)), 0); + else if (object.eRegid.length) + message.eRegid = object.eRegid; + if (object.eKeytype != null) + if (typeof object.eKeytype === "string") + $util.base64.decode(object.eKeytype, message.eKeytype = $util.newBuffer($util.base64.length(object.eKeytype)), 0); + else if (object.eKeytype.length) + message.eKeytype = object.eKeytype; + if (object.eIdent != null) + if (typeof object.eIdent === "string") + $util.base64.decode(object.eIdent, message.eIdent = $util.newBuffer($util.base64.length(object.eIdent)), 0); + else if (object.eIdent.length) + message.eIdent = object.eIdent; + if (object.eSkeyId != null) + if (typeof object.eSkeyId === "string") + $util.base64.decode(object.eSkeyId, message.eSkeyId = $util.newBuffer($util.base64.length(object.eSkeyId)), 0); + else if (object.eSkeyId.length) + message.eSkeyId = object.eSkeyId; + if (object.eSkeyVal != null) + if (typeof object.eSkeyVal === "string") + $util.base64.decode(object.eSkeyVal, message.eSkeyVal = $util.newBuffer($util.base64.length(object.eSkeyVal)), 0); + else if (object.eSkeyVal.length) + message.eSkeyVal = object.eSkeyVal; + if (object.eSkeySig != null) + if (typeof object.eSkeySig === "string") + $util.base64.decode(object.eSkeySig, message.eSkeySig = $util.newBuffer($util.base64.length(object.eSkeySig)), 0); + else if (object.eSkeySig.length) + message.eSkeySig = object.eSkeySig; + if (object.buildHash != null) + if (typeof object.buildHash === "string") + $util.base64.decode(object.buildHash, message.buildHash = $util.newBuffer($util.base64.length(object.buildHash)), 0); + else if (object.buildHash.length) + message.buildHash = object.buildHash; + if (object.deviceProps != null) + if (typeof object.deviceProps === "string") + $util.base64.decode(object.deviceProps, message.deviceProps = $util.newBuffer($util.base64.length(object.deviceProps)), 0); + else if (object.deviceProps.length) + message.deviceProps = object.deviceProps; + return message; + }; + + /** + * Creates a plain object from a DevicePairingRegistrationData message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @static + * @param {proto.ClientPayload.DevicePairingRegistrationData} message DevicePairingRegistrationData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DevicePairingRegistrationData.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.eRegid = ""; + else { + object.eRegid = []; + if (options.bytes !== Array) + object.eRegid = $util.newBuffer(object.eRegid); + } + if (options.bytes === String) + object.eKeytype = ""; + else { + object.eKeytype = []; + if (options.bytes !== Array) + object.eKeytype = $util.newBuffer(object.eKeytype); + } + if (options.bytes === String) + object.eIdent = ""; + else { + object.eIdent = []; + if (options.bytes !== Array) + object.eIdent = $util.newBuffer(object.eIdent); + } + if (options.bytes === String) + object.eSkeyId = ""; + else { + object.eSkeyId = []; + if (options.bytes !== Array) + object.eSkeyId = $util.newBuffer(object.eSkeyId); + } + if (options.bytes === String) + object.eSkeyVal = ""; + else { + object.eSkeyVal = []; + if (options.bytes !== Array) + object.eSkeyVal = $util.newBuffer(object.eSkeyVal); + } + if (options.bytes === String) + object.eSkeySig = ""; + else { + object.eSkeySig = []; + if (options.bytes !== Array) + object.eSkeySig = $util.newBuffer(object.eSkeySig); + } + if (options.bytes === String) + object.buildHash = ""; + else { + object.buildHash = []; + if (options.bytes !== Array) + object.buildHash = $util.newBuffer(object.buildHash); + } + if (options.bytes === String) + object.deviceProps = ""; + else { + object.deviceProps = []; + if (options.bytes !== Array) + object.deviceProps = $util.newBuffer(object.deviceProps); + } + } + if (message.eRegid != null && message.hasOwnProperty("eRegid")) + object.eRegid = options.bytes === String ? $util.base64.encode(message.eRegid, 0, message.eRegid.length) : options.bytes === Array ? Array.prototype.slice.call(message.eRegid) : message.eRegid; + if (message.eKeytype != null && message.hasOwnProperty("eKeytype")) + object.eKeytype = options.bytes === String ? $util.base64.encode(message.eKeytype, 0, message.eKeytype.length) : options.bytes === Array ? Array.prototype.slice.call(message.eKeytype) : message.eKeytype; + if (message.eIdent != null && message.hasOwnProperty("eIdent")) + object.eIdent = options.bytes === String ? $util.base64.encode(message.eIdent, 0, message.eIdent.length) : options.bytes === Array ? Array.prototype.slice.call(message.eIdent) : message.eIdent; + if (message.eSkeyId != null && message.hasOwnProperty("eSkeyId")) + object.eSkeyId = options.bytes === String ? $util.base64.encode(message.eSkeyId, 0, message.eSkeyId.length) : options.bytes === Array ? Array.prototype.slice.call(message.eSkeyId) : message.eSkeyId; + if (message.eSkeyVal != null && message.hasOwnProperty("eSkeyVal")) + object.eSkeyVal = options.bytes === String ? $util.base64.encode(message.eSkeyVal, 0, message.eSkeyVal.length) : options.bytes === Array ? Array.prototype.slice.call(message.eSkeyVal) : message.eSkeyVal; + if (message.eSkeySig != null && message.hasOwnProperty("eSkeySig")) + object.eSkeySig = options.bytes === String ? $util.base64.encode(message.eSkeySig, 0, message.eSkeySig.length) : options.bytes === Array ? Array.prototype.slice.call(message.eSkeySig) : message.eSkeySig; + if (message.buildHash != null && message.hasOwnProperty("buildHash")) + object.buildHash = options.bytes === String ? $util.base64.encode(message.buildHash, 0, message.buildHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.buildHash) : message.buildHash; + if (message.deviceProps != null && message.hasOwnProperty("deviceProps")) + object.deviceProps = options.bytes === String ? $util.base64.encode(message.deviceProps, 0, message.deviceProps.length) : options.bytes === Array ? Array.prototype.slice.call(message.deviceProps) : message.deviceProps; + return object; + }; + + /** + * Converts this DevicePairingRegistrationData to JSON. + * @function toJSON + * @memberof proto.ClientPayload.DevicePairingRegistrationData + * @instance + * @returns {Object.} JSON object + */ + DevicePairingRegistrationData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DevicePairingRegistrationData; + })(); + + /** + * IOSAppExtension enum. + * @name proto.ClientPayload.IOSAppExtension + * @enum {number} + * @property {number} SHARE_EXTENSION=0 SHARE_EXTENSION value + * @property {number} SERVICE_EXTENSION=1 SERVICE_EXTENSION value + * @property {number} INTENTS_EXTENSION=2 INTENTS_EXTENSION value + */ + ClientPayload.IOSAppExtension = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "SHARE_EXTENSION"] = 0; + values[valuesById[1] = "SERVICE_EXTENSION"] = 1; + values[valuesById[2] = "INTENTS_EXTENSION"] = 2; + return values; + })(); + + /** + * Product enum. + * @name proto.ClientPayload.Product + * @enum {number} + * @property {number} WHATSAPP=0 WHATSAPP value + * @property {number} MESSENGER=1 MESSENGER value + */ + ClientPayload.Product = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "WHATSAPP"] = 0; + values[valuesById[1] = "MESSENGER"] = 1; + return values; + })(); + + ClientPayload.UserAgent = (function() { + + /** + * Properties of a UserAgent. + * @memberof proto.ClientPayload + * @interface IUserAgent + * @property {proto.ClientPayload.UserAgent.Platform|null} [platform] UserAgent platform + * @property {proto.ClientPayload.UserAgent.IAppVersion|null} [appVersion] UserAgent appVersion + * @property {string|null} [mcc] UserAgent mcc + * @property {string|null} [mnc] UserAgent mnc + * @property {string|null} [osVersion] UserAgent osVersion + * @property {string|null} [manufacturer] UserAgent manufacturer + * @property {string|null} [device] UserAgent device + * @property {string|null} [osBuildNumber] UserAgent osBuildNumber + * @property {string|null} [phoneId] UserAgent phoneId + * @property {proto.ClientPayload.UserAgent.ReleaseChannel|null} [releaseChannel] UserAgent releaseChannel + * @property {string|null} [localeLanguageIso6391] UserAgent localeLanguageIso6391 + * @property {string|null} [localeCountryIso31661Alpha2] UserAgent localeCountryIso31661Alpha2 + * @property {string|null} [deviceBoard] UserAgent deviceBoard + */ + + /** + * Constructs a new UserAgent. + * @memberof proto.ClientPayload + * @classdesc Represents a UserAgent. + * @implements IUserAgent + * @constructor + * @param {proto.ClientPayload.IUserAgent=} [properties] Properties to set + */ + function UserAgent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * UserAgent platform. + * @member {proto.ClientPayload.UserAgent.Platform} platform + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.platform = 0; + + /** + * UserAgent appVersion. + * @member {proto.ClientPayload.UserAgent.IAppVersion|null|undefined} appVersion + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.appVersion = null; + + /** + * UserAgent mcc. + * @member {string} mcc + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.mcc = ""; + + /** + * UserAgent mnc. + * @member {string} mnc + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.mnc = ""; + + /** + * UserAgent osVersion. + * @member {string} osVersion + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.osVersion = ""; + + /** + * UserAgent manufacturer. + * @member {string} manufacturer + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.manufacturer = ""; + + /** + * UserAgent device. + * @member {string} device + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.device = ""; + + /** + * UserAgent osBuildNumber. + * @member {string} osBuildNumber + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.osBuildNumber = ""; + + /** + * UserAgent phoneId. + * @member {string} phoneId + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.phoneId = ""; + + /** + * UserAgent releaseChannel. + * @member {proto.ClientPayload.UserAgent.ReleaseChannel} releaseChannel + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.releaseChannel = 0; + + /** + * UserAgent localeLanguageIso6391. + * @member {string} localeLanguageIso6391 + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.localeLanguageIso6391 = ""; + + /** + * UserAgent localeCountryIso31661Alpha2. + * @member {string} localeCountryIso31661Alpha2 + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.localeCountryIso31661Alpha2 = ""; + + /** + * UserAgent deviceBoard. + * @member {string} deviceBoard + * @memberof proto.ClientPayload.UserAgent + * @instance + */ + UserAgent.prototype.deviceBoard = ""; + + /** + * Creates a new UserAgent instance using the specified properties. + * @function create + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {proto.ClientPayload.IUserAgent=} [properties] Properties to set + * @returns {proto.ClientPayload.UserAgent} UserAgent instance + */ + UserAgent.create = function create(properties) { + return new UserAgent(properties); + }; + + /** + * Encodes the specified UserAgent message. Does not implicitly {@link proto.ClientPayload.UserAgent.verify|verify} messages. + * @function encode + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {proto.ClientPayload.IUserAgent} message UserAgent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserAgent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.platform != null && Object.hasOwnProperty.call(message, "platform")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.platform); + if (message.appVersion != null && Object.hasOwnProperty.call(message, "appVersion")) + $root.proto.ClientPayload.UserAgent.AppVersion.encode(message.appVersion, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.mcc != null && Object.hasOwnProperty.call(message, "mcc")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.mcc); + if (message.mnc != null && Object.hasOwnProperty.call(message, "mnc")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.mnc); + if (message.osVersion != null && Object.hasOwnProperty.call(message, "osVersion")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.osVersion); + if (message.manufacturer != null && Object.hasOwnProperty.call(message, "manufacturer")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.manufacturer); + if (message.device != null && Object.hasOwnProperty.call(message, "device")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.device); + if (message.osBuildNumber != null && Object.hasOwnProperty.call(message, "osBuildNumber")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.osBuildNumber); + if (message.phoneId != null && Object.hasOwnProperty.call(message, "phoneId")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.phoneId); + if (message.releaseChannel != null && Object.hasOwnProperty.call(message, "releaseChannel")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.releaseChannel); + if (message.localeLanguageIso6391 != null && Object.hasOwnProperty.call(message, "localeLanguageIso6391")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.localeLanguageIso6391); + if (message.localeCountryIso31661Alpha2 != null && Object.hasOwnProperty.call(message, "localeCountryIso31661Alpha2")) + writer.uint32(/* id 12, wireType 2 =*/98).string(message.localeCountryIso31661Alpha2); + if (message.deviceBoard != null && Object.hasOwnProperty.call(message, "deviceBoard")) + writer.uint32(/* id 13, wireType 2 =*/106).string(message.deviceBoard); + return writer; + }; + + /** + * Encodes the specified UserAgent message, length delimited. Does not implicitly {@link proto.ClientPayload.UserAgent.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {proto.ClientPayload.IUserAgent} message UserAgent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserAgent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a UserAgent message from the specified reader or buffer. + * @function decode + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ClientPayload.UserAgent} UserAgent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserAgent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ClientPayload.UserAgent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.platform = reader.int32(); + break; + case 2: + message.appVersion = $root.proto.ClientPayload.UserAgent.AppVersion.decode(reader, reader.uint32()); + break; + case 3: + message.mcc = reader.string(); + break; + case 4: + message.mnc = reader.string(); + break; + case 5: + message.osVersion = reader.string(); + break; + case 6: + message.manufacturer = reader.string(); + break; + case 7: + message.device = reader.string(); + break; + case 8: + message.osBuildNumber = reader.string(); + break; + case 9: + message.phoneId = reader.string(); + break; + case 10: + message.releaseChannel = reader.int32(); + break; + case 11: + message.localeLanguageIso6391 = reader.string(); + break; + case 12: + message.localeCountryIso31661Alpha2 = reader.string(); + break; + case 13: + message.deviceBoard = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a UserAgent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ClientPayload.UserAgent} UserAgent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserAgent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a UserAgent message. + * @function verify + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UserAgent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.platform != null && message.hasOwnProperty("platform")) + switch (message.platform) { + default: + return "platform: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + break; + } + if (message.appVersion != null && message.hasOwnProperty("appVersion")) { + var error = $root.proto.ClientPayload.UserAgent.AppVersion.verify(message.appVersion); + if (error) + return "appVersion." + error; + } + if (message.mcc != null && message.hasOwnProperty("mcc")) + if (!$util.isString(message.mcc)) + return "mcc: string expected"; + if (message.mnc != null && message.hasOwnProperty("mnc")) + if (!$util.isString(message.mnc)) + return "mnc: string expected"; + if (message.osVersion != null && message.hasOwnProperty("osVersion")) + if (!$util.isString(message.osVersion)) + return "osVersion: string expected"; + if (message.manufacturer != null && message.hasOwnProperty("manufacturer")) + if (!$util.isString(message.manufacturer)) + return "manufacturer: string expected"; + if (message.device != null && message.hasOwnProperty("device")) + if (!$util.isString(message.device)) + return "device: string expected"; + if (message.osBuildNumber != null && message.hasOwnProperty("osBuildNumber")) + if (!$util.isString(message.osBuildNumber)) + return "osBuildNumber: string expected"; + if (message.phoneId != null && message.hasOwnProperty("phoneId")) + if (!$util.isString(message.phoneId)) + return "phoneId: string expected"; + if (message.releaseChannel != null && message.hasOwnProperty("releaseChannel")) + switch (message.releaseChannel) { + default: + return "releaseChannel: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.localeLanguageIso6391 != null && message.hasOwnProperty("localeLanguageIso6391")) + if (!$util.isString(message.localeLanguageIso6391)) + return "localeLanguageIso6391: string expected"; + if (message.localeCountryIso31661Alpha2 != null && message.hasOwnProperty("localeCountryIso31661Alpha2")) + if (!$util.isString(message.localeCountryIso31661Alpha2)) + return "localeCountryIso31661Alpha2: string expected"; + if (message.deviceBoard != null && message.hasOwnProperty("deviceBoard")) + if (!$util.isString(message.deviceBoard)) + return "deviceBoard: string expected"; + return null; + }; + + /** + * Creates a UserAgent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {Object.} object Plain object + * @returns {proto.ClientPayload.UserAgent} UserAgent + */ + UserAgent.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ClientPayload.UserAgent) + return object; + var message = new $root.proto.ClientPayload.UserAgent(); + switch (object.platform) { + case "ANDROID": + case 0: + message.platform = 0; + break; + case "IOS": + case 1: + message.platform = 1; + break; + case "WINDOWS_PHONE": + case 2: + message.platform = 2; + break; + case "BLACKBERRY": + case 3: + message.platform = 3; + break; + case "BLACKBERRYX": + case 4: + message.platform = 4; + break; + case "S40": + case 5: + message.platform = 5; + break; + case "S60": + case 6: + message.platform = 6; + break; + case "PYTHON_CLIENT": + case 7: + message.platform = 7; + break; + case "TIZEN": + case 8: + message.platform = 8; + break; + case "ENTERPRISE": + case 9: + message.platform = 9; + break; + case "SMB_ANDROID": + case 10: + message.platform = 10; + break; + case "KAIOS": + case 11: + message.platform = 11; + break; + case "SMB_IOS": + case 12: + message.platform = 12; + break; + case "WINDOWS": + case 13: + message.platform = 13; + break; + case "WEB": + case 14: + message.platform = 14; + break; + case "PORTAL": + case 15: + message.platform = 15; + break; + case "GREEN_ANDROID": + case 16: + message.platform = 16; + break; + case "GREEN_IPHONE": + case 17: + message.platform = 17; + break; + case "BLUE_ANDROID": + case 18: + message.platform = 18; + break; + case "BLUE_IPHONE": + case 19: + message.platform = 19; + break; + case "FBLITE_ANDROID": + case 20: + message.platform = 20; + break; + case "MLITE_ANDROID": + case 21: + message.platform = 21; + break; + case "IGLITE_ANDROID": + case 22: + message.platform = 22; + break; + case "PAGE": + case 23: + message.platform = 23; + break; + case "MACOS": + case 24: + message.platform = 24; + break; + case "OCULUS_MSG": + case 25: + message.platform = 25; + break; + case "OCULUS_CALL": + case 26: + message.platform = 26; + break; + case "MILAN": + case 27: + message.platform = 27; + break; + case "CAPI": + case 28: + message.platform = 28; + break; + case "WEAROS": + case 29: + message.platform = 29; + break; + case "ARDEVICE": + case 30: + message.platform = 30; + break; + case "VRDEVICE": + case 31: + message.platform = 31; + break; + } + if (object.appVersion != null) { + if (typeof object.appVersion !== "object") + throw TypeError(".proto.ClientPayload.UserAgent.appVersion: object expected"); + message.appVersion = $root.proto.ClientPayload.UserAgent.AppVersion.fromObject(object.appVersion); + } + if (object.mcc != null) + message.mcc = String(object.mcc); + if (object.mnc != null) + message.mnc = String(object.mnc); + if (object.osVersion != null) + message.osVersion = String(object.osVersion); + if (object.manufacturer != null) + message.manufacturer = String(object.manufacturer); + if (object.device != null) + message.device = String(object.device); + if (object.osBuildNumber != null) + message.osBuildNumber = String(object.osBuildNumber); + if (object.phoneId != null) + message.phoneId = String(object.phoneId); + switch (object.releaseChannel) { + case "RELEASE": + case 0: + message.releaseChannel = 0; + break; + case "BETA": + case 1: + message.releaseChannel = 1; + break; + case "ALPHA": + case 2: + message.releaseChannel = 2; + break; + case "DEBUG": + case 3: + message.releaseChannel = 3; + break; + } + if (object.localeLanguageIso6391 != null) + message.localeLanguageIso6391 = String(object.localeLanguageIso6391); + if (object.localeCountryIso31661Alpha2 != null) + message.localeCountryIso31661Alpha2 = String(object.localeCountryIso31661Alpha2); + if (object.deviceBoard != null) + message.deviceBoard = String(object.deviceBoard); + return message; + }; + + /** + * Creates a plain object from a UserAgent message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ClientPayload.UserAgent + * @static + * @param {proto.ClientPayload.UserAgent} message UserAgent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + UserAgent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.platform = options.enums === String ? "ANDROID" : 0; + object.appVersion = null; + object.mcc = ""; + object.mnc = ""; + object.osVersion = ""; + object.manufacturer = ""; + object.device = ""; + object.osBuildNumber = ""; + object.phoneId = ""; + object.releaseChannel = options.enums === String ? "RELEASE" : 0; + object.localeLanguageIso6391 = ""; + object.localeCountryIso31661Alpha2 = ""; + object.deviceBoard = ""; + } + if (message.platform != null && message.hasOwnProperty("platform")) + object.platform = options.enums === String ? $root.proto.ClientPayload.UserAgent.Platform[message.platform] : message.platform; + if (message.appVersion != null && message.hasOwnProperty("appVersion")) + object.appVersion = $root.proto.ClientPayload.UserAgent.AppVersion.toObject(message.appVersion, options); + if (message.mcc != null && message.hasOwnProperty("mcc")) + object.mcc = message.mcc; + if (message.mnc != null && message.hasOwnProperty("mnc")) + object.mnc = message.mnc; + if (message.osVersion != null && message.hasOwnProperty("osVersion")) + object.osVersion = message.osVersion; + if (message.manufacturer != null && message.hasOwnProperty("manufacturer")) + object.manufacturer = message.manufacturer; + if (message.device != null && message.hasOwnProperty("device")) + object.device = message.device; + if (message.osBuildNumber != null && message.hasOwnProperty("osBuildNumber")) + object.osBuildNumber = message.osBuildNumber; + if (message.phoneId != null && message.hasOwnProperty("phoneId")) + object.phoneId = message.phoneId; + if (message.releaseChannel != null && message.hasOwnProperty("releaseChannel")) + object.releaseChannel = options.enums === String ? $root.proto.ClientPayload.UserAgent.ReleaseChannel[message.releaseChannel] : message.releaseChannel; + if (message.localeLanguageIso6391 != null && message.hasOwnProperty("localeLanguageIso6391")) + object.localeLanguageIso6391 = message.localeLanguageIso6391; + if (message.localeCountryIso31661Alpha2 != null && message.hasOwnProperty("localeCountryIso31661Alpha2")) + object.localeCountryIso31661Alpha2 = message.localeCountryIso31661Alpha2; + if (message.deviceBoard != null && message.hasOwnProperty("deviceBoard")) + object.deviceBoard = message.deviceBoard; + return object; + }; + + /** + * Converts this UserAgent to JSON. + * @function toJSON + * @memberof proto.ClientPayload.UserAgent + * @instance + * @returns {Object.} JSON object + */ + UserAgent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + UserAgent.AppVersion = (function() { + + /** + * Properties of an AppVersion. + * @memberof proto.ClientPayload.UserAgent + * @interface IAppVersion + * @property {number|null} [primary] AppVersion primary + * @property {number|null} [secondary] AppVersion secondary + * @property {number|null} [tertiary] AppVersion tertiary + * @property {number|null} [quaternary] AppVersion quaternary + * @property {number|null} [quinary] AppVersion quinary + */ + + /** + * Constructs a new AppVersion. + * @memberof proto.ClientPayload.UserAgent + * @classdesc Represents an AppVersion. + * @implements IAppVersion + * @constructor + * @param {proto.ClientPayload.UserAgent.IAppVersion=} [properties] Properties to set + */ + function AppVersion(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppVersion primary. + * @member {number} primary + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @instance + */ + AppVersion.prototype.primary = 0; + + /** + * AppVersion secondary. + * @member {number} secondary + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @instance + */ + AppVersion.prototype.secondary = 0; + + /** + * AppVersion tertiary. + * @member {number} tertiary + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @instance + */ + AppVersion.prototype.tertiary = 0; + + /** + * AppVersion quaternary. + * @member {number} quaternary + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @instance + */ + AppVersion.prototype.quaternary = 0; + + /** + * AppVersion quinary. + * @member {number} quinary + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @instance + */ + AppVersion.prototype.quinary = 0; + + /** + * Creates a new AppVersion instance using the specified properties. + * @function create + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {proto.ClientPayload.UserAgent.IAppVersion=} [properties] Properties to set + * @returns {proto.ClientPayload.UserAgent.AppVersion} AppVersion instance + */ + AppVersion.create = function create(properties) { + return new AppVersion(properties); + }; + + /** + * Encodes the specified AppVersion message. Does not implicitly {@link proto.ClientPayload.UserAgent.AppVersion.verify|verify} messages. + * @function encode + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {proto.ClientPayload.UserAgent.IAppVersion} message AppVersion message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppVersion.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.primary != null && Object.hasOwnProperty.call(message, "primary")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.primary); + if (message.secondary != null && Object.hasOwnProperty.call(message, "secondary")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.secondary); + if (message.tertiary != null && Object.hasOwnProperty.call(message, "tertiary")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.tertiary); + if (message.quaternary != null && Object.hasOwnProperty.call(message, "quaternary")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.quaternary); + if (message.quinary != null && Object.hasOwnProperty.call(message, "quinary")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.quinary); + return writer; + }; + + /** + * Encodes the specified AppVersion message, length delimited. Does not implicitly {@link proto.ClientPayload.UserAgent.AppVersion.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {proto.ClientPayload.UserAgent.IAppVersion} message AppVersion message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppVersion.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppVersion message from the specified reader or buffer. + * @function decode + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ClientPayload.UserAgent.AppVersion} AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppVersion.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ClientPayload.UserAgent.AppVersion(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.primary = reader.uint32(); + break; + case 2: + message.secondary = reader.uint32(); + break; + case 3: + message.tertiary = reader.uint32(); + break; + case 4: + message.quaternary = reader.uint32(); + break; + case 5: + message.quinary = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppVersion message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ClientPayload.UserAgent.AppVersion} AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppVersion.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppVersion message. + * @function verify + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppVersion.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.primary != null && message.hasOwnProperty("primary")) + if (!$util.isInteger(message.primary)) + return "primary: integer expected"; + if (message.secondary != null && message.hasOwnProperty("secondary")) + if (!$util.isInteger(message.secondary)) + return "secondary: integer expected"; + if (message.tertiary != null && message.hasOwnProperty("tertiary")) + if (!$util.isInteger(message.tertiary)) + return "tertiary: integer expected"; + if (message.quaternary != null && message.hasOwnProperty("quaternary")) + if (!$util.isInteger(message.quaternary)) + return "quaternary: integer expected"; + if (message.quinary != null && message.hasOwnProperty("quinary")) + if (!$util.isInteger(message.quinary)) + return "quinary: integer expected"; + return null; + }; + + /** + * Creates an AppVersion message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {Object.} object Plain object + * @returns {proto.ClientPayload.UserAgent.AppVersion} AppVersion + */ + AppVersion.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ClientPayload.UserAgent.AppVersion) + return object; + var message = new $root.proto.ClientPayload.UserAgent.AppVersion(); + if (object.primary != null) + message.primary = object.primary >>> 0; + if (object.secondary != null) + message.secondary = object.secondary >>> 0; + if (object.tertiary != null) + message.tertiary = object.tertiary >>> 0; + if (object.quaternary != null) + message.quaternary = object.quaternary >>> 0; + if (object.quinary != null) + message.quinary = object.quinary >>> 0; + return message; + }; + + /** + * Creates a plain object from an AppVersion message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @static + * @param {proto.ClientPayload.UserAgent.AppVersion} message AppVersion + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppVersion.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.primary = 0; + object.secondary = 0; + object.tertiary = 0; + object.quaternary = 0; + object.quinary = 0; + } + if (message.primary != null && message.hasOwnProperty("primary")) + object.primary = message.primary; + if (message.secondary != null && message.hasOwnProperty("secondary")) + object.secondary = message.secondary; + if (message.tertiary != null && message.hasOwnProperty("tertiary")) + object.tertiary = message.tertiary; + if (message.quaternary != null && message.hasOwnProperty("quaternary")) + object.quaternary = message.quaternary; + if (message.quinary != null && message.hasOwnProperty("quinary")) + object.quinary = message.quinary; + return object; + }; + + /** + * Converts this AppVersion to JSON. + * @function toJSON + * @memberof proto.ClientPayload.UserAgent.AppVersion + * @instance + * @returns {Object.} JSON object + */ + AppVersion.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppVersion; + })(); + + /** + * Platform enum. + * @name proto.ClientPayload.UserAgent.Platform + * @enum {number} + * @property {number} ANDROID=0 ANDROID value + * @property {number} IOS=1 IOS value + * @property {number} WINDOWS_PHONE=2 WINDOWS_PHONE value + * @property {number} BLACKBERRY=3 BLACKBERRY value + * @property {number} BLACKBERRYX=4 BLACKBERRYX value + * @property {number} S40=5 S40 value + * @property {number} S60=6 S60 value + * @property {number} PYTHON_CLIENT=7 PYTHON_CLIENT value + * @property {number} TIZEN=8 TIZEN value + * @property {number} ENTERPRISE=9 ENTERPRISE value + * @property {number} SMB_ANDROID=10 SMB_ANDROID value + * @property {number} KAIOS=11 KAIOS value + * @property {number} SMB_IOS=12 SMB_IOS value + * @property {number} WINDOWS=13 WINDOWS value + * @property {number} WEB=14 WEB value + * @property {number} PORTAL=15 PORTAL value + * @property {number} GREEN_ANDROID=16 GREEN_ANDROID value + * @property {number} GREEN_IPHONE=17 GREEN_IPHONE value + * @property {number} BLUE_ANDROID=18 BLUE_ANDROID value + * @property {number} BLUE_IPHONE=19 BLUE_IPHONE value + * @property {number} FBLITE_ANDROID=20 FBLITE_ANDROID value + * @property {number} MLITE_ANDROID=21 MLITE_ANDROID value + * @property {number} IGLITE_ANDROID=22 IGLITE_ANDROID value + * @property {number} PAGE=23 PAGE value + * @property {number} MACOS=24 MACOS value + * @property {number} OCULUS_MSG=25 OCULUS_MSG value + * @property {number} OCULUS_CALL=26 OCULUS_CALL value + * @property {number} MILAN=27 MILAN value + * @property {number} CAPI=28 CAPI value + * @property {number} WEAROS=29 WEAROS value + * @property {number} ARDEVICE=30 ARDEVICE value + * @property {number} VRDEVICE=31 VRDEVICE value + */ + UserAgent.Platform = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ANDROID"] = 0; + values[valuesById[1] = "IOS"] = 1; + values[valuesById[2] = "WINDOWS_PHONE"] = 2; + values[valuesById[3] = "BLACKBERRY"] = 3; + values[valuesById[4] = "BLACKBERRYX"] = 4; + values[valuesById[5] = "S40"] = 5; + values[valuesById[6] = "S60"] = 6; + values[valuesById[7] = "PYTHON_CLIENT"] = 7; + values[valuesById[8] = "TIZEN"] = 8; + values[valuesById[9] = "ENTERPRISE"] = 9; + values[valuesById[10] = "SMB_ANDROID"] = 10; + values[valuesById[11] = "KAIOS"] = 11; + values[valuesById[12] = "SMB_IOS"] = 12; + values[valuesById[13] = "WINDOWS"] = 13; + values[valuesById[14] = "WEB"] = 14; + values[valuesById[15] = "PORTAL"] = 15; + values[valuesById[16] = "GREEN_ANDROID"] = 16; + values[valuesById[17] = "GREEN_IPHONE"] = 17; + values[valuesById[18] = "BLUE_ANDROID"] = 18; + values[valuesById[19] = "BLUE_IPHONE"] = 19; + values[valuesById[20] = "FBLITE_ANDROID"] = 20; + values[valuesById[21] = "MLITE_ANDROID"] = 21; + values[valuesById[22] = "IGLITE_ANDROID"] = 22; + values[valuesById[23] = "PAGE"] = 23; + values[valuesById[24] = "MACOS"] = 24; + values[valuesById[25] = "OCULUS_MSG"] = 25; + values[valuesById[26] = "OCULUS_CALL"] = 26; + values[valuesById[27] = "MILAN"] = 27; + values[valuesById[28] = "CAPI"] = 28; + values[valuesById[29] = "WEAROS"] = 29; + values[valuesById[30] = "ARDEVICE"] = 30; + values[valuesById[31] = "VRDEVICE"] = 31; + return values; + })(); + + /** + * ReleaseChannel enum. + * @name proto.ClientPayload.UserAgent.ReleaseChannel + * @enum {number} + * @property {number} RELEASE=0 RELEASE value + * @property {number} BETA=1 BETA value + * @property {number} ALPHA=2 ALPHA value + * @property {number} DEBUG=3 DEBUG value + */ + UserAgent.ReleaseChannel = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "RELEASE"] = 0; + values[valuesById[1] = "BETA"] = 1; + values[valuesById[2] = "ALPHA"] = 2; + values[valuesById[3] = "DEBUG"] = 3; + return values; + })(); + + return UserAgent; + })(); + + ClientPayload.WebInfo = (function() { + + /** + * Properties of a WebInfo. + * @memberof proto.ClientPayload + * @interface IWebInfo + * @property {string|null} [refToken] WebInfo refToken + * @property {string|null} [version] WebInfo version + * @property {proto.ClientPayload.WebInfo.IWebdPayload|null} [webdPayload] WebInfo webdPayload + * @property {proto.ClientPayload.WebInfo.WebSubPlatform|null} [webSubPlatform] WebInfo webSubPlatform + */ + + /** + * Constructs a new WebInfo. + * @memberof proto.ClientPayload + * @classdesc Represents a WebInfo. + * @implements IWebInfo + * @constructor + * @param {proto.ClientPayload.IWebInfo=} [properties] Properties to set + */ + function WebInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WebInfo refToken. + * @member {string} refToken + * @memberof proto.ClientPayload.WebInfo + * @instance + */ + WebInfo.prototype.refToken = ""; + + /** + * WebInfo version. + * @member {string} version + * @memberof proto.ClientPayload.WebInfo + * @instance + */ + WebInfo.prototype.version = ""; + + /** + * WebInfo webdPayload. + * @member {proto.ClientPayload.WebInfo.IWebdPayload|null|undefined} webdPayload + * @memberof proto.ClientPayload.WebInfo + * @instance + */ + WebInfo.prototype.webdPayload = null; + + /** + * WebInfo webSubPlatform. + * @member {proto.ClientPayload.WebInfo.WebSubPlatform} webSubPlatform + * @memberof proto.ClientPayload.WebInfo + * @instance + */ + WebInfo.prototype.webSubPlatform = 0; + + /** + * Creates a new WebInfo instance using the specified properties. + * @function create + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {proto.ClientPayload.IWebInfo=} [properties] Properties to set + * @returns {proto.ClientPayload.WebInfo} WebInfo instance + */ + WebInfo.create = function create(properties) { + return new WebInfo(properties); + }; + + /** + * Encodes the specified WebInfo message. Does not implicitly {@link proto.ClientPayload.WebInfo.verify|verify} messages. + * @function encode + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {proto.ClientPayload.IWebInfo} message WebInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.refToken != null && Object.hasOwnProperty.call(message, "refToken")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.refToken); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.version); + if (message.webdPayload != null && Object.hasOwnProperty.call(message, "webdPayload")) + $root.proto.ClientPayload.WebInfo.WebdPayload.encode(message.webdPayload, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.webSubPlatform != null && Object.hasOwnProperty.call(message, "webSubPlatform")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.webSubPlatform); + return writer; + }; + + /** + * Encodes the specified WebInfo message, length delimited. Does not implicitly {@link proto.ClientPayload.WebInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {proto.ClientPayload.IWebInfo} message WebInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WebInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ClientPayload.WebInfo} WebInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ClientPayload.WebInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.refToken = reader.string(); + break; + case 2: + message.version = reader.string(); + break; + case 3: + message.webdPayload = $root.proto.ClientPayload.WebInfo.WebdPayload.decode(reader, reader.uint32()); + break; + case 4: + message.webSubPlatform = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a WebInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ClientPayload.WebInfo} WebInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WebInfo message. + * @function verify + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WebInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.refToken != null && message.hasOwnProperty("refToken")) + if (!$util.isString(message.refToken)) + return "refToken: string expected"; + if (message.version != null && message.hasOwnProperty("version")) + if (!$util.isString(message.version)) + return "version: string expected"; + if (message.webdPayload != null && message.hasOwnProperty("webdPayload")) { + var error = $root.proto.ClientPayload.WebInfo.WebdPayload.verify(message.webdPayload); + if (error) + return "webdPayload." + error; + } + if (message.webSubPlatform != null && message.hasOwnProperty("webSubPlatform")) + switch (message.webSubPlatform) { + default: + return "webSubPlatform: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + break; + } + return null; + }; + + /** + * Creates a WebInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.ClientPayload.WebInfo} WebInfo + */ + WebInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ClientPayload.WebInfo) + return object; + var message = new $root.proto.ClientPayload.WebInfo(); + if (object.refToken != null) + message.refToken = String(object.refToken); + if (object.version != null) + message.version = String(object.version); + if (object.webdPayload != null) { + if (typeof object.webdPayload !== "object") + throw TypeError(".proto.ClientPayload.WebInfo.webdPayload: object expected"); + message.webdPayload = $root.proto.ClientPayload.WebInfo.WebdPayload.fromObject(object.webdPayload); + } + switch (object.webSubPlatform) { + case "WEB_BROWSER": + case 0: + message.webSubPlatform = 0; + break; + case "APP_STORE": + case 1: + message.webSubPlatform = 1; + break; + case "WIN_STORE": + case 2: + message.webSubPlatform = 2; + break; + case "DARWIN": + case 3: + message.webSubPlatform = 3; + break; + case "WIN32": + case 4: + message.webSubPlatform = 4; + break; + } + return message; + }; + + /** + * Creates a plain object from a WebInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ClientPayload.WebInfo + * @static + * @param {proto.ClientPayload.WebInfo} message WebInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WebInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.refToken = ""; + object.version = ""; + object.webdPayload = null; + object.webSubPlatform = options.enums === String ? "WEB_BROWSER" : 0; + } + if (message.refToken != null && message.hasOwnProperty("refToken")) + object.refToken = message.refToken; + if (message.version != null && message.hasOwnProperty("version")) + object.version = message.version; + if (message.webdPayload != null && message.hasOwnProperty("webdPayload")) + object.webdPayload = $root.proto.ClientPayload.WebInfo.WebdPayload.toObject(message.webdPayload, options); + if (message.webSubPlatform != null && message.hasOwnProperty("webSubPlatform")) + object.webSubPlatform = options.enums === String ? $root.proto.ClientPayload.WebInfo.WebSubPlatform[message.webSubPlatform] : message.webSubPlatform; + return object; + }; + + /** + * Converts this WebInfo to JSON. + * @function toJSON + * @memberof proto.ClientPayload.WebInfo + * @instance + * @returns {Object.} JSON object + */ + WebInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * WebSubPlatform enum. + * @name proto.ClientPayload.WebInfo.WebSubPlatform + * @enum {number} + * @property {number} WEB_BROWSER=0 WEB_BROWSER value + * @property {number} APP_STORE=1 APP_STORE value + * @property {number} WIN_STORE=2 WIN_STORE value + * @property {number} DARWIN=3 DARWIN value + * @property {number} WIN32=4 WIN32 value + */ + WebInfo.WebSubPlatform = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "WEB_BROWSER"] = 0; + values[valuesById[1] = "APP_STORE"] = 1; + values[valuesById[2] = "WIN_STORE"] = 2; + values[valuesById[3] = "DARWIN"] = 3; + values[valuesById[4] = "WIN32"] = 4; + return values; + })(); + + WebInfo.WebdPayload = (function() { + + /** + * Properties of a WebdPayload. + * @memberof proto.ClientPayload.WebInfo + * @interface IWebdPayload + * @property {boolean|null} [usesParticipantInKey] WebdPayload usesParticipantInKey + * @property {boolean|null} [supportsStarredMessages] WebdPayload supportsStarredMessages + * @property {boolean|null} [supportsDocumentMessages] WebdPayload supportsDocumentMessages + * @property {boolean|null} [supportsUrlMessages] WebdPayload supportsUrlMessages + * @property {boolean|null} [supportsMediaRetry] WebdPayload supportsMediaRetry + * @property {boolean|null} [supportsE2EImage] WebdPayload supportsE2EImage + * @property {boolean|null} [supportsE2EVideo] WebdPayload supportsE2EVideo + * @property {boolean|null} [supportsE2EAudio] WebdPayload supportsE2EAudio + * @property {boolean|null} [supportsE2EDocument] WebdPayload supportsE2EDocument + * @property {string|null} [documentTypes] WebdPayload documentTypes + * @property {Uint8Array|null} [features] WebdPayload features + */ + + /** + * Constructs a new WebdPayload. + * @memberof proto.ClientPayload.WebInfo + * @classdesc Represents a WebdPayload. + * @implements IWebdPayload + * @constructor + * @param {proto.ClientPayload.WebInfo.IWebdPayload=} [properties] Properties to set + */ + function WebdPayload(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WebdPayload usesParticipantInKey. + * @member {boolean} usesParticipantInKey + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.usesParticipantInKey = false; + + /** + * WebdPayload supportsStarredMessages. + * @member {boolean} supportsStarredMessages + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsStarredMessages = false; + + /** + * WebdPayload supportsDocumentMessages. + * @member {boolean} supportsDocumentMessages + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsDocumentMessages = false; + + /** + * WebdPayload supportsUrlMessages. + * @member {boolean} supportsUrlMessages + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsUrlMessages = false; + + /** + * WebdPayload supportsMediaRetry. + * @member {boolean} supportsMediaRetry + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsMediaRetry = false; + + /** + * WebdPayload supportsE2EImage. + * @member {boolean} supportsE2EImage + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsE2EImage = false; + + /** + * WebdPayload supportsE2EVideo. + * @member {boolean} supportsE2EVideo + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsE2EVideo = false; + + /** + * WebdPayload supportsE2EAudio. + * @member {boolean} supportsE2EAudio + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsE2EAudio = false; + + /** + * WebdPayload supportsE2EDocument. + * @member {boolean} supportsE2EDocument + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.supportsE2EDocument = false; + + /** + * WebdPayload documentTypes. + * @member {string} documentTypes + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.documentTypes = ""; + + /** + * WebdPayload features. + * @member {Uint8Array} features + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + */ + WebdPayload.prototype.features = $util.newBuffer([]); + + /** + * Creates a new WebdPayload instance using the specified properties. + * @function create + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {proto.ClientPayload.WebInfo.IWebdPayload=} [properties] Properties to set + * @returns {proto.ClientPayload.WebInfo.WebdPayload} WebdPayload instance + */ + WebdPayload.create = function create(properties) { + return new WebdPayload(properties); + }; + + /** + * Encodes the specified WebdPayload message. Does not implicitly {@link proto.ClientPayload.WebInfo.WebdPayload.verify|verify} messages. + * @function encode + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {proto.ClientPayload.WebInfo.IWebdPayload} message WebdPayload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebdPayload.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.usesParticipantInKey != null && Object.hasOwnProperty.call(message, "usesParticipantInKey")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.usesParticipantInKey); + if (message.supportsStarredMessages != null && Object.hasOwnProperty.call(message, "supportsStarredMessages")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.supportsStarredMessages); + if (message.supportsDocumentMessages != null && Object.hasOwnProperty.call(message, "supportsDocumentMessages")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.supportsDocumentMessages); + if (message.supportsUrlMessages != null && Object.hasOwnProperty.call(message, "supportsUrlMessages")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.supportsUrlMessages); + if (message.supportsMediaRetry != null && Object.hasOwnProperty.call(message, "supportsMediaRetry")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.supportsMediaRetry); + if (message.supportsE2EImage != null && Object.hasOwnProperty.call(message, "supportsE2EImage")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.supportsE2EImage); + if (message.supportsE2EVideo != null && Object.hasOwnProperty.call(message, "supportsE2EVideo")) + writer.uint32(/* id 7, wireType 0 =*/56).bool(message.supportsE2EVideo); + if (message.supportsE2EAudio != null && Object.hasOwnProperty.call(message, "supportsE2EAudio")) + writer.uint32(/* id 8, wireType 0 =*/64).bool(message.supportsE2EAudio); + if (message.supportsE2EDocument != null && Object.hasOwnProperty.call(message, "supportsE2EDocument")) + writer.uint32(/* id 9, wireType 0 =*/72).bool(message.supportsE2EDocument); + if (message.documentTypes != null && Object.hasOwnProperty.call(message, "documentTypes")) + writer.uint32(/* id 10, wireType 2 =*/82).string(message.documentTypes); + if (message.features != null && Object.hasOwnProperty.call(message, "features")) + writer.uint32(/* id 11, wireType 2 =*/90).bytes(message.features); + return writer; + }; + + /** + * Encodes the specified WebdPayload message, length delimited. Does not implicitly {@link proto.ClientPayload.WebInfo.WebdPayload.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {proto.ClientPayload.WebInfo.IWebdPayload} message WebdPayload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebdPayload.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WebdPayload message from the specified reader or buffer. + * @function decode + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ClientPayload.WebInfo.WebdPayload} WebdPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebdPayload.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ClientPayload.WebInfo.WebdPayload(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.usesParticipantInKey = reader.bool(); + break; + case 2: + message.supportsStarredMessages = reader.bool(); + break; + case 3: + message.supportsDocumentMessages = reader.bool(); + break; + case 4: + message.supportsUrlMessages = reader.bool(); + break; + case 5: + message.supportsMediaRetry = reader.bool(); + break; + case 6: + message.supportsE2EImage = reader.bool(); + break; + case 7: + message.supportsE2EVideo = reader.bool(); + break; + case 8: + message.supportsE2EAudio = reader.bool(); + break; + case 9: + message.supportsE2EDocument = reader.bool(); + break; + case 10: + message.documentTypes = reader.string(); + break; + case 11: + message.features = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a WebdPayload message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ClientPayload.WebInfo.WebdPayload} WebdPayload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebdPayload.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WebdPayload message. + * @function verify + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WebdPayload.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.usesParticipantInKey != null && message.hasOwnProperty("usesParticipantInKey")) + if (typeof message.usesParticipantInKey !== "boolean") + return "usesParticipantInKey: boolean expected"; + if (message.supportsStarredMessages != null && message.hasOwnProperty("supportsStarredMessages")) + if (typeof message.supportsStarredMessages !== "boolean") + return "supportsStarredMessages: boolean expected"; + if (message.supportsDocumentMessages != null && message.hasOwnProperty("supportsDocumentMessages")) + if (typeof message.supportsDocumentMessages !== "boolean") + return "supportsDocumentMessages: boolean expected"; + if (message.supportsUrlMessages != null && message.hasOwnProperty("supportsUrlMessages")) + if (typeof message.supportsUrlMessages !== "boolean") + return "supportsUrlMessages: boolean expected"; + if (message.supportsMediaRetry != null && message.hasOwnProperty("supportsMediaRetry")) + if (typeof message.supportsMediaRetry !== "boolean") + return "supportsMediaRetry: boolean expected"; + if (message.supportsE2EImage != null && message.hasOwnProperty("supportsE2EImage")) + if (typeof message.supportsE2EImage !== "boolean") + return "supportsE2EImage: boolean expected"; + if (message.supportsE2EVideo != null && message.hasOwnProperty("supportsE2EVideo")) + if (typeof message.supportsE2EVideo !== "boolean") + return "supportsE2EVideo: boolean expected"; + if (message.supportsE2EAudio != null && message.hasOwnProperty("supportsE2EAudio")) + if (typeof message.supportsE2EAudio !== "boolean") + return "supportsE2EAudio: boolean expected"; + if (message.supportsE2EDocument != null && message.hasOwnProperty("supportsE2EDocument")) + if (typeof message.supportsE2EDocument !== "boolean") + return "supportsE2EDocument: boolean expected"; + if (message.documentTypes != null && message.hasOwnProperty("documentTypes")) + if (!$util.isString(message.documentTypes)) + return "documentTypes: string expected"; + if (message.features != null && message.hasOwnProperty("features")) + if (!(message.features && typeof message.features.length === "number" || $util.isString(message.features))) + return "features: buffer expected"; + return null; + }; + + /** + * Creates a WebdPayload message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {Object.} object Plain object + * @returns {proto.ClientPayload.WebInfo.WebdPayload} WebdPayload + */ + WebdPayload.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ClientPayload.WebInfo.WebdPayload) + return object; + var message = new $root.proto.ClientPayload.WebInfo.WebdPayload(); + if (object.usesParticipantInKey != null) + message.usesParticipantInKey = Boolean(object.usesParticipantInKey); + if (object.supportsStarredMessages != null) + message.supportsStarredMessages = Boolean(object.supportsStarredMessages); + if (object.supportsDocumentMessages != null) + message.supportsDocumentMessages = Boolean(object.supportsDocumentMessages); + if (object.supportsUrlMessages != null) + message.supportsUrlMessages = Boolean(object.supportsUrlMessages); + if (object.supportsMediaRetry != null) + message.supportsMediaRetry = Boolean(object.supportsMediaRetry); + if (object.supportsE2EImage != null) + message.supportsE2EImage = Boolean(object.supportsE2EImage); + if (object.supportsE2EVideo != null) + message.supportsE2EVideo = Boolean(object.supportsE2EVideo); + if (object.supportsE2EAudio != null) + message.supportsE2EAudio = Boolean(object.supportsE2EAudio); + if (object.supportsE2EDocument != null) + message.supportsE2EDocument = Boolean(object.supportsE2EDocument); + if (object.documentTypes != null) + message.documentTypes = String(object.documentTypes); + if (object.features != null) + if (typeof object.features === "string") + $util.base64.decode(object.features, message.features = $util.newBuffer($util.base64.length(object.features)), 0); + else if (object.features.length) + message.features = object.features; + return message; + }; + + /** + * Creates a plain object from a WebdPayload message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @static + * @param {proto.ClientPayload.WebInfo.WebdPayload} message WebdPayload + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WebdPayload.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.usesParticipantInKey = false; + object.supportsStarredMessages = false; + object.supportsDocumentMessages = false; + object.supportsUrlMessages = false; + object.supportsMediaRetry = false; + object.supportsE2EImage = false; + object.supportsE2EVideo = false; + object.supportsE2EAudio = false; + object.supportsE2EDocument = false; + object.documentTypes = ""; + if (options.bytes === String) + object.features = ""; + else { + object.features = []; + if (options.bytes !== Array) + object.features = $util.newBuffer(object.features); + } + } + if (message.usesParticipantInKey != null && message.hasOwnProperty("usesParticipantInKey")) + object.usesParticipantInKey = message.usesParticipantInKey; + if (message.supportsStarredMessages != null && message.hasOwnProperty("supportsStarredMessages")) + object.supportsStarredMessages = message.supportsStarredMessages; + if (message.supportsDocumentMessages != null && message.hasOwnProperty("supportsDocumentMessages")) + object.supportsDocumentMessages = message.supportsDocumentMessages; + if (message.supportsUrlMessages != null && message.hasOwnProperty("supportsUrlMessages")) + object.supportsUrlMessages = message.supportsUrlMessages; + if (message.supportsMediaRetry != null && message.hasOwnProperty("supportsMediaRetry")) + object.supportsMediaRetry = message.supportsMediaRetry; + if (message.supportsE2EImage != null && message.hasOwnProperty("supportsE2EImage")) + object.supportsE2EImage = message.supportsE2EImage; + if (message.supportsE2EVideo != null && message.hasOwnProperty("supportsE2EVideo")) + object.supportsE2EVideo = message.supportsE2EVideo; + if (message.supportsE2EAudio != null && message.hasOwnProperty("supportsE2EAudio")) + object.supportsE2EAudio = message.supportsE2EAudio; + if (message.supportsE2EDocument != null && message.hasOwnProperty("supportsE2EDocument")) + object.supportsE2EDocument = message.supportsE2EDocument; + if (message.documentTypes != null && message.hasOwnProperty("documentTypes")) + object.documentTypes = message.documentTypes; + if (message.features != null && message.hasOwnProperty("features")) + object.features = options.bytes === String ? $util.base64.encode(message.features, 0, message.features.length) : options.bytes === Array ? Array.prototype.slice.call(message.features) : message.features; + return object; + }; + + /** + * Converts this WebdPayload to JSON. + * @function toJSON + * @memberof proto.ClientPayload.WebInfo.WebdPayload + * @instance + * @returns {Object.} JSON object + */ + WebdPayload.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return WebdPayload; + })(); + + return WebInfo; + })(); + + return ClientPayload; + })(); + + proto.ContextInfo = (function() { + + /** + * Properties of a ContextInfo. + * @memberof proto + * @interface IContextInfo + * @property {string|null} [stanzaId] ContextInfo stanzaId + * @property {string|null} [participant] ContextInfo participant + * @property {proto.IMessage|null} [quotedMessage] ContextInfo quotedMessage + * @property {string|null} [remoteJid] ContextInfo remoteJid + * @property {Array.|null} [mentionedJid] ContextInfo mentionedJid + * @property {string|null} [conversionSource] ContextInfo conversionSource + * @property {Uint8Array|null} [conversionData] ContextInfo conversionData + * @property {number|null} [conversionDelaySeconds] ContextInfo conversionDelaySeconds + * @property {number|null} [forwardingScore] ContextInfo forwardingScore + * @property {boolean|null} [isForwarded] ContextInfo isForwarded + * @property {proto.ContextInfo.IAdReplyInfo|null} [quotedAd] ContextInfo quotedAd + * @property {proto.IMessageKey|null} [placeholderKey] ContextInfo placeholderKey + * @property {number|null} [expiration] ContextInfo expiration + * @property {number|Long|null} [ephemeralSettingTimestamp] ContextInfo ephemeralSettingTimestamp + * @property {Uint8Array|null} [ephemeralSharedSecret] ContextInfo ephemeralSharedSecret + * @property {proto.ContextInfo.IExternalAdReplyInfo|null} [externalAdReply] ContextInfo externalAdReply + * @property {string|null} [entryPointConversionSource] ContextInfo entryPointConversionSource + * @property {string|null} [entryPointConversionApp] ContextInfo entryPointConversionApp + * @property {number|null} [entryPointConversionDelaySeconds] ContextInfo entryPointConversionDelaySeconds + * @property {proto.IDisappearingMode|null} [disappearingMode] ContextInfo disappearingMode + * @property {proto.IActionLink|null} [actionLink] ContextInfo actionLink + * @property {string|null} [groupSubject] ContextInfo groupSubject + * @property {string|null} [parentGroupJid] ContextInfo parentGroupJid + * @property {string|null} [trustBannerType] ContextInfo trustBannerType + * @property {number|null} [trustBannerAction] ContextInfo trustBannerAction + */ + + /** + * Constructs a new ContextInfo. + * @memberof proto + * @classdesc Represents a ContextInfo. + * @implements IContextInfo + * @constructor + * @param {proto.IContextInfo=} [properties] Properties to set + */ + function ContextInfo(properties) { + this.mentionedJid = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ContextInfo stanzaId. + * @member {string} stanzaId + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.stanzaId = ""; + + /** + * ContextInfo participant. + * @member {string} participant + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.participant = ""; + + /** + * ContextInfo quotedMessage. + * @member {proto.IMessage|null|undefined} quotedMessage + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.quotedMessage = null; + + /** + * ContextInfo remoteJid. + * @member {string} remoteJid + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.remoteJid = ""; + + /** + * ContextInfo mentionedJid. + * @member {Array.} mentionedJid + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.mentionedJid = $util.emptyArray; + + /** + * ContextInfo conversionSource. + * @member {string} conversionSource + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.conversionSource = ""; + + /** + * ContextInfo conversionData. + * @member {Uint8Array} conversionData + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.conversionData = $util.newBuffer([]); + + /** + * ContextInfo conversionDelaySeconds. + * @member {number} conversionDelaySeconds + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.conversionDelaySeconds = 0; + + /** + * ContextInfo forwardingScore. + * @member {number} forwardingScore + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.forwardingScore = 0; + + /** + * ContextInfo isForwarded. + * @member {boolean} isForwarded + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.isForwarded = false; + + /** + * ContextInfo quotedAd. + * @member {proto.ContextInfo.IAdReplyInfo|null|undefined} quotedAd + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.quotedAd = null; + + /** + * ContextInfo placeholderKey. + * @member {proto.IMessageKey|null|undefined} placeholderKey + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.placeholderKey = null; + + /** + * ContextInfo expiration. + * @member {number} expiration + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.expiration = 0; + + /** + * ContextInfo ephemeralSettingTimestamp. + * @member {number|Long} ephemeralSettingTimestamp + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.ephemeralSettingTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * ContextInfo ephemeralSharedSecret. + * @member {Uint8Array} ephemeralSharedSecret + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.ephemeralSharedSecret = $util.newBuffer([]); + + /** + * ContextInfo externalAdReply. + * @member {proto.ContextInfo.IExternalAdReplyInfo|null|undefined} externalAdReply + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.externalAdReply = null; + + /** + * ContextInfo entryPointConversionSource. + * @member {string} entryPointConversionSource + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.entryPointConversionSource = ""; + + /** + * ContextInfo entryPointConversionApp. + * @member {string} entryPointConversionApp + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.entryPointConversionApp = ""; + + /** + * ContextInfo entryPointConversionDelaySeconds. + * @member {number} entryPointConversionDelaySeconds + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.entryPointConversionDelaySeconds = 0; + + /** + * ContextInfo disappearingMode. + * @member {proto.IDisappearingMode|null|undefined} disappearingMode + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.disappearingMode = null; + + /** + * ContextInfo actionLink. + * @member {proto.IActionLink|null|undefined} actionLink + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.actionLink = null; + + /** + * ContextInfo groupSubject. + * @member {string} groupSubject + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.groupSubject = ""; + + /** + * ContextInfo parentGroupJid. + * @member {string} parentGroupJid + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.parentGroupJid = ""; + + /** + * ContextInfo trustBannerType. + * @member {string} trustBannerType + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.trustBannerType = ""; + + /** + * ContextInfo trustBannerAction. + * @member {number} trustBannerAction + * @memberof proto.ContextInfo + * @instance + */ + ContextInfo.prototype.trustBannerAction = 0; + + /** + * Creates a new ContextInfo instance using the specified properties. + * @function create + * @memberof proto.ContextInfo + * @static + * @param {proto.IContextInfo=} [properties] Properties to set + * @returns {proto.ContextInfo} ContextInfo instance + */ + ContextInfo.create = function create(properties) { + return new ContextInfo(properties); + }; + + /** + * Encodes the specified ContextInfo message. Does not implicitly {@link proto.ContextInfo.verify|verify} messages. + * @function encode + * @memberof proto.ContextInfo + * @static + * @param {proto.IContextInfo} message ContextInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContextInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.stanzaId != null && Object.hasOwnProperty.call(message, "stanzaId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.stanzaId); + if (message.participant != null && Object.hasOwnProperty.call(message, "participant")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.participant); + if (message.quotedMessage != null && Object.hasOwnProperty.call(message, "quotedMessage")) + $root.proto.Message.encode(message.quotedMessage, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.remoteJid != null && Object.hasOwnProperty.call(message, "remoteJid")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.remoteJid); + if (message.mentionedJid != null && message.mentionedJid.length) + for (var i = 0; i < message.mentionedJid.length; ++i) + writer.uint32(/* id 15, wireType 2 =*/122).string(message.mentionedJid[i]); + if (message.conversionSource != null && Object.hasOwnProperty.call(message, "conversionSource")) + writer.uint32(/* id 18, wireType 2 =*/146).string(message.conversionSource); + if (message.conversionData != null && Object.hasOwnProperty.call(message, "conversionData")) + writer.uint32(/* id 19, wireType 2 =*/154).bytes(message.conversionData); + if (message.conversionDelaySeconds != null && Object.hasOwnProperty.call(message, "conversionDelaySeconds")) + writer.uint32(/* id 20, wireType 0 =*/160).uint32(message.conversionDelaySeconds); + if (message.forwardingScore != null && Object.hasOwnProperty.call(message, "forwardingScore")) + writer.uint32(/* id 21, wireType 0 =*/168).uint32(message.forwardingScore); + if (message.isForwarded != null && Object.hasOwnProperty.call(message, "isForwarded")) + writer.uint32(/* id 22, wireType 0 =*/176).bool(message.isForwarded); + if (message.quotedAd != null && Object.hasOwnProperty.call(message, "quotedAd")) + $root.proto.ContextInfo.AdReplyInfo.encode(message.quotedAd, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim(); + if (message.placeholderKey != null && Object.hasOwnProperty.call(message, "placeholderKey")) + $root.proto.MessageKey.encode(message.placeholderKey, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); + if (message.expiration != null && Object.hasOwnProperty.call(message, "expiration")) + writer.uint32(/* id 25, wireType 0 =*/200).uint32(message.expiration); + if (message.ephemeralSettingTimestamp != null && Object.hasOwnProperty.call(message, "ephemeralSettingTimestamp")) + writer.uint32(/* id 26, wireType 0 =*/208).int64(message.ephemeralSettingTimestamp); + if (message.ephemeralSharedSecret != null && Object.hasOwnProperty.call(message, "ephemeralSharedSecret")) + writer.uint32(/* id 27, wireType 2 =*/218).bytes(message.ephemeralSharedSecret); + if (message.externalAdReply != null && Object.hasOwnProperty.call(message, "externalAdReply")) + $root.proto.ContextInfo.ExternalAdReplyInfo.encode(message.externalAdReply, writer.uint32(/* id 28, wireType 2 =*/226).fork()).ldelim(); + if (message.entryPointConversionSource != null && Object.hasOwnProperty.call(message, "entryPointConversionSource")) + writer.uint32(/* id 29, wireType 2 =*/234).string(message.entryPointConversionSource); + if (message.entryPointConversionApp != null && Object.hasOwnProperty.call(message, "entryPointConversionApp")) + writer.uint32(/* id 30, wireType 2 =*/242).string(message.entryPointConversionApp); + if (message.entryPointConversionDelaySeconds != null && Object.hasOwnProperty.call(message, "entryPointConversionDelaySeconds")) + writer.uint32(/* id 31, wireType 0 =*/248).uint32(message.entryPointConversionDelaySeconds); + if (message.disappearingMode != null && Object.hasOwnProperty.call(message, "disappearingMode")) + $root.proto.DisappearingMode.encode(message.disappearingMode, writer.uint32(/* id 32, wireType 2 =*/258).fork()).ldelim(); + if (message.actionLink != null && Object.hasOwnProperty.call(message, "actionLink")) + $root.proto.ActionLink.encode(message.actionLink, writer.uint32(/* id 33, wireType 2 =*/266).fork()).ldelim(); + if (message.groupSubject != null && Object.hasOwnProperty.call(message, "groupSubject")) + writer.uint32(/* id 34, wireType 2 =*/274).string(message.groupSubject); + if (message.parentGroupJid != null && Object.hasOwnProperty.call(message, "parentGroupJid")) + writer.uint32(/* id 35, wireType 2 =*/282).string(message.parentGroupJid); + if (message.trustBannerType != null && Object.hasOwnProperty.call(message, "trustBannerType")) + writer.uint32(/* id 37, wireType 2 =*/298).string(message.trustBannerType); + if (message.trustBannerAction != null && Object.hasOwnProperty.call(message, "trustBannerAction")) + writer.uint32(/* id 38, wireType 0 =*/304).uint32(message.trustBannerAction); + return writer; + }; + + /** + * Encodes the specified ContextInfo message, length delimited. Does not implicitly {@link proto.ContextInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ContextInfo + * @static + * @param {proto.IContextInfo} message ContextInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContextInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContextInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.ContextInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ContextInfo} ContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContextInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ContextInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.stanzaId = reader.string(); + break; + case 2: + message.participant = reader.string(); + break; + case 3: + message.quotedMessage = $root.proto.Message.decode(reader, reader.uint32()); + break; + case 4: + message.remoteJid = reader.string(); + break; + case 15: + if (!(message.mentionedJid && message.mentionedJid.length)) + message.mentionedJid = []; + message.mentionedJid.push(reader.string()); + break; + case 18: + message.conversionSource = reader.string(); + break; + case 19: + message.conversionData = reader.bytes(); + break; + case 20: + message.conversionDelaySeconds = reader.uint32(); + break; + case 21: + message.forwardingScore = reader.uint32(); + break; + case 22: + message.isForwarded = reader.bool(); + break; + case 23: + message.quotedAd = $root.proto.ContextInfo.AdReplyInfo.decode(reader, reader.uint32()); + break; + case 24: + message.placeholderKey = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 25: + message.expiration = reader.uint32(); + break; + case 26: + message.ephemeralSettingTimestamp = reader.int64(); + break; + case 27: + message.ephemeralSharedSecret = reader.bytes(); + break; + case 28: + message.externalAdReply = $root.proto.ContextInfo.ExternalAdReplyInfo.decode(reader, reader.uint32()); + break; + case 29: + message.entryPointConversionSource = reader.string(); + break; + case 30: + message.entryPointConversionApp = reader.string(); + break; + case 31: + message.entryPointConversionDelaySeconds = reader.uint32(); + break; + case 32: + message.disappearingMode = $root.proto.DisappearingMode.decode(reader, reader.uint32()); + break; + case 33: + message.actionLink = $root.proto.ActionLink.decode(reader, reader.uint32()); + break; + case 34: + message.groupSubject = reader.string(); + break; + case 35: + message.parentGroupJid = reader.string(); + break; + case 37: + message.trustBannerType = reader.string(); + break; + case 38: + message.trustBannerAction = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContextInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ContextInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ContextInfo} ContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContextInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContextInfo message. + * @function verify + * @memberof proto.ContextInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContextInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + if (!$util.isString(message.stanzaId)) + return "stanzaId: string expected"; + if (message.participant != null && message.hasOwnProperty("participant")) + if (!$util.isString(message.participant)) + return "participant: string expected"; + if (message.quotedMessage != null && message.hasOwnProperty("quotedMessage")) { + var error = $root.proto.Message.verify(message.quotedMessage); + if (error) + return "quotedMessage." + error; + } + if (message.remoteJid != null && message.hasOwnProperty("remoteJid")) + if (!$util.isString(message.remoteJid)) + return "remoteJid: string expected"; + if (message.mentionedJid != null && message.hasOwnProperty("mentionedJid")) { + if (!Array.isArray(message.mentionedJid)) + return "mentionedJid: array expected"; + for (var i = 0; i < message.mentionedJid.length; ++i) + if (!$util.isString(message.mentionedJid[i])) + return "mentionedJid: string[] expected"; + } + if (message.conversionSource != null && message.hasOwnProperty("conversionSource")) + if (!$util.isString(message.conversionSource)) + return "conversionSource: string expected"; + if (message.conversionData != null && message.hasOwnProperty("conversionData")) + if (!(message.conversionData && typeof message.conversionData.length === "number" || $util.isString(message.conversionData))) + return "conversionData: buffer expected"; + if (message.conversionDelaySeconds != null && message.hasOwnProperty("conversionDelaySeconds")) + if (!$util.isInteger(message.conversionDelaySeconds)) + return "conversionDelaySeconds: integer expected"; + if (message.forwardingScore != null && message.hasOwnProperty("forwardingScore")) + if (!$util.isInteger(message.forwardingScore)) + return "forwardingScore: integer expected"; + if (message.isForwarded != null && message.hasOwnProperty("isForwarded")) + if (typeof message.isForwarded !== "boolean") + return "isForwarded: boolean expected"; + if (message.quotedAd != null && message.hasOwnProperty("quotedAd")) { + var error = $root.proto.ContextInfo.AdReplyInfo.verify(message.quotedAd); + if (error) + return "quotedAd." + error; + } + if (message.placeholderKey != null && message.hasOwnProperty("placeholderKey")) { + var error = $root.proto.MessageKey.verify(message.placeholderKey); + if (error) + return "placeholderKey." + error; + } + if (message.expiration != null && message.hasOwnProperty("expiration")) + if (!$util.isInteger(message.expiration)) + return "expiration: integer expected"; + if (message.ephemeralSettingTimestamp != null && message.hasOwnProperty("ephemeralSettingTimestamp")) + if (!$util.isInteger(message.ephemeralSettingTimestamp) && !(message.ephemeralSettingTimestamp && $util.isInteger(message.ephemeralSettingTimestamp.low) && $util.isInteger(message.ephemeralSettingTimestamp.high))) + return "ephemeralSettingTimestamp: integer|Long expected"; + if (message.ephemeralSharedSecret != null && message.hasOwnProperty("ephemeralSharedSecret")) + if (!(message.ephemeralSharedSecret && typeof message.ephemeralSharedSecret.length === "number" || $util.isString(message.ephemeralSharedSecret))) + return "ephemeralSharedSecret: buffer expected"; + if (message.externalAdReply != null && message.hasOwnProperty("externalAdReply")) { + var error = $root.proto.ContextInfo.ExternalAdReplyInfo.verify(message.externalAdReply); + if (error) + return "externalAdReply." + error; + } + if (message.entryPointConversionSource != null && message.hasOwnProperty("entryPointConversionSource")) + if (!$util.isString(message.entryPointConversionSource)) + return "entryPointConversionSource: string expected"; + if (message.entryPointConversionApp != null && message.hasOwnProperty("entryPointConversionApp")) + if (!$util.isString(message.entryPointConversionApp)) + return "entryPointConversionApp: string expected"; + if (message.entryPointConversionDelaySeconds != null && message.hasOwnProperty("entryPointConversionDelaySeconds")) + if (!$util.isInteger(message.entryPointConversionDelaySeconds)) + return "entryPointConversionDelaySeconds: integer expected"; + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) { + var error = $root.proto.DisappearingMode.verify(message.disappearingMode); + if (error) + return "disappearingMode." + error; + } + if (message.actionLink != null && message.hasOwnProperty("actionLink")) { + var error = $root.proto.ActionLink.verify(message.actionLink); + if (error) + return "actionLink." + error; + } + if (message.groupSubject != null && message.hasOwnProperty("groupSubject")) + if (!$util.isString(message.groupSubject)) + return "groupSubject: string expected"; + if (message.parentGroupJid != null && message.hasOwnProperty("parentGroupJid")) + if (!$util.isString(message.parentGroupJid)) + return "parentGroupJid: string expected"; + if (message.trustBannerType != null && message.hasOwnProperty("trustBannerType")) + if (!$util.isString(message.trustBannerType)) + return "trustBannerType: string expected"; + if (message.trustBannerAction != null && message.hasOwnProperty("trustBannerAction")) + if (!$util.isInteger(message.trustBannerAction)) + return "trustBannerAction: integer expected"; + return null; + }; + + /** + * Creates a ContextInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ContextInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.ContextInfo} ContextInfo + */ + ContextInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ContextInfo) + return object; + var message = new $root.proto.ContextInfo(); + if (object.stanzaId != null) + message.stanzaId = String(object.stanzaId); + if (object.participant != null) + message.participant = String(object.participant); + if (object.quotedMessage != null) { + if (typeof object.quotedMessage !== "object") + throw TypeError(".proto.ContextInfo.quotedMessage: object expected"); + message.quotedMessage = $root.proto.Message.fromObject(object.quotedMessage); + } + if (object.remoteJid != null) + message.remoteJid = String(object.remoteJid); + if (object.mentionedJid) { + if (!Array.isArray(object.mentionedJid)) + throw TypeError(".proto.ContextInfo.mentionedJid: array expected"); + message.mentionedJid = []; + for (var i = 0; i < object.mentionedJid.length; ++i) + message.mentionedJid[i] = String(object.mentionedJid[i]); + } + if (object.conversionSource != null) + message.conversionSource = String(object.conversionSource); + if (object.conversionData != null) + if (typeof object.conversionData === "string") + $util.base64.decode(object.conversionData, message.conversionData = $util.newBuffer($util.base64.length(object.conversionData)), 0); + else if (object.conversionData.length) + message.conversionData = object.conversionData; + if (object.conversionDelaySeconds != null) + message.conversionDelaySeconds = object.conversionDelaySeconds >>> 0; + if (object.forwardingScore != null) + message.forwardingScore = object.forwardingScore >>> 0; + if (object.isForwarded != null) + message.isForwarded = Boolean(object.isForwarded); + if (object.quotedAd != null) { + if (typeof object.quotedAd !== "object") + throw TypeError(".proto.ContextInfo.quotedAd: object expected"); + message.quotedAd = $root.proto.ContextInfo.AdReplyInfo.fromObject(object.quotedAd); + } + if (object.placeholderKey != null) { + if (typeof object.placeholderKey !== "object") + throw TypeError(".proto.ContextInfo.placeholderKey: object expected"); + message.placeholderKey = $root.proto.MessageKey.fromObject(object.placeholderKey); + } + if (object.expiration != null) + message.expiration = object.expiration >>> 0; + if (object.ephemeralSettingTimestamp != null) + if ($util.Long) + (message.ephemeralSettingTimestamp = $util.Long.fromValue(object.ephemeralSettingTimestamp)).unsigned = false; + else if (typeof object.ephemeralSettingTimestamp === "string") + message.ephemeralSettingTimestamp = parseInt(object.ephemeralSettingTimestamp, 10); + else if (typeof object.ephemeralSettingTimestamp === "number") + message.ephemeralSettingTimestamp = object.ephemeralSettingTimestamp; + else if (typeof object.ephemeralSettingTimestamp === "object") + message.ephemeralSettingTimestamp = new $util.LongBits(object.ephemeralSettingTimestamp.low >>> 0, object.ephemeralSettingTimestamp.high >>> 0).toNumber(); + if (object.ephemeralSharedSecret != null) + if (typeof object.ephemeralSharedSecret === "string") + $util.base64.decode(object.ephemeralSharedSecret, message.ephemeralSharedSecret = $util.newBuffer($util.base64.length(object.ephemeralSharedSecret)), 0); + else if (object.ephemeralSharedSecret.length) + message.ephemeralSharedSecret = object.ephemeralSharedSecret; + if (object.externalAdReply != null) { + if (typeof object.externalAdReply !== "object") + throw TypeError(".proto.ContextInfo.externalAdReply: object expected"); + message.externalAdReply = $root.proto.ContextInfo.ExternalAdReplyInfo.fromObject(object.externalAdReply); + } + if (object.entryPointConversionSource != null) + message.entryPointConversionSource = String(object.entryPointConversionSource); + if (object.entryPointConversionApp != null) + message.entryPointConversionApp = String(object.entryPointConversionApp); + if (object.entryPointConversionDelaySeconds != null) + message.entryPointConversionDelaySeconds = object.entryPointConversionDelaySeconds >>> 0; + if (object.disappearingMode != null) { + if (typeof object.disappearingMode !== "object") + throw TypeError(".proto.ContextInfo.disappearingMode: object expected"); + message.disappearingMode = $root.proto.DisappearingMode.fromObject(object.disappearingMode); + } + if (object.actionLink != null) { + if (typeof object.actionLink !== "object") + throw TypeError(".proto.ContextInfo.actionLink: object expected"); + message.actionLink = $root.proto.ActionLink.fromObject(object.actionLink); + } + if (object.groupSubject != null) + message.groupSubject = String(object.groupSubject); + if (object.parentGroupJid != null) + message.parentGroupJid = String(object.parentGroupJid); + if (object.trustBannerType != null) + message.trustBannerType = String(object.trustBannerType); + if (object.trustBannerAction != null) + message.trustBannerAction = object.trustBannerAction >>> 0; + return message; + }; + + /** + * Creates a plain object from a ContextInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ContextInfo + * @static + * @param {proto.ContextInfo} message ContextInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ContextInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.mentionedJid = []; + if (options.defaults) { + object.stanzaId = ""; + object.participant = ""; + object.quotedMessage = null; + object.remoteJid = ""; + object.conversionSource = ""; + if (options.bytes === String) + object.conversionData = ""; + else { + object.conversionData = []; + if (options.bytes !== Array) + object.conversionData = $util.newBuffer(object.conversionData); + } + object.conversionDelaySeconds = 0; + object.forwardingScore = 0; + object.isForwarded = false; + object.quotedAd = null; + object.placeholderKey = null; + object.expiration = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.ephemeralSettingTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.ephemeralSettingTimestamp = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.ephemeralSharedSecret = ""; + else { + object.ephemeralSharedSecret = []; + if (options.bytes !== Array) + object.ephemeralSharedSecret = $util.newBuffer(object.ephemeralSharedSecret); + } + object.externalAdReply = null; + object.entryPointConversionSource = ""; + object.entryPointConversionApp = ""; + object.entryPointConversionDelaySeconds = 0; + object.disappearingMode = null; + object.actionLink = null; + object.groupSubject = ""; + object.parentGroupJid = ""; + object.trustBannerType = ""; + object.trustBannerAction = 0; + } + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + object.stanzaId = message.stanzaId; + if (message.participant != null && message.hasOwnProperty("participant")) + object.participant = message.participant; + if (message.quotedMessage != null && message.hasOwnProperty("quotedMessage")) + object.quotedMessage = $root.proto.Message.toObject(message.quotedMessage, options); + if (message.remoteJid != null && message.hasOwnProperty("remoteJid")) + object.remoteJid = message.remoteJid; + if (message.mentionedJid && message.mentionedJid.length) { + object.mentionedJid = []; + for (var j = 0; j < message.mentionedJid.length; ++j) + object.mentionedJid[j] = message.mentionedJid[j]; + } + if (message.conversionSource != null && message.hasOwnProperty("conversionSource")) + object.conversionSource = message.conversionSource; + if (message.conversionData != null && message.hasOwnProperty("conversionData")) + object.conversionData = options.bytes === String ? $util.base64.encode(message.conversionData, 0, message.conversionData.length) : options.bytes === Array ? Array.prototype.slice.call(message.conversionData) : message.conversionData; + if (message.conversionDelaySeconds != null && message.hasOwnProperty("conversionDelaySeconds")) + object.conversionDelaySeconds = message.conversionDelaySeconds; + if (message.forwardingScore != null && message.hasOwnProperty("forwardingScore")) + object.forwardingScore = message.forwardingScore; + if (message.isForwarded != null && message.hasOwnProperty("isForwarded")) + object.isForwarded = message.isForwarded; + if (message.quotedAd != null && message.hasOwnProperty("quotedAd")) + object.quotedAd = $root.proto.ContextInfo.AdReplyInfo.toObject(message.quotedAd, options); + if (message.placeholderKey != null && message.hasOwnProperty("placeholderKey")) + object.placeholderKey = $root.proto.MessageKey.toObject(message.placeholderKey, options); + if (message.expiration != null && message.hasOwnProperty("expiration")) + object.expiration = message.expiration; + if (message.ephemeralSettingTimestamp != null && message.hasOwnProperty("ephemeralSettingTimestamp")) + if (typeof message.ephemeralSettingTimestamp === "number") + object.ephemeralSettingTimestamp = options.longs === String ? String(message.ephemeralSettingTimestamp) : message.ephemeralSettingTimestamp; + else + object.ephemeralSettingTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.ephemeralSettingTimestamp) : options.longs === Number ? new $util.LongBits(message.ephemeralSettingTimestamp.low >>> 0, message.ephemeralSettingTimestamp.high >>> 0).toNumber() : message.ephemeralSettingTimestamp; + if (message.ephemeralSharedSecret != null && message.hasOwnProperty("ephemeralSharedSecret")) + object.ephemeralSharedSecret = options.bytes === String ? $util.base64.encode(message.ephemeralSharedSecret, 0, message.ephemeralSharedSecret.length) : options.bytes === Array ? Array.prototype.slice.call(message.ephemeralSharedSecret) : message.ephemeralSharedSecret; + if (message.externalAdReply != null && message.hasOwnProperty("externalAdReply")) + object.externalAdReply = $root.proto.ContextInfo.ExternalAdReplyInfo.toObject(message.externalAdReply, options); + if (message.entryPointConversionSource != null && message.hasOwnProperty("entryPointConversionSource")) + object.entryPointConversionSource = message.entryPointConversionSource; + if (message.entryPointConversionApp != null && message.hasOwnProperty("entryPointConversionApp")) + object.entryPointConversionApp = message.entryPointConversionApp; + if (message.entryPointConversionDelaySeconds != null && message.hasOwnProperty("entryPointConversionDelaySeconds")) + object.entryPointConversionDelaySeconds = message.entryPointConversionDelaySeconds; + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) + object.disappearingMode = $root.proto.DisappearingMode.toObject(message.disappearingMode, options); + if (message.actionLink != null && message.hasOwnProperty("actionLink")) + object.actionLink = $root.proto.ActionLink.toObject(message.actionLink, options); + if (message.groupSubject != null && message.hasOwnProperty("groupSubject")) + object.groupSubject = message.groupSubject; + if (message.parentGroupJid != null && message.hasOwnProperty("parentGroupJid")) + object.parentGroupJid = message.parentGroupJid; + if (message.trustBannerType != null && message.hasOwnProperty("trustBannerType")) + object.trustBannerType = message.trustBannerType; + if (message.trustBannerAction != null && message.hasOwnProperty("trustBannerAction")) + object.trustBannerAction = message.trustBannerAction; + return object; + }; + + /** + * Converts this ContextInfo to JSON. + * @function toJSON + * @memberof proto.ContextInfo + * @instance + * @returns {Object.} JSON object + */ + ContextInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + ContextInfo.AdReplyInfo = (function() { + + /** + * Properties of an AdReplyInfo. + * @memberof proto.ContextInfo + * @interface IAdReplyInfo + * @property {string|null} [advertiserName] AdReplyInfo advertiserName + * @property {proto.ContextInfo.AdReplyInfo.MediaType|null} [mediaType] AdReplyInfo mediaType + * @property {Uint8Array|null} [jpegThumbnail] AdReplyInfo jpegThumbnail + * @property {string|null} [caption] AdReplyInfo caption + */ + + /** + * Constructs a new AdReplyInfo. + * @memberof proto.ContextInfo + * @classdesc Represents an AdReplyInfo. + * @implements IAdReplyInfo + * @constructor + * @param {proto.ContextInfo.IAdReplyInfo=} [properties] Properties to set + */ + function AdReplyInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AdReplyInfo advertiserName. + * @member {string} advertiserName + * @memberof proto.ContextInfo.AdReplyInfo + * @instance + */ + AdReplyInfo.prototype.advertiserName = ""; + + /** + * AdReplyInfo mediaType. + * @member {proto.ContextInfo.AdReplyInfo.MediaType} mediaType + * @memberof proto.ContextInfo.AdReplyInfo + * @instance + */ + AdReplyInfo.prototype.mediaType = 0; + + /** + * AdReplyInfo jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.ContextInfo.AdReplyInfo + * @instance + */ + AdReplyInfo.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * AdReplyInfo caption. + * @member {string} caption + * @memberof proto.ContextInfo.AdReplyInfo + * @instance + */ + AdReplyInfo.prototype.caption = ""; + + /** + * Creates a new AdReplyInfo instance using the specified properties. + * @function create + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {proto.ContextInfo.IAdReplyInfo=} [properties] Properties to set + * @returns {proto.ContextInfo.AdReplyInfo} AdReplyInfo instance + */ + AdReplyInfo.create = function create(properties) { + return new AdReplyInfo(properties); + }; + + /** + * Encodes the specified AdReplyInfo message. Does not implicitly {@link proto.ContextInfo.AdReplyInfo.verify|verify} messages. + * @function encode + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {proto.ContextInfo.IAdReplyInfo} message AdReplyInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AdReplyInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.advertiserName != null && Object.hasOwnProperty.call(message, "advertiserName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.advertiserName); + if (message.mediaType != null && Object.hasOwnProperty.call(message, "mediaType")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.mediaType); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.jpegThumbnail); + if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) + writer.uint32(/* id 17, wireType 2 =*/138).string(message.caption); + return writer; + }; + + /** + * Encodes the specified AdReplyInfo message, length delimited. Does not implicitly {@link proto.ContextInfo.AdReplyInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {proto.ContextInfo.IAdReplyInfo} message AdReplyInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AdReplyInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AdReplyInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ContextInfo.AdReplyInfo} AdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AdReplyInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ContextInfo.AdReplyInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.advertiserName = reader.string(); + break; + case 2: + message.mediaType = reader.int32(); + break; + case 16: + message.jpegThumbnail = reader.bytes(); + break; + case 17: + message.caption = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AdReplyInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ContextInfo.AdReplyInfo} AdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AdReplyInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AdReplyInfo message. + * @function verify + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AdReplyInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.advertiserName != null && message.hasOwnProperty("advertiserName")) + if (!$util.isString(message.advertiserName)) + return "advertiserName: string expected"; + if (message.mediaType != null && message.hasOwnProperty("mediaType")) + switch (message.mediaType) { + default: + return "mediaType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.caption != null && message.hasOwnProperty("caption")) + if (!$util.isString(message.caption)) + return "caption: string expected"; + return null; + }; + + /** + * Creates an AdReplyInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.ContextInfo.AdReplyInfo} AdReplyInfo + */ + AdReplyInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ContextInfo.AdReplyInfo) + return object; + var message = new $root.proto.ContextInfo.AdReplyInfo(); + if (object.advertiserName != null) + message.advertiserName = String(object.advertiserName); + switch (object.mediaType) { + case "NONE": + case 0: + message.mediaType = 0; + break; + case "IMAGE": + case 1: + message.mediaType = 1; + break; + case "VIDEO": + case 2: + message.mediaType = 2; + break; + } + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.caption != null) + message.caption = String(object.caption); + return message; + }; + + /** + * Creates a plain object from an AdReplyInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ContextInfo.AdReplyInfo + * @static + * @param {proto.ContextInfo.AdReplyInfo} message AdReplyInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AdReplyInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.advertiserName = ""; + object.mediaType = options.enums === String ? "NONE" : 0; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.caption = ""; + } + if (message.advertiserName != null && message.hasOwnProperty("advertiserName")) + object.advertiserName = message.advertiserName; + if (message.mediaType != null && message.hasOwnProperty("mediaType")) + object.mediaType = options.enums === String ? $root.proto.ContextInfo.AdReplyInfo.MediaType[message.mediaType] : message.mediaType; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.caption != null && message.hasOwnProperty("caption")) + object.caption = message.caption; + return object; + }; + + /** + * Converts this AdReplyInfo to JSON. + * @function toJSON + * @memberof proto.ContextInfo.AdReplyInfo + * @instance + * @returns {Object.} JSON object + */ + AdReplyInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * MediaType enum. + * @name proto.ContextInfo.AdReplyInfo.MediaType + * @enum {number} + * @property {number} NONE=0 NONE value + * @property {number} IMAGE=1 IMAGE value + * @property {number} VIDEO=2 VIDEO value + */ + AdReplyInfo.MediaType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "NONE"] = 0; + values[valuesById[1] = "IMAGE"] = 1; + values[valuesById[2] = "VIDEO"] = 2; + return values; + })(); + + return AdReplyInfo; + })(); + + ContextInfo.ExternalAdReplyInfo = (function() { + + /** + * Properties of an ExternalAdReplyInfo. + * @memberof proto.ContextInfo + * @interface IExternalAdReplyInfo + * @property {string|null} [title] ExternalAdReplyInfo title + * @property {string|null} [body] ExternalAdReplyInfo body + * @property {proto.ContextInfo.ExternalAdReplyInfo.MediaType|null} [mediaType] ExternalAdReplyInfo mediaType + * @property {string|null} [thumbnailUrl] ExternalAdReplyInfo thumbnailUrl + * @property {string|null} [mediaUrl] ExternalAdReplyInfo mediaUrl + * @property {Uint8Array|null} [thumbnail] ExternalAdReplyInfo thumbnail + * @property {string|null} [sourceType] ExternalAdReplyInfo sourceType + * @property {string|null} [sourceId] ExternalAdReplyInfo sourceId + * @property {string|null} [sourceUrl] ExternalAdReplyInfo sourceUrl + * @property {boolean|null} [containsAutoReply] ExternalAdReplyInfo containsAutoReply + * @property {boolean|null} [renderLargerThumbnail] ExternalAdReplyInfo renderLargerThumbnail + * @property {boolean|null} [showAdAttribution] ExternalAdReplyInfo showAdAttribution + * @property {string|null} [ctwaClid] ExternalAdReplyInfo ctwaClid + */ + + /** + * Constructs a new ExternalAdReplyInfo. + * @memberof proto.ContextInfo + * @classdesc Represents an ExternalAdReplyInfo. + * @implements IExternalAdReplyInfo + * @constructor + * @param {proto.ContextInfo.IExternalAdReplyInfo=} [properties] Properties to set + */ + function ExternalAdReplyInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExternalAdReplyInfo title. + * @member {string} title + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.title = ""; + + /** + * ExternalAdReplyInfo body. + * @member {string} body + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.body = ""; + + /** + * ExternalAdReplyInfo mediaType. + * @member {proto.ContextInfo.ExternalAdReplyInfo.MediaType} mediaType + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.mediaType = 0; + + /** + * ExternalAdReplyInfo thumbnailUrl. + * @member {string} thumbnailUrl + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.thumbnailUrl = ""; + + /** + * ExternalAdReplyInfo mediaUrl. + * @member {string} mediaUrl + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.mediaUrl = ""; + + /** + * ExternalAdReplyInfo thumbnail. + * @member {Uint8Array} thumbnail + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.thumbnail = $util.newBuffer([]); + + /** + * ExternalAdReplyInfo sourceType. + * @member {string} sourceType + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.sourceType = ""; + + /** + * ExternalAdReplyInfo sourceId. + * @member {string} sourceId + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.sourceId = ""; + + /** + * ExternalAdReplyInfo sourceUrl. + * @member {string} sourceUrl + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.sourceUrl = ""; + + /** + * ExternalAdReplyInfo containsAutoReply. + * @member {boolean} containsAutoReply + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.containsAutoReply = false; + + /** + * ExternalAdReplyInfo renderLargerThumbnail. + * @member {boolean} renderLargerThumbnail + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.renderLargerThumbnail = false; + + /** + * ExternalAdReplyInfo showAdAttribution. + * @member {boolean} showAdAttribution + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.showAdAttribution = false; + + /** + * ExternalAdReplyInfo ctwaClid. + * @member {string} ctwaClid + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + */ + ExternalAdReplyInfo.prototype.ctwaClid = ""; + + /** + * Creates a new ExternalAdReplyInfo instance using the specified properties. + * @function create + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {proto.ContextInfo.IExternalAdReplyInfo=} [properties] Properties to set + * @returns {proto.ContextInfo.ExternalAdReplyInfo} ExternalAdReplyInfo instance + */ + ExternalAdReplyInfo.create = function create(properties) { + return new ExternalAdReplyInfo(properties); + }; + + /** + * Encodes the specified ExternalAdReplyInfo message. Does not implicitly {@link proto.ContextInfo.ExternalAdReplyInfo.verify|verify} messages. + * @function encode + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {proto.ContextInfo.IExternalAdReplyInfo} message ExternalAdReplyInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExternalAdReplyInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.body); + if (message.mediaType != null && Object.hasOwnProperty.call(message, "mediaType")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.mediaType); + if (message.thumbnailUrl != null && Object.hasOwnProperty.call(message, "thumbnailUrl")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.thumbnailUrl); + if (message.mediaUrl != null && Object.hasOwnProperty.call(message, "mediaUrl")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.mediaUrl); + if (message.thumbnail != null && Object.hasOwnProperty.call(message, "thumbnail")) + writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.thumbnail); + if (message.sourceType != null && Object.hasOwnProperty.call(message, "sourceType")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.sourceType); + if (message.sourceId != null && Object.hasOwnProperty.call(message, "sourceId")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.sourceId); + if (message.sourceUrl != null && Object.hasOwnProperty.call(message, "sourceUrl")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.sourceUrl); + if (message.containsAutoReply != null && Object.hasOwnProperty.call(message, "containsAutoReply")) + writer.uint32(/* id 10, wireType 0 =*/80).bool(message.containsAutoReply); + if (message.renderLargerThumbnail != null && Object.hasOwnProperty.call(message, "renderLargerThumbnail")) + writer.uint32(/* id 11, wireType 0 =*/88).bool(message.renderLargerThumbnail); + if (message.showAdAttribution != null && Object.hasOwnProperty.call(message, "showAdAttribution")) + writer.uint32(/* id 12, wireType 0 =*/96).bool(message.showAdAttribution); + if (message.ctwaClid != null && Object.hasOwnProperty.call(message, "ctwaClid")) + writer.uint32(/* id 13, wireType 2 =*/106).string(message.ctwaClid); + return writer; + }; + + /** + * Encodes the specified ExternalAdReplyInfo message, length delimited. Does not implicitly {@link proto.ContextInfo.ExternalAdReplyInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {proto.ContextInfo.IExternalAdReplyInfo} message ExternalAdReplyInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExternalAdReplyInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExternalAdReplyInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ContextInfo.ExternalAdReplyInfo} ExternalAdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExternalAdReplyInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ContextInfo.ExternalAdReplyInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.title = reader.string(); + break; + case 2: + message.body = reader.string(); + break; + case 3: + message.mediaType = reader.int32(); + break; + case 4: + message.thumbnailUrl = reader.string(); + break; + case 5: + message.mediaUrl = reader.string(); + break; + case 6: + message.thumbnail = reader.bytes(); + break; + case 7: + message.sourceType = reader.string(); + break; + case 8: + message.sourceId = reader.string(); + break; + case 9: + message.sourceUrl = reader.string(); + break; + case 10: + message.containsAutoReply = reader.bool(); + break; + case 11: + message.renderLargerThumbnail = reader.bool(); + break; + case 12: + message.showAdAttribution = reader.bool(); + break; + case 13: + message.ctwaClid = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExternalAdReplyInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ContextInfo.ExternalAdReplyInfo} ExternalAdReplyInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExternalAdReplyInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExternalAdReplyInfo message. + * @function verify + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExternalAdReplyInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.body != null && message.hasOwnProperty("body")) + if (!$util.isString(message.body)) + return "body: string expected"; + if (message.mediaType != null && message.hasOwnProperty("mediaType")) + switch (message.mediaType) { + default: + return "mediaType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.thumbnailUrl != null && message.hasOwnProperty("thumbnailUrl")) + if (!$util.isString(message.thumbnailUrl)) + return "thumbnailUrl: string expected"; + if (message.mediaUrl != null && message.hasOwnProperty("mediaUrl")) + if (!$util.isString(message.mediaUrl)) + return "mediaUrl: string expected"; + if (message.thumbnail != null && message.hasOwnProperty("thumbnail")) + if (!(message.thumbnail && typeof message.thumbnail.length === "number" || $util.isString(message.thumbnail))) + return "thumbnail: buffer expected"; + if (message.sourceType != null && message.hasOwnProperty("sourceType")) + if (!$util.isString(message.sourceType)) + return "sourceType: string expected"; + if (message.sourceId != null && message.hasOwnProperty("sourceId")) + if (!$util.isString(message.sourceId)) + return "sourceId: string expected"; + if (message.sourceUrl != null && message.hasOwnProperty("sourceUrl")) + if (!$util.isString(message.sourceUrl)) + return "sourceUrl: string expected"; + if (message.containsAutoReply != null && message.hasOwnProperty("containsAutoReply")) + if (typeof message.containsAutoReply !== "boolean") + return "containsAutoReply: boolean expected"; + if (message.renderLargerThumbnail != null && message.hasOwnProperty("renderLargerThumbnail")) + if (typeof message.renderLargerThumbnail !== "boolean") + return "renderLargerThumbnail: boolean expected"; + if (message.showAdAttribution != null && message.hasOwnProperty("showAdAttribution")) + if (typeof message.showAdAttribution !== "boolean") + return "showAdAttribution: boolean expected"; + if (message.ctwaClid != null && message.hasOwnProperty("ctwaClid")) + if (!$util.isString(message.ctwaClid)) + return "ctwaClid: string expected"; + return null; + }; + + /** + * Creates an ExternalAdReplyInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.ContextInfo.ExternalAdReplyInfo} ExternalAdReplyInfo + */ + ExternalAdReplyInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ContextInfo.ExternalAdReplyInfo) + return object; + var message = new $root.proto.ContextInfo.ExternalAdReplyInfo(); + if (object.title != null) + message.title = String(object.title); + if (object.body != null) + message.body = String(object.body); + switch (object.mediaType) { + case "NONE": + case 0: + message.mediaType = 0; + break; + case "IMAGE": + case 1: + message.mediaType = 1; + break; + case "VIDEO": + case 2: + message.mediaType = 2; + break; + } + if (object.thumbnailUrl != null) + message.thumbnailUrl = String(object.thumbnailUrl); + if (object.mediaUrl != null) + message.mediaUrl = String(object.mediaUrl); + if (object.thumbnail != null) + if (typeof object.thumbnail === "string") + $util.base64.decode(object.thumbnail, message.thumbnail = $util.newBuffer($util.base64.length(object.thumbnail)), 0); + else if (object.thumbnail.length) + message.thumbnail = object.thumbnail; + if (object.sourceType != null) + message.sourceType = String(object.sourceType); + if (object.sourceId != null) + message.sourceId = String(object.sourceId); + if (object.sourceUrl != null) + message.sourceUrl = String(object.sourceUrl); + if (object.containsAutoReply != null) + message.containsAutoReply = Boolean(object.containsAutoReply); + if (object.renderLargerThumbnail != null) + message.renderLargerThumbnail = Boolean(object.renderLargerThumbnail); + if (object.showAdAttribution != null) + message.showAdAttribution = Boolean(object.showAdAttribution); + if (object.ctwaClid != null) + message.ctwaClid = String(object.ctwaClid); + return message; + }; + + /** + * Creates a plain object from an ExternalAdReplyInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @static + * @param {proto.ContextInfo.ExternalAdReplyInfo} message ExternalAdReplyInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExternalAdReplyInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.title = ""; + object.body = ""; + object.mediaType = options.enums === String ? "NONE" : 0; + object.thumbnailUrl = ""; + object.mediaUrl = ""; + if (options.bytes === String) + object.thumbnail = ""; + else { + object.thumbnail = []; + if (options.bytes !== Array) + object.thumbnail = $util.newBuffer(object.thumbnail); + } + object.sourceType = ""; + object.sourceId = ""; + object.sourceUrl = ""; + object.containsAutoReply = false; + object.renderLargerThumbnail = false; + object.showAdAttribution = false; + object.ctwaClid = ""; + } + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.body != null && message.hasOwnProperty("body")) + object.body = message.body; + if (message.mediaType != null && message.hasOwnProperty("mediaType")) + object.mediaType = options.enums === String ? $root.proto.ContextInfo.ExternalAdReplyInfo.MediaType[message.mediaType] : message.mediaType; + if (message.thumbnailUrl != null && message.hasOwnProperty("thumbnailUrl")) + object.thumbnailUrl = message.thumbnailUrl; + if (message.mediaUrl != null && message.hasOwnProperty("mediaUrl")) + object.mediaUrl = message.mediaUrl; + if (message.thumbnail != null && message.hasOwnProperty("thumbnail")) + object.thumbnail = options.bytes === String ? $util.base64.encode(message.thumbnail, 0, message.thumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnail) : message.thumbnail; + if (message.sourceType != null && message.hasOwnProperty("sourceType")) + object.sourceType = message.sourceType; + if (message.sourceId != null && message.hasOwnProperty("sourceId")) + object.sourceId = message.sourceId; + if (message.sourceUrl != null && message.hasOwnProperty("sourceUrl")) + object.sourceUrl = message.sourceUrl; + if (message.containsAutoReply != null && message.hasOwnProperty("containsAutoReply")) + object.containsAutoReply = message.containsAutoReply; + if (message.renderLargerThumbnail != null && message.hasOwnProperty("renderLargerThumbnail")) + object.renderLargerThumbnail = message.renderLargerThumbnail; + if (message.showAdAttribution != null && message.hasOwnProperty("showAdAttribution")) + object.showAdAttribution = message.showAdAttribution; + if (message.ctwaClid != null && message.hasOwnProperty("ctwaClid")) + object.ctwaClid = message.ctwaClid; + return object; + }; + + /** + * Converts this ExternalAdReplyInfo to JSON. + * @function toJSON + * @memberof proto.ContextInfo.ExternalAdReplyInfo + * @instance + * @returns {Object.} JSON object + */ + ExternalAdReplyInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * MediaType enum. + * @name proto.ContextInfo.ExternalAdReplyInfo.MediaType + * @enum {number} + * @property {number} NONE=0 NONE value + * @property {number} IMAGE=1 IMAGE value + * @property {number} VIDEO=2 VIDEO value + */ + ExternalAdReplyInfo.MediaType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "NONE"] = 0; + values[valuesById[1] = "IMAGE"] = 1; + values[valuesById[2] = "VIDEO"] = 2; + return values; + })(); + + return ExternalAdReplyInfo; + })(); + + return ContextInfo; + })(); + + proto.Conversation = (function() { + + /** + * Properties of a Conversation. + * @memberof proto + * @interface IConversation + * @property {string} id Conversation id + * @property {Array.|null} [messages] Conversation messages + * @property {string|null} [newJid] Conversation newJid + * @property {string|null} [oldJid] Conversation oldJid + * @property {number|Long|null} [lastMsgTimestamp] Conversation lastMsgTimestamp + * @property {number|null} [unreadCount] Conversation unreadCount + * @property {boolean|null} [readOnly] Conversation readOnly + * @property {boolean|null} [endOfHistoryTransfer] Conversation endOfHistoryTransfer + * @property {number|null} [ephemeralExpiration] Conversation ephemeralExpiration + * @property {number|Long|null} [ephemeralSettingTimestamp] Conversation ephemeralSettingTimestamp + * @property {proto.Conversation.EndOfHistoryTransferType|null} [endOfHistoryTransferType] Conversation endOfHistoryTransferType + * @property {number|Long|null} [conversationTimestamp] Conversation conversationTimestamp + * @property {string|null} [name] Conversation name + * @property {string|null} [pHash] Conversation pHash + * @property {boolean|null} [notSpam] Conversation notSpam + * @property {boolean|null} [archived] Conversation archived + * @property {proto.IDisappearingMode|null} [disappearingMode] Conversation disappearingMode + * @property {number|null} [unreadMentionCount] Conversation unreadMentionCount + * @property {boolean|null} [markedAsUnread] Conversation markedAsUnread + * @property {Array.|null} [participant] Conversation participant + * @property {Uint8Array|null} [tcToken] Conversation tcToken + * @property {number|Long|null} [tcTokenTimestamp] Conversation tcTokenTimestamp + * @property {Uint8Array|null} [contactPrimaryIdentityKey] Conversation contactPrimaryIdentityKey + * @property {number|null} [pinned] Conversation pinned + * @property {number|Long|null} [muteEndTime] Conversation muteEndTime + * @property {proto.IWallpaperSettings|null} [wallpaper] Conversation wallpaper + * @property {proto.MediaVisibility|null} [mediaVisibility] Conversation mediaVisibility + * @property {number|Long|null} [tcTokenSenderTimestamp] Conversation tcTokenSenderTimestamp + * @property {boolean|null} [suspended] Conversation suspended + * @property {boolean|null} [terminated] Conversation terminated + * @property {number|Long|null} [createdAt] Conversation createdAt + * @property {string|null} [createdBy] Conversation createdBy + * @property {string|null} [description] Conversation description + * @property {boolean|null} [support] Conversation support + * @property {boolean|null} [isParentGroup] Conversation isParentGroup + * @property {boolean|null} [isDefaultSubgroup] Conversation isDefaultSubgroup + * @property {string|null} [parentGroupId] Conversation parentGroupId + * @property {string|null} [displayName] Conversation displayName + * @property {string|null} [pnJid] Conversation pnJid + * @property {boolean|null} [shareOwnPn] Conversation shareOwnPn + * @property {boolean|null} [pnhDuplicateLidThread] Conversation pnhDuplicateLidThread + * @property {string|null} [lidJid] Conversation lidJid + */ + + /** + * Constructs a new Conversation. + * @memberof proto + * @classdesc Represents a Conversation. + * @implements IConversation + * @constructor + * @param {proto.IConversation=} [properties] Properties to set + */ + function Conversation(properties) { + this.messages = []; + this.participant = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Conversation id. + * @member {string} id + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.id = ""; + + /** + * Conversation messages. + * @member {Array.} messages + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.messages = $util.emptyArray; + + /** + * Conversation newJid. + * @member {string} newJid + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.newJid = ""; + + /** + * Conversation oldJid. + * @member {string} oldJid + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.oldJid = ""; + + /** + * Conversation lastMsgTimestamp. + * @member {number|Long} lastMsgTimestamp + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.lastMsgTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Conversation unreadCount. + * @member {number} unreadCount + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.unreadCount = 0; + + /** + * Conversation readOnly. + * @member {boolean} readOnly + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.readOnly = false; + + /** + * Conversation endOfHistoryTransfer. + * @member {boolean} endOfHistoryTransfer + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.endOfHistoryTransfer = false; + + /** + * Conversation ephemeralExpiration. + * @member {number} ephemeralExpiration + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.ephemeralExpiration = 0; + + /** + * Conversation ephemeralSettingTimestamp. + * @member {number|Long} ephemeralSettingTimestamp + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.ephemeralSettingTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Conversation endOfHistoryTransferType. + * @member {proto.Conversation.EndOfHistoryTransferType} endOfHistoryTransferType + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.endOfHistoryTransferType = 0; + + /** + * Conversation conversationTimestamp. + * @member {number|Long} conversationTimestamp + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.conversationTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Conversation name. + * @member {string} name + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.name = ""; + + /** + * Conversation pHash. + * @member {string} pHash + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.pHash = ""; + + /** + * Conversation notSpam. + * @member {boolean} notSpam + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.notSpam = false; + + /** + * Conversation archived. + * @member {boolean} archived + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.archived = false; + + /** + * Conversation disappearingMode. + * @member {proto.IDisappearingMode|null|undefined} disappearingMode + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.disappearingMode = null; + + /** + * Conversation unreadMentionCount. + * @member {number} unreadMentionCount + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.unreadMentionCount = 0; + + /** + * Conversation markedAsUnread. + * @member {boolean} markedAsUnread + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.markedAsUnread = false; + + /** + * Conversation participant. + * @member {Array.} participant + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.participant = $util.emptyArray; + + /** + * Conversation tcToken. + * @member {Uint8Array} tcToken + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.tcToken = $util.newBuffer([]); + + /** + * Conversation tcTokenTimestamp. + * @member {number|Long} tcTokenTimestamp + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.tcTokenTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Conversation contactPrimaryIdentityKey. + * @member {Uint8Array} contactPrimaryIdentityKey + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.contactPrimaryIdentityKey = $util.newBuffer([]); + + /** + * Conversation pinned. + * @member {number} pinned + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.pinned = 0; + + /** + * Conversation muteEndTime. + * @member {number|Long} muteEndTime + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.muteEndTime = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Conversation wallpaper. + * @member {proto.IWallpaperSettings|null|undefined} wallpaper + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.wallpaper = null; + + /** + * Conversation mediaVisibility. + * @member {proto.MediaVisibility} mediaVisibility + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.mediaVisibility = 0; + + /** + * Conversation tcTokenSenderTimestamp. + * @member {number|Long} tcTokenSenderTimestamp + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.tcTokenSenderTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Conversation suspended. + * @member {boolean} suspended + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.suspended = false; + + /** + * Conversation terminated. + * @member {boolean} terminated + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.terminated = false; + + /** + * Conversation createdAt. + * @member {number|Long} createdAt + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.createdAt = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Conversation createdBy. + * @member {string} createdBy + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.createdBy = ""; + + /** + * Conversation description. + * @member {string} description + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.description = ""; + + /** + * Conversation support. + * @member {boolean} support + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.support = false; + + /** + * Conversation isParentGroup. + * @member {boolean} isParentGroup + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.isParentGroup = false; + + /** + * Conversation isDefaultSubgroup. + * @member {boolean} isDefaultSubgroup + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.isDefaultSubgroup = false; + + /** + * Conversation parentGroupId. + * @member {string} parentGroupId + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.parentGroupId = ""; + + /** + * Conversation displayName. + * @member {string} displayName + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.displayName = ""; + + /** + * Conversation pnJid. + * @member {string} pnJid + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.pnJid = ""; + + /** + * Conversation shareOwnPn. + * @member {boolean} shareOwnPn + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.shareOwnPn = false; + + /** + * Conversation pnhDuplicateLidThread. + * @member {boolean} pnhDuplicateLidThread + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.pnhDuplicateLidThread = false; + + /** + * Conversation lidJid. + * @member {string} lidJid + * @memberof proto.Conversation + * @instance + */ + Conversation.prototype.lidJid = ""; + + /** + * Creates a new Conversation instance using the specified properties. + * @function create + * @memberof proto.Conversation + * @static + * @param {proto.IConversation=} [properties] Properties to set + * @returns {proto.Conversation} Conversation instance + */ + Conversation.create = function create(properties) { + return new Conversation(properties); + }; + + /** + * Encodes the specified Conversation message. Does not implicitly {@link proto.Conversation.verify|verify} messages. + * @function encode + * @memberof proto.Conversation + * @static + * @param {proto.IConversation} message Conversation message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Conversation.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + writer.uint32(/* id 1, wireType 2 =*/10).string(message.id); + if (message.messages != null && message.messages.length) + for (var i = 0; i < message.messages.length; ++i) + $root.proto.HistorySyncMsg.encode(message.messages[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.newJid != null && Object.hasOwnProperty.call(message, "newJid")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.newJid); + if (message.oldJid != null && Object.hasOwnProperty.call(message, "oldJid")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.oldJid); + if (message.lastMsgTimestamp != null && Object.hasOwnProperty.call(message, "lastMsgTimestamp")) + writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.lastMsgTimestamp); + if (message.unreadCount != null && Object.hasOwnProperty.call(message, "unreadCount")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.unreadCount); + if (message.readOnly != null && Object.hasOwnProperty.call(message, "readOnly")) + writer.uint32(/* id 7, wireType 0 =*/56).bool(message.readOnly); + if (message.endOfHistoryTransfer != null && Object.hasOwnProperty.call(message, "endOfHistoryTransfer")) + writer.uint32(/* id 8, wireType 0 =*/64).bool(message.endOfHistoryTransfer); + if (message.ephemeralExpiration != null && Object.hasOwnProperty.call(message, "ephemeralExpiration")) + writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.ephemeralExpiration); + if (message.ephemeralSettingTimestamp != null && Object.hasOwnProperty.call(message, "ephemeralSettingTimestamp")) + writer.uint32(/* id 10, wireType 0 =*/80).int64(message.ephemeralSettingTimestamp); + if (message.endOfHistoryTransferType != null && Object.hasOwnProperty.call(message, "endOfHistoryTransferType")) + writer.uint32(/* id 11, wireType 0 =*/88).int32(message.endOfHistoryTransferType); + if (message.conversationTimestamp != null && Object.hasOwnProperty.call(message, "conversationTimestamp")) + writer.uint32(/* id 12, wireType 0 =*/96).uint64(message.conversationTimestamp); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 13, wireType 2 =*/106).string(message.name); + if (message.pHash != null && Object.hasOwnProperty.call(message, "pHash")) + writer.uint32(/* id 14, wireType 2 =*/114).string(message.pHash); + if (message.notSpam != null && Object.hasOwnProperty.call(message, "notSpam")) + writer.uint32(/* id 15, wireType 0 =*/120).bool(message.notSpam); + if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) + writer.uint32(/* id 16, wireType 0 =*/128).bool(message.archived); + if (message.disappearingMode != null && Object.hasOwnProperty.call(message, "disappearingMode")) + $root.proto.DisappearingMode.encode(message.disappearingMode, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.unreadMentionCount != null && Object.hasOwnProperty.call(message, "unreadMentionCount")) + writer.uint32(/* id 18, wireType 0 =*/144).uint32(message.unreadMentionCount); + if (message.markedAsUnread != null && Object.hasOwnProperty.call(message, "markedAsUnread")) + writer.uint32(/* id 19, wireType 0 =*/152).bool(message.markedAsUnread); + if (message.participant != null && message.participant.length) + for (var i = 0; i < message.participant.length; ++i) + $root.proto.GroupParticipant.encode(message.participant[i], writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); + if (message.tcToken != null && Object.hasOwnProperty.call(message, "tcToken")) + writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.tcToken); + if (message.tcTokenTimestamp != null && Object.hasOwnProperty.call(message, "tcTokenTimestamp")) + writer.uint32(/* id 22, wireType 0 =*/176).uint64(message.tcTokenTimestamp); + if (message.contactPrimaryIdentityKey != null && Object.hasOwnProperty.call(message, "contactPrimaryIdentityKey")) + writer.uint32(/* id 23, wireType 2 =*/186).bytes(message.contactPrimaryIdentityKey); + if (message.pinned != null && Object.hasOwnProperty.call(message, "pinned")) + writer.uint32(/* id 24, wireType 0 =*/192).uint32(message.pinned); + if (message.muteEndTime != null && Object.hasOwnProperty.call(message, "muteEndTime")) + writer.uint32(/* id 25, wireType 0 =*/200).uint64(message.muteEndTime); + if (message.wallpaper != null && Object.hasOwnProperty.call(message, "wallpaper")) + $root.proto.WallpaperSettings.encode(message.wallpaper, writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim(); + if (message.mediaVisibility != null && Object.hasOwnProperty.call(message, "mediaVisibility")) + writer.uint32(/* id 27, wireType 0 =*/216).int32(message.mediaVisibility); + if (message.tcTokenSenderTimestamp != null && Object.hasOwnProperty.call(message, "tcTokenSenderTimestamp")) + writer.uint32(/* id 28, wireType 0 =*/224).uint64(message.tcTokenSenderTimestamp); + if (message.suspended != null && Object.hasOwnProperty.call(message, "suspended")) + writer.uint32(/* id 29, wireType 0 =*/232).bool(message.suspended); + if (message.terminated != null && Object.hasOwnProperty.call(message, "terminated")) + writer.uint32(/* id 30, wireType 0 =*/240).bool(message.terminated); + if (message.createdAt != null && Object.hasOwnProperty.call(message, "createdAt")) + writer.uint32(/* id 31, wireType 0 =*/248).uint64(message.createdAt); + if (message.createdBy != null && Object.hasOwnProperty.call(message, "createdBy")) + writer.uint32(/* id 32, wireType 2 =*/258).string(message.createdBy); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 33, wireType 2 =*/266).string(message.description); + if (message.support != null && Object.hasOwnProperty.call(message, "support")) + writer.uint32(/* id 34, wireType 0 =*/272).bool(message.support); + if (message.isParentGroup != null && Object.hasOwnProperty.call(message, "isParentGroup")) + writer.uint32(/* id 35, wireType 0 =*/280).bool(message.isParentGroup); + if (message.isDefaultSubgroup != null && Object.hasOwnProperty.call(message, "isDefaultSubgroup")) + writer.uint32(/* id 36, wireType 0 =*/288).bool(message.isDefaultSubgroup); + if (message.parentGroupId != null && Object.hasOwnProperty.call(message, "parentGroupId")) + writer.uint32(/* id 37, wireType 2 =*/298).string(message.parentGroupId); + if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) + writer.uint32(/* id 38, wireType 2 =*/306).string(message.displayName); + if (message.pnJid != null && Object.hasOwnProperty.call(message, "pnJid")) + writer.uint32(/* id 39, wireType 2 =*/314).string(message.pnJid); + if (message.shareOwnPn != null && Object.hasOwnProperty.call(message, "shareOwnPn")) + writer.uint32(/* id 40, wireType 0 =*/320).bool(message.shareOwnPn); + if (message.pnhDuplicateLidThread != null && Object.hasOwnProperty.call(message, "pnhDuplicateLidThread")) + writer.uint32(/* id 41, wireType 0 =*/328).bool(message.pnhDuplicateLidThread); + if (message.lidJid != null && Object.hasOwnProperty.call(message, "lidJid")) + writer.uint32(/* id 42, wireType 2 =*/338).string(message.lidJid); + return writer; + }; + + /** + * Encodes the specified Conversation message, length delimited. Does not implicitly {@link proto.Conversation.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Conversation + * @static + * @param {proto.IConversation} message Conversation message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Conversation.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Conversation message from the specified reader or buffer. + * @function decode + * @memberof proto.Conversation + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Conversation} Conversation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Conversation.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Conversation(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.string(); + break; + case 2: + if (!(message.messages && message.messages.length)) + message.messages = []; + message.messages.push($root.proto.HistorySyncMsg.decode(reader, reader.uint32())); + break; + case 3: + message.newJid = reader.string(); + break; + case 4: + message.oldJid = reader.string(); + break; + case 5: + message.lastMsgTimestamp = reader.uint64(); + break; + case 6: + message.unreadCount = reader.uint32(); + break; + case 7: + message.readOnly = reader.bool(); + break; + case 8: + message.endOfHistoryTransfer = reader.bool(); + break; + case 9: + message.ephemeralExpiration = reader.uint32(); + break; + case 10: + message.ephemeralSettingTimestamp = reader.int64(); + break; + case 11: + message.endOfHistoryTransferType = reader.int32(); + break; + case 12: + message.conversationTimestamp = reader.uint64(); + break; + case 13: + message.name = reader.string(); + break; + case 14: + message.pHash = reader.string(); + break; + case 15: + message.notSpam = reader.bool(); + break; + case 16: + message.archived = reader.bool(); + break; + case 17: + message.disappearingMode = $root.proto.DisappearingMode.decode(reader, reader.uint32()); + break; + case 18: + message.unreadMentionCount = reader.uint32(); + break; + case 19: + message.markedAsUnread = reader.bool(); + break; + case 20: + if (!(message.participant && message.participant.length)) + message.participant = []; + message.participant.push($root.proto.GroupParticipant.decode(reader, reader.uint32())); + break; + case 21: + message.tcToken = reader.bytes(); + break; + case 22: + message.tcTokenTimestamp = reader.uint64(); + break; + case 23: + message.contactPrimaryIdentityKey = reader.bytes(); + break; + case 24: + message.pinned = reader.uint32(); + break; + case 25: + message.muteEndTime = reader.uint64(); + break; + case 26: + message.wallpaper = $root.proto.WallpaperSettings.decode(reader, reader.uint32()); + break; + case 27: + message.mediaVisibility = reader.int32(); + break; + case 28: + message.tcTokenSenderTimestamp = reader.uint64(); + break; + case 29: + message.suspended = reader.bool(); + break; + case 30: + message.terminated = reader.bool(); + break; + case 31: + message.createdAt = reader.uint64(); + break; + case 32: + message.createdBy = reader.string(); + break; + case 33: + message.description = reader.string(); + break; + case 34: + message.support = reader.bool(); + break; + case 35: + message.isParentGroup = reader.bool(); + break; + case 36: + message.isDefaultSubgroup = reader.bool(); + break; + case 37: + message.parentGroupId = reader.string(); + break; + case 38: + message.displayName = reader.string(); + break; + case 39: + message.pnJid = reader.string(); + break; + case 40: + message.shareOwnPn = reader.bool(); + break; + case 41: + message.pnhDuplicateLidThread = reader.bool(); + break; + case 42: + message.lidJid = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("id")) + throw $util.ProtocolError("missing required 'id'", { instance: message }); + return message; + }; + + /** + * Decodes a Conversation message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Conversation + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Conversation} Conversation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Conversation.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Conversation message. + * @function verify + * @memberof proto.Conversation + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Conversation.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.id)) + return "id: string expected"; + if (message.messages != null && message.hasOwnProperty("messages")) { + if (!Array.isArray(message.messages)) + return "messages: array expected"; + for (var i = 0; i < message.messages.length; ++i) { + var error = $root.proto.HistorySyncMsg.verify(message.messages[i]); + if (error) + return "messages." + error; + } + } + if (message.newJid != null && message.hasOwnProperty("newJid")) + if (!$util.isString(message.newJid)) + return "newJid: string expected"; + if (message.oldJid != null && message.hasOwnProperty("oldJid")) + if (!$util.isString(message.oldJid)) + return "oldJid: string expected"; + if (message.lastMsgTimestamp != null && message.hasOwnProperty("lastMsgTimestamp")) + if (!$util.isInteger(message.lastMsgTimestamp) && !(message.lastMsgTimestamp && $util.isInteger(message.lastMsgTimestamp.low) && $util.isInteger(message.lastMsgTimestamp.high))) + return "lastMsgTimestamp: integer|Long expected"; + if (message.unreadCount != null && message.hasOwnProperty("unreadCount")) + if (!$util.isInteger(message.unreadCount)) + return "unreadCount: integer expected"; + if (message.readOnly != null && message.hasOwnProperty("readOnly")) + if (typeof message.readOnly !== "boolean") + return "readOnly: boolean expected"; + if (message.endOfHistoryTransfer != null && message.hasOwnProperty("endOfHistoryTransfer")) + if (typeof message.endOfHistoryTransfer !== "boolean") + return "endOfHistoryTransfer: boolean expected"; + if (message.ephemeralExpiration != null && message.hasOwnProperty("ephemeralExpiration")) + if (!$util.isInteger(message.ephemeralExpiration)) + return "ephemeralExpiration: integer expected"; + if (message.ephemeralSettingTimestamp != null && message.hasOwnProperty("ephemeralSettingTimestamp")) + if (!$util.isInteger(message.ephemeralSettingTimestamp) && !(message.ephemeralSettingTimestamp && $util.isInteger(message.ephemeralSettingTimestamp.low) && $util.isInteger(message.ephemeralSettingTimestamp.high))) + return "ephemeralSettingTimestamp: integer|Long expected"; + if (message.endOfHistoryTransferType != null && message.hasOwnProperty("endOfHistoryTransferType")) + switch (message.endOfHistoryTransferType) { + default: + return "endOfHistoryTransferType: enum value expected"; + case 0: + case 1: + break; + } + if (message.conversationTimestamp != null && message.hasOwnProperty("conversationTimestamp")) + if (!$util.isInteger(message.conversationTimestamp) && !(message.conversationTimestamp && $util.isInteger(message.conversationTimestamp.low) && $util.isInteger(message.conversationTimestamp.high))) + return "conversationTimestamp: integer|Long expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.pHash != null && message.hasOwnProperty("pHash")) + if (!$util.isString(message.pHash)) + return "pHash: string expected"; + if (message.notSpam != null && message.hasOwnProperty("notSpam")) + if (typeof message.notSpam !== "boolean") + return "notSpam: boolean expected"; + if (message.archived != null && message.hasOwnProperty("archived")) + if (typeof message.archived !== "boolean") + return "archived: boolean expected"; + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) { + var error = $root.proto.DisappearingMode.verify(message.disappearingMode); + if (error) + return "disappearingMode." + error; + } + if (message.unreadMentionCount != null && message.hasOwnProperty("unreadMentionCount")) + if (!$util.isInteger(message.unreadMentionCount)) + return "unreadMentionCount: integer expected"; + if (message.markedAsUnread != null && message.hasOwnProperty("markedAsUnread")) + if (typeof message.markedAsUnread !== "boolean") + return "markedAsUnread: boolean expected"; + if (message.participant != null && message.hasOwnProperty("participant")) { + if (!Array.isArray(message.participant)) + return "participant: array expected"; + for (var i = 0; i < message.participant.length; ++i) { + var error = $root.proto.GroupParticipant.verify(message.participant[i]); + if (error) + return "participant." + error; + } + } + if (message.tcToken != null && message.hasOwnProperty("tcToken")) + if (!(message.tcToken && typeof message.tcToken.length === "number" || $util.isString(message.tcToken))) + return "tcToken: buffer expected"; + if (message.tcTokenTimestamp != null && message.hasOwnProperty("tcTokenTimestamp")) + if (!$util.isInteger(message.tcTokenTimestamp) && !(message.tcTokenTimestamp && $util.isInteger(message.tcTokenTimestamp.low) && $util.isInteger(message.tcTokenTimestamp.high))) + return "tcTokenTimestamp: integer|Long expected"; + if (message.contactPrimaryIdentityKey != null && message.hasOwnProperty("contactPrimaryIdentityKey")) + if (!(message.contactPrimaryIdentityKey && typeof message.contactPrimaryIdentityKey.length === "number" || $util.isString(message.contactPrimaryIdentityKey))) + return "contactPrimaryIdentityKey: buffer expected"; + if (message.pinned != null && message.hasOwnProperty("pinned")) + if (!$util.isInteger(message.pinned)) + return "pinned: integer expected"; + if (message.muteEndTime != null && message.hasOwnProperty("muteEndTime")) + if (!$util.isInteger(message.muteEndTime) && !(message.muteEndTime && $util.isInteger(message.muteEndTime.low) && $util.isInteger(message.muteEndTime.high))) + return "muteEndTime: integer|Long expected"; + if (message.wallpaper != null && message.hasOwnProperty("wallpaper")) { + var error = $root.proto.WallpaperSettings.verify(message.wallpaper); + if (error) + return "wallpaper." + error; + } + if (message.mediaVisibility != null && message.hasOwnProperty("mediaVisibility")) + switch (message.mediaVisibility) { + default: + return "mediaVisibility: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.tcTokenSenderTimestamp != null && message.hasOwnProperty("tcTokenSenderTimestamp")) + if (!$util.isInteger(message.tcTokenSenderTimestamp) && !(message.tcTokenSenderTimestamp && $util.isInteger(message.tcTokenSenderTimestamp.low) && $util.isInteger(message.tcTokenSenderTimestamp.high))) + return "tcTokenSenderTimestamp: integer|Long expected"; + if (message.suspended != null && message.hasOwnProperty("suspended")) + if (typeof message.suspended !== "boolean") + return "suspended: boolean expected"; + if (message.terminated != null && message.hasOwnProperty("terminated")) + if (typeof message.terminated !== "boolean") + return "terminated: boolean expected"; + if (message.createdAt != null && message.hasOwnProperty("createdAt")) + if (!$util.isInteger(message.createdAt) && !(message.createdAt && $util.isInteger(message.createdAt.low) && $util.isInteger(message.createdAt.high))) + return "createdAt: integer|Long expected"; + if (message.createdBy != null && message.hasOwnProperty("createdBy")) + if (!$util.isString(message.createdBy)) + return "createdBy: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.support != null && message.hasOwnProperty("support")) + if (typeof message.support !== "boolean") + return "support: boolean expected"; + if (message.isParentGroup != null && message.hasOwnProperty("isParentGroup")) + if (typeof message.isParentGroup !== "boolean") + return "isParentGroup: boolean expected"; + if (message.isDefaultSubgroup != null && message.hasOwnProperty("isDefaultSubgroup")) + if (typeof message.isDefaultSubgroup !== "boolean") + return "isDefaultSubgroup: boolean expected"; + if (message.parentGroupId != null && message.hasOwnProperty("parentGroupId")) + if (!$util.isString(message.parentGroupId)) + return "parentGroupId: string expected"; + if (message.displayName != null && message.hasOwnProperty("displayName")) + if (!$util.isString(message.displayName)) + return "displayName: string expected"; + if (message.pnJid != null && message.hasOwnProperty("pnJid")) + if (!$util.isString(message.pnJid)) + return "pnJid: string expected"; + if (message.shareOwnPn != null && message.hasOwnProperty("shareOwnPn")) + if (typeof message.shareOwnPn !== "boolean") + return "shareOwnPn: boolean expected"; + if (message.pnhDuplicateLidThread != null && message.hasOwnProperty("pnhDuplicateLidThread")) + if (typeof message.pnhDuplicateLidThread !== "boolean") + return "pnhDuplicateLidThread: boolean expected"; + if (message.lidJid != null && message.hasOwnProperty("lidJid")) + if (!$util.isString(message.lidJid)) + return "lidJid: string expected"; + return null; + }; + + /** + * Creates a Conversation message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Conversation + * @static + * @param {Object.} object Plain object + * @returns {proto.Conversation} Conversation + */ + Conversation.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Conversation) + return object; + var message = new $root.proto.Conversation(); + if (object.id != null) + message.id = String(object.id); + if (object.messages) { + if (!Array.isArray(object.messages)) + throw TypeError(".proto.Conversation.messages: array expected"); + message.messages = []; + for (var i = 0; i < object.messages.length; ++i) { + if (typeof object.messages[i] !== "object") + throw TypeError(".proto.Conversation.messages: object expected"); + message.messages[i] = $root.proto.HistorySyncMsg.fromObject(object.messages[i]); + } + } + if (object.newJid != null) + message.newJid = String(object.newJid); + if (object.oldJid != null) + message.oldJid = String(object.oldJid); + if (object.lastMsgTimestamp != null) + if ($util.Long) + (message.lastMsgTimestamp = $util.Long.fromValue(object.lastMsgTimestamp)).unsigned = true; + else if (typeof object.lastMsgTimestamp === "string") + message.lastMsgTimestamp = parseInt(object.lastMsgTimestamp, 10); + else if (typeof object.lastMsgTimestamp === "number") + message.lastMsgTimestamp = object.lastMsgTimestamp; + else if (typeof object.lastMsgTimestamp === "object") + message.lastMsgTimestamp = new $util.LongBits(object.lastMsgTimestamp.low >>> 0, object.lastMsgTimestamp.high >>> 0).toNumber(true); + if (object.unreadCount != null) + message.unreadCount = object.unreadCount >>> 0; + if (object.readOnly != null) + message.readOnly = Boolean(object.readOnly); + if (object.endOfHistoryTransfer != null) + message.endOfHistoryTransfer = Boolean(object.endOfHistoryTransfer); + if (object.ephemeralExpiration != null) + message.ephemeralExpiration = object.ephemeralExpiration >>> 0; + if (object.ephemeralSettingTimestamp != null) + if ($util.Long) + (message.ephemeralSettingTimestamp = $util.Long.fromValue(object.ephemeralSettingTimestamp)).unsigned = false; + else if (typeof object.ephemeralSettingTimestamp === "string") + message.ephemeralSettingTimestamp = parseInt(object.ephemeralSettingTimestamp, 10); + else if (typeof object.ephemeralSettingTimestamp === "number") + message.ephemeralSettingTimestamp = object.ephemeralSettingTimestamp; + else if (typeof object.ephemeralSettingTimestamp === "object") + message.ephemeralSettingTimestamp = new $util.LongBits(object.ephemeralSettingTimestamp.low >>> 0, object.ephemeralSettingTimestamp.high >>> 0).toNumber(); + switch (object.endOfHistoryTransferType) { + case "COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY": + case 0: + message.endOfHistoryTransferType = 0; + break; + case "COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY": + case 1: + message.endOfHistoryTransferType = 1; + break; + } + if (object.conversationTimestamp != null) + if ($util.Long) + (message.conversationTimestamp = $util.Long.fromValue(object.conversationTimestamp)).unsigned = true; + else if (typeof object.conversationTimestamp === "string") + message.conversationTimestamp = parseInt(object.conversationTimestamp, 10); + else if (typeof object.conversationTimestamp === "number") + message.conversationTimestamp = object.conversationTimestamp; + else if (typeof object.conversationTimestamp === "object") + message.conversationTimestamp = new $util.LongBits(object.conversationTimestamp.low >>> 0, object.conversationTimestamp.high >>> 0).toNumber(true); + if (object.name != null) + message.name = String(object.name); + if (object.pHash != null) + message.pHash = String(object.pHash); + if (object.notSpam != null) + message.notSpam = Boolean(object.notSpam); + if (object.archived != null) + message.archived = Boolean(object.archived); + if (object.disappearingMode != null) { + if (typeof object.disappearingMode !== "object") + throw TypeError(".proto.Conversation.disappearingMode: object expected"); + message.disappearingMode = $root.proto.DisappearingMode.fromObject(object.disappearingMode); + } + if (object.unreadMentionCount != null) + message.unreadMentionCount = object.unreadMentionCount >>> 0; + if (object.markedAsUnread != null) + message.markedAsUnread = Boolean(object.markedAsUnread); + if (object.participant) { + if (!Array.isArray(object.participant)) + throw TypeError(".proto.Conversation.participant: array expected"); + message.participant = []; + for (var i = 0; i < object.participant.length; ++i) { + if (typeof object.participant[i] !== "object") + throw TypeError(".proto.Conversation.participant: object expected"); + message.participant[i] = $root.proto.GroupParticipant.fromObject(object.participant[i]); + } + } + if (object.tcToken != null) + if (typeof object.tcToken === "string") + $util.base64.decode(object.tcToken, message.tcToken = $util.newBuffer($util.base64.length(object.tcToken)), 0); + else if (object.tcToken.length) + message.tcToken = object.tcToken; + if (object.tcTokenTimestamp != null) + if ($util.Long) + (message.tcTokenTimestamp = $util.Long.fromValue(object.tcTokenTimestamp)).unsigned = true; + else if (typeof object.tcTokenTimestamp === "string") + message.tcTokenTimestamp = parseInt(object.tcTokenTimestamp, 10); + else if (typeof object.tcTokenTimestamp === "number") + message.tcTokenTimestamp = object.tcTokenTimestamp; + else if (typeof object.tcTokenTimestamp === "object") + message.tcTokenTimestamp = new $util.LongBits(object.tcTokenTimestamp.low >>> 0, object.tcTokenTimestamp.high >>> 0).toNumber(true); + if (object.contactPrimaryIdentityKey != null) + if (typeof object.contactPrimaryIdentityKey === "string") + $util.base64.decode(object.contactPrimaryIdentityKey, message.contactPrimaryIdentityKey = $util.newBuffer($util.base64.length(object.contactPrimaryIdentityKey)), 0); + else if (object.contactPrimaryIdentityKey.length) + message.contactPrimaryIdentityKey = object.contactPrimaryIdentityKey; + if (object.pinned != null) + message.pinned = object.pinned >>> 0; + if (object.muteEndTime != null) + if ($util.Long) + (message.muteEndTime = $util.Long.fromValue(object.muteEndTime)).unsigned = true; + else if (typeof object.muteEndTime === "string") + message.muteEndTime = parseInt(object.muteEndTime, 10); + else if (typeof object.muteEndTime === "number") + message.muteEndTime = object.muteEndTime; + else if (typeof object.muteEndTime === "object") + message.muteEndTime = new $util.LongBits(object.muteEndTime.low >>> 0, object.muteEndTime.high >>> 0).toNumber(true); + if (object.wallpaper != null) { + if (typeof object.wallpaper !== "object") + throw TypeError(".proto.Conversation.wallpaper: object expected"); + message.wallpaper = $root.proto.WallpaperSettings.fromObject(object.wallpaper); + } + switch (object.mediaVisibility) { + case "DEFAULT": + case 0: + message.mediaVisibility = 0; + break; + case "OFF": + case 1: + message.mediaVisibility = 1; + break; + case "ON": + case 2: + message.mediaVisibility = 2; + break; + } + if (object.tcTokenSenderTimestamp != null) + if ($util.Long) + (message.tcTokenSenderTimestamp = $util.Long.fromValue(object.tcTokenSenderTimestamp)).unsigned = true; + else if (typeof object.tcTokenSenderTimestamp === "string") + message.tcTokenSenderTimestamp = parseInt(object.tcTokenSenderTimestamp, 10); + else if (typeof object.tcTokenSenderTimestamp === "number") + message.tcTokenSenderTimestamp = object.tcTokenSenderTimestamp; + else if (typeof object.tcTokenSenderTimestamp === "object") + message.tcTokenSenderTimestamp = new $util.LongBits(object.tcTokenSenderTimestamp.low >>> 0, object.tcTokenSenderTimestamp.high >>> 0).toNumber(true); + if (object.suspended != null) + message.suspended = Boolean(object.suspended); + if (object.terminated != null) + message.terminated = Boolean(object.terminated); + if (object.createdAt != null) + if ($util.Long) + (message.createdAt = $util.Long.fromValue(object.createdAt)).unsigned = true; + else if (typeof object.createdAt === "string") + message.createdAt = parseInt(object.createdAt, 10); + else if (typeof object.createdAt === "number") + message.createdAt = object.createdAt; + else if (typeof object.createdAt === "object") + message.createdAt = new $util.LongBits(object.createdAt.low >>> 0, object.createdAt.high >>> 0).toNumber(true); + if (object.createdBy != null) + message.createdBy = String(object.createdBy); + if (object.description != null) + message.description = String(object.description); + if (object.support != null) + message.support = Boolean(object.support); + if (object.isParentGroup != null) + message.isParentGroup = Boolean(object.isParentGroup); + if (object.isDefaultSubgroup != null) + message.isDefaultSubgroup = Boolean(object.isDefaultSubgroup); + if (object.parentGroupId != null) + message.parentGroupId = String(object.parentGroupId); + if (object.displayName != null) + message.displayName = String(object.displayName); + if (object.pnJid != null) + message.pnJid = String(object.pnJid); + if (object.shareOwnPn != null) + message.shareOwnPn = Boolean(object.shareOwnPn); + if (object.pnhDuplicateLidThread != null) + message.pnhDuplicateLidThread = Boolean(object.pnhDuplicateLidThread); + if (object.lidJid != null) + message.lidJid = String(object.lidJid); + return message; + }; + + /** + * Creates a plain object from a Conversation message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Conversation + * @static + * @param {proto.Conversation} message Conversation + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Conversation.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.messages = []; + object.participant = []; + } + if (options.defaults) { + object.id = ""; + object.newJid = ""; + object.oldJid = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.lastMsgTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.lastMsgTimestamp = options.longs === String ? "0" : 0; + object.unreadCount = 0; + object.readOnly = false; + object.endOfHistoryTransfer = false; + object.ephemeralExpiration = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.ephemeralSettingTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.ephemeralSettingTimestamp = options.longs === String ? "0" : 0; + object.endOfHistoryTransferType = options.enums === String ? "COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.conversationTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.conversationTimestamp = options.longs === String ? "0" : 0; + object.name = ""; + object.pHash = ""; + object.notSpam = false; + object.archived = false; + object.disappearingMode = null; + object.unreadMentionCount = 0; + object.markedAsUnread = false; + if (options.bytes === String) + object.tcToken = ""; + else { + object.tcToken = []; + if (options.bytes !== Array) + object.tcToken = $util.newBuffer(object.tcToken); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.tcTokenTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.tcTokenTimestamp = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.contactPrimaryIdentityKey = ""; + else { + object.contactPrimaryIdentityKey = []; + if (options.bytes !== Array) + object.contactPrimaryIdentityKey = $util.newBuffer(object.contactPrimaryIdentityKey); + } + object.pinned = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.muteEndTime = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.muteEndTime = options.longs === String ? "0" : 0; + object.wallpaper = null; + object.mediaVisibility = options.enums === String ? "DEFAULT" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.tcTokenSenderTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.tcTokenSenderTimestamp = options.longs === String ? "0" : 0; + object.suspended = false; + object.terminated = false; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.createdAt = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.createdAt = options.longs === String ? "0" : 0; + object.createdBy = ""; + object.description = ""; + object.support = false; + object.isParentGroup = false; + object.isDefaultSubgroup = false; + object.parentGroupId = ""; + object.displayName = ""; + object.pnJid = ""; + object.shareOwnPn = false; + object.pnhDuplicateLidThread = false; + object.lidJid = ""; + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.messages && message.messages.length) { + object.messages = []; + for (var j = 0; j < message.messages.length; ++j) + object.messages[j] = $root.proto.HistorySyncMsg.toObject(message.messages[j], options); + } + if (message.newJid != null && message.hasOwnProperty("newJid")) + object.newJid = message.newJid; + if (message.oldJid != null && message.hasOwnProperty("oldJid")) + object.oldJid = message.oldJid; + if (message.lastMsgTimestamp != null && message.hasOwnProperty("lastMsgTimestamp")) + if (typeof message.lastMsgTimestamp === "number") + object.lastMsgTimestamp = options.longs === String ? String(message.lastMsgTimestamp) : message.lastMsgTimestamp; + else + object.lastMsgTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.lastMsgTimestamp) : options.longs === Number ? new $util.LongBits(message.lastMsgTimestamp.low >>> 0, message.lastMsgTimestamp.high >>> 0).toNumber(true) : message.lastMsgTimestamp; + if (message.unreadCount != null && message.hasOwnProperty("unreadCount")) + object.unreadCount = message.unreadCount; + if (message.readOnly != null && message.hasOwnProperty("readOnly")) + object.readOnly = message.readOnly; + if (message.endOfHistoryTransfer != null && message.hasOwnProperty("endOfHistoryTransfer")) + object.endOfHistoryTransfer = message.endOfHistoryTransfer; + if (message.ephemeralExpiration != null && message.hasOwnProperty("ephemeralExpiration")) + object.ephemeralExpiration = message.ephemeralExpiration; + if (message.ephemeralSettingTimestamp != null && message.hasOwnProperty("ephemeralSettingTimestamp")) + if (typeof message.ephemeralSettingTimestamp === "number") + object.ephemeralSettingTimestamp = options.longs === String ? String(message.ephemeralSettingTimestamp) : message.ephemeralSettingTimestamp; + else + object.ephemeralSettingTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.ephemeralSettingTimestamp) : options.longs === Number ? new $util.LongBits(message.ephemeralSettingTimestamp.low >>> 0, message.ephemeralSettingTimestamp.high >>> 0).toNumber() : message.ephemeralSettingTimestamp; + if (message.endOfHistoryTransferType != null && message.hasOwnProperty("endOfHistoryTransferType")) + object.endOfHistoryTransferType = options.enums === String ? $root.proto.Conversation.EndOfHistoryTransferType[message.endOfHistoryTransferType] : message.endOfHistoryTransferType; + if (message.conversationTimestamp != null && message.hasOwnProperty("conversationTimestamp")) + if (typeof message.conversationTimestamp === "number") + object.conversationTimestamp = options.longs === String ? String(message.conversationTimestamp) : message.conversationTimestamp; + else + object.conversationTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.conversationTimestamp) : options.longs === Number ? new $util.LongBits(message.conversationTimestamp.low >>> 0, message.conversationTimestamp.high >>> 0).toNumber(true) : message.conversationTimestamp; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.pHash != null && message.hasOwnProperty("pHash")) + object.pHash = message.pHash; + if (message.notSpam != null && message.hasOwnProperty("notSpam")) + object.notSpam = message.notSpam; + if (message.archived != null && message.hasOwnProperty("archived")) + object.archived = message.archived; + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) + object.disappearingMode = $root.proto.DisappearingMode.toObject(message.disappearingMode, options); + if (message.unreadMentionCount != null && message.hasOwnProperty("unreadMentionCount")) + object.unreadMentionCount = message.unreadMentionCount; + if (message.markedAsUnread != null && message.hasOwnProperty("markedAsUnread")) + object.markedAsUnread = message.markedAsUnread; + if (message.participant && message.participant.length) { + object.participant = []; + for (var j = 0; j < message.participant.length; ++j) + object.participant[j] = $root.proto.GroupParticipant.toObject(message.participant[j], options); + } + if (message.tcToken != null && message.hasOwnProperty("tcToken")) + object.tcToken = options.bytes === String ? $util.base64.encode(message.tcToken, 0, message.tcToken.length) : options.bytes === Array ? Array.prototype.slice.call(message.tcToken) : message.tcToken; + if (message.tcTokenTimestamp != null && message.hasOwnProperty("tcTokenTimestamp")) + if (typeof message.tcTokenTimestamp === "number") + object.tcTokenTimestamp = options.longs === String ? String(message.tcTokenTimestamp) : message.tcTokenTimestamp; + else + object.tcTokenTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.tcTokenTimestamp) : options.longs === Number ? new $util.LongBits(message.tcTokenTimestamp.low >>> 0, message.tcTokenTimestamp.high >>> 0).toNumber(true) : message.tcTokenTimestamp; + if (message.contactPrimaryIdentityKey != null && message.hasOwnProperty("contactPrimaryIdentityKey")) + object.contactPrimaryIdentityKey = options.bytes === String ? $util.base64.encode(message.contactPrimaryIdentityKey, 0, message.contactPrimaryIdentityKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.contactPrimaryIdentityKey) : message.contactPrimaryIdentityKey; + if (message.pinned != null && message.hasOwnProperty("pinned")) + object.pinned = message.pinned; + if (message.muteEndTime != null && message.hasOwnProperty("muteEndTime")) + if (typeof message.muteEndTime === "number") + object.muteEndTime = options.longs === String ? String(message.muteEndTime) : message.muteEndTime; + else + object.muteEndTime = options.longs === String ? $util.Long.prototype.toString.call(message.muteEndTime) : options.longs === Number ? new $util.LongBits(message.muteEndTime.low >>> 0, message.muteEndTime.high >>> 0).toNumber(true) : message.muteEndTime; + if (message.wallpaper != null && message.hasOwnProperty("wallpaper")) + object.wallpaper = $root.proto.WallpaperSettings.toObject(message.wallpaper, options); + if (message.mediaVisibility != null && message.hasOwnProperty("mediaVisibility")) + object.mediaVisibility = options.enums === String ? $root.proto.MediaVisibility[message.mediaVisibility] : message.mediaVisibility; + if (message.tcTokenSenderTimestamp != null && message.hasOwnProperty("tcTokenSenderTimestamp")) + if (typeof message.tcTokenSenderTimestamp === "number") + object.tcTokenSenderTimestamp = options.longs === String ? String(message.tcTokenSenderTimestamp) : message.tcTokenSenderTimestamp; + else + object.tcTokenSenderTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.tcTokenSenderTimestamp) : options.longs === Number ? new $util.LongBits(message.tcTokenSenderTimestamp.low >>> 0, message.tcTokenSenderTimestamp.high >>> 0).toNumber(true) : message.tcTokenSenderTimestamp; + if (message.suspended != null && message.hasOwnProperty("suspended")) + object.suspended = message.suspended; + if (message.terminated != null && message.hasOwnProperty("terminated")) + object.terminated = message.terminated; + if (message.createdAt != null && message.hasOwnProperty("createdAt")) + if (typeof message.createdAt === "number") + object.createdAt = options.longs === String ? String(message.createdAt) : message.createdAt; + else + object.createdAt = options.longs === String ? $util.Long.prototype.toString.call(message.createdAt) : options.longs === Number ? new $util.LongBits(message.createdAt.low >>> 0, message.createdAt.high >>> 0).toNumber(true) : message.createdAt; + if (message.createdBy != null && message.hasOwnProperty("createdBy")) + object.createdBy = message.createdBy; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + if (message.support != null && message.hasOwnProperty("support")) + object.support = message.support; + if (message.isParentGroup != null && message.hasOwnProperty("isParentGroup")) + object.isParentGroup = message.isParentGroup; + if (message.isDefaultSubgroup != null && message.hasOwnProperty("isDefaultSubgroup")) + object.isDefaultSubgroup = message.isDefaultSubgroup; + if (message.parentGroupId != null && message.hasOwnProperty("parentGroupId")) + object.parentGroupId = message.parentGroupId; + if (message.displayName != null && message.hasOwnProperty("displayName")) + object.displayName = message.displayName; + if (message.pnJid != null && message.hasOwnProperty("pnJid")) + object.pnJid = message.pnJid; + if (message.shareOwnPn != null && message.hasOwnProperty("shareOwnPn")) + object.shareOwnPn = message.shareOwnPn; + if (message.pnhDuplicateLidThread != null && message.hasOwnProperty("pnhDuplicateLidThread")) + object.pnhDuplicateLidThread = message.pnhDuplicateLidThread; + if (message.lidJid != null && message.hasOwnProperty("lidJid")) + object.lidJid = message.lidJid; + return object; + }; + + /** + * Converts this Conversation to JSON. + * @function toJSON + * @memberof proto.Conversation + * @instance + * @returns {Object.} JSON object + */ + Conversation.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * EndOfHistoryTransferType enum. + * @name proto.Conversation.EndOfHistoryTransferType + * @enum {number} + * @property {number} COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY=0 COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY value + * @property {number} COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY=1 COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY value + */ + Conversation.EndOfHistoryTransferType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "COMPLETE_BUT_MORE_MESSAGES_REMAIN_ON_PRIMARY"] = 0; + values[valuesById[1] = "COMPLETE_AND_NO_MORE_MESSAGE_REMAIN_ON_PRIMARY"] = 1; + return values; + })(); + + return Conversation; + })(); + + proto.DeviceListMetadata = (function() { + + /** + * Properties of a DeviceListMetadata. + * @memberof proto + * @interface IDeviceListMetadata + * @property {Uint8Array|null} [senderKeyHash] DeviceListMetadata senderKeyHash + * @property {number|Long|null} [senderTimestamp] DeviceListMetadata senderTimestamp + * @property {Array.|null} [senderKeyIndexes] DeviceListMetadata senderKeyIndexes + * @property {Uint8Array|null} [recipientKeyHash] DeviceListMetadata recipientKeyHash + * @property {number|Long|null} [recipientTimestamp] DeviceListMetadata recipientTimestamp + * @property {Array.|null} [recipientKeyIndexes] DeviceListMetadata recipientKeyIndexes + */ + + /** + * Constructs a new DeviceListMetadata. + * @memberof proto + * @classdesc Represents a DeviceListMetadata. + * @implements IDeviceListMetadata + * @constructor + * @param {proto.IDeviceListMetadata=} [properties] Properties to set + */ + function DeviceListMetadata(properties) { + this.senderKeyIndexes = []; + this.recipientKeyIndexes = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DeviceListMetadata senderKeyHash. + * @member {Uint8Array} senderKeyHash + * @memberof proto.DeviceListMetadata + * @instance + */ + DeviceListMetadata.prototype.senderKeyHash = $util.newBuffer([]); + + /** + * DeviceListMetadata senderTimestamp. + * @member {number|Long} senderTimestamp + * @memberof proto.DeviceListMetadata + * @instance + */ + DeviceListMetadata.prototype.senderTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * DeviceListMetadata senderKeyIndexes. + * @member {Array.} senderKeyIndexes + * @memberof proto.DeviceListMetadata + * @instance + */ + DeviceListMetadata.prototype.senderKeyIndexes = $util.emptyArray; + + /** + * DeviceListMetadata recipientKeyHash. + * @member {Uint8Array} recipientKeyHash + * @memberof proto.DeviceListMetadata + * @instance + */ + DeviceListMetadata.prototype.recipientKeyHash = $util.newBuffer([]); + + /** + * DeviceListMetadata recipientTimestamp. + * @member {number|Long} recipientTimestamp + * @memberof proto.DeviceListMetadata + * @instance + */ + DeviceListMetadata.prototype.recipientTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * DeviceListMetadata recipientKeyIndexes. + * @member {Array.} recipientKeyIndexes + * @memberof proto.DeviceListMetadata + * @instance + */ + DeviceListMetadata.prototype.recipientKeyIndexes = $util.emptyArray; + + /** + * Creates a new DeviceListMetadata instance using the specified properties. + * @function create + * @memberof proto.DeviceListMetadata + * @static + * @param {proto.IDeviceListMetadata=} [properties] Properties to set + * @returns {proto.DeviceListMetadata} DeviceListMetadata instance + */ + DeviceListMetadata.create = function create(properties) { + return new DeviceListMetadata(properties); + }; + + /** + * Encodes the specified DeviceListMetadata message. Does not implicitly {@link proto.DeviceListMetadata.verify|verify} messages. + * @function encode + * @memberof proto.DeviceListMetadata + * @static + * @param {proto.IDeviceListMetadata} message DeviceListMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeviceListMetadata.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.senderKeyHash != null && Object.hasOwnProperty.call(message, "senderKeyHash")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.senderKeyHash); + if (message.senderTimestamp != null && Object.hasOwnProperty.call(message, "senderTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.senderTimestamp); + if (message.senderKeyIndexes != null && message.senderKeyIndexes.length) { + writer.uint32(/* id 3, wireType 2 =*/26).fork(); + for (var i = 0; i < message.senderKeyIndexes.length; ++i) + writer.uint32(message.senderKeyIndexes[i]); + writer.ldelim(); + } + if (message.recipientKeyHash != null && Object.hasOwnProperty.call(message, "recipientKeyHash")) + writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.recipientKeyHash); + if (message.recipientTimestamp != null && Object.hasOwnProperty.call(message, "recipientTimestamp")) + writer.uint32(/* id 9, wireType 0 =*/72).uint64(message.recipientTimestamp); + if (message.recipientKeyIndexes != null && message.recipientKeyIndexes.length) { + writer.uint32(/* id 10, wireType 2 =*/82).fork(); + for (var i = 0; i < message.recipientKeyIndexes.length; ++i) + writer.uint32(message.recipientKeyIndexes[i]); + writer.ldelim(); + } + return writer; + }; + + /** + * Encodes the specified DeviceListMetadata message, length delimited. Does not implicitly {@link proto.DeviceListMetadata.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.DeviceListMetadata + * @static + * @param {proto.IDeviceListMetadata} message DeviceListMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeviceListMetadata.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeviceListMetadata message from the specified reader or buffer. + * @function decode + * @memberof proto.DeviceListMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.DeviceListMetadata} DeviceListMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeviceListMetadata.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.DeviceListMetadata(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.senderKeyHash = reader.bytes(); + break; + case 2: + message.senderTimestamp = reader.uint64(); + break; + case 3: + if (!(message.senderKeyIndexes && message.senderKeyIndexes.length)) + message.senderKeyIndexes = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.senderKeyIndexes.push(reader.uint32()); + } else + message.senderKeyIndexes.push(reader.uint32()); + break; + case 8: + message.recipientKeyHash = reader.bytes(); + break; + case 9: + message.recipientTimestamp = reader.uint64(); + break; + case 10: + if (!(message.recipientKeyIndexes && message.recipientKeyIndexes.length)) + message.recipientKeyIndexes = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.recipientKeyIndexes.push(reader.uint32()); + } else + message.recipientKeyIndexes.push(reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeviceListMetadata message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.DeviceListMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.DeviceListMetadata} DeviceListMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeviceListMetadata.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeviceListMetadata message. + * @function verify + * @memberof proto.DeviceListMetadata + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeviceListMetadata.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.senderKeyHash != null && message.hasOwnProperty("senderKeyHash")) + if (!(message.senderKeyHash && typeof message.senderKeyHash.length === "number" || $util.isString(message.senderKeyHash))) + return "senderKeyHash: buffer expected"; + if (message.senderTimestamp != null && message.hasOwnProperty("senderTimestamp")) + if (!$util.isInteger(message.senderTimestamp) && !(message.senderTimestamp && $util.isInteger(message.senderTimestamp.low) && $util.isInteger(message.senderTimestamp.high))) + return "senderTimestamp: integer|Long expected"; + if (message.senderKeyIndexes != null && message.hasOwnProperty("senderKeyIndexes")) { + if (!Array.isArray(message.senderKeyIndexes)) + return "senderKeyIndexes: array expected"; + for (var i = 0; i < message.senderKeyIndexes.length; ++i) + if (!$util.isInteger(message.senderKeyIndexes[i])) + return "senderKeyIndexes: integer[] expected"; + } + if (message.recipientKeyHash != null && message.hasOwnProperty("recipientKeyHash")) + if (!(message.recipientKeyHash && typeof message.recipientKeyHash.length === "number" || $util.isString(message.recipientKeyHash))) + return "recipientKeyHash: buffer expected"; + if (message.recipientTimestamp != null && message.hasOwnProperty("recipientTimestamp")) + if (!$util.isInteger(message.recipientTimestamp) && !(message.recipientTimestamp && $util.isInteger(message.recipientTimestamp.low) && $util.isInteger(message.recipientTimestamp.high))) + return "recipientTimestamp: integer|Long expected"; + if (message.recipientKeyIndexes != null && message.hasOwnProperty("recipientKeyIndexes")) { + if (!Array.isArray(message.recipientKeyIndexes)) + return "recipientKeyIndexes: array expected"; + for (var i = 0; i < message.recipientKeyIndexes.length; ++i) + if (!$util.isInteger(message.recipientKeyIndexes[i])) + return "recipientKeyIndexes: integer[] expected"; + } + return null; + }; + + /** + * Creates a DeviceListMetadata message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.DeviceListMetadata + * @static + * @param {Object.} object Plain object + * @returns {proto.DeviceListMetadata} DeviceListMetadata + */ + DeviceListMetadata.fromObject = function fromObject(object) { + if (object instanceof $root.proto.DeviceListMetadata) + return object; + var message = new $root.proto.DeviceListMetadata(); + if (object.senderKeyHash != null) + if (typeof object.senderKeyHash === "string") + $util.base64.decode(object.senderKeyHash, message.senderKeyHash = $util.newBuffer($util.base64.length(object.senderKeyHash)), 0); + else if (object.senderKeyHash.length) + message.senderKeyHash = object.senderKeyHash; + if (object.senderTimestamp != null) + if ($util.Long) + (message.senderTimestamp = $util.Long.fromValue(object.senderTimestamp)).unsigned = true; + else if (typeof object.senderTimestamp === "string") + message.senderTimestamp = parseInt(object.senderTimestamp, 10); + else if (typeof object.senderTimestamp === "number") + message.senderTimestamp = object.senderTimestamp; + else if (typeof object.senderTimestamp === "object") + message.senderTimestamp = new $util.LongBits(object.senderTimestamp.low >>> 0, object.senderTimestamp.high >>> 0).toNumber(true); + if (object.senderKeyIndexes) { + if (!Array.isArray(object.senderKeyIndexes)) + throw TypeError(".proto.DeviceListMetadata.senderKeyIndexes: array expected"); + message.senderKeyIndexes = []; + for (var i = 0; i < object.senderKeyIndexes.length; ++i) + message.senderKeyIndexes[i] = object.senderKeyIndexes[i] >>> 0; + } + if (object.recipientKeyHash != null) + if (typeof object.recipientKeyHash === "string") + $util.base64.decode(object.recipientKeyHash, message.recipientKeyHash = $util.newBuffer($util.base64.length(object.recipientKeyHash)), 0); + else if (object.recipientKeyHash.length) + message.recipientKeyHash = object.recipientKeyHash; + if (object.recipientTimestamp != null) + if ($util.Long) + (message.recipientTimestamp = $util.Long.fromValue(object.recipientTimestamp)).unsigned = true; + else if (typeof object.recipientTimestamp === "string") + message.recipientTimestamp = parseInt(object.recipientTimestamp, 10); + else if (typeof object.recipientTimestamp === "number") + message.recipientTimestamp = object.recipientTimestamp; + else if (typeof object.recipientTimestamp === "object") + message.recipientTimestamp = new $util.LongBits(object.recipientTimestamp.low >>> 0, object.recipientTimestamp.high >>> 0).toNumber(true); + if (object.recipientKeyIndexes) { + if (!Array.isArray(object.recipientKeyIndexes)) + throw TypeError(".proto.DeviceListMetadata.recipientKeyIndexes: array expected"); + message.recipientKeyIndexes = []; + for (var i = 0; i < object.recipientKeyIndexes.length; ++i) + message.recipientKeyIndexes[i] = object.recipientKeyIndexes[i] >>> 0; + } + return message; + }; + + /** + * Creates a plain object from a DeviceListMetadata message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.DeviceListMetadata + * @static + * @param {proto.DeviceListMetadata} message DeviceListMetadata + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeviceListMetadata.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.senderKeyIndexes = []; + object.recipientKeyIndexes = []; + } + if (options.defaults) { + if (options.bytes === String) + object.senderKeyHash = ""; + else { + object.senderKeyHash = []; + if (options.bytes !== Array) + object.senderKeyHash = $util.newBuffer(object.senderKeyHash); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.senderTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.senderTimestamp = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.recipientKeyHash = ""; + else { + object.recipientKeyHash = []; + if (options.bytes !== Array) + object.recipientKeyHash = $util.newBuffer(object.recipientKeyHash); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.recipientTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.recipientTimestamp = options.longs === String ? "0" : 0; + } + if (message.senderKeyHash != null && message.hasOwnProperty("senderKeyHash")) + object.senderKeyHash = options.bytes === String ? $util.base64.encode(message.senderKeyHash, 0, message.senderKeyHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.senderKeyHash) : message.senderKeyHash; + if (message.senderTimestamp != null && message.hasOwnProperty("senderTimestamp")) + if (typeof message.senderTimestamp === "number") + object.senderTimestamp = options.longs === String ? String(message.senderTimestamp) : message.senderTimestamp; + else + object.senderTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.senderTimestamp) : options.longs === Number ? new $util.LongBits(message.senderTimestamp.low >>> 0, message.senderTimestamp.high >>> 0).toNumber(true) : message.senderTimestamp; + if (message.senderKeyIndexes && message.senderKeyIndexes.length) { + object.senderKeyIndexes = []; + for (var j = 0; j < message.senderKeyIndexes.length; ++j) + object.senderKeyIndexes[j] = message.senderKeyIndexes[j]; + } + if (message.recipientKeyHash != null && message.hasOwnProperty("recipientKeyHash")) + object.recipientKeyHash = options.bytes === String ? $util.base64.encode(message.recipientKeyHash, 0, message.recipientKeyHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.recipientKeyHash) : message.recipientKeyHash; + if (message.recipientTimestamp != null && message.hasOwnProperty("recipientTimestamp")) + if (typeof message.recipientTimestamp === "number") + object.recipientTimestamp = options.longs === String ? String(message.recipientTimestamp) : message.recipientTimestamp; + else + object.recipientTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.recipientTimestamp) : options.longs === Number ? new $util.LongBits(message.recipientTimestamp.low >>> 0, message.recipientTimestamp.high >>> 0).toNumber(true) : message.recipientTimestamp; + if (message.recipientKeyIndexes && message.recipientKeyIndexes.length) { + object.recipientKeyIndexes = []; + for (var j = 0; j < message.recipientKeyIndexes.length; ++j) + object.recipientKeyIndexes[j] = message.recipientKeyIndexes[j]; + } + return object; + }; + + /** + * Converts this DeviceListMetadata to JSON. + * @function toJSON + * @memberof proto.DeviceListMetadata + * @instance + * @returns {Object.} JSON object + */ + DeviceListMetadata.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DeviceListMetadata; + })(); + + proto.DeviceProps = (function() { + + /** + * Properties of a DeviceProps. + * @memberof proto + * @interface IDeviceProps + * @property {string|null} [os] DeviceProps os + * @property {proto.DeviceProps.IAppVersion|null} [version] DeviceProps version + * @property {proto.DeviceProps.PlatformType|null} [platformType] DeviceProps platformType + * @property {boolean|null} [requireFullSync] DeviceProps requireFullSync + * @property {proto.DeviceProps.IHistorySyncConfig|null} [historySyncConfig] DeviceProps historySyncConfig + */ + + /** + * Constructs a new DeviceProps. + * @memberof proto + * @classdesc Represents a DeviceProps. + * @implements IDeviceProps + * @constructor + * @param {proto.IDeviceProps=} [properties] Properties to set + */ + function DeviceProps(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DeviceProps os. + * @member {string} os + * @memberof proto.DeviceProps + * @instance + */ + DeviceProps.prototype.os = ""; + + /** + * DeviceProps version. + * @member {proto.DeviceProps.IAppVersion|null|undefined} version + * @memberof proto.DeviceProps + * @instance + */ + DeviceProps.prototype.version = null; + + /** + * DeviceProps platformType. + * @member {proto.DeviceProps.PlatformType} platformType + * @memberof proto.DeviceProps + * @instance + */ + DeviceProps.prototype.platformType = 0; + + /** + * DeviceProps requireFullSync. + * @member {boolean} requireFullSync + * @memberof proto.DeviceProps + * @instance + */ + DeviceProps.prototype.requireFullSync = false; + + /** + * DeviceProps historySyncConfig. + * @member {proto.DeviceProps.IHistorySyncConfig|null|undefined} historySyncConfig + * @memberof proto.DeviceProps + * @instance + */ + DeviceProps.prototype.historySyncConfig = null; + + /** + * Creates a new DeviceProps instance using the specified properties. + * @function create + * @memberof proto.DeviceProps + * @static + * @param {proto.IDeviceProps=} [properties] Properties to set + * @returns {proto.DeviceProps} DeviceProps instance + */ + DeviceProps.create = function create(properties) { + return new DeviceProps(properties); + }; + + /** + * Encodes the specified DeviceProps message. Does not implicitly {@link proto.DeviceProps.verify|verify} messages. + * @function encode + * @memberof proto.DeviceProps + * @static + * @param {proto.IDeviceProps} message DeviceProps message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeviceProps.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.os != null && Object.hasOwnProperty.call(message, "os")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.os); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + $root.proto.DeviceProps.AppVersion.encode(message.version, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.platformType != null && Object.hasOwnProperty.call(message, "platformType")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.platformType); + if (message.requireFullSync != null && Object.hasOwnProperty.call(message, "requireFullSync")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.requireFullSync); + if (message.historySyncConfig != null && Object.hasOwnProperty.call(message, "historySyncConfig")) + $root.proto.DeviceProps.HistorySyncConfig.encode(message.historySyncConfig, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified DeviceProps message, length delimited. Does not implicitly {@link proto.DeviceProps.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.DeviceProps + * @static + * @param {proto.IDeviceProps} message DeviceProps message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeviceProps.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeviceProps message from the specified reader or buffer. + * @function decode + * @memberof proto.DeviceProps + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.DeviceProps} DeviceProps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeviceProps.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.DeviceProps(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.os = reader.string(); + break; + case 2: + message.version = $root.proto.DeviceProps.AppVersion.decode(reader, reader.uint32()); + break; + case 3: + message.platformType = reader.int32(); + break; + case 4: + message.requireFullSync = reader.bool(); + break; + case 5: + message.historySyncConfig = $root.proto.DeviceProps.HistorySyncConfig.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeviceProps message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.DeviceProps + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.DeviceProps} DeviceProps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeviceProps.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeviceProps message. + * @function verify + * @memberof proto.DeviceProps + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeviceProps.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.os != null && message.hasOwnProperty("os")) + if (!$util.isString(message.os)) + return "os: string expected"; + if (message.version != null && message.hasOwnProperty("version")) { + var error = $root.proto.DeviceProps.AppVersion.verify(message.version); + if (error) + return "version." + error; + } + if (message.platformType != null && message.hasOwnProperty("platformType")) + switch (message.platformType) { + default: + return "platformType: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + break; + } + if (message.requireFullSync != null && message.hasOwnProperty("requireFullSync")) + if (typeof message.requireFullSync !== "boolean") + return "requireFullSync: boolean expected"; + if (message.historySyncConfig != null && message.hasOwnProperty("historySyncConfig")) { + var error = $root.proto.DeviceProps.HistorySyncConfig.verify(message.historySyncConfig); + if (error) + return "historySyncConfig." + error; + } + return null; + }; + + /** + * Creates a DeviceProps message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.DeviceProps + * @static + * @param {Object.} object Plain object + * @returns {proto.DeviceProps} DeviceProps + */ + DeviceProps.fromObject = function fromObject(object) { + if (object instanceof $root.proto.DeviceProps) + return object; + var message = new $root.proto.DeviceProps(); + if (object.os != null) + message.os = String(object.os); + if (object.version != null) { + if (typeof object.version !== "object") + throw TypeError(".proto.DeviceProps.version: object expected"); + message.version = $root.proto.DeviceProps.AppVersion.fromObject(object.version); + } + switch (object.platformType) { + case "UNKNOWN": + case 0: + message.platformType = 0; + break; + case "CHROME": + case 1: + message.platformType = 1; + break; + case "FIREFOX": + case 2: + message.platformType = 2; + break; + case "IE": + case 3: + message.platformType = 3; + break; + case "OPERA": + case 4: + message.platformType = 4; + break; + case "SAFARI": + case 5: + message.platformType = 5; + break; + case "EDGE": + case 6: + message.platformType = 6; + break; + case "DESKTOP": + case 7: + message.platformType = 7; + break; + case "IPAD": + case 8: + message.platformType = 8; + break; + case "ANDROID_TABLET": + case 9: + message.platformType = 9; + break; + case "OHANA": + case 10: + message.platformType = 10; + break; + case "ALOHA": + case 11: + message.platformType = 11; + break; + case "CATALINA": + case 12: + message.platformType = 12; + break; + case "TCL_TV": + case 13: + message.platformType = 13; + break; + } + if (object.requireFullSync != null) + message.requireFullSync = Boolean(object.requireFullSync); + if (object.historySyncConfig != null) { + if (typeof object.historySyncConfig !== "object") + throw TypeError(".proto.DeviceProps.historySyncConfig: object expected"); + message.historySyncConfig = $root.proto.DeviceProps.HistorySyncConfig.fromObject(object.historySyncConfig); + } + return message; + }; + + /** + * Creates a plain object from a DeviceProps message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.DeviceProps + * @static + * @param {proto.DeviceProps} message DeviceProps + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeviceProps.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.os = ""; + object.version = null; + object.platformType = options.enums === String ? "UNKNOWN" : 0; + object.requireFullSync = false; + object.historySyncConfig = null; + } + if (message.os != null && message.hasOwnProperty("os")) + object.os = message.os; + if (message.version != null && message.hasOwnProperty("version")) + object.version = $root.proto.DeviceProps.AppVersion.toObject(message.version, options); + if (message.platformType != null && message.hasOwnProperty("platformType")) + object.platformType = options.enums === String ? $root.proto.DeviceProps.PlatformType[message.platformType] : message.platformType; + if (message.requireFullSync != null && message.hasOwnProperty("requireFullSync")) + object.requireFullSync = message.requireFullSync; + if (message.historySyncConfig != null && message.hasOwnProperty("historySyncConfig")) + object.historySyncConfig = $root.proto.DeviceProps.HistorySyncConfig.toObject(message.historySyncConfig, options); + return object; + }; + + /** + * Converts this DeviceProps to JSON. + * @function toJSON + * @memberof proto.DeviceProps + * @instance + * @returns {Object.} JSON object + */ + DeviceProps.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + DeviceProps.AppVersion = (function() { + + /** + * Properties of an AppVersion. + * @memberof proto.DeviceProps + * @interface IAppVersion + * @property {number|null} [primary] AppVersion primary + * @property {number|null} [secondary] AppVersion secondary + * @property {number|null} [tertiary] AppVersion tertiary + * @property {number|null} [quaternary] AppVersion quaternary + * @property {number|null} [quinary] AppVersion quinary + */ + + /** + * Constructs a new AppVersion. + * @memberof proto.DeviceProps + * @classdesc Represents an AppVersion. + * @implements IAppVersion + * @constructor + * @param {proto.DeviceProps.IAppVersion=} [properties] Properties to set + */ + function AppVersion(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppVersion primary. + * @member {number} primary + * @memberof proto.DeviceProps.AppVersion + * @instance + */ + AppVersion.prototype.primary = 0; + + /** + * AppVersion secondary. + * @member {number} secondary + * @memberof proto.DeviceProps.AppVersion + * @instance + */ + AppVersion.prototype.secondary = 0; + + /** + * AppVersion tertiary. + * @member {number} tertiary + * @memberof proto.DeviceProps.AppVersion + * @instance + */ + AppVersion.prototype.tertiary = 0; + + /** + * AppVersion quaternary. + * @member {number} quaternary + * @memberof proto.DeviceProps.AppVersion + * @instance + */ + AppVersion.prototype.quaternary = 0; + + /** + * AppVersion quinary. + * @member {number} quinary + * @memberof proto.DeviceProps.AppVersion + * @instance + */ + AppVersion.prototype.quinary = 0; + + /** + * Creates a new AppVersion instance using the specified properties. + * @function create + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {proto.DeviceProps.IAppVersion=} [properties] Properties to set + * @returns {proto.DeviceProps.AppVersion} AppVersion instance + */ + AppVersion.create = function create(properties) { + return new AppVersion(properties); + }; + + /** + * Encodes the specified AppVersion message. Does not implicitly {@link proto.DeviceProps.AppVersion.verify|verify} messages. + * @function encode + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {proto.DeviceProps.IAppVersion} message AppVersion message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppVersion.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.primary != null && Object.hasOwnProperty.call(message, "primary")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.primary); + if (message.secondary != null && Object.hasOwnProperty.call(message, "secondary")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.secondary); + if (message.tertiary != null && Object.hasOwnProperty.call(message, "tertiary")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.tertiary); + if (message.quaternary != null && Object.hasOwnProperty.call(message, "quaternary")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.quaternary); + if (message.quinary != null && Object.hasOwnProperty.call(message, "quinary")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.quinary); + return writer; + }; + + /** + * Encodes the specified AppVersion message, length delimited. Does not implicitly {@link proto.DeviceProps.AppVersion.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {proto.DeviceProps.IAppVersion} message AppVersion message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppVersion.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppVersion message from the specified reader or buffer. + * @function decode + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.DeviceProps.AppVersion} AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppVersion.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.DeviceProps.AppVersion(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.primary = reader.uint32(); + break; + case 2: + message.secondary = reader.uint32(); + break; + case 3: + message.tertiary = reader.uint32(); + break; + case 4: + message.quaternary = reader.uint32(); + break; + case 5: + message.quinary = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppVersion message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.DeviceProps.AppVersion} AppVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppVersion.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppVersion message. + * @function verify + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppVersion.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.primary != null && message.hasOwnProperty("primary")) + if (!$util.isInteger(message.primary)) + return "primary: integer expected"; + if (message.secondary != null && message.hasOwnProperty("secondary")) + if (!$util.isInteger(message.secondary)) + return "secondary: integer expected"; + if (message.tertiary != null && message.hasOwnProperty("tertiary")) + if (!$util.isInteger(message.tertiary)) + return "tertiary: integer expected"; + if (message.quaternary != null && message.hasOwnProperty("quaternary")) + if (!$util.isInteger(message.quaternary)) + return "quaternary: integer expected"; + if (message.quinary != null && message.hasOwnProperty("quinary")) + if (!$util.isInteger(message.quinary)) + return "quinary: integer expected"; + return null; + }; + + /** + * Creates an AppVersion message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {Object.} object Plain object + * @returns {proto.DeviceProps.AppVersion} AppVersion + */ + AppVersion.fromObject = function fromObject(object) { + if (object instanceof $root.proto.DeviceProps.AppVersion) + return object; + var message = new $root.proto.DeviceProps.AppVersion(); + if (object.primary != null) + message.primary = object.primary >>> 0; + if (object.secondary != null) + message.secondary = object.secondary >>> 0; + if (object.tertiary != null) + message.tertiary = object.tertiary >>> 0; + if (object.quaternary != null) + message.quaternary = object.quaternary >>> 0; + if (object.quinary != null) + message.quinary = object.quinary >>> 0; + return message; + }; + + /** + * Creates a plain object from an AppVersion message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.DeviceProps.AppVersion + * @static + * @param {proto.DeviceProps.AppVersion} message AppVersion + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppVersion.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.primary = 0; + object.secondary = 0; + object.tertiary = 0; + object.quaternary = 0; + object.quinary = 0; + } + if (message.primary != null && message.hasOwnProperty("primary")) + object.primary = message.primary; + if (message.secondary != null && message.hasOwnProperty("secondary")) + object.secondary = message.secondary; + if (message.tertiary != null && message.hasOwnProperty("tertiary")) + object.tertiary = message.tertiary; + if (message.quaternary != null && message.hasOwnProperty("quaternary")) + object.quaternary = message.quaternary; + if (message.quinary != null && message.hasOwnProperty("quinary")) + object.quinary = message.quinary; + return object; + }; + + /** + * Converts this AppVersion to JSON. + * @function toJSON + * @memberof proto.DeviceProps.AppVersion + * @instance + * @returns {Object.} JSON object + */ + AppVersion.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppVersion; + })(); + + DeviceProps.HistorySyncConfig = (function() { + + /** + * Properties of a HistorySyncConfig. + * @memberof proto.DeviceProps + * @interface IHistorySyncConfig + * @property {number|null} [fullSyncDaysLimit] HistorySyncConfig fullSyncDaysLimit + * @property {number|null} [fullSyncSizeMbLimit] HistorySyncConfig fullSyncSizeMbLimit + * @property {number|null} [storageQuotaMb] HistorySyncConfig storageQuotaMb + */ + + /** + * Constructs a new HistorySyncConfig. + * @memberof proto.DeviceProps + * @classdesc Represents a HistorySyncConfig. + * @implements IHistorySyncConfig + * @constructor + * @param {proto.DeviceProps.IHistorySyncConfig=} [properties] Properties to set + */ + function HistorySyncConfig(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HistorySyncConfig fullSyncDaysLimit. + * @member {number} fullSyncDaysLimit + * @memberof proto.DeviceProps.HistorySyncConfig + * @instance + */ + HistorySyncConfig.prototype.fullSyncDaysLimit = 0; + + /** + * HistorySyncConfig fullSyncSizeMbLimit. + * @member {number} fullSyncSizeMbLimit + * @memberof proto.DeviceProps.HistorySyncConfig + * @instance + */ + HistorySyncConfig.prototype.fullSyncSizeMbLimit = 0; + + /** + * HistorySyncConfig storageQuotaMb. + * @member {number} storageQuotaMb + * @memberof proto.DeviceProps.HistorySyncConfig + * @instance + */ + HistorySyncConfig.prototype.storageQuotaMb = 0; + + /** + * Creates a new HistorySyncConfig instance using the specified properties. + * @function create + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {proto.DeviceProps.IHistorySyncConfig=} [properties] Properties to set + * @returns {proto.DeviceProps.HistorySyncConfig} HistorySyncConfig instance + */ + HistorySyncConfig.create = function create(properties) { + return new HistorySyncConfig(properties); + }; + + /** + * Encodes the specified HistorySyncConfig message. Does not implicitly {@link proto.DeviceProps.HistorySyncConfig.verify|verify} messages. + * @function encode + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {proto.DeviceProps.IHistorySyncConfig} message HistorySyncConfig message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySyncConfig.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.fullSyncDaysLimit != null && Object.hasOwnProperty.call(message, "fullSyncDaysLimit")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.fullSyncDaysLimit); + if (message.fullSyncSizeMbLimit != null && Object.hasOwnProperty.call(message, "fullSyncSizeMbLimit")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.fullSyncSizeMbLimit); + if (message.storageQuotaMb != null && Object.hasOwnProperty.call(message, "storageQuotaMb")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.storageQuotaMb); + return writer; + }; + + /** + * Encodes the specified HistorySyncConfig message, length delimited. Does not implicitly {@link proto.DeviceProps.HistorySyncConfig.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {proto.DeviceProps.IHistorySyncConfig} message HistorySyncConfig message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySyncConfig.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HistorySyncConfig message from the specified reader or buffer. + * @function decode + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.DeviceProps.HistorySyncConfig} HistorySyncConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySyncConfig.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.DeviceProps.HistorySyncConfig(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fullSyncDaysLimit = reader.uint32(); + break; + case 2: + message.fullSyncSizeMbLimit = reader.uint32(); + break; + case 3: + message.storageQuotaMb = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HistorySyncConfig message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.DeviceProps.HistorySyncConfig} HistorySyncConfig + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySyncConfig.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HistorySyncConfig message. + * @function verify + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HistorySyncConfig.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.fullSyncDaysLimit != null && message.hasOwnProperty("fullSyncDaysLimit")) + if (!$util.isInteger(message.fullSyncDaysLimit)) + return "fullSyncDaysLimit: integer expected"; + if (message.fullSyncSizeMbLimit != null && message.hasOwnProperty("fullSyncSizeMbLimit")) + if (!$util.isInteger(message.fullSyncSizeMbLimit)) + return "fullSyncSizeMbLimit: integer expected"; + if (message.storageQuotaMb != null && message.hasOwnProperty("storageQuotaMb")) + if (!$util.isInteger(message.storageQuotaMb)) + return "storageQuotaMb: integer expected"; + return null; + }; + + /** + * Creates a HistorySyncConfig message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {Object.} object Plain object + * @returns {proto.DeviceProps.HistorySyncConfig} HistorySyncConfig + */ + HistorySyncConfig.fromObject = function fromObject(object) { + if (object instanceof $root.proto.DeviceProps.HistorySyncConfig) + return object; + var message = new $root.proto.DeviceProps.HistorySyncConfig(); + if (object.fullSyncDaysLimit != null) + message.fullSyncDaysLimit = object.fullSyncDaysLimit >>> 0; + if (object.fullSyncSizeMbLimit != null) + message.fullSyncSizeMbLimit = object.fullSyncSizeMbLimit >>> 0; + if (object.storageQuotaMb != null) + message.storageQuotaMb = object.storageQuotaMb >>> 0; + return message; + }; + + /** + * Creates a plain object from a HistorySyncConfig message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.DeviceProps.HistorySyncConfig + * @static + * @param {proto.DeviceProps.HistorySyncConfig} message HistorySyncConfig + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HistorySyncConfig.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.fullSyncDaysLimit = 0; + object.fullSyncSizeMbLimit = 0; + object.storageQuotaMb = 0; + } + if (message.fullSyncDaysLimit != null && message.hasOwnProperty("fullSyncDaysLimit")) + object.fullSyncDaysLimit = message.fullSyncDaysLimit; + if (message.fullSyncSizeMbLimit != null && message.hasOwnProperty("fullSyncSizeMbLimit")) + object.fullSyncSizeMbLimit = message.fullSyncSizeMbLimit; + if (message.storageQuotaMb != null && message.hasOwnProperty("storageQuotaMb")) + object.storageQuotaMb = message.storageQuotaMb; + return object; + }; + + /** + * Converts this HistorySyncConfig to JSON. + * @function toJSON + * @memberof proto.DeviceProps.HistorySyncConfig + * @instance + * @returns {Object.} JSON object + */ + HistorySyncConfig.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HistorySyncConfig; + })(); + + /** + * PlatformType enum. + * @name proto.DeviceProps.PlatformType + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} CHROME=1 CHROME value + * @property {number} FIREFOX=2 FIREFOX value + * @property {number} IE=3 IE value + * @property {number} OPERA=4 OPERA value + * @property {number} SAFARI=5 SAFARI value + * @property {number} EDGE=6 EDGE value + * @property {number} DESKTOP=7 DESKTOP value + * @property {number} IPAD=8 IPAD value + * @property {number} ANDROID_TABLET=9 ANDROID_TABLET value + * @property {number} OHANA=10 OHANA value + * @property {number} ALOHA=11 ALOHA value + * @property {number} CATALINA=12 CATALINA value + * @property {number} TCL_TV=13 TCL_TV value + */ + DeviceProps.PlatformType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "CHROME"] = 1; + values[valuesById[2] = "FIREFOX"] = 2; + values[valuesById[3] = "IE"] = 3; + values[valuesById[4] = "OPERA"] = 4; + values[valuesById[5] = "SAFARI"] = 5; + values[valuesById[6] = "EDGE"] = 6; + values[valuesById[7] = "DESKTOP"] = 7; + values[valuesById[8] = "IPAD"] = 8; + values[valuesById[9] = "ANDROID_TABLET"] = 9; + values[valuesById[10] = "OHANA"] = 10; + values[valuesById[11] = "ALOHA"] = 11; + values[valuesById[12] = "CATALINA"] = 12; + values[valuesById[13] = "TCL_TV"] = 13; + return values; + })(); + + return DeviceProps; + })(); + + proto.DisappearingMode = (function() { + + /** + * Properties of a DisappearingMode. + * @memberof proto + * @interface IDisappearingMode + * @property {proto.DisappearingMode.Initiator|null} [initiator] DisappearingMode initiator + */ + + /** + * Constructs a new DisappearingMode. + * @memberof proto + * @classdesc Represents a DisappearingMode. + * @implements IDisappearingMode + * @constructor + * @param {proto.IDisappearingMode=} [properties] Properties to set + */ + function DisappearingMode(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DisappearingMode initiator. + * @member {proto.DisappearingMode.Initiator} initiator + * @memberof proto.DisappearingMode + * @instance + */ + DisappearingMode.prototype.initiator = 0; + + /** + * Creates a new DisappearingMode instance using the specified properties. + * @function create + * @memberof proto.DisappearingMode + * @static + * @param {proto.IDisappearingMode=} [properties] Properties to set + * @returns {proto.DisappearingMode} DisappearingMode instance + */ + DisappearingMode.create = function create(properties) { + return new DisappearingMode(properties); + }; + + /** + * Encodes the specified DisappearingMode message. Does not implicitly {@link proto.DisappearingMode.verify|verify} messages. + * @function encode + * @memberof proto.DisappearingMode + * @static + * @param {proto.IDisappearingMode} message DisappearingMode message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DisappearingMode.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.initiator != null && Object.hasOwnProperty.call(message, "initiator")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.initiator); + return writer; + }; + + /** + * Encodes the specified DisappearingMode message, length delimited. Does not implicitly {@link proto.DisappearingMode.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.DisappearingMode + * @static + * @param {proto.IDisappearingMode} message DisappearingMode message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DisappearingMode.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DisappearingMode message from the specified reader or buffer. + * @function decode + * @memberof proto.DisappearingMode + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.DisappearingMode} DisappearingMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DisappearingMode.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.DisappearingMode(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.initiator = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DisappearingMode message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.DisappearingMode + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.DisappearingMode} DisappearingMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DisappearingMode.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DisappearingMode message. + * @function verify + * @memberof proto.DisappearingMode + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DisappearingMode.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.initiator != null && message.hasOwnProperty("initiator")) + switch (message.initiator) { + default: + return "initiator: enum value expected"; + case 0: + case 1: + case 2: + break; + } + return null; + }; + + /** + * Creates a DisappearingMode message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.DisappearingMode + * @static + * @param {Object.} object Plain object + * @returns {proto.DisappearingMode} DisappearingMode + */ + DisappearingMode.fromObject = function fromObject(object) { + if (object instanceof $root.proto.DisappearingMode) + return object; + var message = new $root.proto.DisappearingMode(); + switch (object.initiator) { + case "CHANGED_IN_CHAT": + case 0: + message.initiator = 0; + break; + case "INITIATED_BY_ME": + case 1: + message.initiator = 1; + break; + case "INITIATED_BY_OTHER": + case 2: + message.initiator = 2; + break; + } + return message; + }; + + /** + * Creates a plain object from a DisappearingMode message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.DisappearingMode + * @static + * @param {proto.DisappearingMode} message DisappearingMode + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DisappearingMode.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.initiator = options.enums === String ? "CHANGED_IN_CHAT" : 0; + if (message.initiator != null && message.hasOwnProperty("initiator")) + object.initiator = options.enums === String ? $root.proto.DisappearingMode.Initiator[message.initiator] : message.initiator; + return object; + }; + + /** + * Converts this DisappearingMode to JSON. + * @function toJSON + * @memberof proto.DisappearingMode + * @instance + * @returns {Object.} JSON object + */ + DisappearingMode.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Initiator enum. + * @name proto.DisappearingMode.Initiator + * @enum {number} + * @property {number} CHANGED_IN_CHAT=0 CHANGED_IN_CHAT value + * @property {number} INITIATED_BY_ME=1 INITIATED_BY_ME value + * @property {number} INITIATED_BY_OTHER=2 INITIATED_BY_OTHER value + */ + DisappearingMode.Initiator = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "CHANGED_IN_CHAT"] = 0; + values[valuesById[1] = "INITIATED_BY_ME"] = 1; + values[valuesById[2] = "INITIATED_BY_OTHER"] = 2; + return values; + })(); + + return DisappearingMode; + })(); + + proto.EphemeralSetting = (function() { + + /** + * Properties of an EphemeralSetting. + * @memberof proto + * @interface IEphemeralSetting + * @property {number|null} [duration] EphemeralSetting duration + * @property {number|Long|null} [timestamp] EphemeralSetting timestamp + */ + + /** + * Constructs a new EphemeralSetting. + * @memberof proto + * @classdesc Represents an EphemeralSetting. + * @implements IEphemeralSetting + * @constructor + * @param {proto.IEphemeralSetting=} [properties] Properties to set + */ + function EphemeralSetting(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * EphemeralSetting duration. + * @member {number} duration + * @memberof proto.EphemeralSetting + * @instance + */ + EphemeralSetting.prototype.duration = 0; + + /** + * EphemeralSetting timestamp. + * @member {number|Long} timestamp + * @memberof proto.EphemeralSetting + * @instance + */ + EphemeralSetting.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new EphemeralSetting instance using the specified properties. + * @function create + * @memberof proto.EphemeralSetting + * @static + * @param {proto.IEphemeralSetting=} [properties] Properties to set + * @returns {proto.EphemeralSetting} EphemeralSetting instance + */ + EphemeralSetting.create = function create(properties) { + return new EphemeralSetting(properties); + }; + + /** + * Encodes the specified EphemeralSetting message. Does not implicitly {@link proto.EphemeralSetting.verify|verify} messages. + * @function encode + * @memberof proto.EphemeralSetting + * @static + * @param {proto.IEphemeralSetting} message EphemeralSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + EphemeralSetting.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.duration != null && Object.hasOwnProperty.call(message, "duration")) + writer.uint32(/* id 1, wireType 5 =*/13).sfixed32(message.duration); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 2, wireType 1 =*/17).sfixed64(message.timestamp); + return writer; + }; + + /** + * Encodes the specified EphemeralSetting message, length delimited. Does not implicitly {@link proto.EphemeralSetting.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.EphemeralSetting + * @static + * @param {proto.IEphemeralSetting} message EphemeralSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + EphemeralSetting.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an EphemeralSetting message from the specified reader or buffer. + * @function decode + * @memberof proto.EphemeralSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.EphemeralSetting} EphemeralSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + EphemeralSetting.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.EphemeralSetting(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.duration = reader.sfixed32(); + break; + case 2: + message.timestamp = reader.sfixed64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an EphemeralSetting message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.EphemeralSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.EphemeralSetting} EphemeralSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + EphemeralSetting.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an EphemeralSetting message. + * @function verify + * @memberof proto.EphemeralSetting + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + EphemeralSetting.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.duration != null && message.hasOwnProperty("duration")) + if (!$util.isInteger(message.duration)) + return "duration: integer expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + return null; + }; + + /** + * Creates an EphemeralSetting message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.EphemeralSetting + * @static + * @param {Object.} object Plain object + * @returns {proto.EphemeralSetting} EphemeralSetting + */ + EphemeralSetting.fromObject = function fromObject(object) { + if (object instanceof $root.proto.EphemeralSetting) + return object; + var message = new $root.proto.EphemeralSetting(); + if (object.duration != null) + message.duration = object.duration | 0; + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from an EphemeralSetting message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.EphemeralSetting + * @static + * @param {proto.EphemeralSetting} message EphemeralSetting + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + EphemeralSetting.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.duration = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + } + if (message.duration != null && message.hasOwnProperty("duration")) + object.duration = message.duration; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp; + return object; + }; + + /** + * Converts this EphemeralSetting to JSON. + * @function toJSON + * @memberof proto.EphemeralSetting + * @instance + * @returns {Object.} JSON object + */ + EphemeralSetting.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return EphemeralSetting; + })(); + + proto.ExitCode = (function() { + + /** + * Properties of an ExitCode. + * @memberof proto + * @interface IExitCode + * @property {number|Long|null} [code] ExitCode code + * @property {string|null} [text] ExitCode text + */ + + /** + * Constructs a new ExitCode. + * @memberof proto + * @classdesc Represents an ExitCode. + * @implements IExitCode + * @constructor + * @param {proto.IExitCode=} [properties] Properties to set + */ + function ExitCode(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExitCode code. + * @member {number|Long} code + * @memberof proto.ExitCode + * @instance + */ + ExitCode.prototype.code = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ExitCode text. + * @member {string} text + * @memberof proto.ExitCode + * @instance + */ + ExitCode.prototype.text = ""; + + /** + * Creates a new ExitCode instance using the specified properties. + * @function create + * @memberof proto.ExitCode + * @static + * @param {proto.IExitCode=} [properties] Properties to set + * @returns {proto.ExitCode} ExitCode instance + */ + ExitCode.create = function create(properties) { + return new ExitCode(properties); + }; + + /** + * Encodes the specified ExitCode message. Does not implicitly {@link proto.ExitCode.verify|verify} messages. + * @function encode + * @memberof proto.ExitCode + * @static + * @param {proto.IExitCode} message ExitCode message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExitCode.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.code != null && Object.hasOwnProperty.call(message, "code")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.code); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.text); + return writer; + }; + + /** + * Encodes the specified ExitCode message, length delimited. Does not implicitly {@link proto.ExitCode.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ExitCode + * @static + * @param {proto.IExitCode} message ExitCode message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExitCode.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExitCode message from the specified reader or buffer. + * @function decode + * @memberof proto.ExitCode + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ExitCode} ExitCode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExitCode.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ExitCode(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.code = reader.uint64(); + break; + case 2: + message.text = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExitCode message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ExitCode + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ExitCode} ExitCode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExitCode.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExitCode message. + * @function verify + * @memberof proto.ExitCode + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExitCode.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.code != null && message.hasOwnProperty("code")) + if (!$util.isInteger(message.code) && !(message.code && $util.isInteger(message.code.low) && $util.isInteger(message.code.high))) + return "code: integer|Long expected"; + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + return null; + }; + + /** + * Creates an ExitCode message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ExitCode + * @static + * @param {Object.} object Plain object + * @returns {proto.ExitCode} ExitCode + */ + ExitCode.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ExitCode) + return object; + var message = new $root.proto.ExitCode(); + if (object.code != null) + if ($util.Long) + (message.code = $util.Long.fromValue(object.code)).unsigned = true; + else if (typeof object.code === "string") + message.code = parseInt(object.code, 10); + else if (typeof object.code === "number") + message.code = object.code; + else if (typeof object.code === "object") + message.code = new $util.LongBits(object.code.low >>> 0, object.code.high >>> 0).toNumber(true); + if (object.text != null) + message.text = String(object.text); + return message; + }; + + /** + * Creates a plain object from an ExitCode message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ExitCode + * @static + * @param {proto.ExitCode} message ExitCode + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExitCode.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.code = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.code = options.longs === String ? "0" : 0; + object.text = ""; + } + if (message.code != null && message.hasOwnProperty("code")) + if (typeof message.code === "number") + object.code = options.longs === String ? String(message.code) : message.code; + else + object.code = options.longs === String ? $util.Long.prototype.toString.call(message.code) : options.longs === Number ? new $util.LongBits(message.code.low >>> 0, message.code.high >>> 0).toNumber(true) : message.code; + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + return object; + }; + + /** + * Converts this ExitCode to JSON. + * @function toJSON + * @memberof proto.ExitCode + * @instance + * @returns {Object.} JSON object + */ + ExitCode.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ExitCode; + })(); + + proto.ExternalBlobReference = (function() { + + /** + * Properties of an ExternalBlobReference. + * @memberof proto + * @interface IExternalBlobReference + * @property {Uint8Array|null} [mediaKey] ExternalBlobReference mediaKey + * @property {string|null} [directPath] ExternalBlobReference directPath + * @property {string|null} [handle] ExternalBlobReference handle + * @property {number|Long|null} [fileSizeBytes] ExternalBlobReference fileSizeBytes + * @property {Uint8Array|null} [fileSha256] ExternalBlobReference fileSha256 + * @property {Uint8Array|null} [fileEncSha256] ExternalBlobReference fileEncSha256 + */ + + /** + * Constructs a new ExternalBlobReference. + * @memberof proto + * @classdesc Represents an ExternalBlobReference. + * @implements IExternalBlobReference + * @constructor + * @param {proto.IExternalBlobReference=} [properties] Properties to set + */ + function ExternalBlobReference(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExternalBlobReference mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.ExternalBlobReference + * @instance + */ + ExternalBlobReference.prototype.mediaKey = $util.newBuffer([]); + + /** + * ExternalBlobReference directPath. + * @member {string} directPath + * @memberof proto.ExternalBlobReference + * @instance + */ + ExternalBlobReference.prototype.directPath = ""; + + /** + * ExternalBlobReference handle. + * @member {string} handle + * @memberof proto.ExternalBlobReference + * @instance + */ + ExternalBlobReference.prototype.handle = ""; + + /** + * ExternalBlobReference fileSizeBytes. + * @member {number|Long} fileSizeBytes + * @memberof proto.ExternalBlobReference + * @instance + */ + ExternalBlobReference.prototype.fileSizeBytes = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ExternalBlobReference fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.ExternalBlobReference + * @instance + */ + ExternalBlobReference.prototype.fileSha256 = $util.newBuffer([]); + + /** + * ExternalBlobReference fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.ExternalBlobReference + * @instance + */ + ExternalBlobReference.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * Creates a new ExternalBlobReference instance using the specified properties. + * @function create + * @memberof proto.ExternalBlobReference + * @static + * @param {proto.IExternalBlobReference=} [properties] Properties to set + * @returns {proto.ExternalBlobReference} ExternalBlobReference instance + */ + ExternalBlobReference.create = function create(properties) { + return new ExternalBlobReference(properties); + }; + + /** + * Encodes the specified ExternalBlobReference message. Does not implicitly {@link proto.ExternalBlobReference.verify|verify} messages. + * @function encode + * @memberof proto.ExternalBlobReference + * @static + * @param {proto.IExternalBlobReference} message ExternalBlobReference message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExternalBlobReference.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.mediaKey); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.directPath); + if (message.handle != null && Object.hasOwnProperty.call(message, "handle")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.handle); + if (message.fileSizeBytes != null && Object.hasOwnProperty.call(message, "fileSizeBytes")) + writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.fileSizeBytes); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.fileSha256); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.fileEncSha256); + return writer; + }; + + /** + * Encodes the specified ExternalBlobReference message, length delimited. Does not implicitly {@link proto.ExternalBlobReference.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ExternalBlobReference + * @static + * @param {proto.IExternalBlobReference} message ExternalBlobReference message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExternalBlobReference.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExternalBlobReference message from the specified reader or buffer. + * @function decode + * @memberof proto.ExternalBlobReference + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ExternalBlobReference} ExternalBlobReference + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExternalBlobReference.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ExternalBlobReference(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.mediaKey = reader.bytes(); + break; + case 2: + message.directPath = reader.string(); + break; + case 3: + message.handle = reader.string(); + break; + case 4: + message.fileSizeBytes = reader.uint64(); + break; + case 5: + message.fileSha256 = reader.bytes(); + break; + case 6: + message.fileEncSha256 = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExternalBlobReference message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ExternalBlobReference + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ExternalBlobReference} ExternalBlobReference + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExternalBlobReference.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExternalBlobReference message. + * @function verify + * @memberof proto.ExternalBlobReference + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExternalBlobReference.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.handle != null && message.hasOwnProperty("handle")) + if (!$util.isString(message.handle)) + return "handle: string expected"; + if (message.fileSizeBytes != null && message.hasOwnProperty("fileSizeBytes")) + if (!$util.isInteger(message.fileSizeBytes) && !(message.fileSizeBytes && $util.isInteger(message.fileSizeBytes.low) && $util.isInteger(message.fileSizeBytes.high))) + return "fileSizeBytes: integer|Long expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + return null; + }; + + /** + * Creates an ExternalBlobReference message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ExternalBlobReference + * @static + * @param {Object.} object Plain object + * @returns {proto.ExternalBlobReference} ExternalBlobReference + */ + ExternalBlobReference.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ExternalBlobReference) + return object; + var message = new $root.proto.ExternalBlobReference(); + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.handle != null) + message.handle = String(object.handle); + if (object.fileSizeBytes != null) + if ($util.Long) + (message.fileSizeBytes = $util.Long.fromValue(object.fileSizeBytes)).unsigned = true; + else if (typeof object.fileSizeBytes === "string") + message.fileSizeBytes = parseInt(object.fileSizeBytes, 10); + else if (typeof object.fileSizeBytes === "number") + message.fileSizeBytes = object.fileSizeBytes; + else if (typeof object.fileSizeBytes === "object") + message.fileSizeBytes = new $util.LongBits(object.fileSizeBytes.low >>> 0, object.fileSizeBytes.high >>> 0).toNumber(true); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + return message; + }; + + /** + * Creates a plain object from an ExternalBlobReference message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ExternalBlobReference + * @static + * @param {proto.ExternalBlobReference} message ExternalBlobReference + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExternalBlobReference.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + object.directPath = ""; + object.handle = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileSizeBytes = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileSizeBytes = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + } + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.handle != null && message.hasOwnProperty("handle")) + object.handle = message.handle; + if (message.fileSizeBytes != null && message.hasOwnProperty("fileSizeBytes")) + if (typeof message.fileSizeBytes === "number") + object.fileSizeBytes = options.longs === String ? String(message.fileSizeBytes) : message.fileSizeBytes; + else + object.fileSizeBytes = options.longs === String ? $util.Long.prototype.toString.call(message.fileSizeBytes) : options.longs === Number ? new $util.LongBits(message.fileSizeBytes.low >>> 0, message.fileSizeBytes.high >>> 0).toNumber(true) : message.fileSizeBytes; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + return object; + }; + + /** + * Converts this ExternalBlobReference to JSON. + * @function toJSON + * @memberof proto.ExternalBlobReference + * @instance + * @returns {Object.} JSON object + */ + ExternalBlobReference.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ExternalBlobReference; + })(); + + proto.GlobalSettings = (function() { + + /** + * Properties of a GlobalSettings. + * @memberof proto + * @interface IGlobalSettings + * @property {proto.IWallpaperSettings|null} [lightThemeWallpaper] GlobalSettings lightThemeWallpaper + * @property {proto.MediaVisibility|null} [mediaVisibility] GlobalSettings mediaVisibility + * @property {proto.IWallpaperSettings|null} [darkThemeWallpaper] GlobalSettings darkThemeWallpaper + * @property {proto.IAutoDownloadSettings|null} [autoDownloadWiFi] GlobalSettings autoDownloadWiFi + * @property {proto.IAutoDownloadSettings|null} [autoDownloadCellular] GlobalSettings autoDownloadCellular + * @property {proto.IAutoDownloadSettings|null} [autoDownloadRoaming] GlobalSettings autoDownloadRoaming + * @property {boolean|null} [showIndividualNotificationsPreview] GlobalSettings showIndividualNotificationsPreview + * @property {boolean|null} [showGroupNotificationsPreview] GlobalSettings showGroupNotificationsPreview + * @property {number|null} [disappearingModeDuration] GlobalSettings disappearingModeDuration + * @property {number|Long|null} [disappearingModeTimestamp] GlobalSettings disappearingModeTimestamp + * @property {proto.IAvatarUserSettings|null} [avatarUserSettings] GlobalSettings avatarUserSettings + */ + + /** + * Constructs a new GlobalSettings. + * @memberof proto + * @classdesc Represents a GlobalSettings. + * @implements IGlobalSettings + * @constructor + * @param {proto.IGlobalSettings=} [properties] Properties to set + */ + function GlobalSettings(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GlobalSettings lightThemeWallpaper. + * @member {proto.IWallpaperSettings|null|undefined} lightThemeWallpaper + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.lightThemeWallpaper = null; + + /** + * GlobalSettings mediaVisibility. + * @member {proto.MediaVisibility} mediaVisibility + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.mediaVisibility = 0; + + /** + * GlobalSettings darkThemeWallpaper. + * @member {proto.IWallpaperSettings|null|undefined} darkThemeWallpaper + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.darkThemeWallpaper = null; + + /** + * GlobalSettings autoDownloadWiFi. + * @member {proto.IAutoDownloadSettings|null|undefined} autoDownloadWiFi + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.autoDownloadWiFi = null; + + /** + * GlobalSettings autoDownloadCellular. + * @member {proto.IAutoDownloadSettings|null|undefined} autoDownloadCellular + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.autoDownloadCellular = null; + + /** + * GlobalSettings autoDownloadRoaming. + * @member {proto.IAutoDownloadSettings|null|undefined} autoDownloadRoaming + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.autoDownloadRoaming = null; + + /** + * GlobalSettings showIndividualNotificationsPreview. + * @member {boolean} showIndividualNotificationsPreview + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.showIndividualNotificationsPreview = false; + + /** + * GlobalSettings showGroupNotificationsPreview. + * @member {boolean} showGroupNotificationsPreview + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.showGroupNotificationsPreview = false; + + /** + * GlobalSettings disappearingModeDuration. + * @member {number} disappearingModeDuration + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.disappearingModeDuration = 0; + + /** + * GlobalSettings disappearingModeTimestamp. + * @member {number|Long} disappearingModeTimestamp + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.disappearingModeTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * GlobalSettings avatarUserSettings. + * @member {proto.IAvatarUserSettings|null|undefined} avatarUserSettings + * @memberof proto.GlobalSettings + * @instance + */ + GlobalSettings.prototype.avatarUserSettings = null; + + /** + * Creates a new GlobalSettings instance using the specified properties. + * @function create + * @memberof proto.GlobalSettings + * @static + * @param {proto.IGlobalSettings=} [properties] Properties to set + * @returns {proto.GlobalSettings} GlobalSettings instance + */ + GlobalSettings.create = function create(properties) { + return new GlobalSettings(properties); + }; + + /** + * Encodes the specified GlobalSettings message. Does not implicitly {@link proto.GlobalSettings.verify|verify} messages. + * @function encode + * @memberof proto.GlobalSettings + * @static + * @param {proto.IGlobalSettings} message GlobalSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GlobalSettings.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.lightThemeWallpaper != null && Object.hasOwnProperty.call(message, "lightThemeWallpaper")) + $root.proto.WallpaperSettings.encode(message.lightThemeWallpaper, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.mediaVisibility != null && Object.hasOwnProperty.call(message, "mediaVisibility")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.mediaVisibility); + if (message.darkThemeWallpaper != null && Object.hasOwnProperty.call(message, "darkThemeWallpaper")) + $root.proto.WallpaperSettings.encode(message.darkThemeWallpaper, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.autoDownloadWiFi != null && Object.hasOwnProperty.call(message, "autoDownloadWiFi")) + $root.proto.AutoDownloadSettings.encode(message.autoDownloadWiFi, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.autoDownloadCellular != null && Object.hasOwnProperty.call(message, "autoDownloadCellular")) + $root.proto.AutoDownloadSettings.encode(message.autoDownloadCellular, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.autoDownloadRoaming != null && Object.hasOwnProperty.call(message, "autoDownloadRoaming")) + $root.proto.AutoDownloadSettings.encode(message.autoDownloadRoaming, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.showIndividualNotificationsPreview != null && Object.hasOwnProperty.call(message, "showIndividualNotificationsPreview")) + writer.uint32(/* id 7, wireType 0 =*/56).bool(message.showIndividualNotificationsPreview); + if (message.showGroupNotificationsPreview != null && Object.hasOwnProperty.call(message, "showGroupNotificationsPreview")) + writer.uint32(/* id 8, wireType 0 =*/64).bool(message.showGroupNotificationsPreview); + if (message.disappearingModeDuration != null && Object.hasOwnProperty.call(message, "disappearingModeDuration")) + writer.uint32(/* id 9, wireType 0 =*/72).int32(message.disappearingModeDuration); + if (message.disappearingModeTimestamp != null && Object.hasOwnProperty.call(message, "disappearingModeTimestamp")) + writer.uint32(/* id 10, wireType 0 =*/80).int64(message.disappearingModeTimestamp); + if (message.avatarUserSettings != null && Object.hasOwnProperty.call(message, "avatarUserSettings")) + $root.proto.AvatarUserSettings.encode(message.avatarUserSettings, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GlobalSettings message, length delimited. Does not implicitly {@link proto.GlobalSettings.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.GlobalSettings + * @static + * @param {proto.IGlobalSettings} message GlobalSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GlobalSettings.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GlobalSettings message from the specified reader or buffer. + * @function decode + * @memberof proto.GlobalSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.GlobalSettings} GlobalSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GlobalSettings.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.GlobalSettings(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.lightThemeWallpaper = $root.proto.WallpaperSettings.decode(reader, reader.uint32()); + break; + case 2: + message.mediaVisibility = reader.int32(); + break; + case 3: + message.darkThemeWallpaper = $root.proto.WallpaperSettings.decode(reader, reader.uint32()); + break; + case 4: + message.autoDownloadWiFi = $root.proto.AutoDownloadSettings.decode(reader, reader.uint32()); + break; + case 5: + message.autoDownloadCellular = $root.proto.AutoDownloadSettings.decode(reader, reader.uint32()); + break; + case 6: + message.autoDownloadRoaming = $root.proto.AutoDownloadSettings.decode(reader, reader.uint32()); + break; + case 7: + message.showIndividualNotificationsPreview = reader.bool(); + break; + case 8: + message.showGroupNotificationsPreview = reader.bool(); + break; + case 9: + message.disappearingModeDuration = reader.int32(); + break; + case 10: + message.disappearingModeTimestamp = reader.int64(); + break; + case 11: + message.avatarUserSettings = $root.proto.AvatarUserSettings.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GlobalSettings message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.GlobalSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.GlobalSettings} GlobalSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GlobalSettings.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GlobalSettings message. + * @function verify + * @memberof proto.GlobalSettings + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GlobalSettings.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.lightThemeWallpaper != null && message.hasOwnProperty("lightThemeWallpaper")) { + var error = $root.proto.WallpaperSettings.verify(message.lightThemeWallpaper); + if (error) + return "lightThemeWallpaper." + error; + } + if (message.mediaVisibility != null && message.hasOwnProperty("mediaVisibility")) + switch (message.mediaVisibility) { + default: + return "mediaVisibility: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.darkThemeWallpaper != null && message.hasOwnProperty("darkThemeWallpaper")) { + var error = $root.proto.WallpaperSettings.verify(message.darkThemeWallpaper); + if (error) + return "darkThemeWallpaper." + error; + } + if (message.autoDownloadWiFi != null && message.hasOwnProperty("autoDownloadWiFi")) { + var error = $root.proto.AutoDownloadSettings.verify(message.autoDownloadWiFi); + if (error) + return "autoDownloadWiFi." + error; + } + if (message.autoDownloadCellular != null && message.hasOwnProperty("autoDownloadCellular")) { + var error = $root.proto.AutoDownloadSettings.verify(message.autoDownloadCellular); + if (error) + return "autoDownloadCellular." + error; + } + if (message.autoDownloadRoaming != null && message.hasOwnProperty("autoDownloadRoaming")) { + var error = $root.proto.AutoDownloadSettings.verify(message.autoDownloadRoaming); + if (error) + return "autoDownloadRoaming." + error; + } + if (message.showIndividualNotificationsPreview != null && message.hasOwnProperty("showIndividualNotificationsPreview")) + if (typeof message.showIndividualNotificationsPreview !== "boolean") + return "showIndividualNotificationsPreview: boolean expected"; + if (message.showGroupNotificationsPreview != null && message.hasOwnProperty("showGroupNotificationsPreview")) + if (typeof message.showGroupNotificationsPreview !== "boolean") + return "showGroupNotificationsPreview: boolean expected"; + if (message.disappearingModeDuration != null && message.hasOwnProperty("disappearingModeDuration")) + if (!$util.isInteger(message.disappearingModeDuration)) + return "disappearingModeDuration: integer expected"; + if (message.disappearingModeTimestamp != null && message.hasOwnProperty("disappearingModeTimestamp")) + if (!$util.isInteger(message.disappearingModeTimestamp) && !(message.disappearingModeTimestamp && $util.isInteger(message.disappearingModeTimestamp.low) && $util.isInteger(message.disappearingModeTimestamp.high))) + return "disappearingModeTimestamp: integer|Long expected"; + if (message.avatarUserSettings != null && message.hasOwnProperty("avatarUserSettings")) { + var error = $root.proto.AvatarUserSettings.verify(message.avatarUserSettings); + if (error) + return "avatarUserSettings." + error; + } + return null; + }; + + /** + * Creates a GlobalSettings message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.GlobalSettings + * @static + * @param {Object.} object Plain object + * @returns {proto.GlobalSettings} GlobalSettings + */ + GlobalSettings.fromObject = function fromObject(object) { + if (object instanceof $root.proto.GlobalSettings) + return object; + var message = new $root.proto.GlobalSettings(); + if (object.lightThemeWallpaper != null) { + if (typeof object.lightThemeWallpaper !== "object") + throw TypeError(".proto.GlobalSettings.lightThemeWallpaper: object expected"); + message.lightThemeWallpaper = $root.proto.WallpaperSettings.fromObject(object.lightThemeWallpaper); + } + switch (object.mediaVisibility) { + case "DEFAULT": + case 0: + message.mediaVisibility = 0; + break; + case "OFF": + case 1: + message.mediaVisibility = 1; + break; + case "ON": + case 2: + message.mediaVisibility = 2; + break; + } + if (object.darkThemeWallpaper != null) { + if (typeof object.darkThemeWallpaper !== "object") + throw TypeError(".proto.GlobalSettings.darkThemeWallpaper: object expected"); + message.darkThemeWallpaper = $root.proto.WallpaperSettings.fromObject(object.darkThemeWallpaper); + } + if (object.autoDownloadWiFi != null) { + if (typeof object.autoDownloadWiFi !== "object") + throw TypeError(".proto.GlobalSettings.autoDownloadWiFi: object expected"); + message.autoDownloadWiFi = $root.proto.AutoDownloadSettings.fromObject(object.autoDownloadWiFi); + } + if (object.autoDownloadCellular != null) { + if (typeof object.autoDownloadCellular !== "object") + throw TypeError(".proto.GlobalSettings.autoDownloadCellular: object expected"); + message.autoDownloadCellular = $root.proto.AutoDownloadSettings.fromObject(object.autoDownloadCellular); + } + if (object.autoDownloadRoaming != null) { + if (typeof object.autoDownloadRoaming !== "object") + throw TypeError(".proto.GlobalSettings.autoDownloadRoaming: object expected"); + message.autoDownloadRoaming = $root.proto.AutoDownloadSettings.fromObject(object.autoDownloadRoaming); + } + if (object.showIndividualNotificationsPreview != null) + message.showIndividualNotificationsPreview = Boolean(object.showIndividualNotificationsPreview); + if (object.showGroupNotificationsPreview != null) + message.showGroupNotificationsPreview = Boolean(object.showGroupNotificationsPreview); + if (object.disappearingModeDuration != null) + message.disappearingModeDuration = object.disappearingModeDuration | 0; + if (object.disappearingModeTimestamp != null) + if ($util.Long) + (message.disappearingModeTimestamp = $util.Long.fromValue(object.disappearingModeTimestamp)).unsigned = false; + else if (typeof object.disappearingModeTimestamp === "string") + message.disappearingModeTimestamp = parseInt(object.disappearingModeTimestamp, 10); + else if (typeof object.disappearingModeTimestamp === "number") + message.disappearingModeTimestamp = object.disappearingModeTimestamp; + else if (typeof object.disappearingModeTimestamp === "object") + message.disappearingModeTimestamp = new $util.LongBits(object.disappearingModeTimestamp.low >>> 0, object.disappearingModeTimestamp.high >>> 0).toNumber(); + if (object.avatarUserSettings != null) { + if (typeof object.avatarUserSettings !== "object") + throw TypeError(".proto.GlobalSettings.avatarUserSettings: object expected"); + message.avatarUserSettings = $root.proto.AvatarUserSettings.fromObject(object.avatarUserSettings); + } + return message; + }; + + /** + * Creates a plain object from a GlobalSettings message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.GlobalSettings + * @static + * @param {proto.GlobalSettings} message GlobalSettings + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GlobalSettings.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.lightThemeWallpaper = null; + object.mediaVisibility = options.enums === String ? "DEFAULT" : 0; + object.darkThemeWallpaper = null; + object.autoDownloadWiFi = null; + object.autoDownloadCellular = null; + object.autoDownloadRoaming = null; + object.showIndividualNotificationsPreview = false; + object.showGroupNotificationsPreview = false; + object.disappearingModeDuration = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.disappearingModeTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.disappearingModeTimestamp = options.longs === String ? "0" : 0; + object.avatarUserSettings = null; + } + if (message.lightThemeWallpaper != null && message.hasOwnProperty("lightThemeWallpaper")) + object.lightThemeWallpaper = $root.proto.WallpaperSettings.toObject(message.lightThemeWallpaper, options); + if (message.mediaVisibility != null && message.hasOwnProperty("mediaVisibility")) + object.mediaVisibility = options.enums === String ? $root.proto.MediaVisibility[message.mediaVisibility] : message.mediaVisibility; + if (message.darkThemeWallpaper != null && message.hasOwnProperty("darkThemeWallpaper")) + object.darkThemeWallpaper = $root.proto.WallpaperSettings.toObject(message.darkThemeWallpaper, options); + if (message.autoDownloadWiFi != null && message.hasOwnProperty("autoDownloadWiFi")) + object.autoDownloadWiFi = $root.proto.AutoDownloadSettings.toObject(message.autoDownloadWiFi, options); + if (message.autoDownloadCellular != null && message.hasOwnProperty("autoDownloadCellular")) + object.autoDownloadCellular = $root.proto.AutoDownloadSettings.toObject(message.autoDownloadCellular, options); + if (message.autoDownloadRoaming != null && message.hasOwnProperty("autoDownloadRoaming")) + object.autoDownloadRoaming = $root.proto.AutoDownloadSettings.toObject(message.autoDownloadRoaming, options); + if (message.showIndividualNotificationsPreview != null && message.hasOwnProperty("showIndividualNotificationsPreview")) + object.showIndividualNotificationsPreview = message.showIndividualNotificationsPreview; + if (message.showGroupNotificationsPreview != null && message.hasOwnProperty("showGroupNotificationsPreview")) + object.showGroupNotificationsPreview = message.showGroupNotificationsPreview; + if (message.disappearingModeDuration != null && message.hasOwnProperty("disappearingModeDuration")) + object.disappearingModeDuration = message.disappearingModeDuration; + if (message.disappearingModeTimestamp != null && message.hasOwnProperty("disappearingModeTimestamp")) + if (typeof message.disappearingModeTimestamp === "number") + object.disappearingModeTimestamp = options.longs === String ? String(message.disappearingModeTimestamp) : message.disappearingModeTimestamp; + else + object.disappearingModeTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.disappearingModeTimestamp) : options.longs === Number ? new $util.LongBits(message.disappearingModeTimestamp.low >>> 0, message.disappearingModeTimestamp.high >>> 0).toNumber() : message.disappearingModeTimestamp; + if (message.avatarUserSettings != null && message.hasOwnProperty("avatarUserSettings")) + object.avatarUserSettings = $root.proto.AvatarUserSettings.toObject(message.avatarUserSettings, options); + return object; + }; + + /** + * Converts this GlobalSettings to JSON. + * @function toJSON + * @memberof proto.GlobalSettings + * @instance + * @returns {Object.} JSON object + */ + GlobalSettings.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GlobalSettings; + })(); + + proto.GroupParticipant = (function() { + + /** + * Properties of a GroupParticipant. + * @memberof proto + * @interface IGroupParticipant + * @property {string} userJid GroupParticipant userJid + * @property {proto.GroupParticipant.Rank|null} [rank] GroupParticipant rank + */ + + /** + * Constructs a new GroupParticipant. + * @memberof proto + * @classdesc Represents a GroupParticipant. + * @implements IGroupParticipant + * @constructor + * @param {proto.IGroupParticipant=} [properties] Properties to set + */ + function GroupParticipant(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupParticipant userJid. + * @member {string} userJid + * @memberof proto.GroupParticipant + * @instance + */ + GroupParticipant.prototype.userJid = ""; + + /** + * GroupParticipant rank. + * @member {proto.GroupParticipant.Rank} rank + * @memberof proto.GroupParticipant + * @instance + */ + GroupParticipant.prototype.rank = 0; + + /** + * Creates a new GroupParticipant instance using the specified properties. + * @function create + * @memberof proto.GroupParticipant + * @static + * @param {proto.IGroupParticipant=} [properties] Properties to set + * @returns {proto.GroupParticipant} GroupParticipant instance + */ + GroupParticipant.create = function create(properties) { + return new GroupParticipant(properties); + }; + + /** + * Encodes the specified GroupParticipant message. Does not implicitly {@link proto.GroupParticipant.verify|verify} messages. + * @function encode + * @memberof proto.GroupParticipant + * @static + * @param {proto.IGroupParticipant} message GroupParticipant message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupParticipant.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + writer.uint32(/* id 1, wireType 2 =*/10).string(message.userJid); + if (message.rank != null && Object.hasOwnProperty.call(message, "rank")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.rank); + return writer; + }; + + /** + * Encodes the specified GroupParticipant message, length delimited. Does not implicitly {@link proto.GroupParticipant.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.GroupParticipant + * @static + * @param {proto.IGroupParticipant} message GroupParticipant message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupParticipant.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupParticipant message from the specified reader or buffer. + * @function decode + * @memberof proto.GroupParticipant + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.GroupParticipant} GroupParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupParticipant.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.GroupParticipant(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.userJid = reader.string(); + break; + case 2: + message.rank = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("userJid")) + throw $util.ProtocolError("missing required 'userJid'", { instance: message }); + return message; + }; + + /** + * Decodes a GroupParticipant message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.GroupParticipant + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.GroupParticipant} GroupParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupParticipant.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupParticipant message. + * @function verify + * @memberof proto.GroupParticipant + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupParticipant.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.userJid)) + return "userJid: string expected"; + if (message.rank != null && message.hasOwnProperty("rank")) + switch (message.rank) { + default: + return "rank: enum value expected"; + case 0: + case 1: + case 2: + break; + } + return null; + }; + + /** + * Creates a GroupParticipant message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.GroupParticipant + * @static + * @param {Object.} object Plain object + * @returns {proto.GroupParticipant} GroupParticipant + */ + GroupParticipant.fromObject = function fromObject(object) { + if (object instanceof $root.proto.GroupParticipant) + return object; + var message = new $root.proto.GroupParticipant(); + if (object.userJid != null) + message.userJid = String(object.userJid); + switch (object.rank) { + case "REGULAR": + case 0: + message.rank = 0; + break; + case "ADMIN": + case 1: + message.rank = 1; + break; + case "SUPERADMIN": + case 2: + message.rank = 2; + break; + } + return message; + }; + + /** + * Creates a plain object from a GroupParticipant message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.GroupParticipant + * @static + * @param {proto.GroupParticipant} message GroupParticipant + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GroupParticipant.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.userJid = ""; + object.rank = options.enums === String ? "REGULAR" : 0; + } + if (message.userJid != null && message.hasOwnProperty("userJid")) + object.userJid = message.userJid; + if (message.rank != null && message.hasOwnProperty("rank")) + object.rank = options.enums === String ? $root.proto.GroupParticipant.Rank[message.rank] : message.rank; + return object; + }; + + /** + * Converts this GroupParticipant to JSON. + * @function toJSON + * @memberof proto.GroupParticipant + * @instance + * @returns {Object.} JSON object + */ + GroupParticipant.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Rank enum. + * @name proto.GroupParticipant.Rank + * @enum {number} + * @property {number} REGULAR=0 REGULAR value + * @property {number} ADMIN=1 ADMIN value + * @property {number} SUPERADMIN=2 SUPERADMIN value + */ + GroupParticipant.Rank = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "REGULAR"] = 0; + values[valuesById[1] = "ADMIN"] = 1; + values[valuesById[2] = "SUPERADMIN"] = 2; + return values; + })(); + + return GroupParticipant; + })(); + + proto.HandshakeMessage = (function() { + + /** + * Properties of a HandshakeMessage. + * @memberof proto + * @interface IHandshakeMessage + * @property {proto.HandshakeMessage.IClientHello|null} [clientHello] HandshakeMessage clientHello + * @property {proto.HandshakeMessage.IServerHello|null} [serverHello] HandshakeMessage serverHello + * @property {proto.HandshakeMessage.IClientFinish|null} [clientFinish] HandshakeMessage clientFinish + */ + + /** + * Constructs a new HandshakeMessage. + * @memberof proto + * @classdesc Represents a HandshakeMessage. + * @implements IHandshakeMessage + * @constructor + * @param {proto.IHandshakeMessage=} [properties] Properties to set + */ + function HandshakeMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HandshakeMessage clientHello. + * @member {proto.HandshakeMessage.IClientHello|null|undefined} clientHello + * @memberof proto.HandshakeMessage + * @instance + */ + HandshakeMessage.prototype.clientHello = null; + + /** + * HandshakeMessage serverHello. + * @member {proto.HandshakeMessage.IServerHello|null|undefined} serverHello + * @memberof proto.HandshakeMessage + * @instance + */ + HandshakeMessage.prototype.serverHello = null; + + /** + * HandshakeMessage clientFinish. + * @member {proto.HandshakeMessage.IClientFinish|null|undefined} clientFinish + * @memberof proto.HandshakeMessage + * @instance + */ + HandshakeMessage.prototype.clientFinish = null; + + /** + * Creates a new HandshakeMessage instance using the specified properties. + * @function create + * @memberof proto.HandshakeMessage + * @static + * @param {proto.IHandshakeMessage=} [properties] Properties to set + * @returns {proto.HandshakeMessage} HandshakeMessage instance + */ + HandshakeMessage.create = function create(properties) { + return new HandshakeMessage(properties); + }; + + /** + * Encodes the specified HandshakeMessage message. Does not implicitly {@link proto.HandshakeMessage.verify|verify} messages. + * @function encode + * @memberof proto.HandshakeMessage + * @static + * @param {proto.IHandshakeMessage} message HandshakeMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HandshakeMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.clientHello != null && Object.hasOwnProperty.call(message, "clientHello")) + $root.proto.HandshakeMessage.ClientHello.encode(message.clientHello, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.serverHello != null && Object.hasOwnProperty.call(message, "serverHello")) + $root.proto.HandshakeMessage.ServerHello.encode(message.serverHello, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.clientFinish != null && Object.hasOwnProperty.call(message, "clientFinish")) + $root.proto.HandshakeMessage.ClientFinish.encode(message.clientFinish, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified HandshakeMessage message, length delimited. Does not implicitly {@link proto.HandshakeMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HandshakeMessage + * @static + * @param {proto.IHandshakeMessage} message HandshakeMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HandshakeMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HandshakeMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.HandshakeMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HandshakeMessage} HandshakeMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HandshakeMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HandshakeMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 2: + message.clientHello = $root.proto.HandshakeMessage.ClientHello.decode(reader, reader.uint32()); + break; + case 3: + message.serverHello = $root.proto.HandshakeMessage.ServerHello.decode(reader, reader.uint32()); + break; + case 4: + message.clientFinish = $root.proto.HandshakeMessage.ClientFinish.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HandshakeMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HandshakeMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HandshakeMessage} HandshakeMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HandshakeMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HandshakeMessage message. + * @function verify + * @memberof proto.HandshakeMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HandshakeMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.clientHello != null && message.hasOwnProperty("clientHello")) { + var error = $root.proto.HandshakeMessage.ClientHello.verify(message.clientHello); + if (error) + return "clientHello." + error; + } + if (message.serverHello != null && message.hasOwnProperty("serverHello")) { + var error = $root.proto.HandshakeMessage.ServerHello.verify(message.serverHello); + if (error) + return "serverHello." + error; + } + if (message.clientFinish != null && message.hasOwnProperty("clientFinish")) { + var error = $root.proto.HandshakeMessage.ClientFinish.verify(message.clientFinish); + if (error) + return "clientFinish." + error; + } + return null; + }; + + /** + * Creates a HandshakeMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HandshakeMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.HandshakeMessage} HandshakeMessage + */ + HandshakeMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HandshakeMessage) + return object; + var message = new $root.proto.HandshakeMessage(); + if (object.clientHello != null) { + if (typeof object.clientHello !== "object") + throw TypeError(".proto.HandshakeMessage.clientHello: object expected"); + message.clientHello = $root.proto.HandshakeMessage.ClientHello.fromObject(object.clientHello); + } + if (object.serverHello != null) { + if (typeof object.serverHello !== "object") + throw TypeError(".proto.HandshakeMessage.serverHello: object expected"); + message.serverHello = $root.proto.HandshakeMessage.ServerHello.fromObject(object.serverHello); + } + if (object.clientFinish != null) { + if (typeof object.clientFinish !== "object") + throw TypeError(".proto.HandshakeMessage.clientFinish: object expected"); + message.clientFinish = $root.proto.HandshakeMessage.ClientFinish.fromObject(object.clientFinish); + } + return message; + }; + + /** + * Creates a plain object from a HandshakeMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HandshakeMessage + * @static + * @param {proto.HandshakeMessage} message HandshakeMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HandshakeMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.clientHello = null; + object.serverHello = null; + object.clientFinish = null; + } + if (message.clientHello != null && message.hasOwnProperty("clientHello")) + object.clientHello = $root.proto.HandshakeMessage.ClientHello.toObject(message.clientHello, options); + if (message.serverHello != null && message.hasOwnProperty("serverHello")) + object.serverHello = $root.proto.HandshakeMessage.ServerHello.toObject(message.serverHello, options); + if (message.clientFinish != null && message.hasOwnProperty("clientFinish")) + object.clientFinish = $root.proto.HandshakeMessage.ClientFinish.toObject(message.clientFinish, options); + return object; + }; + + /** + * Converts this HandshakeMessage to JSON. + * @function toJSON + * @memberof proto.HandshakeMessage + * @instance + * @returns {Object.} JSON object + */ + HandshakeMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + HandshakeMessage.ClientFinish = (function() { + + /** + * Properties of a ClientFinish. + * @memberof proto.HandshakeMessage + * @interface IClientFinish + * @property {Uint8Array|null} ["static"] ClientFinish static + * @property {Uint8Array|null} [payload] ClientFinish payload + */ + + /** + * Constructs a new ClientFinish. + * @memberof proto.HandshakeMessage + * @classdesc Represents a ClientFinish. + * @implements IClientFinish + * @constructor + * @param {proto.HandshakeMessage.IClientFinish=} [properties] Properties to set + */ + function ClientFinish(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ClientFinish static. + * @member {Uint8Array} static + * @memberof proto.HandshakeMessage.ClientFinish + * @instance + */ + ClientFinish.prototype["static"] = $util.newBuffer([]); + + /** + * ClientFinish payload. + * @member {Uint8Array} payload + * @memberof proto.HandshakeMessage.ClientFinish + * @instance + */ + ClientFinish.prototype.payload = $util.newBuffer([]); + + /** + * Creates a new ClientFinish instance using the specified properties. + * @function create + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {proto.HandshakeMessage.IClientFinish=} [properties] Properties to set + * @returns {proto.HandshakeMessage.ClientFinish} ClientFinish instance + */ + ClientFinish.create = function create(properties) { + return new ClientFinish(properties); + }; + + /** + * Encodes the specified ClientFinish message. Does not implicitly {@link proto.HandshakeMessage.ClientFinish.verify|verify} messages. + * @function encode + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {proto.HandshakeMessage.IClientFinish} message ClientFinish message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClientFinish.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message["static"] != null && Object.hasOwnProperty.call(message, "static")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message["static"]); + if (message.payload != null && Object.hasOwnProperty.call(message, "payload")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.payload); + return writer; + }; + + /** + * Encodes the specified ClientFinish message, length delimited. Does not implicitly {@link proto.HandshakeMessage.ClientFinish.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {proto.HandshakeMessage.IClientFinish} message ClientFinish message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClientFinish.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ClientFinish message from the specified reader or buffer. + * @function decode + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HandshakeMessage.ClientFinish} ClientFinish + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClientFinish.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HandshakeMessage.ClientFinish(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message["static"] = reader.bytes(); + break; + case 2: + message.payload = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ClientFinish message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HandshakeMessage.ClientFinish} ClientFinish + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClientFinish.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ClientFinish message. + * @function verify + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ClientFinish.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message["static"] != null && message.hasOwnProperty("static")) + if (!(message["static"] && typeof message["static"].length === "number" || $util.isString(message["static"]))) + return "static: buffer expected"; + if (message.payload != null && message.hasOwnProperty("payload")) + if (!(message.payload && typeof message.payload.length === "number" || $util.isString(message.payload))) + return "payload: buffer expected"; + return null; + }; + + /** + * Creates a ClientFinish message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {Object.} object Plain object + * @returns {proto.HandshakeMessage.ClientFinish} ClientFinish + */ + ClientFinish.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HandshakeMessage.ClientFinish) + return object; + var message = new $root.proto.HandshakeMessage.ClientFinish(); + if (object["static"] != null) + if (typeof object["static"] === "string") + $util.base64.decode(object["static"], message["static"] = $util.newBuffer($util.base64.length(object["static"])), 0); + else if (object["static"].length) + message["static"] = object["static"]; + if (object.payload != null) + if (typeof object.payload === "string") + $util.base64.decode(object.payload, message.payload = $util.newBuffer($util.base64.length(object.payload)), 0); + else if (object.payload.length) + message.payload = object.payload; + return message; + }; + + /** + * Creates a plain object from a ClientFinish message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HandshakeMessage.ClientFinish + * @static + * @param {proto.HandshakeMessage.ClientFinish} message ClientFinish + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ClientFinish.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object["static"] = ""; + else { + object["static"] = []; + if (options.bytes !== Array) + object["static"] = $util.newBuffer(object["static"]); + } + if (options.bytes === String) + object.payload = ""; + else { + object.payload = []; + if (options.bytes !== Array) + object.payload = $util.newBuffer(object.payload); + } + } + if (message["static"] != null && message.hasOwnProperty("static")) + object["static"] = options.bytes === String ? $util.base64.encode(message["static"], 0, message["static"].length) : options.bytes === Array ? Array.prototype.slice.call(message["static"]) : message["static"]; + if (message.payload != null && message.hasOwnProperty("payload")) + object.payload = options.bytes === String ? $util.base64.encode(message.payload, 0, message.payload.length) : options.bytes === Array ? Array.prototype.slice.call(message.payload) : message.payload; + return object; + }; + + /** + * Converts this ClientFinish to JSON. + * @function toJSON + * @memberof proto.HandshakeMessage.ClientFinish + * @instance + * @returns {Object.} JSON object + */ + ClientFinish.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ClientFinish; + })(); + + HandshakeMessage.ClientHello = (function() { + + /** + * Properties of a ClientHello. + * @memberof proto.HandshakeMessage + * @interface IClientHello + * @property {Uint8Array|null} [ephemeral] ClientHello ephemeral + * @property {Uint8Array|null} ["static"] ClientHello static + * @property {Uint8Array|null} [payload] ClientHello payload + */ + + /** + * Constructs a new ClientHello. + * @memberof proto.HandshakeMessage + * @classdesc Represents a ClientHello. + * @implements IClientHello + * @constructor + * @param {proto.HandshakeMessage.IClientHello=} [properties] Properties to set + */ + function ClientHello(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ClientHello ephemeral. + * @member {Uint8Array} ephemeral + * @memberof proto.HandshakeMessage.ClientHello + * @instance + */ + ClientHello.prototype.ephemeral = $util.newBuffer([]); + + /** + * ClientHello static. + * @member {Uint8Array} static + * @memberof proto.HandshakeMessage.ClientHello + * @instance + */ + ClientHello.prototype["static"] = $util.newBuffer([]); + + /** + * ClientHello payload. + * @member {Uint8Array} payload + * @memberof proto.HandshakeMessage.ClientHello + * @instance + */ + ClientHello.prototype.payload = $util.newBuffer([]); + + /** + * Creates a new ClientHello instance using the specified properties. + * @function create + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {proto.HandshakeMessage.IClientHello=} [properties] Properties to set + * @returns {proto.HandshakeMessage.ClientHello} ClientHello instance + */ + ClientHello.create = function create(properties) { + return new ClientHello(properties); + }; + + /** + * Encodes the specified ClientHello message. Does not implicitly {@link proto.HandshakeMessage.ClientHello.verify|verify} messages. + * @function encode + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {proto.HandshakeMessage.IClientHello} message ClientHello message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClientHello.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.ephemeral != null && Object.hasOwnProperty.call(message, "ephemeral")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ephemeral); + if (message["static"] != null && Object.hasOwnProperty.call(message, "static")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message["static"]); + if (message.payload != null && Object.hasOwnProperty.call(message, "payload")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.payload); + return writer; + }; + + /** + * Encodes the specified ClientHello message, length delimited. Does not implicitly {@link proto.HandshakeMessage.ClientHello.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {proto.HandshakeMessage.IClientHello} message ClientHello message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClientHello.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ClientHello message from the specified reader or buffer. + * @function decode + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HandshakeMessage.ClientHello} ClientHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClientHello.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HandshakeMessage.ClientHello(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.ephemeral = reader.bytes(); + break; + case 2: + message["static"] = reader.bytes(); + break; + case 3: + message.payload = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ClientHello message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HandshakeMessage.ClientHello} ClientHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClientHello.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ClientHello message. + * @function verify + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ClientHello.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.ephemeral != null && message.hasOwnProperty("ephemeral")) + if (!(message.ephemeral && typeof message.ephemeral.length === "number" || $util.isString(message.ephemeral))) + return "ephemeral: buffer expected"; + if (message["static"] != null && message.hasOwnProperty("static")) + if (!(message["static"] && typeof message["static"].length === "number" || $util.isString(message["static"]))) + return "static: buffer expected"; + if (message.payload != null && message.hasOwnProperty("payload")) + if (!(message.payload && typeof message.payload.length === "number" || $util.isString(message.payload))) + return "payload: buffer expected"; + return null; + }; + + /** + * Creates a ClientHello message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {Object.} object Plain object + * @returns {proto.HandshakeMessage.ClientHello} ClientHello + */ + ClientHello.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HandshakeMessage.ClientHello) + return object; + var message = new $root.proto.HandshakeMessage.ClientHello(); + if (object.ephemeral != null) + if (typeof object.ephemeral === "string") + $util.base64.decode(object.ephemeral, message.ephemeral = $util.newBuffer($util.base64.length(object.ephemeral)), 0); + else if (object.ephemeral.length) + message.ephemeral = object.ephemeral; + if (object["static"] != null) + if (typeof object["static"] === "string") + $util.base64.decode(object["static"], message["static"] = $util.newBuffer($util.base64.length(object["static"])), 0); + else if (object["static"].length) + message["static"] = object["static"]; + if (object.payload != null) + if (typeof object.payload === "string") + $util.base64.decode(object.payload, message.payload = $util.newBuffer($util.base64.length(object.payload)), 0); + else if (object.payload.length) + message.payload = object.payload; + return message; + }; + + /** + * Creates a plain object from a ClientHello message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HandshakeMessage.ClientHello + * @static + * @param {proto.HandshakeMessage.ClientHello} message ClientHello + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ClientHello.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.ephemeral = ""; + else { + object.ephemeral = []; + if (options.bytes !== Array) + object.ephemeral = $util.newBuffer(object.ephemeral); + } + if (options.bytes === String) + object["static"] = ""; + else { + object["static"] = []; + if (options.bytes !== Array) + object["static"] = $util.newBuffer(object["static"]); + } + if (options.bytes === String) + object.payload = ""; + else { + object.payload = []; + if (options.bytes !== Array) + object.payload = $util.newBuffer(object.payload); + } + } + if (message.ephemeral != null && message.hasOwnProperty("ephemeral")) + object.ephemeral = options.bytes === String ? $util.base64.encode(message.ephemeral, 0, message.ephemeral.length) : options.bytes === Array ? Array.prototype.slice.call(message.ephemeral) : message.ephemeral; + if (message["static"] != null && message.hasOwnProperty("static")) + object["static"] = options.bytes === String ? $util.base64.encode(message["static"], 0, message["static"].length) : options.bytes === Array ? Array.prototype.slice.call(message["static"]) : message["static"]; + if (message.payload != null && message.hasOwnProperty("payload")) + object.payload = options.bytes === String ? $util.base64.encode(message.payload, 0, message.payload.length) : options.bytes === Array ? Array.prototype.slice.call(message.payload) : message.payload; + return object; + }; + + /** + * Converts this ClientHello to JSON. + * @function toJSON + * @memberof proto.HandshakeMessage.ClientHello + * @instance + * @returns {Object.} JSON object + */ + ClientHello.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ClientHello; + })(); + + HandshakeMessage.ServerHello = (function() { + + /** + * Properties of a ServerHello. + * @memberof proto.HandshakeMessage + * @interface IServerHello + * @property {Uint8Array|null} [ephemeral] ServerHello ephemeral + * @property {Uint8Array|null} ["static"] ServerHello static + * @property {Uint8Array|null} [payload] ServerHello payload + */ + + /** + * Constructs a new ServerHello. + * @memberof proto.HandshakeMessage + * @classdesc Represents a ServerHello. + * @implements IServerHello + * @constructor + * @param {proto.HandshakeMessage.IServerHello=} [properties] Properties to set + */ + function ServerHello(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ServerHello ephemeral. + * @member {Uint8Array} ephemeral + * @memberof proto.HandshakeMessage.ServerHello + * @instance + */ + ServerHello.prototype.ephemeral = $util.newBuffer([]); + + /** + * ServerHello static. + * @member {Uint8Array} static + * @memberof proto.HandshakeMessage.ServerHello + * @instance + */ + ServerHello.prototype["static"] = $util.newBuffer([]); + + /** + * ServerHello payload. + * @member {Uint8Array} payload + * @memberof proto.HandshakeMessage.ServerHello + * @instance + */ + ServerHello.prototype.payload = $util.newBuffer([]); + + /** + * Creates a new ServerHello instance using the specified properties. + * @function create + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {proto.HandshakeMessage.IServerHello=} [properties] Properties to set + * @returns {proto.HandshakeMessage.ServerHello} ServerHello instance + */ + ServerHello.create = function create(properties) { + return new ServerHello(properties); + }; + + /** + * Encodes the specified ServerHello message. Does not implicitly {@link proto.HandshakeMessage.ServerHello.verify|verify} messages. + * @function encode + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {proto.HandshakeMessage.IServerHello} message ServerHello message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ServerHello.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.ephemeral != null && Object.hasOwnProperty.call(message, "ephemeral")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.ephemeral); + if (message["static"] != null && Object.hasOwnProperty.call(message, "static")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message["static"]); + if (message.payload != null && Object.hasOwnProperty.call(message, "payload")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.payload); + return writer; + }; + + /** + * Encodes the specified ServerHello message, length delimited. Does not implicitly {@link proto.HandshakeMessage.ServerHello.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {proto.HandshakeMessage.IServerHello} message ServerHello message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ServerHello.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ServerHello message from the specified reader or buffer. + * @function decode + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HandshakeMessage.ServerHello} ServerHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ServerHello.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HandshakeMessage.ServerHello(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.ephemeral = reader.bytes(); + break; + case 2: + message["static"] = reader.bytes(); + break; + case 3: + message.payload = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ServerHello message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HandshakeMessage.ServerHello} ServerHello + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ServerHello.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ServerHello message. + * @function verify + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ServerHello.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.ephemeral != null && message.hasOwnProperty("ephemeral")) + if (!(message.ephemeral && typeof message.ephemeral.length === "number" || $util.isString(message.ephemeral))) + return "ephemeral: buffer expected"; + if (message["static"] != null && message.hasOwnProperty("static")) + if (!(message["static"] && typeof message["static"].length === "number" || $util.isString(message["static"]))) + return "static: buffer expected"; + if (message.payload != null && message.hasOwnProperty("payload")) + if (!(message.payload && typeof message.payload.length === "number" || $util.isString(message.payload))) + return "payload: buffer expected"; + return null; + }; + + /** + * Creates a ServerHello message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {Object.} object Plain object + * @returns {proto.HandshakeMessage.ServerHello} ServerHello + */ + ServerHello.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HandshakeMessage.ServerHello) + return object; + var message = new $root.proto.HandshakeMessage.ServerHello(); + if (object.ephemeral != null) + if (typeof object.ephemeral === "string") + $util.base64.decode(object.ephemeral, message.ephemeral = $util.newBuffer($util.base64.length(object.ephemeral)), 0); + else if (object.ephemeral.length) + message.ephemeral = object.ephemeral; + if (object["static"] != null) + if (typeof object["static"] === "string") + $util.base64.decode(object["static"], message["static"] = $util.newBuffer($util.base64.length(object["static"])), 0); + else if (object["static"].length) + message["static"] = object["static"]; + if (object.payload != null) + if (typeof object.payload === "string") + $util.base64.decode(object.payload, message.payload = $util.newBuffer($util.base64.length(object.payload)), 0); + else if (object.payload.length) + message.payload = object.payload; + return message; + }; + + /** + * Creates a plain object from a ServerHello message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HandshakeMessage.ServerHello + * @static + * @param {proto.HandshakeMessage.ServerHello} message ServerHello + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ServerHello.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.ephemeral = ""; + else { + object.ephemeral = []; + if (options.bytes !== Array) + object.ephemeral = $util.newBuffer(object.ephemeral); + } + if (options.bytes === String) + object["static"] = ""; + else { + object["static"] = []; + if (options.bytes !== Array) + object["static"] = $util.newBuffer(object["static"]); + } + if (options.bytes === String) + object.payload = ""; + else { + object.payload = []; + if (options.bytes !== Array) + object.payload = $util.newBuffer(object.payload); + } + } + if (message.ephemeral != null && message.hasOwnProperty("ephemeral")) + object.ephemeral = options.bytes === String ? $util.base64.encode(message.ephemeral, 0, message.ephemeral.length) : options.bytes === Array ? Array.prototype.slice.call(message.ephemeral) : message.ephemeral; + if (message["static"] != null && message.hasOwnProperty("static")) + object["static"] = options.bytes === String ? $util.base64.encode(message["static"], 0, message["static"].length) : options.bytes === Array ? Array.prototype.slice.call(message["static"]) : message["static"]; + if (message.payload != null && message.hasOwnProperty("payload")) + object.payload = options.bytes === String ? $util.base64.encode(message.payload, 0, message.payload.length) : options.bytes === Array ? Array.prototype.slice.call(message.payload) : message.payload; + return object; + }; + + /** + * Converts this ServerHello to JSON. + * @function toJSON + * @memberof proto.HandshakeMessage.ServerHello + * @instance + * @returns {Object.} JSON object + */ + ServerHello.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ServerHello; + })(); + + return HandshakeMessage; + })(); + + proto.HistorySync = (function() { + + /** + * Properties of a HistorySync. + * @memberof proto + * @interface IHistorySync + * @property {proto.HistorySync.HistorySyncType} syncType HistorySync syncType + * @property {Array.|null} [conversations] HistorySync conversations + * @property {Array.|null} [statusV3Messages] HistorySync statusV3Messages + * @property {number|null} [chunkOrder] HistorySync chunkOrder + * @property {number|null} [progress] HistorySync progress + * @property {Array.|null} [pushnames] HistorySync pushnames + * @property {proto.IGlobalSettings|null} [globalSettings] HistorySync globalSettings + * @property {Uint8Array|null} [threadIdUserSecret] HistorySync threadIdUserSecret + * @property {number|null} [threadDsTimeframeOffset] HistorySync threadDsTimeframeOffset + * @property {Array.|null} [recentStickers] HistorySync recentStickers + * @property {Array.|null} [pastParticipants] HistorySync pastParticipants + */ + + /** + * Constructs a new HistorySync. + * @memberof proto + * @classdesc Represents a HistorySync. + * @implements IHistorySync + * @constructor + * @param {proto.IHistorySync=} [properties] Properties to set + */ + function HistorySync(properties) { + this.conversations = []; + this.statusV3Messages = []; + this.pushnames = []; + this.recentStickers = []; + this.pastParticipants = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HistorySync syncType. + * @member {proto.HistorySync.HistorySyncType} syncType + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.syncType = 0; + + /** + * HistorySync conversations. + * @member {Array.} conversations + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.conversations = $util.emptyArray; + + /** + * HistorySync statusV3Messages. + * @member {Array.} statusV3Messages + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.statusV3Messages = $util.emptyArray; + + /** + * HistorySync chunkOrder. + * @member {number} chunkOrder + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.chunkOrder = 0; + + /** + * HistorySync progress. + * @member {number} progress + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.progress = 0; + + /** + * HistorySync pushnames. + * @member {Array.} pushnames + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.pushnames = $util.emptyArray; + + /** + * HistorySync globalSettings. + * @member {proto.IGlobalSettings|null|undefined} globalSettings + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.globalSettings = null; + + /** + * HistorySync threadIdUserSecret. + * @member {Uint8Array} threadIdUserSecret + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.threadIdUserSecret = $util.newBuffer([]); + + /** + * HistorySync threadDsTimeframeOffset. + * @member {number} threadDsTimeframeOffset + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.threadDsTimeframeOffset = 0; + + /** + * HistorySync recentStickers. + * @member {Array.} recentStickers + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.recentStickers = $util.emptyArray; + + /** + * HistorySync pastParticipants. + * @member {Array.} pastParticipants + * @memberof proto.HistorySync + * @instance + */ + HistorySync.prototype.pastParticipants = $util.emptyArray; + + /** + * Creates a new HistorySync instance using the specified properties. + * @function create + * @memberof proto.HistorySync + * @static + * @param {proto.IHistorySync=} [properties] Properties to set + * @returns {proto.HistorySync} HistorySync instance + */ + HistorySync.create = function create(properties) { + return new HistorySync(properties); + }; + + /** + * Encodes the specified HistorySync message. Does not implicitly {@link proto.HistorySync.verify|verify} messages. + * @function encode + * @memberof proto.HistorySync + * @static + * @param {proto.IHistorySync} message HistorySync message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySync.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.syncType); + if (message.conversations != null && message.conversations.length) + for (var i = 0; i < message.conversations.length; ++i) + $root.proto.Conversation.encode(message.conversations[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.statusV3Messages != null && message.statusV3Messages.length) + for (var i = 0; i < message.statusV3Messages.length; ++i) + $root.proto.WebMessageInfo.encode(message.statusV3Messages[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.chunkOrder != null && Object.hasOwnProperty.call(message, "chunkOrder")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.chunkOrder); + if (message.progress != null && Object.hasOwnProperty.call(message, "progress")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.progress); + if (message.pushnames != null && message.pushnames.length) + for (var i = 0; i < message.pushnames.length; ++i) + $root.proto.Pushname.encode(message.pushnames[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.globalSettings != null && Object.hasOwnProperty.call(message, "globalSettings")) + $root.proto.GlobalSettings.encode(message.globalSettings, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.threadIdUserSecret != null && Object.hasOwnProperty.call(message, "threadIdUserSecret")) + writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.threadIdUserSecret); + if (message.threadDsTimeframeOffset != null && Object.hasOwnProperty.call(message, "threadDsTimeframeOffset")) + writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.threadDsTimeframeOffset); + if (message.recentStickers != null && message.recentStickers.length) + for (var i = 0; i < message.recentStickers.length; ++i) + $root.proto.StickerMetadata.encode(message.recentStickers[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); + if (message.pastParticipants != null && message.pastParticipants.length) + for (var i = 0; i < message.pastParticipants.length; ++i) + $root.proto.PastParticipants.encode(message.pastParticipants[i], writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified HistorySync message, length delimited. Does not implicitly {@link proto.HistorySync.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HistorySync + * @static + * @param {proto.IHistorySync} message HistorySync message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySync.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HistorySync message from the specified reader or buffer. + * @function decode + * @memberof proto.HistorySync + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HistorySync} HistorySync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySync.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HistorySync(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.syncType = reader.int32(); + break; + case 2: + if (!(message.conversations && message.conversations.length)) + message.conversations = []; + message.conversations.push($root.proto.Conversation.decode(reader, reader.uint32())); + break; + case 3: + if (!(message.statusV3Messages && message.statusV3Messages.length)) + message.statusV3Messages = []; + message.statusV3Messages.push($root.proto.WebMessageInfo.decode(reader, reader.uint32())); + break; + case 5: + message.chunkOrder = reader.uint32(); + break; + case 6: + message.progress = reader.uint32(); + break; + case 7: + if (!(message.pushnames && message.pushnames.length)) + message.pushnames = []; + message.pushnames.push($root.proto.Pushname.decode(reader, reader.uint32())); + break; + case 8: + message.globalSettings = $root.proto.GlobalSettings.decode(reader, reader.uint32()); + break; + case 9: + message.threadIdUserSecret = reader.bytes(); + break; + case 10: + message.threadDsTimeframeOffset = reader.uint32(); + break; + case 11: + if (!(message.recentStickers && message.recentStickers.length)) + message.recentStickers = []; + message.recentStickers.push($root.proto.StickerMetadata.decode(reader, reader.uint32())); + break; + case 12: + if (!(message.pastParticipants && message.pastParticipants.length)) + message.pastParticipants = []; + message.pastParticipants.push($root.proto.PastParticipants.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("syncType")) + throw $util.ProtocolError("missing required 'syncType'", { instance: message }); + return message; + }; + + /** + * Decodes a HistorySync message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HistorySync + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HistorySync} HistorySync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySync.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HistorySync message. + * @function verify + * @memberof proto.HistorySync + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HistorySync.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + switch (message.syncType) { + default: + return "syncType: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } + if (message.conversations != null && message.hasOwnProperty("conversations")) { + if (!Array.isArray(message.conversations)) + return "conversations: array expected"; + for (var i = 0; i < message.conversations.length; ++i) { + var error = $root.proto.Conversation.verify(message.conversations[i]); + if (error) + return "conversations." + error; + } + } + if (message.statusV3Messages != null && message.hasOwnProperty("statusV3Messages")) { + if (!Array.isArray(message.statusV3Messages)) + return "statusV3Messages: array expected"; + for (var i = 0; i < message.statusV3Messages.length; ++i) { + var error = $root.proto.WebMessageInfo.verify(message.statusV3Messages[i]); + if (error) + return "statusV3Messages." + error; + } + } + if (message.chunkOrder != null && message.hasOwnProperty("chunkOrder")) + if (!$util.isInteger(message.chunkOrder)) + return "chunkOrder: integer expected"; + if (message.progress != null && message.hasOwnProperty("progress")) + if (!$util.isInteger(message.progress)) + return "progress: integer expected"; + if (message.pushnames != null && message.hasOwnProperty("pushnames")) { + if (!Array.isArray(message.pushnames)) + return "pushnames: array expected"; + for (var i = 0; i < message.pushnames.length; ++i) { + var error = $root.proto.Pushname.verify(message.pushnames[i]); + if (error) + return "pushnames." + error; + } + } + if (message.globalSettings != null && message.hasOwnProperty("globalSettings")) { + var error = $root.proto.GlobalSettings.verify(message.globalSettings); + if (error) + return "globalSettings." + error; + } + if (message.threadIdUserSecret != null && message.hasOwnProperty("threadIdUserSecret")) + if (!(message.threadIdUserSecret && typeof message.threadIdUserSecret.length === "number" || $util.isString(message.threadIdUserSecret))) + return "threadIdUserSecret: buffer expected"; + if (message.threadDsTimeframeOffset != null && message.hasOwnProperty("threadDsTimeframeOffset")) + if (!$util.isInteger(message.threadDsTimeframeOffset)) + return "threadDsTimeframeOffset: integer expected"; + if (message.recentStickers != null && message.hasOwnProperty("recentStickers")) { + if (!Array.isArray(message.recentStickers)) + return "recentStickers: array expected"; + for (var i = 0; i < message.recentStickers.length; ++i) { + var error = $root.proto.StickerMetadata.verify(message.recentStickers[i]); + if (error) + return "recentStickers." + error; + } + } + if (message.pastParticipants != null && message.hasOwnProperty("pastParticipants")) { + if (!Array.isArray(message.pastParticipants)) + return "pastParticipants: array expected"; + for (var i = 0; i < message.pastParticipants.length; ++i) { + var error = $root.proto.PastParticipants.verify(message.pastParticipants[i]); + if (error) + return "pastParticipants." + error; + } + } + return null; + }; + + /** + * Creates a HistorySync message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HistorySync + * @static + * @param {Object.} object Plain object + * @returns {proto.HistorySync} HistorySync + */ + HistorySync.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HistorySync) + return object; + var message = new $root.proto.HistorySync(); + switch (object.syncType) { + case "INITIAL_BOOTSTRAP": + case 0: + message.syncType = 0; + break; + case "INITIAL_STATUS_V3": + case 1: + message.syncType = 1; + break; + case "FULL": + case 2: + message.syncType = 2; + break; + case "RECENT": + case 3: + message.syncType = 3; + break; + case "PUSH_NAME": + case 4: + message.syncType = 4; + break; + case "NON_BLOCKING_DATA": + case 5: + message.syncType = 5; + break; + } + if (object.conversations) { + if (!Array.isArray(object.conversations)) + throw TypeError(".proto.HistorySync.conversations: array expected"); + message.conversations = []; + for (var i = 0; i < object.conversations.length; ++i) { + if (typeof object.conversations[i] !== "object") + throw TypeError(".proto.HistorySync.conversations: object expected"); + message.conversations[i] = $root.proto.Conversation.fromObject(object.conversations[i]); + } + } + if (object.statusV3Messages) { + if (!Array.isArray(object.statusV3Messages)) + throw TypeError(".proto.HistorySync.statusV3Messages: array expected"); + message.statusV3Messages = []; + for (var i = 0; i < object.statusV3Messages.length; ++i) { + if (typeof object.statusV3Messages[i] !== "object") + throw TypeError(".proto.HistorySync.statusV3Messages: object expected"); + message.statusV3Messages[i] = $root.proto.WebMessageInfo.fromObject(object.statusV3Messages[i]); + } + } + if (object.chunkOrder != null) + message.chunkOrder = object.chunkOrder >>> 0; + if (object.progress != null) + message.progress = object.progress >>> 0; + if (object.pushnames) { + if (!Array.isArray(object.pushnames)) + throw TypeError(".proto.HistorySync.pushnames: array expected"); + message.pushnames = []; + for (var i = 0; i < object.pushnames.length; ++i) { + if (typeof object.pushnames[i] !== "object") + throw TypeError(".proto.HistorySync.pushnames: object expected"); + message.pushnames[i] = $root.proto.Pushname.fromObject(object.pushnames[i]); + } + } + if (object.globalSettings != null) { + if (typeof object.globalSettings !== "object") + throw TypeError(".proto.HistorySync.globalSettings: object expected"); + message.globalSettings = $root.proto.GlobalSettings.fromObject(object.globalSettings); + } + if (object.threadIdUserSecret != null) + if (typeof object.threadIdUserSecret === "string") + $util.base64.decode(object.threadIdUserSecret, message.threadIdUserSecret = $util.newBuffer($util.base64.length(object.threadIdUserSecret)), 0); + else if (object.threadIdUserSecret.length) + message.threadIdUserSecret = object.threadIdUserSecret; + if (object.threadDsTimeframeOffset != null) + message.threadDsTimeframeOffset = object.threadDsTimeframeOffset >>> 0; + if (object.recentStickers) { + if (!Array.isArray(object.recentStickers)) + throw TypeError(".proto.HistorySync.recentStickers: array expected"); + message.recentStickers = []; + for (var i = 0; i < object.recentStickers.length; ++i) { + if (typeof object.recentStickers[i] !== "object") + throw TypeError(".proto.HistorySync.recentStickers: object expected"); + message.recentStickers[i] = $root.proto.StickerMetadata.fromObject(object.recentStickers[i]); + } + } + if (object.pastParticipants) { + if (!Array.isArray(object.pastParticipants)) + throw TypeError(".proto.HistorySync.pastParticipants: array expected"); + message.pastParticipants = []; + for (var i = 0; i < object.pastParticipants.length; ++i) { + if (typeof object.pastParticipants[i] !== "object") + throw TypeError(".proto.HistorySync.pastParticipants: object expected"); + message.pastParticipants[i] = $root.proto.PastParticipants.fromObject(object.pastParticipants[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a HistorySync message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HistorySync + * @static + * @param {proto.HistorySync} message HistorySync + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HistorySync.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.conversations = []; + object.statusV3Messages = []; + object.pushnames = []; + object.recentStickers = []; + object.pastParticipants = []; + } + if (options.defaults) { + object.syncType = options.enums === String ? "INITIAL_BOOTSTRAP" : 0; + object.chunkOrder = 0; + object.progress = 0; + object.globalSettings = null; + if (options.bytes === String) + object.threadIdUserSecret = ""; + else { + object.threadIdUserSecret = []; + if (options.bytes !== Array) + object.threadIdUserSecret = $util.newBuffer(object.threadIdUserSecret); + } + object.threadDsTimeframeOffset = 0; + } + if (message.syncType != null && message.hasOwnProperty("syncType")) + object.syncType = options.enums === String ? $root.proto.HistorySync.HistorySyncType[message.syncType] : message.syncType; + if (message.conversations && message.conversations.length) { + object.conversations = []; + for (var j = 0; j < message.conversations.length; ++j) + object.conversations[j] = $root.proto.Conversation.toObject(message.conversations[j], options); + } + if (message.statusV3Messages && message.statusV3Messages.length) { + object.statusV3Messages = []; + for (var j = 0; j < message.statusV3Messages.length; ++j) + object.statusV3Messages[j] = $root.proto.WebMessageInfo.toObject(message.statusV3Messages[j], options); + } + if (message.chunkOrder != null && message.hasOwnProperty("chunkOrder")) + object.chunkOrder = message.chunkOrder; + if (message.progress != null && message.hasOwnProperty("progress")) + object.progress = message.progress; + if (message.pushnames && message.pushnames.length) { + object.pushnames = []; + for (var j = 0; j < message.pushnames.length; ++j) + object.pushnames[j] = $root.proto.Pushname.toObject(message.pushnames[j], options); + } + if (message.globalSettings != null && message.hasOwnProperty("globalSettings")) + object.globalSettings = $root.proto.GlobalSettings.toObject(message.globalSettings, options); + if (message.threadIdUserSecret != null && message.hasOwnProperty("threadIdUserSecret")) + object.threadIdUserSecret = options.bytes === String ? $util.base64.encode(message.threadIdUserSecret, 0, message.threadIdUserSecret.length) : options.bytes === Array ? Array.prototype.slice.call(message.threadIdUserSecret) : message.threadIdUserSecret; + if (message.threadDsTimeframeOffset != null && message.hasOwnProperty("threadDsTimeframeOffset")) + object.threadDsTimeframeOffset = message.threadDsTimeframeOffset; + if (message.recentStickers && message.recentStickers.length) { + object.recentStickers = []; + for (var j = 0; j < message.recentStickers.length; ++j) + object.recentStickers[j] = $root.proto.StickerMetadata.toObject(message.recentStickers[j], options); + } + if (message.pastParticipants && message.pastParticipants.length) { + object.pastParticipants = []; + for (var j = 0; j < message.pastParticipants.length; ++j) + object.pastParticipants[j] = $root.proto.PastParticipants.toObject(message.pastParticipants[j], options); + } + return object; + }; + + /** + * Converts this HistorySync to JSON. + * @function toJSON + * @memberof proto.HistorySync + * @instance + * @returns {Object.} JSON object + */ + HistorySync.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * HistorySyncType enum. + * @name proto.HistorySync.HistorySyncType + * @enum {number} + * @property {number} INITIAL_BOOTSTRAP=0 INITIAL_BOOTSTRAP value + * @property {number} INITIAL_STATUS_V3=1 INITIAL_STATUS_V3 value + * @property {number} FULL=2 FULL value + * @property {number} RECENT=3 RECENT value + * @property {number} PUSH_NAME=4 PUSH_NAME value + * @property {number} NON_BLOCKING_DATA=5 NON_BLOCKING_DATA value + */ + HistorySync.HistorySyncType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "INITIAL_BOOTSTRAP"] = 0; + values[valuesById[1] = "INITIAL_STATUS_V3"] = 1; + values[valuesById[2] = "FULL"] = 2; + values[valuesById[3] = "RECENT"] = 3; + values[valuesById[4] = "PUSH_NAME"] = 4; + values[valuesById[5] = "NON_BLOCKING_DATA"] = 5; + return values; + })(); + + return HistorySync; + })(); + + proto.HistorySyncMsg = (function() { + + /** + * Properties of a HistorySyncMsg. + * @memberof proto + * @interface IHistorySyncMsg + * @property {proto.IWebMessageInfo|null} [message] HistorySyncMsg message + * @property {number|Long|null} [msgOrderId] HistorySyncMsg msgOrderId + */ + + /** + * Constructs a new HistorySyncMsg. + * @memberof proto + * @classdesc Represents a HistorySyncMsg. + * @implements IHistorySyncMsg + * @constructor + * @param {proto.IHistorySyncMsg=} [properties] Properties to set + */ + function HistorySyncMsg(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HistorySyncMsg message. + * @member {proto.IWebMessageInfo|null|undefined} message + * @memberof proto.HistorySyncMsg + * @instance + */ + HistorySyncMsg.prototype.message = null; + + /** + * HistorySyncMsg msgOrderId. + * @member {number|Long} msgOrderId + * @memberof proto.HistorySyncMsg + * @instance + */ + HistorySyncMsg.prototype.msgOrderId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new HistorySyncMsg instance using the specified properties. + * @function create + * @memberof proto.HistorySyncMsg + * @static + * @param {proto.IHistorySyncMsg=} [properties] Properties to set + * @returns {proto.HistorySyncMsg} HistorySyncMsg instance + */ + HistorySyncMsg.create = function create(properties) { + return new HistorySyncMsg(properties); + }; + + /** + * Encodes the specified HistorySyncMsg message. Does not implicitly {@link proto.HistorySyncMsg.verify|verify} messages. + * @function encode + * @memberof proto.HistorySyncMsg + * @static + * @param {proto.IHistorySyncMsg} message HistorySyncMsg message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySyncMsg.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + $root.proto.WebMessageInfo.encode(message.message, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.msgOrderId != null && Object.hasOwnProperty.call(message, "msgOrderId")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.msgOrderId); + return writer; + }; + + /** + * Encodes the specified HistorySyncMsg message, length delimited. Does not implicitly {@link proto.HistorySyncMsg.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HistorySyncMsg + * @static + * @param {proto.IHistorySyncMsg} message HistorySyncMsg message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySyncMsg.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HistorySyncMsg message from the specified reader or buffer. + * @function decode + * @memberof proto.HistorySyncMsg + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HistorySyncMsg} HistorySyncMsg + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySyncMsg.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HistorySyncMsg(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.message = $root.proto.WebMessageInfo.decode(reader, reader.uint32()); + break; + case 2: + message.msgOrderId = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HistorySyncMsg message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HistorySyncMsg + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HistorySyncMsg} HistorySyncMsg + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySyncMsg.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HistorySyncMsg message. + * @function verify + * @memberof proto.HistorySyncMsg + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HistorySyncMsg.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.message != null && message.hasOwnProperty("message")) { + var error = $root.proto.WebMessageInfo.verify(message.message); + if (error) + return "message." + error; + } + if (message.msgOrderId != null && message.hasOwnProperty("msgOrderId")) + if (!$util.isInteger(message.msgOrderId) && !(message.msgOrderId && $util.isInteger(message.msgOrderId.low) && $util.isInteger(message.msgOrderId.high))) + return "msgOrderId: integer|Long expected"; + return null; + }; + + /** + * Creates a HistorySyncMsg message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HistorySyncMsg + * @static + * @param {Object.} object Plain object + * @returns {proto.HistorySyncMsg} HistorySyncMsg + */ + HistorySyncMsg.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HistorySyncMsg) + return object; + var message = new $root.proto.HistorySyncMsg(); + if (object.message != null) { + if (typeof object.message !== "object") + throw TypeError(".proto.HistorySyncMsg.message: object expected"); + message.message = $root.proto.WebMessageInfo.fromObject(object.message); + } + if (object.msgOrderId != null) + if ($util.Long) + (message.msgOrderId = $util.Long.fromValue(object.msgOrderId)).unsigned = true; + else if (typeof object.msgOrderId === "string") + message.msgOrderId = parseInt(object.msgOrderId, 10); + else if (typeof object.msgOrderId === "number") + message.msgOrderId = object.msgOrderId; + else if (typeof object.msgOrderId === "object") + message.msgOrderId = new $util.LongBits(object.msgOrderId.low >>> 0, object.msgOrderId.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a HistorySyncMsg message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HistorySyncMsg + * @static + * @param {proto.HistorySyncMsg} message HistorySyncMsg + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HistorySyncMsg.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.message = null; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.msgOrderId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.msgOrderId = options.longs === String ? "0" : 0; + } + if (message.message != null && message.hasOwnProperty("message")) + object.message = $root.proto.WebMessageInfo.toObject(message.message, options); + if (message.msgOrderId != null && message.hasOwnProperty("msgOrderId")) + if (typeof message.msgOrderId === "number") + object.msgOrderId = options.longs === String ? String(message.msgOrderId) : message.msgOrderId; + else + object.msgOrderId = options.longs === String ? $util.Long.prototype.toString.call(message.msgOrderId) : options.longs === Number ? new $util.LongBits(message.msgOrderId.low >>> 0, message.msgOrderId.high >>> 0).toNumber(true) : message.msgOrderId; + return object; + }; + + /** + * Converts this HistorySyncMsg to JSON. + * @function toJSON + * @memberof proto.HistorySyncMsg + * @instance + * @returns {Object.} JSON object + */ + HistorySyncMsg.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HistorySyncMsg; + })(); + + proto.HydratedTemplateButton = (function() { + + /** + * Properties of a HydratedTemplateButton. + * @memberof proto + * @interface IHydratedTemplateButton + * @property {number|null} [index] HydratedTemplateButton index + * @property {proto.HydratedTemplateButton.IHydratedQuickReplyButton|null} [quickReplyButton] HydratedTemplateButton quickReplyButton + * @property {proto.HydratedTemplateButton.IHydratedURLButton|null} [urlButton] HydratedTemplateButton urlButton + * @property {proto.HydratedTemplateButton.IHydratedCallButton|null} [callButton] HydratedTemplateButton callButton + */ + + /** + * Constructs a new HydratedTemplateButton. + * @memberof proto + * @classdesc Represents a HydratedTemplateButton. + * @implements IHydratedTemplateButton + * @constructor + * @param {proto.IHydratedTemplateButton=} [properties] Properties to set + */ + function HydratedTemplateButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HydratedTemplateButton index. + * @member {number} index + * @memberof proto.HydratedTemplateButton + * @instance + */ + HydratedTemplateButton.prototype.index = 0; + + /** + * HydratedTemplateButton quickReplyButton. + * @member {proto.HydratedTemplateButton.IHydratedQuickReplyButton|null|undefined} quickReplyButton + * @memberof proto.HydratedTemplateButton + * @instance + */ + HydratedTemplateButton.prototype.quickReplyButton = null; + + /** + * HydratedTemplateButton urlButton. + * @member {proto.HydratedTemplateButton.IHydratedURLButton|null|undefined} urlButton + * @memberof proto.HydratedTemplateButton + * @instance + */ + HydratedTemplateButton.prototype.urlButton = null; + + /** + * HydratedTemplateButton callButton. + * @member {proto.HydratedTemplateButton.IHydratedCallButton|null|undefined} callButton + * @memberof proto.HydratedTemplateButton + * @instance + */ + HydratedTemplateButton.prototype.callButton = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * HydratedTemplateButton hydratedButton. + * @member {"quickReplyButton"|"urlButton"|"callButton"|undefined} hydratedButton + * @memberof proto.HydratedTemplateButton + * @instance + */ + Object.defineProperty(HydratedTemplateButton.prototype, "hydratedButton", { + get: $util.oneOfGetter($oneOfFields = ["quickReplyButton", "urlButton", "callButton"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new HydratedTemplateButton instance using the specified properties. + * @function create + * @memberof proto.HydratedTemplateButton + * @static + * @param {proto.IHydratedTemplateButton=} [properties] Properties to set + * @returns {proto.HydratedTemplateButton} HydratedTemplateButton instance + */ + HydratedTemplateButton.create = function create(properties) { + return new HydratedTemplateButton(properties); + }; + + /** + * Encodes the specified HydratedTemplateButton message. Does not implicitly {@link proto.HydratedTemplateButton.verify|verify} messages. + * @function encode + * @memberof proto.HydratedTemplateButton + * @static + * @param {proto.IHydratedTemplateButton} message HydratedTemplateButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedTemplateButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.quickReplyButton != null && Object.hasOwnProperty.call(message, "quickReplyButton")) + $root.proto.HydratedTemplateButton.HydratedQuickReplyButton.encode(message.quickReplyButton, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.urlButton != null && Object.hasOwnProperty.call(message, "urlButton")) + $root.proto.HydratedTemplateButton.HydratedURLButton.encode(message.urlButton, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.callButton != null && Object.hasOwnProperty.call(message, "callButton")) + $root.proto.HydratedTemplateButton.HydratedCallButton.encode(message.callButton, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.index != null && Object.hasOwnProperty.call(message, "index")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.index); + return writer; + }; + + /** + * Encodes the specified HydratedTemplateButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HydratedTemplateButton + * @static + * @param {proto.IHydratedTemplateButton} message HydratedTemplateButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedTemplateButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HydratedTemplateButton message from the specified reader or buffer. + * @function decode + * @memberof proto.HydratedTemplateButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HydratedTemplateButton} HydratedTemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedTemplateButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HydratedTemplateButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 4: + message.index = reader.uint32(); + break; + case 1: + message.quickReplyButton = $root.proto.HydratedTemplateButton.HydratedQuickReplyButton.decode(reader, reader.uint32()); + break; + case 2: + message.urlButton = $root.proto.HydratedTemplateButton.HydratedURLButton.decode(reader, reader.uint32()); + break; + case 3: + message.callButton = $root.proto.HydratedTemplateButton.HydratedCallButton.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HydratedTemplateButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HydratedTemplateButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HydratedTemplateButton} HydratedTemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedTemplateButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HydratedTemplateButton message. + * @function verify + * @memberof proto.HydratedTemplateButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HydratedTemplateButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.index != null && message.hasOwnProperty("index")) + if (!$util.isInteger(message.index)) + return "index: integer expected"; + if (message.quickReplyButton != null && message.hasOwnProperty("quickReplyButton")) { + properties.hydratedButton = 1; + { + var error = $root.proto.HydratedTemplateButton.HydratedQuickReplyButton.verify(message.quickReplyButton); + if (error) + return "quickReplyButton." + error; + } + } + if (message.urlButton != null && message.hasOwnProperty("urlButton")) { + if (properties.hydratedButton === 1) + return "hydratedButton: multiple values"; + properties.hydratedButton = 1; + { + var error = $root.proto.HydratedTemplateButton.HydratedURLButton.verify(message.urlButton); + if (error) + return "urlButton." + error; + } + } + if (message.callButton != null && message.hasOwnProperty("callButton")) { + if (properties.hydratedButton === 1) + return "hydratedButton: multiple values"; + properties.hydratedButton = 1; + { + var error = $root.proto.HydratedTemplateButton.HydratedCallButton.verify(message.callButton); + if (error) + return "callButton." + error; + } + } + return null; + }; + + /** + * Creates a HydratedTemplateButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HydratedTemplateButton + * @static + * @param {Object.} object Plain object + * @returns {proto.HydratedTemplateButton} HydratedTemplateButton + */ + HydratedTemplateButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HydratedTemplateButton) + return object; + var message = new $root.proto.HydratedTemplateButton(); + if (object.index != null) + message.index = object.index >>> 0; + if (object.quickReplyButton != null) { + if (typeof object.quickReplyButton !== "object") + throw TypeError(".proto.HydratedTemplateButton.quickReplyButton: object expected"); + message.quickReplyButton = $root.proto.HydratedTemplateButton.HydratedQuickReplyButton.fromObject(object.quickReplyButton); + } + if (object.urlButton != null) { + if (typeof object.urlButton !== "object") + throw TypeError(".proto.HydratedTemplateButton.urlButton: object expected"); + message.urlButton = $root.proto.HydratedTemplateButton.HydratedURLButton.fromObject(object.urlButton); + } + if (object.callButton != null) { + if (typeof object.callButton !== "object") + throw TypeError(".proto.HydratedTemplateButton.callButton: object expected"); + message.callButton = $root.proto.HydratedTemplateButton.HydratedCallButton.fromObject(object.callButton); + } + return message; + }; + + /** + * Creates a plain object from a HydratedTemplateButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HydratedTemplateButton + * @static + * @param {proto.HydratedTemplateButton} message HydratedTemplateButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HydratedTemplateButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.index = 0; + if (message.quickReplyButton != null && message.hasOwnProperty("quickReplyButton")) { + object.quickReplyButton = $root.proto.HydratedTemplateButton.HydratedQuickReplyButton.toObject(message.quickReplyButton, options); + if (options.oneofs) + object.hydratedButton = "quickReplyButton"; + } + if (message.urlButton != null && message.hasOwnProperty("urlButton")) { + object.urlButton = $root.proto.HydratedTemplateButton.HydratedURLButton.toObject(message.urlButton, options); + if (options.oneofs) + object.hydratedButton = "urlButton"; + } + if (message.callButton != null && message.hasOwnProperty("callButton")) { + object.callButton = $root.proto.HydratedTemplateButton.HydratedCallButton.toObject(message.callButton, options); + if (options.oneofs) + object.hydratedButton = "callButton"; + } + if (message.index != null && message.hasOwnProperty("index")) + object.index = message.index; + return object; + }; + + /** + * Converts this HydratedTemplateButton to JSON. + * @function toJSON + * @memberof proto.HydratedTemplateButton + * @instance + * @returns {Object.} JSON object + */ + HydratedTemplateButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + HydratedTemplateButton.HydratedCallButton = (function() { + + /** + * Properties of a HydratedCallButton. + * @memberof proto.HydratedTemplateButton + * @interface IHydratedCallButton + * @property {string|null} [displayText] HydratedCallButton displayText + * @property {string|null} [phoneNumber] HydratedCallButton phoneNumber + */ + + /** + * Constructs a new HydratedCallButton. + * @memberof proto.HydratedTemplateButton + * @classdesc Represents a HydratedCallButton. + * @implements IHydratedCallButton + * @constructor + * @param {proto.HydratedTemplateButton.IHydratedCallButton=} [properties] Properties to set + */ + function HydratedCallButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HydratedCallButton displayText. + * @member {string} displayText + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @instance + */ + HydratedCallButton.prototype.displayText = ""; + + /** + * HydratedCallButton phoneNumber. + * @member {string} phoneNumber + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @instance + */ + HydratedCallButton.prototype.phoneNumber = ""; + + /** + * Creates a new HydratedCallButton instance using the specified properties. + * @function create + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedCallButton=} [properties] Properties to set + * @returns {proto.HydratedTemplateButton.HydratedCallButton} HydratedCallButton instance + */ + HydratedCallButton.create = function create(properties) { + return new HydratedCallButton(properties); + }; + + /** + * Encodes the specified HydratedCallButton message. Does not implicitly {@link proto.HydratedTemplateButton.HydratedCallButton.verify|verify} messages. + * @function encode + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedCallButton} message HydratedCallButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedCallButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayText != null && Object.hasOwnProperty.call(message, "displayText")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.displayText); + if (message.phoneNumber != null && Object.hasOwnProperty.call(message, "phoneNumber")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.phoneNumber); + return writer; + }; + + /** + * Encodes the specified HydratedCallButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.HydratedCallButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedCallButton} message HydratedCallButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedCallButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HydratedCallButton message from the specified reader or buffer. + * @function decode + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HydratedTemplateButton.HydratedCallButton} HydratedCallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedCallButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HydratedTemplateButton.HydratedCallButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayText = reader.string(); + break; + case 2: + message.phoneNumber = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HydratedCallButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HydratedTemplateButton.HydratedCallButton} HydratedCallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedCallButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HydratedCallButton message. + * @function verify + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HydratedCallButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayText != null && message.hasOwnProperty("displayText")) + if (!$util.isString(message.displayText)) + return "displayText: string expected"; + if (message.phoneNumber != null && message.hasOwnProperty("phoneNumber")) + if (!$util.isString(message.phoneNumber)) + return "phoneNumber: string expected"; + return null; + }; + + /** + * Creates a HydratedCallButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {Object.} object Plain object + * @returns {proto.HydratedTemplateButton.HydratedCallButton} HydratedCallButton + */ + HydratedCallButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HydratedTemplateButton.HydratedCallButton) + return object; + var message = new $root.proto.HydratedTemplateButton.HydratedCallButton(); + if (object.displayText != null) + message.displayText = String(object.displayText); + if (object.phoneNumber != null) + message.phoneNumber = String(object.phoneNumber); + return message; + }; + + /** + * Creates a plain object from a HydratedCallButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @static + * @param {proto.HydratedTemplateButton.HydratedCallButton} message HydratedCallButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HydratedCallButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayText = ""; + object.phoneNumber = ""; + } + if (message.displayText != null && message.hasOwnProperty("displayText")) + object.displayText = message.displayText; + if (message.phoneNumber != null && message.hasOwnProperty("phoneNumber")) + object.phoneNumber = message.phoneNumber; + return object; + }; + + /** + * Converts this HydratedCallButton to JSON. + * @function toJSON + * @memberof proto.HydratedTemplateButton.HydratedCallButton + * @instance + * @returns {Object.} JSON object + */ + HydratedCallButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HydratedCallButton; + })(); + + HydratedTemplateButton.HydratedQuickReplyButton = (function() { + + /** + * Properties of a HydratedQuickReplyButton. + * @memberof proto.HydratedTemplateButton + * @interface IHydratedQuickReplyButton + * @property {string|null} [displayText] HydratedQuickReplyButton displayText + * @property {string|null} [id] HydratedQuickReplyButton id + */ + + /** + * Constructs a new HydratedQuickReplyButton. + * @memberof proto.HydratedTemplateButton + * @classdesc Represents a HydratedQuickReplyButton. + * @implements IHydratedQuickReplyButton + * @constructor + * @param {proto.HydratedTemplateButton.IHydratedQuickReplyButton=} [properties] Properties to set + */ + function HydratedQuickReplyButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HydratedQuickReplyButton displayText. + * @member {string} displayText + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @instance + */ + HydratedQuickReplyButton.prototype.displayText = ""; + + /** + * HydratedQuickReplyButton id. + * @member {string} id + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @instance + */ + HydratedQuickReplyButton.prototype.id = ""; + + /** + * Creates a new HydratedQuickReplyButton instance using the specified properties. + * @function create + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedQuickReplyButton=} [properties] Properties to set + * @returns {proto.HydratedTemplateButton.HydratedQuickReplyButton} HydratedQuickReplyButton instance + */ + HydratedQuickReplyButton.create = function create(properties) { + return new HydratedQuickReplyButton(properties); + }; + + /** + * Encodes the specified HydratedQuickReplyButton message. Does not implicitly {@link proto.HydratedTemplateButton.HydratedQuickReplyButton.verify|verify} messages. + * @function encode + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedQuickReplyButton} message HydratedQuickReplyButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedQuickReplyButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayText != null && Object.hasOwnProperty.call(message, "displayText")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.displayText); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.id); + return writer; + }; + + /** + * Encodes the specified HydratedQuickReplyButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.HydratedQuickReplyButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedQuickReplyButton} message HydratedQuickReplyButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedQuickReplyButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HydratedQuickReplyButton message from the specified reader or buffer. + * @function decode + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HydratedTemplateButton.HydratedQuickReplyButton} HydratedQuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedQuickReplyButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HydratedTemplateButton.HydratedQuickReplyButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayText = reader.string(); + break; + case 2: + message.id = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HydratedQuickReplyButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HydratedTemplateButton.HydratedQuickReplyButton} HydratedQuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedQuickReplyButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HydratedQuickReplyButton message. + * @function verify + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HydratedQuickReplyButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayText != null && message.hasOwnProperty("displayText")) + if (!$util.isString(message.displayText)) + return "displayText: string expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + return null; + }; + + /** + * Creates a HydratedQuickReplyButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {Object.} object Plain object + * @returns {proto.HydratedTemplateButton.HydratedQuickReplyButton} HydratedQuickReplyButton + */ + HydratedQuickReplyButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HydratedTemplateButton.HydratedQuickReplyButton) + return object; + var message = new $root.proto.HydratedTemplateButton.HydratedQuickReplyButton(); + if (object.displayText != null) + message.displayText = String(object.displayText); + if (object.id != null) + message.id = String(object.id); + return message; + }; + + /** + * Creates a plain object from a HydratedQuickReplyButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @static + * @param {proto.HydratedTemplateButton.HydratedQuickReplyButton} message HydratedQuickReplyButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HydratedQuickReplyButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayText = ""; + object.id = ""; + } + if (message.displayText != null && message.hasOwnProperty("displayText")) + object.displayText = message.displayText; + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + return object; + }; + + /** + * Converts this HydratedQuickReplyButton to JSON. + * @function toJSON + * @memberof proto.HydratedTemplateButton.HydratedQuickReplyButton + * @instance + * @returns {Object.} JSON object + */ + HydratedQuickReplyButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HydratedQuickReplyButton; + })(); + + HydratedTemplateButton.HydratedURLButton = (function() { + + /** + * Properties of a HydratedURLButton. + * @memberof proto.HydratedTemplateButton + * @interface IHydratedURLButton + * @property {string|null} [displayText] HydratedURLButton displayText + * @property {string|null} [url] HydratedURLButton url + */ + + /** + * Constructs a new HydratedURLButton. + * @memberof proto.HydratedTemplateButton + * @classdesc Represents a HydratedURLButton. + * @implements IHydratedURLButton + * @constructor + * @param {proto.HydratedTemplateButton.IHydratedURLButton=} [properties] Properties to set + */ + function HydratedURLButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HydratedURLButton displayText. + * @member {string} displayText + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @instance + */ + HydratedURLButton.prototype.displayText = ""; + + /** + * HydratedURLButton url. + * @member {string} url + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @instance + */ + HydratedURLButton.prototype.url = ""; + + /** + * Creates a new HydratedURLButton instance using the specified properties. + * @function create + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedURLButton=} [properties] Properties to set + * @returns {proto.HydratedTemplateButton.HydratedURLButton} HydratedURLButton instance + */ + HydratedURLButton.create = function create(properties) { + return new HydratedURLButton(properties); + }; + + /** + * Encodes the specified HydratedURLButton message. Does not implicitly {@link proto.HydratedTemplateButton.HydratedURLButton.verify|verify} messages. + * @function encode + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedURLButton} message HydratedURLButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedURLButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayText != null && Object.hasOwnProperty.call(message, "displayText")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.displayText); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.url); + return writer; + }; + + /** + * Encodes the specified HydratedURLButton message, length delimited. Does not implicitly {@link proto.HydratedTemplateButton.HydratedURLButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {proto.HydratedTemplateButton.IHydratedURLButton} message HydratedURLButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedURLButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HydratedURLButton message from the specified reader or buffer. + * @function decode + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.HydratedTemplateButton.HydratedURLButton} HydratedURLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedURLButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.HydratedTemplateButton.HydratedURLButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayText = reader.string(); + break; + case 2: + message.url = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HydratedURLButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.HydratedTemplateButton.HydratedURLButton} HydratedURLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedURLButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HydratedURLButton message. + * @function verify + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HydratedURLButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayText != null && message.hasOwnProperty("displayText")) + if (!$util.isString(message.displayText)) + return "displayText: string expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + return null; + }; + + /** + * Creates a HydratedURLButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {Object.} object Plain object + * @returns {proto.HydratedTemplateButton.HydratedURLButton} HydratedURLButton + */ + HydratedURLButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.HydratedTemplateButton.HydratedURLButton) + return object; + var message = new $root.proto.HydratedTemplateButton.HydratedURLButton(); + if (object.displayText != null) + message.displayText = String(object.displayText); + if (object.url != null) + message.url = String(object.url); + return message; + }; + + /** + * Creates a plain object from a HydratedURLButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @static + * @param {proto.HydratedTemplateButton.HydratedURLButton} message HydratedURLButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HydratedURLButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayText = ""; + object.url = ""; + } + if (message.displayText != null && message.hasOwnProperty("displayText")) + object.displayText = message.displayText; + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + return object; + }; + + /** + * Converts this HydratedURLButton to JSON. + * @function toJSON + * @memberof proto.HydratedTemplateButton.HydratedURLButton + * @instance + * @returns {Object.} JSON object + */ + HydratedURLButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HydratedURLButton; + })(); + + return HydratedTemplateButton; + })(); + + proto.IdentityKeyPairStructure = (function() { + + /** + * Properties of an IdentityKeyPairStructure. + * @memberof proto + * @interface IIdentityKeyPairStructure + * @property {Uint8Array|null} [publicKey] IdentityKeyPairStructure publicKey + * @property {Uint8Array|null} [privateKey] IdentityKeyPairStructure privateKey + */ + + /** + * Constructs a new IdentityKeyPairStructure. + * @memberof proto + * @classdesc Represents an IdentityKeyPairStructure. + * @implements IIdentityKeyPairStructure + * @constructor + * @param {proto.IIdentityKeyPairStructure=} [properties] Properties to set + */ + function IdentityKeyPairStructure(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentityKeyPairStructure publicKey. + * @member {Uint8Array} publicKey + * @memberof proto.IdentityKeyPairStructure + * @instance + */ + IdentityKeyPairStructure.prototype.publicKey = $util.newBuffer([]); + + /** + * IdentityKeyPairStructure privateKey. + * @member {Uint8Array} privateKey + * @memberof proto.IdentityKeyPairStructure + * @instance + */ + IdentityKeyPairStructure.prototype.privateKey = $util.newBuffer([]); + + /** + * Creates a new IdentityKeyPairStructure instance using the specified properties. + * @function create + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {proto.IIdentityKeyPairStructure=} [properties] Properties to set + * @returns {proto.IdentityKeyPairStructure} IdentityKeyPairStructure instance + */ + IdentityKeyPairStructure.create = function create(properties) { + return new IdentityKeyPairStructure(properties); + }; + + /** + * Encodes the specified IdentityKeyPairStructure message. Does not implicitly {@link proto.IdentityKeyPairStructure.verify|verify} messages. + * @function encode + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {proto.IIdentityKeyPairStructure} message IdentityKeyPairStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityKeyPairStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.publicKey); + if (message.privateKey != null && Object.hasOwnProperty.call(message, "privateKey")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.privateKey); + return writer; + }; + + /** + * Encodes the specified IdentityKeyPairStructure message, length delimited. Does not implicitly {@link proto.IdentityKeyPairStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {proto.IIdentityKeyPairStructure} message IdentityKeyPairStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityKeyPairStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an IdentityKeyPairStructure message from the specified reader or buffer. + * @function decode + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.IdentityKeyPairStructure} IdentityKeyPairStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityKeyPairStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.IdentityKeyPairStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.publicKey = reader.bytes(); + break; + case 2: + message.privateKey = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an IdentityKeyPairStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.IdentityKeyPairStructure} IdentityKeyPairStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityKeyPairStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an IdentityKeyPairStructure message. + * @function verify + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityKeyPairStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.publicKey != null && message.hasOwnProperty("publicKey")) + if (!(message.publicKey && typeof message.publicKey.length === "number" || $util.isString(message.publicKey))) + return "publicKey: buffer expected"; + if (message.privateKey != null && message.hasOwnProperty("privateKey")) + if (!(message.privateKey && typeof message.privateKey.length === "number" || $util.isString(message.privateKey))) + return "privateKey: buffer expected"; + return null; + }; + + /** + * Creates an IdentityKeyPairStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {Object.} object Plain object + * @returns {proto.IdentityKeyPairStructure} IdentityKeyPairStructure + */ + IdentityKeyPairStructure.fromObject = function fromObject(object) { + if (object instanceof $root.proto.IdentityKeyPairStructure) + return object; + var message = new $root.proto.IdentityKeyPairStructure(); + if (object.publicKey != null) + if (typeof object.publicKey === "string") + $util.base64.decode(object.publicKey, message.publicKey = $util.newBuffer($util.base64.length(object.publicKey)), 0); + else if (object.publicKey.length) + message.publicKey = object.publicKey; + if (object.privateKey != null) + if (typeof object.privateKey === "string") + $util.base64.decode(object.privateKey, message.privateKey = $util.newBuffer($util.base64.length(object.privateKey)), 0); + else if (object.privateKey.length) + message.privateKey = object.privateKey; + return message; + }; + + /** + * Creates a plain object from an IdentityKeyPairStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.IdentityKeyPairStructure + * @static + * @param {proto.IdentityKeyPairStructure} message IdentityKeyPairStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + IdentityKeyPairStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.publicKey = ""; + else { + object.publicKey = []; + if (options.bytes !== Array) + object.publicKey = $util.newBuffer(object.publicKey); + } + if (options.bytes === String) + object.privateKey = ""; + else { + object.privateKey = []; + if (options.bytes !== Array) + object.privateKey = $util.newBuffer(object.privateKey); + } + } + if (message.publicKey != null && message.hasOwnProperty("publicKey")) + object.publicKey = options.bytes === String ? $util.base64.encode(message.publicKey, 0, message.publicKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.publicKey) : message.publicKey; + if (message.privateKey != null && message.hasOwnProperty("privateKey")) + object.privateKey = options.bytes === String ? $util.base64.encode(message.privateKey, 0, message.privateKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.privateKey) : message.privateKey; + return object; + }; + + /** + * Converts this IdentityKeyPairStructure to JSON. + * @function toJSON + * @memberof proto.IdentityKeyPairStructure + * @instance + * @returns {Object.} JSON object + */ + IdentityKeyPairStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityKeyPairStructure; + })(); + + proto.InteractiveAnnotation = (function() { + + /** + * Properties of an InteractiveAnnotation. + * @memberof proto + * @interface IInteractiveAnnotation + * @property {Array.|null} [polygonVertices] InteractiveAnnotation polygonVertices + * @property {proto.ILocation|null} [location] InteractiveAnnotation location + */ + + /** + * Constructs a new InteractiveAnnotation. + * @memberof proto + * @classdesc Represents an InteractiveAnnotation. + * @implements IInteractiveAnnotation + * @constructor + * @param {proto.IInteractiveAnnotation=} [properties] Properties to set + */ + function InteractiveAnnotation(properties) { + this.polygonVertices = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * InteractiveAnnotation polygonVertices. + * @member {Array.} polygonVertices + * @memberof proto.InteractiveAnnotation + * @instance + */ + InteractiveAnnotation.prototype.polygonVertices = $util.emptyArray; + + /** + * InteractiveAnnotation location. + * @member {proto.ILocation|null|undefined} location + * @memberof proto.InteractiveAnnotation + * @instance + */ + InteractiveAnnotation.prototype.location = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * InteractiveAnnotation action. + * @member {"location"|undefined} action + * @memberof proto.InteractiveAnnotation + * @instance + */ + Object.defineProperty(InteractiveAnnotation.prototype, "action", { + get: $util.oneOfGetter($oneOfFields = ["location"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new InteractiveAnnotation instance using the specified properties. + * @function create + * @memberof proto.InteractiveAnnotation + * @static + * @param {proto.IInteractiveAnnotation=} [properties] Properties to set + * @returns {proto.InteractiveAnnotation} InteractiveAnnotation instance + */ + InteractiveAnnotation.create = function create(properties) { + return new InteractiveAnnotation(properties); + }; + + /** + * Encodes the specified InteractiveAnnotation message. Does not implicitly {@link proto.InteractiveAnnotation.verify|verify} messages. + * @function encode + * @memberof proto.InteractiveAnnotation + * @static + * @param {proto.IInteractiveAnnotation} message InteractiveAnnotation message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InteractiveAnnotation.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.polygonVertices != null && message.polygonVertices.length) + for (var i = 0; i < message.polygonVertices.length; ++i) + $root.proto.Point.encode(message.polygonVertices[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.location != null && Object.hasOwnProperty.call(message, "location")) + $root.proto.Location.encode(message.location, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified InteractiveAnnotation message, length delimited. Does not implicitly {@link proto.InteractiveAnnotation.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.InteractiveAnnotation + * @static + * @param {proto.IInteractiveAnnotation} message InteractiveAnnotation message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InteractiveAnnotation.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an InteractiveAnnotation message from the specified reader or buffer. + * @function decode + * @memberof proto.InteractiveAnnotation + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.InteractiveAnnotation} InteractiveAnnotation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InteractiveAnnotation.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.InteractiveAnnotation(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.polygonVertices && message.polygonVertices.length)) + message.polygonVertices = []; + message.polygonVertices.push($root.proto.Point.decode(reader, reader.uint32())); + break; + case 2: + message.location = $root.proto.Location.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an InteractiveAnnotation message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.InteractiveAnnotation + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.InteractiveAnnotation} InteractiveAnnotation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InteractiveAnnotation.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an InteractiveAnnotation message. + * @function verify + * @memberof proto.InteractiveAnnotation + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + InteractiveAnnotation.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.polygonVertices != null && message.hasOwnProperty("polygonVertices")) { + if (!Array.isArray(message.polygonVertices)) + return "polygonVertices: array expected"; + for (var i = 0; i < message.polygonVertices.length; ++i) { + var error = $root.proto.Point.verify(message.polygonVertices[i]); + if (error) + return "polygonVertices." + error; + } + } + if (message.location != null && message.hasOwnProperty("location")) { + properties.action = 1; + { + var error = $root.proto.Location.verify(message.location); + if (error) + return "location." + error; + } + } + return null; + }; + + /** + * Creates an InteractiveAnnotation message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.InteractiveAnnotation + * @static + * @param {Object.} object Plain object + * @returns {proto.InteractiveAnnotation} InteractiveAnnotation + */ + InteractiveAnnotation.fromObject = function fromObject(object) { + if (object instanceof $root.proto.InteractiveAnnotation) + return object; + var message = new $root.proto.InteractiveAnnotation(); + if (object.polygonVertices) { + if (!Array.isArray(object.polygonVertices)) + throw TypeError(".proto.InteractiveAnnotation.polygonVertices: array expected"); + message.polygonVertices = []; + for (var i = 0; i < object.polygonVertices.length; ++i) { + if (typeof object.polygonVertices[i] !== "object") + throw TypeError(".proto.InteractiveAnnotation.polygonVertices: object expected"); + message.polygonVertices[i] = $root.proto.Point.fromObject(object.polygonVertices[i]); + } + } + if (object.location != null) { + if (typeof object.location !== "object") + throw TypeError(".proto.InteractiveAnnotation.location: object expected"); + message.location = $root.proto.Location.fromObject(object.location); + } + return message; + }; + + /** + * Creates a plain object from an InteractiveAnnotation message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.InteractiveAnnotation + * @static + * @param {proto.InteractiveAnnotation} message InteractiveAnnotation + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + InteractiveAnnotation.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.polygonVertices = []; + if (message.polygonVertices && message.polygonVertices.length) { + object.polygonVertices = []; + for (var j = 0; j < message.polygonVertices.length; ++j) + object.polygonVertices[j] = $root.proto.Point.toObject(message.polygonVertices[j], options); + } + if (message.location != null && message.hasOwnProperty("location")) { + object.location = $root.proto.Location.toObject(message.location, options); + if (options.oneofs) + object.action = "location"; + } + return object; + }; + + /** + * Converts this InteractiveAnnotation to JSON. + * @function toJSON + * @memberof proto.InteractiveAnnotation + * @instance + * @returns {Object.} JSON object + */ + InteractiveAnnotation.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return InteractiveAnnotation; + })(); + + proto.KeepInChat = (function() { + + /** + * Properties of a KeepInChat. + * @memberof proto + * @interface IKeepInChat + * @property {proto.KeepType|null} [keepType] KeepInChat keepType + * @property {number|Long|null} [serverTimestamp] KeepInChat serverTimestamp + * @property {proto.IMessageKey|null} [key] KeepInChat key + * @property {string|null} [deviceJid] KeepInChat deviceJid + * @property {number|Long|null} [clientTimestampMs] KeepInChat clientTimestampMs + * @property {number|Long|null} [serverTimestampMs] KeepInChat serverTimestampMs + */ + + /** + * Constructs a new KeepInChat. + * @memberof proto + * @classdesc Represents a KeepInChat. + * @implements IKeepInChat + * @constructor + * @param {proto.IKeepInChat=} [properties] Properties to set + */ + function KeepInChat(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * KeepInChat keepType. + * @member {proto.KeepType} keepType + * @memberof proto.KeepInChat + * @instance + */ + KeepInChat.prototype.keepType = 0; + + /** + * KeepInChat serverTimestamp. + * @member {number|Long} serverTimestamp + * @memberof proto.KeepInChat + * @instance + */ + KeepInChat.prototype.serverTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * KeepInChat key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.KeepInChat + * @instance + */ + KeepInChat.prototype.key = null; + + /** + * KeepInChat deviceJid. + * @member {string} deviceJid + * @memberof proto.KeepInChat + * @instance + */ + KeepInChat.prototype.deviceJid = ""; + + /** + * KeepInChat clientTimestampMs. + * @member {number|Long} clientTimestampMs + * @memberof proto.KeepInChat + * @instance + */ + KeepInChat.prototype.clientTimestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * KeepInChat serverTimestampMs. + * @member {number|Long} serverTimestampMs + * @memberof proto.KeepInChat + * @instance + */ + KeepInChat.prototype.serverTimestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new KeepInChat instance using the specified properties. + * @function create + * @memberof proto.KeepInChat + * @static + * @param {proto.IKeepInChat=} [properties] Properties to set + * @returns {proto.KeepInChat} KeepInChat instance + */ + KeepInChat.create = function create(properties) { + return new KeepInChat(properties); + }; + + /** + * Encodes the specified KeepInChat message. Does not implicitly {@link proto.KeepInChat.verify|verify} messages. + * @function encode + * @memberof proto.KeepInChat + * @static + * @param {proto.IKeepInChat} message KeepInChat message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeepInChat.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keepType != null && Object.hasOwnProperty.call(message, "keepType")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.keepType); + if (message.serverTimestamp != null && Object.hasOwnProperty.call(message, "serverTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.serverTimestamp); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.deviceJid != null && Object.hasOwnProperty.call(message, "deviceJid")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.deviceJid); + if (message.clientTimestampMs != null && Object.hasOwnProperty.call(message, "clientTimestampMs")) + writer.uint32(/* id 5, wireType 0 =*/40).int64(message.clientTimestampMs); + if (message.serverTimestampMs != null && Object.hasOwnProperty.call(message, "serverTimestampMs")) + writer.uint32(/* id 6, wireType 0 =*/48).int64(message.serverTimestampMs); + return writer; + }; + + /** + * Encodes the specified KeepInChat message, length delimited. Does not implicitly {@link proto.KeepInChat.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.KeepInChat + * @static + * @param {proto.IKeepInChat} message KeepInChat message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeepInChat.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a KeepInChat message from the specified reader or buffer. + * @function decode + * @memberof proto.KeepInChat + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.KeepInChat} KeepInChat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeepInChat.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.KeepInChat(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.keepType = reader.int32(); + break; + case 2: + message.serverTimestamp = reader.int64(); + break; + case 3: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 4: + message.deviceJid = reader.string(); + break; + case 5: + message.clientTimestampMs = reader.int64(); + break; + case 6: + message.serverTimestampMs = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a KeepInChat message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.KeepInChat + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.KeepInChat} KeepInChat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeepInChat.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a KeepInChat message. + * @function verify + * @memberof proto.KeepInChat + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + KeepInChat.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keepType != null && message.hasOwnProperty("keepType")) + switch (message.keepType) { + default: + return "keepType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.serverTimestamp != null && message.hasOwnProperty("serverTimestamp")) + if (!$util.isInteger(message.serverTimestamp) && !(message.serverTimestamp && $util.isInteger(message.serverTimestamp.low) && $util.isInteger(message.serverTimestamp.high))) + return "serverTimestamp: integer|Long expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.deviceJid != null && message.hasOwnProperty("deviceJid")) + if (!$util.isString(message.deviceJid)) + return "deviceJid: string expected"; + if (message.clientTimestampMs != null && message.hasOwnProperty("clientTimestampMs")) + if (!$util.isInteger(message.clientTimestampMs) && !(message.clientTimestampMs && $util.isInteger(message.clientTimestampMs.low) && $util.isInteger(message.clientTimestampMs.high))) + return "clientTimestampMs: integer|Long expected"; + if (message.serverTimestampMs != null && message.hasOwnProperty("serverTimestampMs")) + if (!$util.isInteger(message.serverTimestampMs) && !(message.serverTimestampMs && $util.isInteger(message.serverTimestampMs.low) && $util.isInteger(message.serverTimestampMs.high))) + return "serverTimestampMs: integer|Long expected"; + return null; + }; + + /** + * Creates a KeepInChat message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.KeepInChat + * @static + * @param {Object.} object Plain object + * @returns {proto.KeepInChat} KeepInChat + */ + KeepInChat.fromObject = function fromObject(object) { + if (object instanceof $root.proto.KeepInChat) + return object; + var message = new $root.proto.KeepInChat(); + switch (object.keepType) { + case "UNKNOWN": + case 0: + message.keepType = 0; + break; + case "KEEP_FOR_ALL": + case 1: + message.keepType = 1; + break; + case "UNDO_KEEP_FOR_ALL": + case 2: + message.keepType = 2; + break; + } + if (object.serverTimestamp != null) + if ($util.Long) + (message.serverTimestamp = $util.Long.fromValue(object.serverTimestamp)).unsigned = false; + else if (typeof object.serverTimestamp === "string") + message.serverTimestamp = parseInt(object.serverTimestamp, 10); + else if (typeof object.serverTimestamp === "number") + message.serverTimestamp = object.serverTimestamp; + else if (typeof object.serverTimestamp === "object") + message.serverTimestamp = new $util.LongBits(object.serverTimestamp.low >>> 0, object.serverTimestamp.high >>> 0).toNumber(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.KeepInChat.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + if (object.deviceJid != null) + message.deviceJid = String(object.deviceJid); + if (object.clientTimestampMs != null) + if ($util.Long) + (message.clientTimestampMs = $util.Long.fromValue(object.clientTimestampMs)).unsigned = false; + else if (typeof object.clientTimestampMs === "string") + message.clientTimestampMs = parseInt(object.clientTimestampMs, 10); + else if (typeof object.clientTimestampMs === "number") + message.clientTimestampMs = object.clientTimestampMs; + else if (typeof object.clientTimestampMs === "object") + message.clientTimestampMs = new $util.LongBits(object.clientTimestampMs.low >>> 0, object.clientTimestampMs.high >>> 0).toNumber(); + if (object.serverTimestampMs != null) + if ($util.Long) + (message.serverTimestampMs = $util.Long.fromValue(object.serverTimestampMs)).unsigned = false; + else if (typeof object.serverTimestampMs === "string") + message.serverTimestampMs = parseInt(object.serverTimestampMs, 10); + else if (typeof object.serverTimestampMs === "number") + message.serverTimestampMs = object.serverTimestampMs; + else if (typeof object.serverTimestampMs === "object") + message.serverTimestampMs = new $util.LongBits(object.serverTimestampMs.low >>> 0, object.serverTimestampMs.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a KeepInChat message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.KeepInChat + * @static + * @param {proto.KeepInChat} message KeepInChat + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + KeepInChat.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.keepType = options.enums === String ? "UNKNOWN" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.serverTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.serverTimestamp = options.longs === String ? "0" : 0; + object.key = null; + object.deviceJid = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.clientTimestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.clientTimestampMs = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.serverTimestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.serverTimestampMs = options.longs === String ? "0" : 0; + } + if (message.keepType != null && message.hasOwnProperty("keepType")) + object.keepType = options.enums === String ? $root.proto.KeepType[message.keepType] : message.keepType; + if (message.serverTimestamp != null && message.hasOwnProperty("serverTimestamp")) + if (typeof message.serverTimestamp === "number") + object.serverTimestamp = options.longs === String ? String(message.serverTimestamp) : message.serverTimestamp; + else + object.serverTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.serverTimestamp) : options.longs === Number ? new $util.LongBits(message.serverTimestamp.low >>> 0, message.serverTimestamp.high >>> 0).toNumber() : message.serverTimestamp; + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.deviceJid != null && message.hasOwnProperty("deviceJid")) + object.deviceJid = message.deviceJid; + if (message.clientTimestampMs != null && message.hasOwnProperty("clientTimestampMs")) + if (typeof message.clientTimestampMs === "number") + object.clientTimestampMs = options.longs === String ? String(message.clientTimestampMs) : message.clientTimestampMs; + else + object.clientTimestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.clientTimestampMs) : options.longs === Number ? new $util.LongBits(message.clientTimestampMs.low >>> 0, message.clientTimestampMs.high >>> 0).toNumber() : message.clientTimestampMs; + if (message.serverTimestampMs != null && message.hasOwnProperty("serverTimestampMs")) + if (typeof message.serverTimestampMs === "number") + object.serverTimestampMs = options.longs === String ? String(message.serverTimestampMs) : message.serverTimestampMs; + else + object.serverTimestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.serverTimestampMs) : options.longs === Number ? new $util.LongBits(message.serverTimestampMs.low >>> 0, message.serverTimestampMs.high >>> 0).toNumber() : message.serverTimestampMs; + return object; + }; + + /** + * Converts this KeepInChat to JSON. + * @function toJSON + * @memberof proto.KeepInChat + * @instance + * @returns {Object.} JSON object + */ + KeepInChat.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return KeepInChat; + })(); + + /** + * KeepType enum. + * @name proto.KeepType + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} KEEP_FOR_ALL=1 KEEP_FOR_ALL value + * @property {number} UNDO_KEEP_FOR_ALL=2 UNDO_KEEP_FOR_ALL value + */ + proto.KeepType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "KEEP_FOR_ALL"] = 1; + values[valuesById[2] = "UNDO_KEEP_FOR_ALL"] = 2; + return values; + })(); + + proto.KeyId = (function() { + + /** + * Properties of a KeyId. + * @memberof proto + * @interface IKeyId + * @property {Uint8Array|null} [id] KeyId id + */ + + /** + * Constructs a new KeyId. + * @memberof proto + * @classdesc Represents a KeyId. + * @implements IKeyId + * @constructor + * @param {proto.IKeyId=} [properties] Properties to set + */ + function KeyId(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * KeyId id. + * @member {Uint8Array} id + * @memberof proto.KeyId + * @instance + */ + KeyId.prototype.id = $util.newBuffer([]); + + /** + * Creates a new KeyId instance using the specified properties. + * @function create + * @memberof proto.KeyId + * @static + * @param {proto.IKeyId=} [properties] Properties to set + * @returns {proto.KeyId} KeyId instance + */ + KeyId.create = function create(properties) { + return new KeyId(properties); + }; + + /** + * Encodes the specified KeyId message. Does not implicitly {@link proto.KeyId.verify|verify} messages. + * @function encode + * @memberof proto.KeyId + * @static + * @param {proto.IKeyId} message KeyId message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeyId.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.id); + return writer; + }; + + /** + * Encodes the specified KeyId message, length delimited. Does not implicitly {@link proto.KeyId.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.KeyId + * @static + * @param {proto.IKeyId} message KeyId message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeyId.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a KeyId message from the specified reader or buffer. + * @function decode + * @memberof proto.KeyId + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.KeyId} KeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeyId.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.KeyId(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a KeyId message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.KeyId + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.KeyId} KeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeyId.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a KeyId message. + * @function verify + * @memberof proto.KeyId + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + KeyId.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!(message.id && typeof message.id.length === "number" || $util.isString(message.id))) + return "id: buffer expected"; + return null; + }; + + /** + * Creates a KeyId message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.KeyId + * @static + * @param {Object.} object Plain object + * @returns {proto.KeyId} KeyId + */ + KeyId.fromObject = function fromObject(object) { + if (object instanceof $root.proto.KeyId) + return object; + var message = new $root.proto.KeyId(); + if (object.id != null) + if (typeof object.id === "string") + $util.base64.decode(object.id, message.id = $util.newBuffer($util.base64.length(object.id)), 0); + else if (object.id.length) + message.id = object.id; + return message; + }; + + /** + * Creates a plain object from a KeyId message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.KeyId + * @static + * @param {proto.KeyId} message KeyId + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + KeyId.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.id = ""; + else { + object.id = []; + if (options.bytes !== Array) + object.id = $util.newBuffer(object.id); + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = options.bytes === String ? $util.base64.encode(message.id, 0, message.id.length) : options.bytes === Array ? Array.prototype.slice.call(message.id) : message.id; + return object; + }; + + /** + * Converts this KeyId to JSON. + * @function toJSON + * @memberof proto.KeyId + * @instance + * @returns {Object.} JSON object + */ + KeyId.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return KeyId; + })(); + + proto.LocalizedName = (function() { + + /** + * Properties of a LocalizedName. + * @memberof proto + * @interface ILocalizedName + * @property {string|null} [lg] LocalizedName lg + * @property {string|null} [lc] LocalizedName lc + * @property {string|null} [verifiedName] LocalizedName verifiedName + */ + + /** + * Constructs a new LocalizedName. + * @memberof proto + * @classdesc Represents a LocalizedName. + * @implements ILocalizedName + * @constructor + * @param {proto.ILocalizedName=} [properties] Properties to set + */ + function LocalizedName(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LocalizedName lg. + * @member {string} lg + * @memberof proto.LocalizedName + * @instance + */ + LocalizedName.prototype.lg = ""; + + /** + * LocalizedName lc. + * @member {string} lc + * @memberof proto.LocalizedName + * @instance + */ + LocalizedName.prototype.lc = ""; + + /** + * LocalizedName verifiedName. + * @member {string} verifiedName + * @memberof proto.LocalizedName + * @instance + */ + LocalizedName.prototype.verifiedName = ""; + + /** + * Creates a new LocalizedName instance using the specified properties. + * @function create + * @memberof proto.LocalizedName + * @static + * @param {proto.ILocalizedName=} [properties] Properties to set + * @returns {proto.LocalizedName} LocalizedName instance + */ + LocalizedName.create = function create(properties) { + return new LocalizedName(properties); + }; + + /** + * Encodes the specified LocalizedName message. Does not implicitly {@link proto.LocalizedName.verify|verify} messages. + * @function encode + * @memberof proto.LocalizedName + * @static + * @param {proto.ILocalizedName} message LocalizedName message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LocalizedName.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.lg != null && Object.hasOwnProperty.call(message, "lg")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.lg); + if (message.lc != null && Object.hasOwnProperty.call(message, "lc")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.lc); + if (message.verifiedName != null && Object.hasOwnProperty.call(message, "verifiedName")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.verifiedName); + return writer; + }; + + /** + * Encodes the specified LocalizedName message, length delimited. Does not implicitly {@link proto.LocalizedName.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.LocalizedName + * @static + * @param {proto.ILocalizedName} message LocalizedName message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LocalizedName.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LocalizedName message from the specified reader or buffer. + * @function decode + * @memberof proto.LocalizedName + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.LocalizedName} LocalizedName + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LocalizedName.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.LocalizedName(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.lg = reader.string(); + break; + case 2: + message.lc = reader.string(); + break; + case 3: + message.verifiedName = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LocalizedName message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.LocalizedName + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.LocalizedName} LocalizedName + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LocalizedName.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LocalizedName message. + * @function verify + * @memberof proto.LocalizedName + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LocalizedName.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.lg != null && message.hasOwnProperty("lg")) + if (!$util.isString(message.lg)) + return "lg: string expected"; + if (message.lc != null && message.hasOwnProperty("lc")) + if (!$util.isString(message.lc)) + return "lc: string expected"; + if (message.verifiedName != null && message.hasOwnProperty("verifiedName")) + if (!$util.isString(message.verifiedName)) + return "verifiedName: string expected"; + return null; + }; + + /** + * Creates a LocalizedName message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.LocalizedName + * @static + * @param {Object.} object Plain object + * @returns {proto.LocalizedName} LocalizedName + */ + LocalizedName.fromObject = function fromObject(object) { + if (object instanceof $root.proto.LocalizedName) + return object; + var message = new $root.proto.LocalizedName(); + if (object.lg != null) + message.lg = String(object.lg); + if (object.lc != null) + message.lc = String(object.lc); + if (object.verifiedName != null) + message.verifiedName = String(object.verifiedName); + return message; + }; + + /** + * Creates a plain object from a LocalizedName message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.LocalizedName + * @static + * @param {proto.LocalizedName} message LocalizedName + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LocalizedName.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.lg = ""; + object.lc = ""; + object.verifiedName = ""; + } + if (message.lg != null && message.hasOwnProperty("lg")) + object.lg = message.lg; + if (message.lc != null && message.hasOwnProperty("lc")) + object.lc = message.lc; + if (message.verifiedName != null && message.hasOwnProperty("verifiedName")) + object.verifiedName = message.verifiedName; + return object; + }; + + /** + * Converts this LocalizedName to JSON. + * @function toJSON + * @memberof proto.LocalizedName + * @instance + * @returns {Object.} JSON object + */ + LocalizedName.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return LocalizedName; + })(); + + proto.Location = (function() { + + /** + * Properties of a Location. + * @memberof proto + * @interface ILocation + * @property {number|null} [degreesLatitude] Location degreesLatitude + * @property {number|null} [degreesLongitude] Location degreesLongitude + * @property {string|null} [name] Location name + */ + + /** + * Constructs a new Location. + * @memberof proto + * @classdesc Represents a Location. + * @implements ILocation + * @constructor + * @param {proto.ILocation=} [properties] Properties to set + */ + function Location(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Location degreesLatitude. + * @member {number} degreesLatitude + * @memberof proto.Location + * @instance + */ + Location.prototype.degreesLatitude = 0; + + /** + * Location degreesLongitude. + * @member {number} degreesLongitude + * @memberof proto.Location + * @instance + */ + Location.prototype.degreesLongitude = 0; + + /** + * Location name. + * @member {string} name + * @memberof proto.Location + * @instance + */ + Location.prototype.name = ""; + + /** + * Creates a new Location instance using the specified properties. + * @function create + * @memberof proto.Location + * @static + * @param {proto.ILocation=} [properties] Properties to set + * @returns {proto.Location} Location instance + */ + Location.create = function create(properties) { + return new Location(properties); + }; + + /** + * Encodes the specified Location message. Does not implicitly {@link proto.Location.verify|verify} messages. + * @function encode + * @memberof proto.Location + * @static + * @param {proto.ILocation} message Location message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Location.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.degreesLatitude != null && Object.hasOwnProperty.call(message, "degreesLatitude")) + writer.uint32(/* id 1, wireType 1 =*/9).double(message.degreesLatitude); + if (message.degreesLongitude != null && Object.hasOwnProperty.call(message, "degreesLongitude")) + writer.uint32(/* id 2, wireType 1 =*/17).double(message.degreesLongitude); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.name); + return writer; + }; + + /** + * Encodes the specified Location message, length delimited. Does not implicitly {@link proto.Location.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Location + * @static + * @param {proto.ILocation} message Location message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Location.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Location message from the specified reader or buffer. + * @function decode + * @memberof proto.Location + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Location} Location + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Location.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Location(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.degreesLatitude = reader.double(); + break; + case 2: + message.degreesLongitude = reader.double(); + break; + case 3: + message.name = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Location message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Location + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Location} Location + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Location.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Location message. + * @function verify + * @memberof proto.Location + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Location.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.degreesLatitude != null && message.hasOwnProperty("degreesLatitude")) + if (typeof message.degreesLatitude !== "number") + return "degreesLatitude: number expected"; + if (message.degreesLongitude != null && message.hasOwnProperty("degreesLongitude")) + if (typeof message.degreesLongitude !== "number") + return "degreesLongitude: number expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + return null; + }; + + /** + * Creates a Location message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Location + * @static + * @param {Object.} object Plain object + * @returns {proto.Location} Location + */ + Location.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Location) + return object; + var message = new $root.proto.Location(); + if (object.degreesLatitude != null) + message.degreesLatitude = Number(object.degreesLatitude); + if (object.degreesLongitude != null) + message.degreesLongitude = Number(object.degreesLongitude); + if (object.name != null) + message.name = String(object.name); + return message; + }; + + /** + * Creates a plain object from a Location message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Location + * @static + * @param {proto.Location} message Location + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Location.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.degreesLatitude = 0; + object.degreesLongitude = 0; + object.name = ""; + } + if (message.degreesLatitude != null && message.hasOwnProperty("degreesLatitude")) + object.degreesLatitude = options.json && !isFinite(message.degreesLatitude) ? String(message.degreesLatitude) : message.degreesLatitude; + if (message.degreesLongitude != null && message.hasOwnProperty("degreesLongitude")) + object.degreesLongitude = options.json && !isFinite(message.degreesLongitude) ? String(message.degreesLongitude) : message.degreesLongitude; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + return object; + }; + + /** + * Converts this Location to JSON. + * @function toJSON + * @memberof proto.Location + * @instance + * @returns {Object.} JSON object + */ + Location.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Location; + })(); + + proto.MediaData = (function() { + + /** + * Properties of a MediaData. + * @memberof proto + * @interface IMediaData + * @property {string|null} [localPath] MediaData localPath + */ + + /** + * Constructs a new MediaData. + * @memberof proto + * @classdesc Represents a MediaData. + * @implements IMediaData + * @constructor + * @param {proto.IMediaData=} [properties] Properties to set + */ + function MediaData(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MediaData localPath. + * @member {string} localPath + * @memberof proto.MediaData + * @instance + */ + MediaData.prototype.localPath = ""; + + /** + * Creates a new MediaData instance using the specified properties. + * @function create + * @memberof proto.MediaData + * @static + * @param {proto.IMediaData=} [properties] Properties to set + * @returns {proto.MediaData} MediaData instance + */ + MediaData.create = function create(properties) { + return new MediaData(properties); + }; + + /** + * Encodes the specified MediaData message. Does not implicitly {@link proto.MediaData.verify|verify} messages. + * @function encode + * @memberof proto.MediaData + * @static + * @param {proto.IMediaData} message MediaData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MediaData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.localPath != null && Object.hasOwnProperty.call(message, "localPath")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.localPath); + return writer; + }; + + /** + * Encodes the specified MediaData message, length delimited. Does not implicitly {@link proto.MediaData.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.MediaData + * @static + * @param {proto.IMediaData} message MediaData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MediaData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MediaData message from the specified reader or buffer. + * @function decode + * @memberof proto.MediaData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.MediaData} MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MediaData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.MediaData(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.localPath = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MediaData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.MediaData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.MediaData} MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MediaData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MediaData message. + * @function verify + * @memberof proto.MediaData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MediaData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.localPath != null && message.hasOwnProperty("localPath")) + if (!$util.isString(message.localPath)) + return "localPath: string expected"; + return null; + }; + + /** + * Creates a MediaData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.MediaData + * @static + * @param {Object.} object Plain object + * @returns {proto.MediaData} MediaData + */ + MediaData.fromObject = function fromObject(object) { + if (object instanceof $root.proto.MediaData) + return object; + var message = new $root.proto.MediaData(); + if (object.localPath != null) + message.localPath = String(object.localPath); + return message; + }; + + /** + * Creates a plain object from a MediaData message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.MediaData + * @static + * @param {proto.MediaData} message MediaData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MediaData.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.localPath = ""; + if (message.localPath != null && message.hasOwnProperty("localPath")) + object.localPath = message.localPath; + return object; + }; + + /** + * Converts this MediaData to JSON. + * @function toJSON + * @memberof proto.MediaData + * @instance + * @returns {Object.} JSON object + */ + MediaData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MediaData; + })(); + + proto.MediaRetryNotification = (function() { + + /** + * Properties of a MediaRetryNotification. + * @memberof proto + * @interface IMediaRetryNotification + * @property {string|null} [stanzaId] MediaRetryNotification stanzaId + * @property {string|null} [directPath] MediaRetryNotification directPath + * @property {proto.MediaRetryNotification.ResultType|null} [result] MediaRetryNotification result + */ + + /** + * Constructs a new MediaRetryNotification. + * @memberof proto + * @classdesc Represents a MediaRetryNotification. + * @implements IMediaRetryNotification + * @constructor + * @param {proto.IMediaRetryNotification=} [properties] Properties to set + */ + function MediaRetryNotification(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MediaRetryNotification stanzaId. + * @member {string} stanzaId + * @memberof proto.MediaRetryNotification + * @instance + */ + MediaRetryNotification.prototype.stanzaId = ""; + + /** + * MediaRetryNotification directPath. + * @member {string} directPath + * @memberof proto.MediaRetryNotification + * @instance + */ + MediaRetryNotification.prototype.directPath = ""; + + /** + * MediaRetryNotification result. + * @member {proto.MediaRetryNotification.ResultType} result + * @memberof proto.MediaRetryNotification + * @instance + */ + MediaRetryNotification.prototype.result = 0; + + /** + * Creates a new MediaRetryNotification instance using the specified properties. + * @function create + * @memberof proto.MediaRetryNotification + * @static + * @param {proto.IMediaRetryNotification=} [properties] Properties to set + * @returns {proto.MediaRetryNotification} MediaRetryNotification instance + */ + MediaRetryNotification.create = function create(properties) { + return new MediaRetryNotification(properties); + }; + + /** + * Encodes the specified MediaRetryNotification message. Does not implicitly {@link proto.MediaRetryNotification.verify|verify} messages. + * @function encode + * @memberof proto.MediaRetryNotification + * @static + * @param {proto.IMediaRetryNotification} message MediaRetryNotification message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MediaRetryNotification.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.stanzaId != null && Object.hasOwnProperty.call(message, "stanzaId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.stanzaId); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.directPath); + if (message.result != null && Object.hasOwnProperty.call(message, "result")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.result); + return writer; + }; + + /** + * Encodes the specified MediaRetryNotification message, length delimited. Does not implicitly {@link proto.MediaRetryNotification.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.MediaRetryNotification + * @static + * @param {proto.IMediaRetryNotification} message MediaRetryNotification message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MediaRetryNotification.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MediaRetryNotification message from the specified reader or buffer. + * @function decode + * @memberof proto.MediaRetryNotification + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.MediaRetryNotification} MediaRetryNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MediaRetryNotification.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.MediaRetryNotification(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.stanzaId = reader.string(); + break; + case 2: + message.directPath = reader.string(); + break; + case 3: + message.result = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MediaRetryNotification message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.MediaRetryNotification + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.MediaRetryNotification} MediaRetryNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MediaRetryNotification.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MediaRetryNotification message. + * @function verify + * @memberof proto.MediaRetryNotification + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MediaRetryNotification.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + if (!$util.isString(message.stanzaId)) + return "stanzaId: string expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.result != null && message.hasOwnProperty("result")) + switch (message.result) { + default: + return "result: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + return null; + }; + + /** + * Creates a MediaRetryNotification message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.MediaRetryNotification + * @static + * @param {Object.} object Plain object + * @returns {proto.MediaRetryNotification} MediaRetryNotification + */ + MediaRetryNotification.fromObject = function fromObject(object) { + if (object instanceof $root.proto.MediaRetryNotification) + return object; + var message = new $root.proto.MediaRetryNotification(); + if (object.stanzaId != null) + message.stanzaId = String(object.stanzaId); + if (object.directPath != null) + message.directPath = String(object.directPath); + switch (object.result) { + case "GENERAL_ERROR": + case 0: + message.result = 0; + break; + case "SUCCESS": + case 1: + message.result = 1; + break; + case "NOT_FOUND": + case 2: + message.result = 2; + break; + case "DECRYPTION_ERROR": + case 3: + message.result = 3; + break; + } + return message; + }; + + /** + * Creates a plain object from a MediaRetryNotification message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.MediaRetryNotification + * @static + * @param {proto.MediaRetryNotification} message MediaRetryNotification + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MediaRetryNotification.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.stanzaId = ""; + object.directPath = ""; + object.result = options.enums === String ? "GENERAL_ERROR" : 0; + } + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + object.stanzaId = message.stanzaId; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.result != null && message.hasOwnProperty("result")) + object.result = options.enums === String ? $root.proto.MediaRetryNotification.ResultType[message.result] : message.result; + return object; + }; + + /** + * Converts this MediaRetryNotification to JSON. + * @function toJSON + * @memberof proto.MediaRetryNotification + * @instance + * @returns {Object.} JSON object + */ + MediaRetryNotification.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ResultType enum. + * @name proto.MediaRetryNotification.ResultType + * @enum {number} + * @property {number} GENERAL_ERROR=0 GENERAL_ERROR value + * @property {number} SUCCESS=1 SUCCESS value + * @property {number} NOT_FOUND=2 NOT_FOUND value + * @property {number} DECRYPTION_ERROR=3 DECRYPTION_ERROR value + */ + MediaRetryNotification.ResultType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "GENERAL_ERROR"] = 0; + values[valuesById[1] = "SUCCESS"] = 1; + values[valuesById[2] = "NOT_FOUND"] = 2; + values[valuesById[3] = "DECRYPTION_ERROR"] = 3; + return values; + })(); + + return MediaRetryNotification; + })(); + + /** + * MediaVisibility enum. + * @name proto.MediaVisibility + * @enum {number} + * @property {number} DEFAULT=0 DEFAULT value + * @property {number} OFF=1 OFF value + * @property {number} ON=2 ON value + */ + proto.MediaVisibility = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "DEFAULT"] = 0; + values[valuesById[1] = "OFF"] = 1; + values[valuesById[2] = "ON"] = 2; + return values; + })(); + + proto.Message = (function() { + + /** + * Properties of a Message. + * @memberof proto + * @interface IMessage + * @property {string|null} [conversation] Message conversation + * @property {proto.Message.ISenderKeyDistributionMessage|null} [senderKeyDistributionMessage] Message senderKeyDistributionMessage + * @property {proto.Message.IImageMessage|null} [imageMessage] Message imageMessage + * @property {proto.Message.IContactMessage|null} [contactMessage] Message contactMessage + * @property {proto.Message.ILocationMessage|null} [locationMessage] Message locationMessage + * @property {proto.Message.IExtendedTextMessage|null} [extendedTextMessage] Message extendedTextMessage + * @property {proto.Message.IDocumentMessage|null} [documentMessage] Message documentMessage + * @property {proto.Message.IAudioMessage|null} [audioMessage] Message audioMessage + * @property {proto.Message.IVideoMessage|null} [videoMessage] Message videoMessage + * @property {proto.Message.ICall|null} [call] Message call + * @property {proto.Message.IChat|null} [chat] Message chat + * @property {proto.Message.IProtocolMessage|null} [protocolMessage] Message protocolMessage + * @property {proto.Message.IContactsArrayMessage|null} [contactsArrayMessage] Message contactsArrayMessage + * @property {proto.Message.IHighlyStructuredMessage|null} [highlyStructuredMessage] Message highlyStructuredMessage + * @property {proto.Message.ISenderKeyDistributionMessage|null} [fastRatchetKeySenderKeyDistributionMessage] Message fastRatchetKeySenderKeyDistributionMessage + * @property {proto.Message.ISendPaymentMessage|null} [sendPaymentMessage] Message sendPaymentMessage + * @property {proto.Message.ILiveLocationMessage|null} [liveLocationMessage] Message liveLocationMessage + * @property {proto.Message.IRequestPaymentMessage|null} [requestPaymentMessage] Message requestPaymentMessage + * @property {proto.Message.IDeclinePaymentRequestMessage|null} [declinePaymentRequestMessage] Message declinePaymentRequestMessage + * @property {proto.Message.ICancelPaymentRequestMessage|null} [cancelPaymentRequestMessage] Message cancelPaymentRequestMessage + * @property {proto.Message.ITemplateMessage|null} [templateMessage] Message templateMessage + * @property {proto.Message.IStickerMessage|null} [stickerMessage] Message stickerMessage + * @property {proto.Message.IGroupInviteMessage|null} [groupInviteMessage] Message groupInviteMessage + * @property {proto.Message.ITemplateButtonReplyMessage|null} [templateButtonReplyMessage] Message templateButtonReplyMessage + * @property {proto.Message.IProductMessage|null} [productMessage] Message productMessage + * @property {proto.Message.IDeviceSentMessage|null} [deviceSentMessage] Message deviceSentMessage + * @property {proto.IMessageContextInfo|null} [messageContextInfo] Message messageContextInfo + * @property {proto.Message.IListMessage|null} [listMessage] Message listMessage + * @property {proto.Message.IFutureProofMessage|null} [viewOnceMessage] Message viewOnceMessage + * @property {proto.Message.IOrderMessage|null} [orderMessage] Message orderMessage + * @property {proto.Message.IListResponseMessage|null} [listResponseMessage] Message listResponseMessage + * @property {proto.Message.IFutureProofMessage|null} [ephemeralMessage] Message ephemeralMessage + * @property {proto.Message.IInvoiceMessage|null} [invoiceMessage] Message invoiceMessage + * @property {proto.Message.IButtonsMessage|null} [buttonsMessage] Message buttonsMessage + * @property {proto.Message.IButtonsResponseMessage|null} [buttonsResponseMessage] Message buttonsResponseMessage + * @property {proto.Message.IPaymentInviteMessage|null} [paymentInviteMessage] Message paymentInviteMessage + * @property {proto.Message.IInteractiveMessage|null} [interactiveMessage] Message interactiveMessage + * @property {proto.Message.IReactionMessage|null} [reactionMessage] Message reactionMessage + * @property {proto.Message.IStickerSyncRMRMessage|null} [stickerSyncRmrMessage] Message stickerSyncRmrMessage + * @property {proto.Message.IInteractiveResponseMessage|null} [interactiveResponseMessage] Message interactiveResponseMessage + * @property {proto.Message.IPollCreationMessage|null} [pollCreationMessage] Message pollCreationMessage + * @property {proto.Message.IPollUpdateMessage|null} [pollUpdateMessage] Message pollUpdateMessage + * @property {proto.Message.IKeepInChatMessage|null} [keepInChatMessage] Message keepInChatMessage + * @property {proto.Message.IFutureProofMessage|null} [documentWithCaptionMessage] Message documentWithCaptionMessage + * @property {proto.Message.IRequestPhoneNumberMessage|null} [requestPhoneNumberMessage] Message requestPhoneNumberMessage + * @property {proto.Message.IFutureProofMessage|null} [viewOnceMessageV2] Message viewOnceMessageV2 + * @property {proto.Message.IEncReactionMessage|null} [encReactionMessage] Message encReactionMessage + * @property {proto.Message.IFutureProofMessage|null} [editedMessage] Message editedMessage + * @property {proto.Message.IFutureProofMessage|null} [viewOnceMessageV2Extension] Message viewOnceMessageV2Extension + */ + + /** + * Constructs a new Message. + * @memberof proto + * @classdesc Represents a Message. + * @implements IMessage + * @constructor + * @param {proto.IMessage=} [properties] Properties to set + */ + function Message(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Message conversation. + * @member {string} conversation + * @memberof proto.Message + * @instance + */ + Message.prototype.conversation = ""; + + /** + * Message senderKeyDistributionMessage. + * @member {proto.Message.ISenderKeyDistributionMessage|null|undefined} senderKeyDistributionMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.senderKeyDistributionMessage = null; + + /** + * Message imageMessage. + * @member {proto.Message.IImageMessage|null|undefined} imageMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.imageMessage = null; + + /** + * Message contactMessage. + * @member {proto.Message.IContactMessage|null|undefined} contactMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.contactMessage = null; + + /** + * Message locationMessage. + * @member {proto.Message.ILocationMessage|null|undefined} locationMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.locationMessage = null; + + /** + * Message extendedTextMessage. + * @member {proto.Message.IExtendedTextMessage|null|undefined} extendedTextMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.extendedTextMessage = null; + + /** + * Message documentMessage. + * @member {proto.Message.IDocumentMessage|null|undefined} documentMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.documentMessage = null; + + /** + * Message audioMessage. + * @member {proto.Message.IAudioMessage|null|undefined} audioMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.audioMessage = null; + + /** + * Message videoMessage. + * @member {proto.Message.IVideoMessage|null|undefined} videoMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.videoMessage = null; + + /** + * Message call. + * @member {proto.Message.ICall|null|undefined} call + * @memberof proto.Message + * @instance + */ + Message.prototype.call = null; + + /** + * Message chat. + * @member {proto.Message.IChat|null|undefined} chat + * @memberof proto.Message + * @instance + */ + Message.prototype.chat = null; + + /** + * Message protocolMessage. + * @member {proto.Message.IProtocolMessage|null|undefined} protocolMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.protocolMessage = null; + + /** + * Message contactsArrayMessage. + * @member {proto.Message.IContactsArrayMessage|null|undefined} contactsArrayMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.contactsArrayMessage = null; + + /** + * Message highlyStructuredMessage. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} highlyStructuredMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.highlyStructuredMessage = null; + + /** + * Message fastRatchetKeySenderKeyDistributionMessage. + * @member {proto.Message.ISenderKeyDistributionMessage|null|undefined} fastRatchetKeySenderKeyDistributionMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.fastRatchetKeySenderKeyDistributionMessage = null; + + /** + * Message sendPaymentMessage. + * @member {proto.Message.ISendPaymentMessage|null|undefined} sendPaymentMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.sendPaymentMessage = null; + + /** + * Message liveLocationMessage. + * @member {proto.Message.ILiveLocationMessage|null|undefined} liveLocationMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.liveLocationMessage = null; + + /** + * Message requestPaymentMessage. + * @member {proto.Message.IRequestPaymentMessage|null|undefined} requestPaymentMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.requestPaymentMessage = null; + + /** + * Message declinePaymentRequestMessage. + * @member {proto.Message.IDeclinePaymentRequestMessage|null|undefined} declinePaymentRequestMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.declinePaymentRequestMessage = null; + + /** + * Message cancelPaymentRequestMessage. + * @member {proto.Message.ICancelPaymentRequestMessage|null|undefined} cancelPaymentRequestMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.cancelPaymentRequestMessage = null; + + /** + * Message templateMessage. + * @member {proto.Message.ITemplateMessage|null|undefined} templateMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.templateMessage = null; + + /** + * Message stickerMessage. + * @member {proto.Message.IStickerMessage|null|undefined} stickerMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.stickerMessage = null; + + /** + * Message groupInviteMessage. + * @member {proto.Message.IGroupInviteMessage|null|undefined} groupInviteMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.groupInviteMessage = null; + + /** + * Message templateButtonReplyMessage. + * @member {proto.Message.ITemplateButtonReplyMessage|null|undefined} templateButtonReplyMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.templateButtonReplyMessage = null; + + /** + * Message productMessage. + * @member {proto.Message.IProductMessage|null|undefined} productMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.productMessage = null; + + /** + * Message deviceSentMessage. + * @member {proto.Message.IDeviceSentMessage|null|undefined} deviceSentMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.deviceSentMessage = null; + + /** + * Message messageContextInfo. + * @member {proto.IMessageContextInfo|null|undefined} messageContextInfo + * @memberof proto.Message + * @instance + */ + Message.prototype.messageContextInfo = null; + + /** + * Message listMessage. + * @member {proto.Message.IListMessage|null|undefined} listMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.listMessage = null; + + /** + * Message viewOnceMessage. + * @member {proto.Message.IFutureProofMessage|null|undefined} viewOnceMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.viewOnceMessage = null; + + /** + * Message orderMessage. + * @member {proto.Message.IOrderMessage|null|undefined} orderMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.orderMessage = null; + + /** + * Message listResponseMessage. + * @member {proto.Message.IListResponseMessage|null|undefined} listResponseMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.listResponseMessage = null; + + /** + * Message ephemeralMessage. + * @member {proto.Message.IFutureProofMessage|null|undefined} ephemeralMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.ephemeralMessage = null; + + /** + * Message invoiceMessage. + * @member {proto.Message.IInvoiceMessage|null|undefined} invoiceMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.invoiceMessage = null; + + /** + * Message buttonsMessage. + * @member {proto.Message.IButtonsMessage|null|undefined} buttonsMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.buttonsMessage = null; + + /** + * Message buttonsResponseMessage. + * @member {proto.Message.IButtonsResponseMessage|null|undefined} buttonsResponseMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.buttonsResponseMessage = null; + + /** + * Message paymentInviteMessage. + * @member {proto.Message.IPaymentInviteMessage|null|undefined} paymentInviteMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.paymentInviteMessage = null; + + /** + * Message interactiveMessage. + * @member {proto.Message.IInteractiveMessage|null|undefined} interactiveMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.interactiveMessage = null; + + /** + * Message reactionMessage. + * @member {proto.Message.IReactionMessage|null|undefined} reactionMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.reactionMessage = null; + + /** + * Message stickerSyncRmrMessage. + * @member {proto.Message.IStickerSyncRMRMessage|null|undefined} stickerSyncRmrMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.stickerSyncRmrMessage = null; + + /** + * Message interactiveResponseMessage. + * @member {proto.Message.IInteractiveResponseMessage|null|undefined} interactiveResponseMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.interactiveResponseMessage = null; + + /** + * Message pollCreationMessage. + * @member {proto.Message.IPollCreationMessage|null|undefined} pollCreationMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.pollCreationMessage = null; + + /** + * Message pollUpdateMessage. + * @member {proto.Message.IPollUpdateMessage|null|undefined} pollUpdateMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.pollUpdateMessage = null; + + /** + * Message keepInChatMessage. + * @member {proto.Message.IKeepInChatMessage|null|undefined} keepInChatMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.keepInChatMessage = null; + + /** + * Message documentWithCaptionMessage. + * @member {proto.Message.IFutureProofMessage|null|undefined} documentWithCaptionMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.documentWithCaptionMessage = null; + + /** + * Message requestPhoneNumberMessage. + * @member {proto.Message.IRequestPhoneNumberMessage|null|undefined} requestPhoneNumberMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.requestPhoneNumberMessage = null; + + /** + * Message viewOnceMessageV2. + * @member {proto.Message.IFutureProofMessage|null|undefined} viewOnceMessageV2 + * @memberof proto.Message + * @instance + */ + Message.prototype.viewOnceMessageV2 = null; + + /** + * Message encReactionMessage. + * @member {proto.Message.IEncReactionMessage|null|undefined} encReactionMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.encReactionMessage = null; + + /** + * Message editedMessage. + * @member {proto.Message.IFutureProofMessage|null|undefined} editedMessage + * @memberof proto.Message + * @instance + */ + Message.prototype.editedMessage = null; + + /** + * Message viewOnceMessageV2Extension. + * @member {proto.Message.IFutureProofMessage|null|undefined} viewOnceMessageV2Extension + * @memberof proto.Message + * @instance + */ + Message.prototype.viewOnceMessageV2Extension = null; + + /** + * Creates a new Message instance using the specified properties. + * @function create + * @memberof proto.Message + * @static + * @param {proto.IMessage=} [properties] Properties to set + * @returns {proto.Message} Message instance + */ + Message.create = function create(properties) { + return new Message(properties); + }; + + /** + * Encodes the specified Message message. Does not implicitly {@link proto.Message.verify|verify} messages. + * @function encode + * @memberof proto.Message + * @static + * @param {proto.IMessage} message Message message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Message.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.conversation != null && Object.hasOwnProperty.call(message, "conversation")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.conversation); + if (message.senderKeyDistributionMessage != null && Object.hasOwnProperty.call(message, "senderKeyDistributionMessage")) + $root.proto.Message.SenderKeyDistributionMessage.encode(message.senderKeyDistributionMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.imageMessage != null && Object.hasOwnProperty.call(message, "imageMessage")) + $root.proto.Message.ImageMessage.encode(message.imageMessage, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.contactMessage != null && Object.hasOwnProperty.call(message, "contactMessage")) + $root.proto.Message.ContactMessage.encode(message.contactMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.locationMessage != null && Object.hasOwnProperty.call(message, "locationMessage")) + $root.proto.Message.LocationMessage.encode(message.locationMessage, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.extendedTextMessage != null && Object.hasOwnProperty.call(message, "extendedTextMessage")) + $root.proto.Message.ExtendedTextMessage.encode(message.extendedTextMessage, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.documentMessage != null && Object.hasOwnProperty.call(message, "documentMessage")) + $root.proto.Message.DocumentMessage.encode(message.documentMessage, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.audioMessage != null && Object.hasOwnProperty.call(message, "audioMessage")) + $root.proto.Message.AudioMessage.encode(message.audioMessage, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.videoMessage != null && Object.hasOwnProperty.call(message, "videoMessage")) + $root.proto.Message.VideoMessage.encode(message.videoMessage, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); + if (message.call != null && Object.hasOwnProperty.call(message, "call")) + $root.proto.Message.Call.encode(message.call, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); + if (message.chat != null && Object.hasOwnProperty.call(message, "chat")) + $root.proto.Message.Chat.encode(message.chat, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); + if (message.protocolMessage != null && Object.hasOwnProperty.call(message, "protocolMessage")) + $root.proto.Message.ProtocolMessage.encode(message.protocolMessage, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); + if (message.contactsArrayMessage != null && Object.hasOwnProperty.call(message, "contactsArrayMessage")) + $root.proto.Message.ContactsArrayMessage.encode(message.contactsArrayMessage, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); + if (message.highlyStructuredMessage != null && Object.hasOwnProperty.call(message, "highlyStructuredMessage")) + $root.proto.Message.HighlyStructuredMessage.encode(message.highlyStructuredMessage, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); + if (message.fastRatchetKeySenderKeyDistributionMessage != null && Object.hasOwnProperty.call(message, "fastRatchetKeySenderKeyDistributionMessage")) + $root.proto.Message.SenderKeyDistributionMessage.encode(message.fastRatchetKeySenderKeyDistributionMessage, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); + if (message.sendPaymentMessage != null && Object.hasOwnProperty.call(message, "sendPaymentMessage")) + $root.proto.Message.SendPaymentMessage.encode(message.sendPaymentMessage, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); + if (message.liveLocationMessage != null && Object.hasOwnProperty.call(message, "liveLocationMessage")) + $root.proto.Message.LiveLocationMessage.encode(message.liveLocationMessage, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); + if (message.requestPaymentMessage != null && Object.hasOwnProperty.call(message, "requestPaymentMessage")) + $root.proto.Message.RequestPaymentMessage.encode(message.requestPaymentMessage, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim(); + if (message.declinePaymentRequestMessage != null && Object.hasOwnProperty.call(message, "declinePaymentRequestMessage")) + $root.proto.Message.DeclinePaymentRequestMessage.encode(message.declinePaymentRequestMessage, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim(); + if (message.cancelPaymentRequestMessage != null && Object.hasOwnProperty.call(message, "cancelPaymentRequestMessage")) + $root.proto.Message.CancelPaymentRequestMessage.encode(message.cancelPaymentRequestMessage, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); + if (message.templateMessage != null && Object.hasOwnProperty.call(message, "templateMessage")) + $root.proto.Message.TemplateMessage.encode(message.templateMessage, writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim(); + if (message.stickerMessage != null && Object.hasOwnProperty.call(message, "stickerMessage")) + $root.proto.Message.StickerMessage.encode(message.stickerMessage, writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim(); + if (message.groupInviteMessage != null && Object.hasOwnProperty.call(message, "groupInviteMessage")) + $root.proto.Message.GroupInviteMessage.encode(message.groupInviteMessage, writer.uint32(/* id 28, wireType 2 =*/226).fork()).ldelim(); + if (message.templateButtonReplyMessage != null && Object.hasOwnProperty.call(message, "templateButtonReplyMessage")) + $root.proto.Message.TemplateButtonReplyMessage.encode(message.templateButtonReplyMessage, writer.uint32(/* id 29, wireType 2 =*/234).fork()).ldelim(); + if (message.productMessage != null && Object.hasOwnProperty.call(message, "productMessage")) + $root.proto.Message.ProductMessage.encode(message.productMessage, writer.uint32(/* id 30, wireType 2 =*/242).fork()).ldelim(); + if (message.deviceSentMessage != null && Object.hasOwnProperty.call(message, "deviceSentMessage")) + $root.proto.Message.DeviceSentMessage.encode(message.deviceSentMessage, writer.uint32(/* id 31, wireType 2 =*/250).fork()).ldelim(); + if (message.messageContextInfo != null && Object.hasOwnProperty.call(message, "messageContextInfo")) + $root.proto.MessageContextInfo.encode(message.messageContextInfo, writer.uint32(/* id 35, wireType 2 =*/282).fork()).ldelim(); + if (message.listMessage != null && Object.hasOwnProperty.call(message, "listMessage")) + $root.proto.Message.ListMessage.encode(message.listMessage, writer.uint32(/* id 36, wireType 2 =*/290).fork()).ldelim(); + if (message.viewOnceMessage != null && Object.hasOwnProperty.call(message, "viewOnceMessage")) + $root.proto.Message.FutureProofMessage.encode(message.viewOnceMessage, writer.uint32(/* id 37, wireType 2 =*/298).fork()).ldelim(); + if (message.orderMessage != null && Object.hasOwnProperty.call(message, "orderMessage")) + $root.proto.Message.OrderMessage.encode(message.orderMessage, writer.uint32(/* id 38, wireType 2 =*/306).fork()).ldelim(); + if (message.listResponseMessage != null && Object.hasOwnProperty.call(message, "listResponseMessage")) + $root.proto.Message.ListResponseMessage.encode(message.listResponseMessage, writer.uint32(/* id 39, wireType 2 =*/314).fork()).ldelim(); + if (message.ephemeralMessage != null && Object.hasOwnProperty.call(message, "ephemeralMessage")) + $root.proto.Message.FutureProofMessage.encode(message.ephemeralMessage, writer.uint32(/* id 40, wireType 2 =*/322).fork()).ldelim(); + if (message.invoiceMessage != null && Object.hasOwnProperty.call(message, "invoiceMessage")) + $root.proto.Message.InvoiceMessage.encode(message.invoiceMessage, writer.uint32(/* id 41, wireType 2 =*/330).fork()).ldelim(); + if (message.buttonsMessage != null && Object.hasOwnProperty.call(message, "buttonsMessage")) + $root.proto.Message.ButtonsMessage.encode(message.buttonsMessage, writer.uint32(/* id 42, wireType 2 =*/338).fork()).ldelim(); + if (message.buttonsResponseMessage != null && Object.hasOwnProperty.call(message, "buttonsResponseMessage")) + $root.proto.Message.ButtonsResponseMessage.encode(message.buttonsResponseMessage, writer.uint32(/* id 43, wireType 2 =*/346).fork()).ldelim(); + if (message.paymentInviteMessage != null && Object.hasOwnProperty.call(message, "paymentInviteMessage")) + $root.proto.Message.PaymentInviteMessage.encode(message.paymentInviteMessage, writer.uint32(/* id 44, wireType 2 =*/354).fork()).ldelim(); + if (message.interactiveMessage != null && Object.hasOwnProperty.call(message, "interactiveMessage")) + $root.proto.Message.InteractiveMessage.encode(message.interactiveMessage, writer.uint32(/* id 45, wireType 2 =*/362).fork()).ldelim(); + if (message.reactionMessage != null && Object.hasOwnProperty.call(message, "reactionMessage")) + $root.proto.Message.ReactionMessage.encode(message.reactionMessage, writer.uint32(/* id 46, wireType 2 =*/370).fork()).ldelim(); + if (message.stickerSyncRmrMessage != null && Object.hasOwnProperty.call(message, "stickerSyncRmrMessage")) + $root.proto.Message.StickerSyncRMRMessage.encode(message.stickerSyncRmrMessage, writer.uint32(/* id 47, wireType 2 =*/378).fork()).ldelim(); + if (message.interactiveResponseMessage != null && Object.hasOwnProperty.call(message, "interactiveResponseMessage")) + $root.proto.Message.InteractiveResponseMessage.encode(message.interactiveResponseMessage, writer.uint32(/* id 48, wireType 2 =*/386).fork()).ldelim(); + if (message.pollCreationMessage != null && Object.hasOwnProperty.call(message, "pollCreationMessage")) + $root.proto.Message.PollCreationMessage.encode(message.pollCreationMessage, writer.uint32(/* id 49, wireType 2 =*/394).fork()).ldelim(); + if (message.pollUpdateMessage != null && Object.hasOwnProperty.call(message, "pollUpdateMessage")) + $root.proto.Message.PollUpdateMessage.encode(message.pollUpdateMessage, writer.uint32(/* id 50, wireType 2 =*/402).fork()).ldelim(); + if (message.keepInChatMessage != null && Object.hasOwnProperty.call(message, "keepInChatMessage")) + $root.proto.Message.KeepInChatMessage.encode(message.keepInChatMessage, writer.uint32(/* id 51, wireType 2 =*/410).fork()).ldelim(); + if (message.documentWithCaptionMessage != null && Object.hasOwnProperty.call(message, "documentWithCaptionMessage")) + $root.proto.Message.FutureProofMessage.encode(message.documentWithCaptionMessage, writer.uint32(/* id 53, wireType 2 =*/426).fork()).ldelim(); + if (message.requestPhoneNumberMessage != null && Object.hasOwnProperty.call(message, "requestPhoneNumberMessage")) + $root.proto.Message.RequestPhoneNumberMessage.encode(message.requestPhoneNumberMessage, writer.uint32(/* id 54, wireType 2 =*/434).fork()).ldelim(); + if (message.viewOnceMessageV2 != null && Object.hasOwnProperty.call(message, "viewOnceMessageV2")) + $root.proto.Message.FutureProofMessage.encode(message.viewOnceMessageV2, writer.uint32(/* id 55, wireType 2 =*/442).fork()).ldelim(); + if (message.encReactionMessage != null && Object.hasOwnProperty.call(message, "encReactionMessage")) + $root.proto.Message.EncReactionMessage.encode(message.encReactionMessage, writer.uint32(/* id 56, wireType 2 =*/450).fork()).ldelim(); + if (message.editedMessage != null && Object.hasOwnProperty.call(message, "editedMessage")) + $root.proto.Message.FutureProofMessage.encode(message.editedMessage, writer.uint32(/* id 58, wireType 2 =*/466).fork()).ldelim(); + if (message.viewOnceMessageV2Extension != null && Object.hasOwnProperty.call(message, "viewOnceMessageV2Extension")) + $root.proto.Message.FutureProofMessage.encode(message.viewOnceMessageV2Extension, writer.uint32(/* id 59, wireType 2 =*/474).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Message message, length delimited. Does not implicitly {@link proto.Message.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message + * @static + * @param {proto.IMessage} message Message message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Message.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Message message from the specified reader or buffer. + * @function decode + * @memberof proto.Message + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message} Message + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Message.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.conversation = reader.string(); + break; + case 2: + message.senderKeyDistributionMessage = $root.proto.Message.SenderKeyDistributionMessage.decode(reader, reader.uint32()); + break; + case 3: + message.imageMessage = $root.proto.Message.ImageMessage.decode(reader, reader.uint32()); + break; + case 4: + message.contactMessage = $root.proto.Message.ContactMessage.decode(reader, reader.uint32()); + break; + case 5: + message.locationMessage = $root.proto.Message.LocationMessage.decode(reader, reader.uint32()); + break; + case 6: + message.extendedTextMessage = $root.proto.Message.ExtendedTextMessage.decode(reader, reader.uint32()); + break; + case 7: + message.documentMessage = $root.proto.Message.DocumentMessage.decode(reader, reader.uint32()); + break; + case 8: + message.audioMessage = $root.proto.Message.AudioMessage.decode(reader, reader.uint32()); + break; + case 9: + message.videoMessage = $root.proto.Message.VideoMessage.decode(reader, reader.uint32()); + break; + case 10: + message.call = $root.proto.Message.Call.decode(reader, reader.uint32()); + break; + case 11: + message.chat = $root.proto.Message.Chat.decode(reader, reader.uint32()); + break; + case 12: + message.protocolMessage = $root.proto.Message.ProtocolMessage.decode(reader, reader.uint32()); + break; + case 13: + message.contactsArrayMessage = $root.proto.Message.ContactsArrayMessage.decode(reader, reader.uint32()); + break; + case 14: + message.highlyStructuredMessage = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + case 15: + message.fastRatchetKeySenderKeyDistributionMessage = $root.proto.Message.SenderKeyDistributionMessage.decode(reader, reader.uint32()); + break; + case 16: + message.sendPaymentMessage = $root.proto.Message.SendPaymentMessage.decode(reader, reader.uint32()); + break; + case 18: + message.liveLocationMessage = $root.proto.Message.LiveLocationMessage.decode(reader, reader.uint32()); + break; + case 22: + message.requestPaymentMessage = $root.proto.Message.RequestPaymentMessage.decode(reader, reader.uint32()); + break; + case 23: + message.declinePaymentRequestMessage = $root.proto.Message.DeclinePaymentRequestMessage.decode(reader, reader.uint32()); + break; + case 24: + message.cancelPaymentRequestMessage = $root.proto.Message.CancelPaymentRequestMessage.decode(reader, reader.uint32()); + break; + case 25: + message.templateMessage = $root.proto.Message.TemplateMessage.decode(reader, reader.uint32()); + break; + case 26: + message.stickerMessage = $root.proto.Message.StickerMessage.decode(reader, reader.uint32()); + break; + case 28: + message.groupInviteMessage = $root.proto.Message.GroupInviteMessage.decode(reader, reader.uint32()); + break; + case 29: + message.templateButtonReplyMessage = $root.proto.Message.TemplateButtonReplyMessage.decode(reader, reader.uint32()); + break; + case 30: + message.productMessage = $root.proto.Message.ProductMessage.decode(reader, reader.uint32()); + break; + case 31: + message.deviceSentMessage = $root.proto.Message.DeviceSentMessage.decode(reader, reader.uint32()); + break; + case 35: + message.messageContextInfo = $root.proto.MessageContextInfo.decode(reader, reader.uint32()); + break; + case 36: + message.listMessage = $root.proto.Message.ListMessage.decode(reader, reader.uint32()); + break; + case 37: + message.viewOnceMessage = $root.proto.Message.FutureProofMessage.decode(reader, reader.uint32()); + break; + case 38: + message.orderMessage = $root.proto.Message.OrderMessage.decode(reader, reader.uint32()); + break; + case 39: + message.listResponseMessage = $root.proto.Message.ListResponseMessage.decode(reader, reader.uint32()); + break; + case 40: + message.ephemeralMessage = $root.proto.Message.FutureProofMessage.decode(reader, reader.uint32()); + break; + case 41: + message.invoiceMessage = $root.proto.Message.InvoiceMessage.decode(reader, reader.uint32()); + break; + case 42: + message.buttonsMessage = $root.proto.Message.ButtonsMessage.decode(reader, reader.uint32()); + break; + case 43: + message.buttonsResponseMessage = $root.proto.Message.ButtonsResponseMessage.decode(reader, reader.uint32()); + break; + case 44: + message.paymentInviteMessage = $root.proto.Message.PaymentInviteMessage.decode(reader, reader.uint32()); + break; + case 45: + message.interactiveMessage = $root.proto.Message.InteractiveMessage.decode(reader, reader.uint32()); + break; + case 46: + message.reactionMessage = $root.proto.Message.ReactionMessage.decode(reader, reader.uint32()); + break; + case 47: + message.stickerSyncRmrMessage = $root.proto.Message.StickerSyncRMRMessage.decode(reader, reader.uint32()); + break; + case 48: + message.interactiveResponseMessage = $root.proto.Message.InteractiveResponseMessage.decode(reader, reader.uint32()); + break; + case 49: + message.pollCreationMessage = $root.proto.Message.PollCreationMessage.decode(reader, reader.uint32()); + break; + case 50: + message.pollUpdateMessage = $root.proto.Message.PollUpdateMessage.decode(reader, reader.uint32()); + break; + case 51: + message.keepInChatMessage = $root.proto.Message.KeepInChatMessage.decode(reader, reader.uint32()); + break; + case 53: + message.documentWithCaptionMessage = $root.proto.Message.FutureProofMessage.decode(reader, reader.uint32()); + break; + case 54: + message.requestPhoneNumberMessage = $root.proto.Message.RequestPhoneNumberMessage.decode(reader, reader.uint32()); + break; + case 55: + message.viewOnceMessageV2 = $root.proto.Message.FutureProofMessage.decode(reader, reader.uint32()); + break; + case 56: + message.encReactionMessage = $root.proto.Message.EncReactionMessage.decode(reader, reader.uint32()); + break; + case 58: + message.editedMessage = $root.proto.Message.FutureProofMessage.decode(reader, reader.uint32()); + break; + case 59: + message.viewOnceMessageV2Extension = $root.proto.Message.FutureProofMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Message message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message} Message + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Message.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Message message. + * @function verify + * @memberof proto.Message + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Message.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.conversation != null && message.hasOwnProperty("conversation")) + if (!$util.isString(message.conversation)) + return "conversation: string expected"; + if (message.senderKeyDistributionMessage != null && message.hasOwnProperty("senderKeyDistributionMessage")) { + var error = $root.proto.Message.SenderKeyDistributionMessage.verify(message.senderKeyDistributionMessage); + if (error) + return "senderKeyDistributionMessage." + error; + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + var error = $root.proto.Message.ImageMessage.verify(message.imageMessage); + if (error) + return "imageMessage." + error; + } + if (message.contactMessage != null && message.hasOwnProperty("contactMessage")) { + var error = $root.proto.Message.ContactMessage.verify(message.contactMessage); + if (error) + return "contactMessage." + error; + } + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) { + var error = $root.proto.Message.LocationMessage.verify(message.locationMessage); + if (error) + return "locationMessage." + error; + } + if (message.extendedTextMessage != null && message.hasOwnProperty("extendedTextMessage")) { + var error = $root.proto.Message.ExtendedTextMessage.verify(message.extendedTextMessage); + if (error) + return "extendedTextMessage." + error; + } + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + var error = $root.proto.Message.DocumentMessage.verify(message.documentMessage); + if (error) + return "documentMessage." + error; + } + if (message.audioMessage != null && message.hasOwnProperty("audioMessage")) { + var error = $root.proto.Message.AudioMessage.verify(message.audioMessage); + if (error) + return "audioMessage." + error; + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + var error = $root.proto.Message.VideoMessage.verify(message.videoMessage); + if (error) + return "videoMessage." + error; + } + if (message.call != null && message.hasOwnProperty("call")) { + var error = $root.proto.Message.Call.verify(message.call); + if (error) + return "call." + error; + } + if (message.chat != null && message.hasOwnProperty("chat")) { + var error = $root.proto.Message.Chat.verify(message.chat); + if (error) + return "chat." + error; + } + if (message.protocolMessage != null && message.hasOwnProperty("protocolMessage")) { + var error = $root.proto.Message.ProtocolMessage.verify(message.protocolMessage); + if (error) + return "protocolMessage." + error; + } + if (message.contactsArrayMessage != null && message.hasOwnProperty("contactsArrayMessage")) { + var error = $root.proto.Message.ContactsArrayMessage.verify(message.contactsArrayMessage); + if (error) + return "contactsArrayMessage." + error; + } + if (message.highlyStructuredMessage != null && message.hasOwnProperty("highlyStructuredMessage")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.highlyStructuredMessage); + if (error) + return "highlyStructuredMessage." + error; + } + if (message.fastRatchetKeySenderKeyDistributionMessage != null && message.hasOwnProperty("fastRatchetKeySenderKeyDistributionMessage")) { + var error = $root.proto.Message.SenderKeyDistributionMessage.verify(message.fastRatchetKeySenderKeyDistributionMessage); + if (error) + return "fastRatchetKeySenderKeyDistributionMessage." + error; + } + if (message.sendPaymentMessage != null && message.hasOwnProperty("sendPaymentMessage")) { + var error = $root.proto.Message.SendPaymentMessage.verify(message.sendPaymentMessage); + if (error) + return "sendPaymentMessage." + error; + } + if (message.liveLocationMessage != null && message.hasOwnProperty("liveLocationMessage")) { + var error = $root.proto.Message.LiveLocationMessage.verify(message.liveLocationMessage); + if (error) + return "liveLocationMessage." + error; + } + if (message.requestPaymentMessage != null && message.hasOwnProperty("requestPaymentMessage")) { + var error = $root.proto.Message.RequestPaymentMessage.verify(message.requestPaymentMessage); + if (error) + return "requestPaymentMessage." + error; + } + if (message.declinePaymentRequestMessage != null && message.hasOwnProperty("declinePaymentRequestMessage")) { + var error = $root.proto.Message.DeclinePaymentRequestMessage.verify(message.declinePaymentRequestMessage); + if (error) + return "declinePaymentRequestMessage." + error; + } + if (message.cancelPaymentRequestMessage != null && message.hasOwnProperty("cancelPaymentRequestMessage")) { + var error = $root.proto.Message.CancelPaymentRequestMessage.verify(message.cancelPaymentRequestMessage); + if (error) + return "cancelPaymentRequestMessage." + error; + } + if (message.templateMessage != null && message.hasOwnProperty("templateMessage")) { + var error = $root.proto.Message.TemplateMessage.verify(message.templateMessage); + if (error) + return "templateMessage." + error; + } + if (message.stickerMessage != null && message.hasOwnProperty("stickerMessage")) { + var error = $root.proto.Message.StickerMessage.verify(message.stickerMessage); + if (error) + return "stickerMessage." + error; + } + if (message.groupInviteMessage != null && message.hasOwnProperty("groupInviteMessage")) { + var error = $root.proto.Message.GroupInviteMessage.verify(message.groupInviteMessage); + if (error) + return "groupInviteMessage." + error; + } + if (message.templateButtonReplyMessage != null && message.hasOwnProperty("templateButtonReplyMessage")) { + var error = $root.proto.Message.TemplateButtonReplyMessage.verify(message.templateButtonReplyMessage); + if (error) + return "templateButtonReplyMessage." + error; + } + if (message.productMessage != null && message.hasOwnProperty("productMessage")) { + var error = $root.proto.Message.ProductMessage.verify(message.productMessage); + if (error) + return "productMessage." + error; + } + if (message.deviceSentMessage != null && message.hasOwnProperty("deviceSentMessage")) { + var error = $root.proto.Message.DeviceSentMessage.verify(message.deviceSentMessage); + if (error) + return "deviceSentMessage." + error; + } + if (message.messageContextInfo != null && message.hasOwnProperty("messageContextInfo")) { + var error = $root.proto.MessageContextInfo.verify(message.messageContextInfo); + if (error) + return "messageContextInfo." + error; + } + if (message.listMessage != null && message.hasOwnProperty("listMessage")) { + var error = $root.proto.Message.ListMessage.verify(message.listMessage); + if (error) + return "listMessage." + error; + } + if (message.viewOnceMessage != null && message.hasOwnProperty("viewOnceMessage")) { + var error = $root.proto.Message.FutureProofMessage.verify(message.viewOnceMessage); + if (error) + return "viewOnceMessage." + error; + } + if (message.orderMessage != null && message.hasOwnProperty("orderMessage")) { + var error = $root.proto.Message.OrderMessage.verify(message.orderMessage); + if (error) + return "orderMessage." + error; + } + if (message.listResponseMessage != null && message.hasOwnProperty("listResponseMessage")) { + var error = $root.proto.Message.ListResponseMessage.verify(message.listResponseMessage); + if (error) + return "listResponseMessage." + error; + } + if (message.ephemeralMessage != null && message.hasOwnProperty("ephemeralMessage")) { + var error = $root.proto.Message.FutureProofMessage.verify(message.ephemeralMessage); + if (error) + return "ephemeralMessage." + error; + } + if (message.invoiceMessage != null && message.hasOwnProperty("invoiceMessage")) { + var error = $root.proto.Message.InvoiceMessage.verify(message.invoiceMessage); + if (error) + return "invoiceMessage." + error; + } + if (message.buttonsMessage != null && message.hasOwnProperty("buttonsMessage")) { + var error = $root.proto.Message.ButtonsMessage.verify(message.buttonsMessage); + if (error) + return "buttonsMessage." + error; + } + if (message.buttonsResponseMessage != null && message.hasOwnProperty("buttonsResponseMessage")) { + var error = $root.proto.Message.ButtonsResponseMessage.verify(message.buttonsResponseMessage); + if (error) + return "buttonsResponseMessage." + error; + } + if (message.paymentInviteMessage != null && message.hasOwnProperty("paymentInviteMessage")) { + var error = $root.proto.Message.PaymentInviteMessage.verify(message.paymentInviteMessage); + if (error) + return "paymentInviteMessage." + error; + } + if (message.interactiveMessage != null && message.hasOwnProperty("interactiveMessage")) { + var error = $root.proto.Message.InteractiveMessage.verify(message.interactiveMessage); + if (error) + return "interactiveMessage." + error; + } + if (message.reactionMessage != null && message.hasOwnProperty("reactionMessage")) { + var error = $root.proto.Message.ReactionMessage.verify(message.reactionMessage); + if (error) + return "reactionMessage." + error; + } + if (message.stickerSyncRmrMessage != null && message.hasOwnProperty("stickerSyncRmrMessage")) { + var error = $root.proto.Message.StickerSyncRMRMessage.verify(message.stickerSyncRmrMessage); + if (error) + return "stickerSyncRmrMessage." + error; + } + if (message.interactiveResponseMessage != null && message.hasOwnProperty("interactiveResponseMessage")) { + var error = $root.proto.Message.InteractiveResponseMessage.verify(message.interactiveResponseMessage); + if (error) + return "interactiveResponseMessage." + error; + } + if (message.pollCreationMessage != null && message.hasOwnProperty("pollCreationMessage")) { + var error = $root.proto.Message.PollCreationMessage.verify(message.pollCreationMessage); + if (error) + return "pollCreationMessage." + error; + } + if (message.pollUpdateMessage != null && message.hasOwnProperty("pollUpdateMessage")) { + var error = $root.proto.Message.PollUpdateMessage.verify(message.pollUpdateMessage); + if (error) + return "pollUpdateMessage." + error; + } + if (message.keepInChatMessage != null && message.hasOwnProperty("keepInChatMessage")) { + var error = $root.proto.Message.KeepInChatMessage.verify(message.keepInChatMessage); + if (error) + return "keepInChatMessage." + error; + } + if (message.documentWithCaptionMessage != null && message.hasOwnProperty("documentWithCaptionMessage")) { + var error = $root.proto.Message.FutureProofMessage.verify(message.documentWithCaptionMessage); + if (error) + return "documentWithCaptionMessage." + error; + } + if (message.requestPhoneNumberMessage != null && message.hasOwnProperty("requestPhoneNumberMessage")) { + var error = $root.proto.Message.RequestPhoneNumberMessage.verify(message.requestPhoneNumberMessage); + if (error) + return "requestPhoneNumberMessage." + error; + } + if (message.viewOnceMessageV2 != null && message.hasOwnProperty("viewOnceMessageV2")) { + var error = $root.proto.Message.FutureProofMessage.verify(message.viewOnceMessageV2); + if (error) + return "viewOnceMessageV2." + error; + } + if (message.encReactionMessage != null && message.hasOwnProperty("encReactionMessage")) { + var error = $root.proto.Message.EncReactionMessage.verify(message.encReactionMessage); + if (error) + return "encReactionMessage." + error; + } + if (message.editedMessage != null && message.hasOwnProperty("editedMessage")) { + var error = $root.proto.Message.FutureProofMessage.verify(message.editedMessage); + if (error) + return "editedMessage." + error; + } + if (message.viewOnceMessageV2Extension != null && message.hasOwnProperty("viewOnceMessageV2Extension")) { + var error = $root.proto.Message.FutureProofMessage.verify(message.viewOnceMessageV2Extension); + if (error) + return "viewOnceMessageV2Extension." + error; + } + return null; + }; + + /** + * Creates a Message message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message + * @static + * @param {Object.} object Plain object + * @returns {proto.Message} Message + */ + Message.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message) + return object; + var message = new $root.proto.Message(); + if (object.conversation != null) + message.conversation = String(object.conversation); + if (object.senderKeyDistributionMessage != null) { + if (typeof object.senderKeyDistributionMessage !== "object") + throw TypeError(".proto.Message.senderKeyDistributionMessage: object expected"); + message.senderKeyDistributionMessage = $root.proto.Message.SenderKeyDistributionMessage.fromObject(object.senderKeyDistributionMessage); + } + if (object.imageMessage != null) { + if (typeof object.imageMessage !== "object") + throw TypeError(".proto.Message.imageMessage: object expected"); + message.imageMessage = $root.proto.Message.ImageMessage.fromObject(object.imageMessage); + } + if (object.contactMessage != null) { + if (typeof object.contactMessage !== "object") + throw TypeError(".proto.Message.contactMessage: object expected"); + message.contactMessage = $root.proto.Message.ContactMessage.fromObject(object.contactMessage); + } + if (object.locationMessage != null) { + if (typeof object.locationMessage !== "object") + throw TypeError(".proto.Message.locationMessage: object expected"); + message.locationMessage = $root.proto.Message.LocationMessage.fromObject(object.locationMessage); + } + if (object.extendedTextMessage != null) { + if (typeof object.extendedTextMessage !== "object") + throw TypeError(".proto.Message.extendedTextMessage: object expected"); + message.extendedTextMessage = $root.proto.Message.ExtendedTextMessage.fromObject(object.extendedTextMessage); + } + if (object.documentMessage != null) { + if (typeof object.documentMessage !== "object") + throw TypeError(".proto.Message.documentMessage: object expected"); + message.documentMessage = $root.proto.Message.DocumentMessage.fromObject(object.documentMessage); + } + if (object.audioMessage != null) { + if (typeof object.audioMessage !== "object") + throw TypeError(".proto.Message.audioMessage: object expected"); + message.audioMessage = $root.proto.Message.AudioMessage.fromObject(object.audioMessage); + } + if (object.videoMessage != null) { + if (typeof object.videoMessage !== "object") + throw TypeError(".proto.Message.videoMessage: object expected"); + message.videoMessage = $root.proto.Message.VideoMessage.fromObject(object.videoMessage); + } + if (object.call != null) { + if (typeof object.call !== "object") + throw TypeError(".proto.Message.call: object expected"); + message.call = $root.proto.Message.Call.fromObject(object.call); + } + if (object.chat != null) { + if (typeof object.chat !== "object") + throw TypeError(".proto.Message.chat: object expected"); + message.chat = $root.proto.Message.Chat.fromObject(object.chat); + } + if (object.protocolMessage != null) { + if (typeof object.protocolMessage !== "object") + throw TypeError(".proto.Message.protocolMessage: object expected"); + message.protocolMessage = $root.proto.Message.ProtocolMessage.fromObject(object.protocolMessage); + } + if (object.contactsArrayMessage != null) { + if (typeof object.contactsArrayMessage !== "object") + throw TypeError(".proto.Message.contactsArrayMessage: object expected"); + message.contactsArrayMessage = $root.proto.Message.ContactsArrayMessage.fromObject(object.contactsArrayMessage); + } + if (object.highlyStructuredMessage != null) { + if (typeof object.highlyStructuredMessage !== "object") + throw TypeError(".proto.Message.highlyStructuredMessage: object expected"); + message.highlyStructuredMessage = $root.proto.Message.HighlyStructuredMessage.fromObject(object.highlyStructuredMessage); + } + if (object.fastRatchetKeySenderKeyDistributionMessage != null) { + if (typeof object.fastRatchetKeySenderKeyDistributionMessage !== "object") + throw TypeError(".proto.Message.fastRatchetKeySenderKeyDistributionMessage: object expected"); + message.fastRatchetKeySenderKeyDistributionMessage = $root.proto.Message.SenderKeyDistributionMessage.fromObject(object.fastRatchetKeySenderKeyDistributionMessage); + } + if (object.sendPaymentMessage != null) { + if (typeof object.sendPaymentMessage !== "object") + throw TypeError(".proto.Message.sendPaymentMessage: object expected"); + message.sendPaymentMessage = $root.proto.Message.SendPaymentMessage.fromObject(object.sendPaymentMessage); + } + if (object.liveLocationMessage != null) { + if (typeof object.liveLocationMessage !== "object") + throw TypeError(".proto.Message.liveLocationMessage: object expected"); + message.liveLocationMessage = $root.proto.Message.LiveLocationMessage.fromObject(object.liveLocationMessage); + } + if (object.requestPaymentMessage != null) { + if (typeof object.requestPaymentMessage !== "object") + throw TypeError(".proto.Message.requestPaymentMessage: object expected"); + message.requestPaymentMessage = $root.proto.Message.RequestPaymentMessage.fromObject(object.requestPaymentMessage); + } + if (object.declinePaymentRequestMessage != null) { + if (typeof object.declinePaymentRequestMessage !== "object") + throw TypeError(".proto.Message.declinePaymentRequestMessage: object expected"); + message.declinePaymentRequestMessage = $root.proto.Message.DeclinePaymentRequestMessage.fromObject(object.declinePaymentRequestMessage); + } + if (object.cancelPaymentRequestMessage != null) { + if (typeof object.cancelPaymentRequestMessage !== "object") + throw TypeError(".proto.Message.cancelPaymentRequestMessage: object expected"); + message.cancelPaymentRequestMessage = $root.proto.Message.CancelPaymentRequestMessage.fromObject(object.cancelPaymentRequestMessage); + } + if (object.templateMessage != null) { + if (typeof object.templateMessage !== "object") + throw TypeError(".proto.Message.templateMessage: object expected"); + message.templateMessage = $root.proto.Message.TemplateMessage.fromObject(object.templateMessage); + } + if (object.stickerMessage != null) { + if (typeof object.stickerMessage !== "object") + throw TypeError(".proto.Message.stickerMessage: object expected"); + message.stickerMessage = $root.proto.Message.StickerMessage.fromObject(object.stickerMessage); + } + if (object.groupInviteMessage != null) { + if (typeof object.groupInviteMessage !== "object") + throw TypeError(".proto.Message.groupInviteMessage: object expected"); + message.groupInviteMessage = $root.proto.Message.GroupInviteMessage.fromObject(object.groupInviteMessage); + } + if (object.templateButtonReplyMessage != null) { + if (typeof object.templateButtonReplyMessage !== "object") + throw TypeError(".proto.Message.templateButtonReplyMessage: object expected"); + message.templateButtonReplyMessage = $root.proto.Message.TemplateButtonReplyMessage.fromObject(object.templateButtonReplyMessage); + } + if (object.productMessage != null) { + if (typeof object.productMessage !== "object") + throw TypeError(".proto.Message.productMessage: object expected"); + message.productMessage = $root.proto.Message.ProductMessage.fromObject(object.productMessage); + } + if (object.deviceSentMessage != null) { + if (typeof object.deviceSentMessage !== "object") + throw TypeError(".proto.Message.deviceSentMessage: object expected"); + message.deviceSentMessage = $root.proto.Message.DeviceSentMessage.fromObject(object.deviceSentMessage); + } + if (object.messageContextInfo != null) { + if (typeof object.messageContextInfo !== "object") + throw TypeError(".proto.Message.messageContextInfo: object expected"); + message.messageContextInfo = $root.proto.MessageContextInfo.fromObject(object.messageContextInfo); + } + if (object.listMessage != null) { + if (typeof object.listMessage !== "object") + throw TypeError(".proto.Message.listMessage: object expected"); + message.listMessage = $root.proto.Message.ListMessage.fromObject(object.listMessage); + } + if (object.viewOnceMessage != null) { + if (typeof object.viewOnceMessage !== "object") + throw TypeError(".proto.Message.viewOnceMessage: object expected"); + message.viewOnceMessage = $root.proto.Message.FutureProofMessage.fromObject(object.viewOnceMessage); + } + if (object.orderMessage != null) { + if (typeof object.orderMessage !== "object") + throw TypeError(".proto.Message.orderMessage: object expected"); + message.orderMessage = $root.proto.Message.OrderMessage.fromObject(object.orderMessage); + } + if (object.listResponseMessage != null) { + if (typeof object.listResponseMessage !== "object") + throw TypeError(".proto.Message.listResponseMessage: object expected"); + message.listResponseMessage = $root.proto.Message.ListResponseMessage.fromObject(object.listResponseMessage); + } + if (object.ephemeralMessage != null) { + if (typeof object.ephemeralMessage !== "object") + throw TypeError(".proto.Message.ephemeralMessage: object expected"); + message.ephemeralMessage = $root.proto.Message.FutureProofMessage.fromObject(object.ephemeralMessage); + } + if (object.invoiceMessage != null) { + if (typeof object.invoiceMessage !== "object") + throw TypeError(".proto.Message.invoiceMessage: object expected"); + message.invoiceMessage = $root.proto.Message.InvoiceMessage.fromObject(object.invoiceMessage); + } + if (object.buttonsMessage != null) { + if (typeof object.buttonsMessage !== "object") + throw TypeError(".proto.Message.buttonsMessage: object expected"); + message.buttonsMessage = $root.proto.Message.ButtonsMessage.fromObject(object.buttonsMessage); + } + if (object.buttonsResponseMessage != null) { + if (typeof object.buttonsResponseMessage !== "object") + throw TypeError(".proto.Message.buttonsResponseMessage: object expected"); + message.buttonsResponseMessage = $root.proto.Message.ButtonsResponseMessage.fromObject(object.buttonsResponseMessage); + } + if (object.paymentInviteMessage != null) { + if (typeof object.paymentInviteMessage !== "object") + throw TypeError(".proto.Message.paymentInviteMessage: object expected"); + message.paymentInviteMessage = $root.proto.Message.PaymentInviteMessage.fromObject(object.paymentInviteMessage); + } + if (object.interactiveMessage != null) { + if (typeof object.interactiveMessage !== "object") + throw TypeError(".proto.Message.interactiveMessage: object expected"); + message.interactiveMessage = $root.proto.Message.InteractiveMessage.fromObject(object.interactiveMessage); + } + if (object.reactionMessage != null) { + if (typeof object.reactionMessage !== "object") + throw TypeError(".proto.Message.reactionMessage: object expected"); + message.reactionMessage = $root.proto.Message.ReactionMessage.fromObject(object.reactionMessage); + } + if (object.stickerSyncRmrMessage != null) { + if (typeof object.stickerSyncRmrMessage !== "object") + throw TypeError(".proto.Message.stickerSyncRmrMessage: object expected"); + message.stickerSyncRmrMessage = $root.proto.Message.StickerSyncRMRMessage.fromObject(object.stickerSyncRmrMessage); + } + if (object.interactiveResponseMessage != null) { + if (typeof object.interactiveResponseMessage !== "object") + throw TypeError(".proto.Message.interactiveResponseMessage: object expected"); + message.interactiveResponseMessage = $root.proto.Message.InteractiveResponseMessage.fromObject(object.interactiveResponseMessage); + } + if (object.pollCreationMessage != null) { + if (typeof object.pollCreationMessage !== "object") + throw TypeError(".proto.Message.pollCreationMessage: object expected"); + message.pollCreationMessage = $root.proto.Message.PollCreationMessage.fromObject(object.pollCreationMessage); + } + if (object.pollUpdateMessage != null) { + if (typeof object.pollUpdateMessage !== "object") + throw TypeError(".proto.Message.pollUpdateMessage: object expected"); + message.pollUpdateMessage = $root.proto.Message.PollUpdateMessage.fromObject(object.pollUpdateMessage); + } + if (object.keepInChatMessage != null) { + if (typeof object.keepInChatMessage !== "object") + throw TypeError(".proto.Message.keepInChatMessage: object expected"); + message.keepInChatMessage = $root.proto.Message.KeepInChatMessage.fromObject(object.keepInChatMessage); + } + if (object.documentWithCaptionMessage != null) { + if (typeof object.documentWithCaptionMessage !== "object") + throw TypeError(".proto.Message.documentWithCaptionMessage: object expected"); + message.documentWithCaptionMessage = $root.proto.Message.FutureProofMessage.fromObject(object.documentWithCaptionMessage); + } + if (object.requestPhoneNumberMessage != null) { + if (typeof object.requestPhoneNumberMessage !== "object") + throw TypeError(".proto.Message.requestPhoneNumberMessage: object expected"); + message.requestPhoneNumberMessage = $root.proto.Message.RequestPhoneNumberMessage.fromObject(object.requestPhoneNumberMessage); + } + if (object.viewOnceMessageV2 != null) { + if (typeof object.viewOnceMessageV2 !== "object") + throw TypeError(".proto.Message.viewOnceMessageV2: object expected"); + message.viewOnceMessageV2 = $root.proto.Message.FutureProofMessage.fromObject(object.viewOnceMessageV2); + } + if (object.encReactionMessage != null) { + if (typeof object.encReactionMessage !== "object") + throw TypeError(".proto.Message.encReactionMessage: object expected"); + message.encReactionMessage = $root.proto.Message.EncReactionMessage.fromObject(object.encReactionMessage); + } + if (object.editedMessage != null) { + if (typeof object.editedMessage !== "object") + throw TypeError(".proto.Message.editedMessage: object expected"); + message.editedMessage = $root.proto.Message.FutureProofMessage.fromObject(object.editedMessage); + } + if (object.viewOnceMessageV2Extension != null) { + if (typeof object.viewOnceMessageV2Extension !== "object") + throw TypeError(".proto.Message.viewOnceMessageV2Extension: object expected"); + message.viewOnceMessageV2Extension = $root.proto.Message.FutureProofMessage.fromObject(object.viewOnceMessageV2Extension); + } + return message; + }; + + /** + * Creates a plain object from a Message message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message + * @static + * @param {proto.Message} message Message + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Message.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.conversation = ""; + object.senderKeyDistributionMessage = null; + object.imageMessage = null; + object.contactMessage = null; + object.locationMessage = null; + object.extendedTextMessage = null; + object.documentMessage = null; + object.audioMessage = null; + object.videoMessage = null; + object.call = null; + object.chat = null; + object.protocolMessage = null; + object.contactsArrayMessage = null; + object.highlyStructuredMessage = null; + object.fastRatchetKeySenderKeyDistributionMessage = null; + object.sendPaymentMessage = null; + object.liveLocationMessage = null; + object.requestPaymentMessage = null; + object.declinePaymentRequestMessage = null; + object.cancelPaymentRequestMessage = null; + object.templateMessage = null; + object.stickerMessage = null; + object.groupInviteMessage = null; + object.templateButtonReplyMessage = null; + object.productMessage = null; + object.deviceSentMessage = null; + object.messageContextInfo = null; + object.listMessage = null; + object.viewOnceMessage = null; + object.orderMessage = null; + object.listResponseMessage = null; + object.ephemeralMessage = null; + object.invoiceMessage = null; + object.buttonsMessage = null; + object.buttonsResponseMessage = null; + object.paymentInviteMessage = null; + object.interactiveMessage = null; + object.reactionMessage = null; + object.stickerSyncRmrMessage = null; + object.interactiveResponseMessage = null; + object.pollCreationMessage = null; + object.pollUpdateMessage = null; + object.keepInChatMessage = null; + object.documentWithCaptionMessage = null; + object.requestPhoneNumberMessage = null; + object.viewOnceMessageV2 = null; + object.encReactionMessage = null; + object.editedMessage = null; + object.viewOnceMessageV2Extension = null; + } + if (message.conversation != null && message.hasOwnProperty("conversation")) + object.conversation = message.conversation; + if (message.senderKeyDistributionMessage != null && message.hasOwnProperty("senderKeyDistributionMessage")) + object.senderKeyDistributionMessage = $root.proto.Message.SenderKeyDistributionMessage.toObject(message.senderKeyDistributionMessage, options); + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) + object.imageMessage = $root.proto.Message.ImageMessage.toObject(message.imageMessage, options); + if (message.contactMessage != null && message.hasOwnProperty("contactMessage")) + object.contactMessage = $root.proto.Message.ContactMessage.toObject(message.contactMessage, options); + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) + object.locationMessage = $root.proto.Message.LocationMessage.toObject(message.locationMessage, options); + if (message.extendedTextMessage != null && message.hasOwnProperty("extendedTextMessage")) + object.extendedTextMessage = $root.proto.Message.ExtendedTextMessage.toObject(message.extendedTextMessage, options); + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) + object.documentMessage = $root.proto.Message.DocumentMessage.toObject(message.documentMessage, options); + if (message.audioMessage != null && message.hasOwnProperty("audioMessage")) + object.audioMessage = $root.proto.Message.AudioMessage.toObject(message.audioMessage, options); + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) + object.videoMessage = $root.proto.Message.VideoMessage.toObject(message.videoMessage, options); + if (message.call != null && message.hasOwnProperty("call")) + object.call = $root.proto.Message.Call.toObject(message.call, options); + if (message.chat != null && message.hasOwnProperty("chat")) + object.chat = $root.proto.Message.Chat.toObject(message.chat, options); + if (message.protocolMessage != null && message.hasOwnProperty("protocolMessage")) + object.protocolMessage = $root.proto.Message.ProtocolMessage.toObject(message.protocolMessage, options); + if (message.contactsArrayMessage != null && message.hasOwnProperty("contactsArrayMessage")) + object.contactsArrayMessage = $root.proto.Message.ContactsArrayMessage.toObject(message.contactsArrayMessage, options); + if (message.highlyStructuredMessage != null && message.hasOwnProperty("highlyStructuredMessage")) + object.highlyStructuredMessage = $root.proto.Message.HighlyStructuredMessage.toObject(message.highlyStructuredMessage, options); + if (message.fastRatchetKeySenderKeyDistributionMessage != null && message.hasOwnProperty("fastRatchetKeySenderKeyDistributionMessage")) + object.fastRatchetKeySenderKeyDistributionMessage = $root.proto.Message.SenderKeyDistributionMessage.toObject(message.fastRatchetKeySenderKeyDistributionMessage, options); + if (message.sendPaymentMessage != null && message.hasOwnProperty("sendPaymentMessage")) + object.sendPaymentMessage = $root.proto.Message.SendPaymentMessage.toObject(message.sendPaymentMessage, options); + if (message.liveLocationMessage != null && message.hasOwnProperty("liveLocationMessage")) + object.liveLocationMessage = $root.proto.Message.LiveLocationMessage.toObject(message.liveLocationMessage, options); + if (message.requestPaymentMessage != null && message.hasOwnProperty("requestPaymentMessage")) + object.requestPaymentMessage = $root.proto.Message.RequestPaymentMessage.toObject(message.requestPaymentMessage, options); + if (message.declinePaymentRequestMessage != null && message.hasOwnProperty("declinePaymentRequestMessage")) + object.declinePaymentRequestMessage = $root.proto.Message.DeclinePaymentRequestMessage.toObject(message.declinePaymentRequestMessage, options); + if (message.cancelPaymentRequestMessage != null && message.hasOwnProperty("cancelPaymentRequestMessage")) + object.cancelPaymentRequestMessage = $root.proto.Message.CancelPaymentRequestMessage.toObject(message.cancelPaymentRequestMessage, options); + if (message.templateMessage != null && message.hasOwnProperty("templateMessage")) + object.templateMessage = $root.proto.Message.TemplateMessage.toObject(message.templateMessage, options); + if (message.stickerMessage != null && message.hasOwnProperty("stickerMessage")) + object.stickerMessage = $root.proto.Message.StickerMessage.toObject(message.stickerMessage, options); + if (message.groupInviteMessage != null && message.hasOwnProperty("groupInviteMessage")) + object.groupInviteMessage = $root.proto.Message.GroupInviteMessage.toObject(message.groupInviteMessage, options); + if (message.templateButtonReplyMessage != null && message.hasOwnProperty("templateButtonReplyMessage")) + object.templateButtonReplyMessage = $root.proto.Message.TemplateButtonReplyMessage.toObject(message.templateButtonReplyMessage, options); + if (message.productMessage != null && message.hasOwnProperty("productMessage")) + object.productMessage = $root.proto.Message.ProductMessage.toObject(message.productMessage, options); + if (message.deviceSentMessage != null && message.hasOwnProperty("deviceSentMessage")) + object.deviceSentMessage = $root.proto.Message.DeviceSentMessage.toObject(message.deviceSentMessage, options); + if (message.messageContextInfo != null && message.hasOwnProperty("messageContextInfo")) + object.messageContextInfo = $root.proto.MessageContextInfo.toObject(message.messageContextInfo, options); + if (message.listMessage != null && message.hasOwnProperty("listMessage")) + object.listMessage = $root.proto.Message.ListMessage.toObject(message.listMessage, options); + if (message.viewOnceMessage != null && message.hasOwnProperty("viewOnceMessage")) + object.viewOnceMessage = $root.proto.Message.FutureProofMessage.toObject(message.viewOnceMessage, options); + if (message.orderMessage != null && message.hasOwnProperty("orderMessage")) + object.orderMessage = $root.proto.Message.OrderMessage.toObject(message.orderMessage, options); + if (message.listResponseMessage != null && message.hasOwnProperty("listResponseMessage")) + object.listResponseMessage = $root.proto.Message.ListResponseMessage.toObject(message.listResponseMessage, options); + if (message.ephemeralMessage != null && message.hasOwnProperty("ephemeralMessage")) + object.ephemeralMessage = $root.proto.Message.FutureProofMessage.toObject(message.ephemeralMessage, options); + if (message.invoiceMessage != null && message.hasOwnProperty("invoiceMessage")) + object.invoiceMessage = $root.proto.Message.InvoiceMessage.toObject(message.invoiceMessage, options); + if (message.buttonsMessage != null && message.hasOwnProperty("buttonsMessage")) + object.buttonsMessage = $root.proto.Message.ButtonsMessage.toObject(message.buttonsMessage, options); + if (message.buttonsResponseMessage != null && message.hasOwnProperty("buttonsResponseMessage")) + object.buttonsResponseMessage = $root.proto.Message.ButtonsResponseMessage.toObject(message.buttonsResponseMessage, options); + if (message.paymentInviteMessage != null && message.hasOwnProperty("paymentInviteMessage")) + object.paymentInviteMessage = $root.proto.Message.PaymentInviteMessage.toObject(message.paymentInviteMessage, options); + if (message.interactiveMessage != null && message.hasOwnProperty("interactiveMessage")) + object.interactiveMessage = $root.proto.Message.InteractiveMessage.toObject(message.interactiveMessage, options); + if (message.reactionMessage != null && message.hasOwnProperty("reactionMessage")) + object.reactionMessage = $root.proto.Message.ReactionMessage.toObject(message.reactionMessage, options); + if (message.stickerSyncRmrMessage != null && message.hasOwnProperty("stickerSyncRmrMessage")) + object.stickerSyncRmrMessage = $root.proto.Message.StickerSyncRMRMessage.toObject(message.stickerSyncRmrMessage, options); + if (message.interactiveResponseMessage != null && message.hasOwnProperty("interactiveResponseMessage")) + object.interactiveResponseMessage = $root.proto.Message.InteractiveResponseMessage.toObject(message.interactiveResponseMessage, options); + if (message.pollCreationMessage != null && message.hasOwnProperty("pollCreationMessage")) + object.pollCreationMessage = $root.proto.Message.PollCreationMessage.toObject(message.pollCreationMessage, options); + if (message.pollUpdateMessage != null && message.hasOwnProperty("pollUpdateMessage")) + object.pollUpdateMessage = $root.proto.Message.PollUpdateMessage.toObject(message.pollUpdateMessage, options); + if (message.keepInChatMessage != null && message.hasOwnProperty("keepInChatMessage")) + object.keepInChatMessage = $root.proto.Message.KeepInChatMessage.toObject(message.keepInChatMessage, options); + if (message.documentWithCaptionMessage != null && message.hasOwnProperty("documentWithCaptionMessage")) + object.documentWithCaptionMessage = $root.proto.Message.FutureProofMessage.toObject(message.documentWithCaptionMessage, options); + if (message.requestPhoneNumberMessage != null && message.hasOwnProperty("requestPhoneNumberMessage")) + object.requestPhoneNumberMessage = $root.proto.Message.RequestPhoneNumberMessage.toObject(message.requestPhoneNumberMessage, options); + if (message.viewOnceMessageV2 != null && message.hasOwnProperty("viewOnceMessageV2")) + object.viewOnceMessageV2 = $root.proto.Message.FutureProofMessage.toObject(message.viewOnceMessageV2, options); + if (message.encReactionMessage != null && message.hasOwnProperty("encReactionMessage")) + object.encReactionMessage = $root.proto.Message.EncReactionMessage.toObject(message.encReactionMessage, options); + if (message.editedMessage != null && message.hasOwnProperty("editedMessage")) + object.editedMessage = $root.proto.Message.FutureProofMessage.toObject(message.editedMessage, options); + if (message.viewOnceMessageV2Extension != null && message.hasOwnProperty("viewOnceMessageV2Extension")) + object.viewOnceMessageV2Extension = $root.proto.Message.FutureProofMessage.toObject(message.viewOnceMessageV2Extension, options); + return object; + }; + + /** + * Converts this Message to JSON. + * @function toJSON + * @memberof proto.Message + * @instance + * @returns {Object.} JSON object + */ + Message.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + Message.AppStateFatalExceptionNotification = (function() { + + /** + * Properties of an AppStateFatalExceptionNotification. + * @memberof proto.Message + * @interface IAppStateFatalExceptionNotification + * @property {Array.|null} [collectionNames] AppStateFatalExceptionNotification collectionNames + * @property {number|Long|null} [timestamp] AppStateFatalExceptionNotification timestamp + */ + + /** + * Constructs a new AppStateFatalExceptionNotification. + * @memberof proto.Message + * @classdesc Represents an AppStateFatalExceptionNotification. + * @implements IAppStateFatalExceptionNotification + * @constructor + * @param {proto.Message.IAppStateFatalExceptionNotification=} [properties] Properties to set + */ + function AppStateFatalExceptionNotification(properties) { + this.collectionNames = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppStateFatalExceptionNotification collectionNames. + * @member {Array.} collectionNames + * @memberof proto.Message.AppStateFatalExceptionNotification + * @instance + */ + AppStateFatalExceptionNotification.prototype.collectionNames = $util.emptyArray; + + /** + * AppStateFatalExceptionNotification timestamp. + * @member {number|Long} timestamp + * @memberof proto.Message.AppStateFatalExceptionNotification + * @instance + */ + AppStateFatalExceptionNotification.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new AppStateFatalExceptionNotification instance using the specified properties. + * @function create + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {proto.Message.IAppStateFatalExceptionNotification=} [properties] Properties to set + * @returns {proto.Message.AppStateFatalExceptionNotification} AppStateFatalExceptionNotification instance + */ + AppStateFatalExceptionNotification.create = function create(properties) { + return new AppStateFatalExceptionNotification(properties); + }; + + /** + * Encodes the specified AppStateFatalExceptionNotification message. Does not implicitly {@link proto.Message.AppStateFatalExceptionNotification.verify|verify} messages. + * @function encode + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {proto.Message.IAppStateFatalExceptionNotification} message AppStateFatalExceptionNotification message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateFatalExceptionNotification.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.collectionNames != null && message.collectionNames.length) + for (var i = 0; i < message.collectionNames.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.collectionNames[i]); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.timestamp); + return writer; + }; + + /** + * Encodes the specified AppStateFatalExceptionNotification message, length delimited. Does not implicitly {@link proto.Message.AppStateFatalExceptionNotification.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {proto.Message.IAppStateFatalExceptionNotification} message AppStateFatalExceptionNotification message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateFatalExceptionNotification.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppStateFatalExceptionNotification message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AppStateFatalExceptionNotification} AppStateFatalExceptionNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateFatalExceptionNotification.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AppStateFatalExceptionNotification(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.collectionNames && message.collectionNames.length)) + message.collectionNames = []; + message.collectionNames.push(reader.string()); + break; + case 2: + message.timestamp = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppStateFatalExceptionNotification message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AppStateFatalExceptionNotification} AppStateFatalExceptionNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateFatalExceptionNotification.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppStateFatalExceptionNotification message. + * @function verify + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppStateFatalExceptionNotification.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.collectionNames != null && message.hasOwnProperty("collectionNames")) { + if (!Array.isArray(message.collectionNames)) + return "collectionNames: array expected"; + for (var i = 0; i < message.collectionNames.length; ++i) + if (!$util.isString(message.collectionNames[i])) + return "collectionNames: string[] expected"; + } + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + return null; + }; + + /** + * Creates an AppStateFatalExceptionNotification message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AppStateFatalExceptionNotification} AppStateFatalExceptionNotification + */ + AppStateFatalExceptionNotification.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AppStateFatalExceptionNotification) + return object; + var message = new $root.proto.Message.AppStateFatalExceptionNotification(); + if (object.collectionNames) { + if (!Array.isArray(object.collectionNames)) + throw TypeError(".proto.Message.AppStateFatalExceptionNotification.collectionNames: array expected"); + message.collectionNames = []; + for (var i = 0; i < object.collectionNames.length; ++i) + message.collectionNames[i] = String(object.collectionNames[i]); + } + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from an AppStateFatalExceptionNotification message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AppStateFatalExceptionNotification + * @static + * @param {proto.Message.AppStateFatalExceptionNotification} message AppStateFatalExceptionNotification + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppStateFatalExceptionNotification.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.collectionNames = []; + if (options.defaults) + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + if (message.collectionNames && message.collectionNames.length) { + object.collectionNames = []; + for (var j = 0; j < message.collectionNames.length; ++j) + object.collectionNames[j] = message.collectionNames[j]; + } + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp; + return object; + }; + + /** + * Converts this AppStateFatalExceptionNotification to JSON. + * @function toJSON + * @memberof proto.Message.AppStateFatalExceptionNotification + * @instance + * @returns {Object.} JSON object + */ + AppStateFatalExceptionNotification.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppStateFatalExceptionNotification; + })(); + + Message.AppStateSyncKey = (function() { + + /** + * Properties of an AppStateSyncKey. + * @memberof proto.Message + * @interface IAppStateSyncKey + * @property {proto.Message.IAppStateSyncKeyId|null} [keyId] AppStateSyncKey keyId + * @property {proto.Message.IAppStateSyncKeyData|null} [keyData] AppStateSyncKey keyData + */ + + /** + * Constructs a new AppStateSyncKey. + * @memberof proto.Message + * @classdesc Represents an AppStateSyncKey. + * @implements IAppStateSyncKey + * @constructor + * @param {proto.Message.IAppStateSyncKey=} [properties] Properties to set + */ + function AppStateSyncKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppStateSyncKey keyId. + * @member {proto.Message.IAppStateSyncKeyId|null|undefined} keyId + * @memberof proto.Message.AppStateSyncKey + * @instance + */ + AppStateSyncKey.prototype.keyId = null; + + /** + * AppStateSyncKey keyData. + * @member {proto.Message.IAppStateSyncKeyData|null|undefined} keyData + * @memberof proto.Message.AppStateSyncKey + * @instance + */ + AppStateSyncKey.prototype.keyData = null; + + /** + * Creates a new AppStateSyncKey instance using the specified properties. + * @function create + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {proto.Message.IAppStateSyncKey=} [properties] Properties to set + * @returns {proto.Message.AppStateSyncKey} AppStateSyncKey instance + */ + AppStateSyncKey.create = function create(properties) { + return new AppStateSyncKey(properties); + }; + + /** + * Encodes the specified AppStateSyncKey message. Does not implicitly {@link proto.Message.AppStateSyncKey.verify|verify} messages. + * @function encode + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {proto.Message.IAppStateSyncKey} message AppStateSyncKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyId != null && Object.hasOwnProperty.call(message, "keyId")) + $root.proto.Message.AppStateSyncKeyId.encode(message.keyId, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.keyData != null && Object.hasOwnProperty.call(message, "keyData")) + $root.proto.Message.AppStateSyncKeyData.encode(message.keyData, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified AppStateSyncKey message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKey.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {proto.Message.IAppStateSyncKey} message AppStateSyncKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppStateSyncKey message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AppStateSyncKey} AppStateSyncKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AppStateSyncKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.keyId = $root.proto.Message.AppStateSyncKeyId.decode(reader, reader.uint32()); + break; + case 2: + message.keyData = $root.proto.Message.AppStateSyncKeyData.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppStateSyncKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AppStateSyncKey} AppStateSyncKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppStateSyncKey message. + * @function verify + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppStateSyncKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyId != null && message.hasOwnProperty("keyId")) { + var error = $root.proto.Message.AppStateSyncKeyId.verify(message.keyId); + if (error) + return "keyId." + error; + } + if (message.keyData != null && message.hasOwnProperty("keyData")) { + var error = $root.proto.Message.AppStateSyncKeyData.verify(message.keyData); + if (error) + return "keyData." + error; + } + return null; + }; + + /** + * Creates an AppStateSyncKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AppStateSyncKey} AppStateSyncKey + */ + AppStateSyncKey.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AppStateSyncKey) + return object; + var message = new $root.proto.Message.AppStateSyncKey(); + if (object.keyId != null) { + if (typeof object.keyId !== "object") + throw TypeError(".proto.Message.AppStateSyncKey.keyId: object expected"); + message.keyId = $root.proto.Message.AppStateSyncKeyId.fromObject(object.keyId); + } + if (object.keyData != null) { + if (typeof object.keyData !== "object") + throw TypeError(".proto.Message.AppStateSyncKey.keyData: object expected"); + message.keyData = $root.proto.Message.AppStateSyncKeyData.fromObject(object.keyData); + } + return message; + }; + + /** + * Creates a plain object from an AppStateSyncKey message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AppStateSyncKey + * @static + * @param {proto.Message.AppStateSyncKey} message AppStateSyncKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppStateSyncKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.keyId = null; + object.keyData = null; + } + if (message.keyId != null && message.hasOwnProperty("keyId")) + object.keyId = $root.proto.Message.AppStateSyncKeyId.toObject(message.keyId, options); + if (message.keyData != null && message.hasOwnProperty("keyData")) + object.keyData = $root.proto.Message.AppStateSyncKeyData.toObject(message.keyData, options); + return object; + }; + + /** + * Converts this AppStateSyncKey to JSON. + * @function toJSON + * @memberof proto.Message.AppStateSyncKey + * @instance + * @returns {Object.} JSON object + */ + AppStateSyncKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppStateSyncKey; + })(); + + Message.AppStateSyncKeyData = (function() { + + /** + * Properties of an AppStateSyncKeyData. + * @memberof proto.Message + * @interface IAppStateSyncKeyData + * @property {Uint8Array|null} [keyData] AppStateSyncKeyData keyData + * @property {proto.Message.IAppStateSyncKeyFingerprint|null} [fingerprint] AppStateSyncKeyData fingerprint + * @property {number|Long|null} [timestamp] AppStateSyncKeyData timestamp + */ + + /** + * Constructs a new AppStateSyncKeyData. + * @memberof proto.Message + * @classdesc Represents an AppStateSyncKeyData. + * @implements IAppStateSyncKeyData + * @constructor + * @param {proto.Message.IAppStateSyncKeyData=} [properties] Properties to set + */ + function AppStateSyncKeyData(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppStateSyncKeyData keyData. + * @member {Uint8Array} keyData + * @memberof proto.Message.AppStateSyncKeyData + * @instance + */ + AppStateSyncKeyData.prototype.keyData = $util.newBuffer([]); + + /** + * AppStateSyncKeyData fingerprint. + * @member {proto.Message.IAppStateSyncKeyFingerprint|null|undefined} fingerprint + * @memberof proto.Message.AppStateSyncKeyData + * @instance + */ + AppStateSyncKeyData.prototype.fingerprint = null; + + /** + * AppStateSyncKeyData timestamp. + * @member {number|Long} timestamp + * @memberof proto.Message.AppStateSyncKeyData + * @instance + */ + AppStateSyncKeyData.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new AppStateSyncKeyData instance using the specified properties. + * @function create + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {proto.Message.IAppStateSyncKeyData=} [properties] Properties to set + * @returns {proto.Message.AppStateSyncKeyData} AppStateSyncKeyData instance + */ + AppStateSyncKeyData.create = function create(properties) { + return new AppStateSyncKeyData(properties); + }; + + /** + * Encodes the specified AppStateSyncKeyData message. Does not implicitly {@link proto.Message.AppStateSyncKeyData.verify|verify} messages. + * @function encode + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {proto.Message.IAppStateSyncKeyData} message AppStateSyncKeyData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyData != null && Object.hasOwnProperty.call(message, "keyData")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.keyData); + if (message.fingerprint != null && Object.hasOwnProperty.call(message, "fingerprint")) + $root.proto.Message.AppStateSyncKeyFingerprint.encode(message.fingerprint, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.timestamp); + return writer; + }; + + /** + * Encodes the specified AppStateSyncKeyData message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyData.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {proto.Message.IAppStateSyncKeyData} message AppStateSyncKeyData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppStateSyncKeyData message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AppStateSyncKeyData} AppStateSyncKeyData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AppStateSyncKeyData(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.keyData = reader.bytes(); + break; + case 2: + message.fingerprint = $root.proto.Message.AppStateSyncKeyFingerprint.decode(reader, reader.uint32()); + break; + case 3: + message.timestamp = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppStateSyncKeyData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AppStateSyncKeyData} AppStateSyncKeyData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppStateSyncKeyData message. + * @function verify + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppStateSyncKeyData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyData != null && message.hasOwnProperty("keyData")) + if (!(message.keyData && typeof message.keyData.length === "number" || $util.isString(message.keyData))) + return "keyData: buffer expected"; + if (message.fingerprint != null && message.hasOwnProperty("fingerprint")) { + var error = $root.proto.Message.AppStateSyncKeyFingerprint.verify(message.fingerprint); + if (error) + return "fingerprint." + error; + } + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + return null; + }; + + /** + * Creates an AppStateSyncKeyData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AppStateSyncKeyData} AppStateSyncKeyData + */ + AppStateSyncKeyData.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AppStateSyncKeyData) + return object; + var message = new $root.proto.Message.AppStateSyncKeyData(); + if (object.keyData != null) + if (typeof object.keyData === "string") + $util.base64.decode(object.keyData, message.keyData = $util.newBuffer($util.base64.length(object.keyData)), 0); + else if (object.keyData.length) + message.keyData = object.keyData; + if (object.fingerprint != null) { + if (typeof object.fingerprint !== "object") + throw TypeError(".proto.Message.AppStateSyncKeyData.fingerprint: object expected"); + message.fingerprint = $root.proto.Message.AppStateSyncKeyFingerprint.fromObject(object.fingerprint); + } + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from an AppStateSyncKeyData message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AppStateSyncKeyData + * @static + * @param {proto.Message.AppStateSyncKeyData} message AppStateSyncKeyData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppStateSyncKeyData.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.keyData = ""; + else { + object.keyData = []; + if (options.bytes !== Array) + object.keyData = $util.newBuffer(object.keyData); + } + object.fingerprint = null; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + } + if (message.keyData != null && message.hasOwnProperty("keyData")) + object.keyData = options.bytes === String ? $util.base64.encode(message.keyData, 0, message.keyData.length) : options.bytes === Array ? Array.prototype.slice.call(message.keyData) : message.keyData; + if (message.fingerprint != null && message.hasOwnProperty("fingerprint")) + object.fingerprint = $root.proto.Message.AppStateSyncKeyFingerprint.toObject(message.fingerprint, options); + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp; + return object; + }; + + /** + * Converts this AppStateSyncKeyData to JSON. + * @function toJSON + * @memberof proto.Message.AppStateSyncKeyData + * @instance + * @returns {Object.} JSON object + */ + AppStateSyncKeyData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppStateSyncKeyData; + })(); + + Message.AppStateSyncKeyFingerprint = (function() { + + /** + * Properties of an AppStateSyncKeyFingerprint. + * @memberof proto.Message + * @interface IAppStateSyncKeyFingerprint + * @property {number|null} [rawId] AppStateSyncKeyFingerprint rawId + * @property {number|null} [currentIndex] AppStateSyncKeyFingerprint currentIndex + * @property {Array.|null} [deviceIndexes] AppStateSyncKeyFingerprint deviceIndexes + */ + + /** + * Constructs a new AppStateSyncKeyFingerprint. + * @memberof proto.Message + * @classdesc Represents an AppStateSyncKeyFingerprint. + * @implements IAppStateSyncKeyFingerprint + * @constructor + * @param {proto.Message.IAppStateSyncKeyFingerprint=} [properties] Properties to set + */ + function AppStateSyncKeyFingerprint(properties) { + this.deviceIndexes = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppStateSyncKeyFingerprint rawId. + * @member {number} rawId + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @instance + */ + AppStateSyncKeyFingerprint.prototype.rawId = 0; + + /** + * AppStateSyncKeyFingerprint currentIndex. + * @member {number} currentIndex + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @instance + */ + AppStateSyncKeyFingerprint.prototype.currentIndex = 0; + + /** + * AppStateSyncKeyFingerprint deviceIndexes. + * @member {Array.} deviceIndexes + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @instance + */ + AppStateSyncKeyFingerprint.prototype.deviceIndexes = $util.emptyArray; + + /** + * Creates a new AppStateSyncKeyFingerprint instance using the specified properties. + * @function create + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {proto.Message.IAppStateSyncKeyFingerprint=} [properties] Properties to set + * @returns {proto.Message.AppStateSyncKeyFingerprint} AppStateSyncKeyFingerprint instance + */ + AppStateSyncKeyFingerprint.create = function create(properties) { + return new AppStateSyncKeyFingerprint(properties); + }; + + /** + * Encodes the specified AppStateSyncKeyFingerprint message. Does not implicitly {@link proto.Message.AppStateSyncKeyFingerprint.verify|verify} messages. + * @function encode + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {proto.Message.IAppStateSyncKeyFingerprint} message AppStateSyncKeyFingerprint message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyFingerprint.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.rawId != null && Object.hasOwnProperty.call(message, "rawId")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.rawId); + if (message.currentIndex != null && Object.hasOwnProperty.call(message, "currentIndex")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.currentIndex); + if (message.deviceIndexes != null && message.deviceIndexes.length) { + writer.uint32(/* id 3, wireType 2 =*/26).fork(); + for (var i = 0; i < message.deviceIndexes.length; ++i) + writer.uint32(message.deviceIndexes[i]); + writer.ldelim(); + } + return writer; + }; + + /** + * Encodes the specified AppStateSyncKeyFingerprint message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyFingerprint.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {proto.Message.IAppStateSyncKeyFingerprint} message AppStateSyncKeyFingerprint message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyFingerprint.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppStateSyncKeyFingerprint message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AppStateSyncKeyFingerprint} AppStateSyncKeyFingerprint + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyFingerprint.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AppStateSyncKeyFingerprint(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.rawId = reader.uint32(); + break; + case 2: + message.currentIndex = reader.uint32(); + break; + case 3: + if (!(message.deviceIndexes && message.deviceIndexes.length)) + message.deviceIndexes = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.deviceIndexes.push(reader.uint32()); + } else + message.deviceIndexes.push(reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppStateSyncKeyFingerprint message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AppStateSyncKeyFingerprint} AppStateSyncKeyFingerprint + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyFingerprint.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppStateSyncKeyFingerprint message. + * @function verify + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppStateSyncKeyFingerprint.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.rawId != null && message.hasOwnProperty("rawId")) + if (!$util.isInteger(message.rawId)) + return "rawId: integer expected"; + if (message.currentIndex != null && message.hasOwnProperty("currentIndex")) + if (!$util.isInteger(message.currentIndex)) + return "currentIndex: integer expected"; + if (message.deviceIndexes != null && message.hasOwnProperty("deviceIndexes")) { + if (!Array.isArray(message.deviceIndexes)) + return "deviceIndexes: array expected"; + for (var i = 0; i < message.deviceIndexes.length; ++i) + if (!$util.isInteger(message.deviceIndexes[i])) + return "deviceIndexes: integer[] expected"; + } + return null; + }; + + /** + * Creates an AppStateSyncKeyFingerprint message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AppStateSyncKeyFingerprint} AppStateSyncKeyFingerprint + */ + AppStateSyncKeyFingerprint.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AppStateSyncKeyFingerprint) + return object; + var message = new $root.proto.Message.AppStateSyncKeyFingerprint(); + if (object.rawId != null) + message.rawId = object.rawId >>> 0; + if (object.currentIndex != null) + message.currentIndex = object.currentIndex >>> 0; + if (object.deviceIndexes) { + if (!Array.isArray(object.deviceIndexes)) + throw TypeError(".proto.Message.AppStateSyncKeyFingerprint.deviceIndexes: array expected"); + message.deviceIndexes = []; + for (var i = 0; i < object.deviceIndexes.length; ++i) + message.deviceIndexes[i] = object.deviceIndexes[i] >>> 0; + } + return message; + }; + + /** + * Creates a plain object from an AppStateSyncKeyFingerprint message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @static + * @param {proto.Message.AppStateSyncKeyFingerprint} message AppStateSyncKeyFingerprint + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppStateSyncKeyFingerprint.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.deviceIndexes = []; + if (options.defaults) { + object.rawId = 0; + object.currentIndex = 0; + } + if (message.rawId != null && message.hasOwnProperty("rawId")) + object.rawId = message.rawId; + if (message.currentIndex != null && message.hasOwnProperty("currentIndex")) + object.currentIndex = message.currentIndex; + if (message.deviceIndexes && message.deviceIndexes.length) { + object.deviceIndexes = []; + for (var j = 0; j < message.deviceIndexes.length; ++j) + object.deviceIndexes[j] = message.deviceIndexes[j]; + } + return object; + }; + + /** + * Converts this AppStateSyncKeyFingerprint to JSON. + * @function toJSON + * @memberof proto.Message.AppStateSyncKeyFingerprint + * @instance + * @returns {Object.} JSON object + */ + AppStateSyncKeyFingerprint.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppStateSyncKeyFingerprint; + })(); + + Message.AppStateSyncKeyId = (function() { + + /** + * Properties of an AppStateSyncKeyId. + * @memberof proto.Message + * @interface IAppStateSyncKeyId + * @property {Uint8Array|null} [keyId] AppStateSyncKeyId keyId + */ + + /** + * Constructs a new AppStateSyncKeyId. + * @memberof proto.Message + * @classdesc Represents an AppStateSyncKeyId. + * @implements IAppStateSyncKeyId + * @constructor + * @param {proto.Message.IAppStateSyncKeyId=} [properties] Properties to set + */ + function AppStateSyncKeyId(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppStateSyncKeyId keyId. + * @member {Uint8Array} keyId + * @memberof proto.Message.AppStateSyncKeyId + * @instance + */ + AppStateSyncKeyId.prototype.keyId = $util.newBuffer([]); + + /** + * Creates a new AppStateSyncKeyId instance using the specified properties. + * @function create + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {proto.Message.IAppStateSyncKeyId=} [properties] Properties to set + * @returns {proto.Message.AppStateSyncKeyId} AppStateSyncKeyId instance + */ + AppStateSyncKeyId.create = function create(properties) { + return new AppStateSyncKeyId(properties); + }; + + /** + * Encodes the specified AppStateSyncKeyId message. Does not implicitly {@link proto.Message.AppStateSyncKeyId.verify|verify} messages. + * @function encode + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {proto.Message.IAppStateSyncKeyId} message AppStateSyncKeyId message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyId.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyId != null && Object.hasOwnProperty.call(message, "keyId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.keyId); + return writer; + }; + + /** + * Encodes the specified AppStateSyncKeyId message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyId.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {proto.Message.IAppStateSyncKeyId} message AppStateSyncKeyId message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyId.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppStateSyncKeyId message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AppStateSyncKeyId} AppStateSyncKeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyId.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AppStateSyncKeyId(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.keyId = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppStateSyncKeyId message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AppStateSyncKeyId} AppStateSyncKeyId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyId.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppStateSyncKeyId message. + * @function verify + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppStateSyncKeyId.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyId != null && message.hasOwnProperty("keyId")) + if (!(message.keyId && typeof message.keyId.length === "number" || $util.isString(message.keyId))) + return "keyId: buffer expected"; + return null; + }; + + /** + * Creates an AppStateSyncKeyId message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AppStateSyncKeyId} AppStateSyncKeyId + */ + AppStateSyncKeyId.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AppStateSyncKeyId) + return object; + var message = new $root.proto.Message.AppStateSyncKeyId(); + if (object.keyId != null) + if (typeof object.keyId === "string") + $util.base64.decode(object.keyId, message.keyId = $util.newBuffer($util.base64.length(object.keyId)), 0); + else if (object.keyId.length) + message.keyId = object.keyId; + return message; + }; + + /** + * Creates a plain object from an AppStateSyncKeyId message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AppStateSyncKeyId + * @static + * @param {proto.Message.AppStateSyncKeyId} message AppStateSyncKeyId + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppStateSyncKeyId.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.keyId = ""; + else { + object.keyId = []; + if (options.bytes !== Array) + object.keyId = $util.newBuffer(object.keyId); + } + if (message.keyId != null && message.hasOwnProperty("keyId")) + object.keyId = options.bytes === String ? $util.base64.encode(message.keyId, 0, message.keyId.length) : options.bytes === Array ? Array.prototype.slice.call(message.keyId) : message.keyId; + return object; + }; + + /** + * Converts this AppStateSyncKeyId to JSON. + * @function toJSON + * @memberof proto.Message.AppStateSyncKeyId + * @instance + * @returns {Object.} JSON object + */ + AppStateSyncKeyId.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppStateSyncKeyId; + })(); + + Message.AppStateSyncKeyRequest = (function() { + + /** + * Properties of an AppStateSyncKeyRequest. + * @memberof proto.Message + * @interface IAppStateSyncKeyRequest + * @property {Array.|null} [keyIds] AppStateSyncKeyRequest keyIds + */ + + /** + * Constructs a new AppStateSyncKeyRequest. + * @memberof proto.Message + * @classdesc Represents an AppStateSyncKeyRequest. + * @implements IAppStateSyncKeyRequest + * @constructor + * @param {proto.Message.IAppStateSyncKeyRequest=} [properties] Properties to set + */ + function AppStateSyncKeyRequest(properties) { + this.keyIds = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppStateSyncKeyRequest keyIds. + * @member {Array.} keyIds + * @memberof proto.Message.AppStateSyncKeyRequest + * @instance + */ + AppStateSyncKeyRequest.prototype.keyIds = $util.emptyArray; + + /** + * Creates a new AppStateSyncKeyRequest instance using the specified properties. + * @function create + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {proto.Message.IAppStateSyncKeyRequest=} [properties] Properties to set + * @returns {proto.Message.AppStateSyncKeyRequest} AppStateSyncKeyRequest instance + */ + AppStateSyncKeyRequest.create = function create(properties) { + return new AppStateSyncKeyRequest(properties); + }; + + /** + * Encodes the specified AppStateSyncKeyRequest message. Does not implicitly {@link proto.Message.AppStateSyncKeyRequest.verify|verify} messages. + * @function encode + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {proto.Message.IAppStateSyncKeyRequest} message AppStateSyncKeyRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyIds != null && message.keyIds.length) + for (var i = 0; i < message.keyIds.length; ++i) + $root.proto.Message.AppStateSyncKeyId.encode(message.keyIds[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified AppStateSyncKeyRequest message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {proto.Message.IAppStateSyncKeyRequest} message AppStateSyncKeyRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppStateSyncKeyRequest message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AppStateSyncKeyRequest} AppStateSyncKeyRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AppStateSyncKeyRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.keyIds && message.keyIds.length)) + message.keyIds = []; + message.keyIds.push($root.proto.Message.AppStateSyncKeyId.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppStateSyncKeyRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AppStateSyncKeyRequest} AppStateSyncKeyRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppStateSyncKeyRequest message. + * @function verify + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppStateSyncKeyRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyIds != null && message.hasOwnProperty("keyIds")) { + if (!Array.isArray(message.keyIds)) + return "keyIds: array expected"; + for (var i = 0; i < message.keyIds.length; ++i) { + var error = $root.proto.Message.AppStateSyncKeyId.verify(message.keyIds[i]); + if (error) + return "keyIds." + error; + } + } + return null; + }; + + /** + * Creates an AppStateSyncKeyRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AppStateSyncKeyRequest} AppStateSyncKeyRequest + */ + AppStateSyncKeyRequest.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AppStateSyncKeyRequest) + return object; + var message = new $root.proto.Message.AppStateSyncKeyRequest(); + if (object.keyIds) { + if (!Array.isArray(object.keyIds)) + throw TypeError(".proto.Message.AppStateSyncKeyRequest.keyIds: array expected"); + message.keyIds = []; + for (var i = 0; i < object.keyIds.length; ++i) { + if (typeof object.keyIds[i] !== "object") + throw TypeError(".proto.Message.AppStateSyncKeyRequest.keyIds: object expected"); + message.keyIds[i] = $root.proto.Message.AppStateSyncKeyId.fromObject(object.keyIds[i]); + } + } + return message; + }; + + /** + * Creates a plain object from an AppStateSyncKeyRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AppStateSyncKeyRequest + * @static + * @param {proto.Message.AppStateSyncKeyRequest} message AppStateSyncKeyRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppStateSyncKeyRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.keyIds = []; + if (message.keyIds && message.keyIds.length) { + object.keyIds = []; + for (var j = 0; j < message.keyIds.length; ++j) + object.keyIds[j] = $root.proto.Message.AppStateSyncKeyId.toObject(message.keyIds[j], options); + } + return object; + }; + + /** + * Converts this AppStateSyncKeyRequest to JSON. + * @function toJSON + * @memberof proto.Message.AppStateSyncKeyRequest + * @instance + * @returns {Object.} JSON object + */ + AppStateSyncKeyRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppStateSyncKeyRequest; + })(); + + Message.AppStateSyncKeyShare = (function() { + + /** + * Properties of an AppStateSyncKeyShare. + * @memberof proto.Message + * @interface IAppStateSyncKeyShare + * @property {Array.|null} [keys] AppStateSyncKeyShare keys + */ + + /** + * Constructs a new AppStateSyncKeyShare. + * @memberof proto.Message + * @classdesc Represents an AppStateSyncKeyShare. + * @implements IAppStateSyncKeyShare + * @constructor + * @param {proto.Message.IAppStateSyncKeyShare=} [properties] Properties to set + */ + function AppStateSyncKeyShare(properties) { + this.keys = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AppStateSyncKeyShare keys. + * @member {Array.} keys + * @memberof proto.Message.AppStateSyncKeyShare + * @instance + */ + AppStateSyncKeyShare.prototype.keys = $util.emptyArray; + + /** + * Creates a new AppStateSyncKeyShare instance using the specified properties. + * @function create + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {proto.Message.IAppStateSyncKeyShare=} [properties] Properties to set + * @returns {proto.Message.AppStateSyncKeyShare} AppStateSyncKeyShare instance + */ + AppStateSyncKeyShare.create = function create(properties) { + return new AppStateSyncKeyShare(properties); + }; + + /** + * Encodes the specified AppStateSyncKeyShare message. Does not implicitly {@link proto.Message.AppStateSyncKeyShare.verify|verify} messages. + * @function encode + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {proto.Message.IAppStateSyncKeyShare} message AppStateSyncKeyShare message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyShare.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keys != null && message.keys.length) + for (var i = 0; i < message.keys.length; ++i) + $root.proto.Message.AppStateSyncKey.encode(message.keys[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified AppStateSyncKeyShare message, length delimited. Does not implicitly {@link proto.Message.AppStateSyncKeyShare.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {proto.Message.IAppStateSyncKeyShare} message AppStateSyncKeyShare message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AppStateSyncKeyShare.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AppStateSyncKeyShare message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AppStateSyncKeyShare} AppStateSyncKeyShare + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyShare.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AppStateSyncKeyShare(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.keys && message.keys.length)) + message.keys = []; + message.keys.push($root.proto.Message.AppStateSyncKey.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AppStateSyncKeyShare message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AppStateSyncKeyShare} AppStateSyncKeyShare + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AppStateSyncKeyShare.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AppStateSyncKeyShare message. + * @function verify + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AppStateSyncKeyShare.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keys != null && message.hasOwnProperty("keys")) { + if (!Array.isArray(message.keys)) + return "keys: array expected"; + for (var i = 0; i < message.keys.length; ++i) { + var error = $root.proto.Message.AppStateSyncKey.verify(message.keys[i]); + if (error) + return "keys." + error; + } + } + return null; + }; + + /** + * Creates an AppStateSyncKeyShare message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AppStateSyncKeyShare} AppStateSyncKeyShare + */ + AppStateSyncKeyShare.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AppStateSyncKeyShare) + return object; + var message = new $root.proto.Message.AppStateSyncKeyShare(); + if (object.keys) { + if (!Array.isArray(object.keys)) + throw TypeError(".proto.Message.AppStateSyncKeyShare.keys: array expected"); + message.keys = []; + for (var i = 0; i < object.keys.length; ++i) { + if (typeof object.keys[i] !== "object") + throw TypeError(".proto.Message.AppStateSyncKeyShare.keys: object expected"); + message.keys[i] = $root.proto.Message.AppStateSyncKey.fromObject(object.keys[i]); + } + } + return message; + }; + + /** + * Creates a plain object from an AppStateSyncKeyShare message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AppStateSyncKeyShare + * @static + * @param {proto.Message.AppStateSyncKeyShare} message AppStateSyncKeyShare + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AppStateSyncKeyShare.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.keys = []; + if (message.keys && message.keys.length) { + object.keys = []; + for (var j = 0; j < message.keys.length; ++j) + object.keys[j] = $root.proto.Message.AppStateSyncKey.toObject(message.keys[j], options); + } + return object; + }; + + /** + * Converts this AppStateSyncKeyShare to JSON. + * @function toJSON + * @memberof proto.Message.AppStateSyncKeyShare + * @instance + * @returns {Object.} JSON object + */ + AppStateSyncKeyShare.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AppStateSyncKeyShare; + })(); + + Message.AudioMessage = (function() { + + /** + * Properties of an AudioMessage. + * @memberof proto.Message + * @interface IAudioMessage + * @property {string|null} [url] AudioMessage url + * @property {string|null} [mimetype] AudioMessage mimetype + * @property {Uint8Array|null} [fileSha256] AudioMessage fileSha256 + * @property {number|Long|null} [fileLength] AudioMessage fileLength + * @property {number|null} [seconds] AudioMessage seconds + * @property {boolean|null} [ptt] AudioMessage ptt + * @property {Uint8Array|null} [mediaKey] AudioMessage mediaKey + * @property {Uint8Array|null} [fileEncSha256] AudioMessage fileEncSha256 + * @property {string|null} [directPath] AudioMessage directPath + * @property {number|Long|null} [mediaKeyTimestamp] AudioMessage mediaKeyTimestamp + * @property {proto.IContextInfo|null} [contextInfo] AudioMessage contextInfo + * @property {Uint8Array|null} [streamingSidecar] AudioMessage streamingSidecar + * @property {Uint8Array|null} [waveform] AudioMessage waveform + * @property {number|null} [backgroundArgb] AudioMessage backgroundArgb + */ + + /** + * Constructs a new AudioMessage. + * @memberof proto.Message + * @classdesc Represents an AudioMessage. + * @implements IAudioMessage + * @constructor + * @param {proto.Message.IAudioMessage=} [properties] Properties to set + */ + function AudioMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AudioMessage url. + * @member {string} url + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.url = ""; + + /** + * AudioMessage mimetype. + * @member {string} mimetype + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.mimetype = ""; + + /** + * AudioMessage fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.fileSha256 = $util.newBuffer([]); + + /** + * AudioMessage fileLength. + * @member {number|Long} fileLength + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * AudioMessage seconds. + * @member {number} seconds + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.seconds = 0; + + /** + * AudioMessage ptt. + * @member {boolean} ptt + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.ptt = false; + + /** + * AudioMessage mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.mediaKey = $util.newBuffer([]); + + /** + * AudioMessage fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * AudioMessage directPath. + * @member {string} directPath + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.directPath = ""; + + /** + * AudioMessage mediaKeyTimestamp. + * @member {number|Long} mediaKeyTimestamp + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.mediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * AudioMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.contextInfo = null; + + /** + * AudioMessage streamingSidecar. + * @member {Uint8Array} streamingSidecar + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.streamingSidecar = $util.newBuffer([]); + + /** + * AudioMessage waveform. + * @member {Uint8Array} waveform + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.waveform = $util.newBuffer([]); + + /** + * AudioMessage backgroundArgb. + * @member {number} backgroundArgb + * @memberof proto.Message.AudioMessage + * @instance + */ + AudioMessage.prototype.backgroundArgb = 0; + + /** + * Creates a new AudioMessage instance using the specified properties. + * @function create + * @memberof proto.Message.AudioMessage + * @static + * @param {proto.Message.IAudioMessage=} [properties] Properties to set + * @returns {proto.Message.AudioMessage} AudioMessage instance + */ + AudioMessage.create = function create(properties) { + return new AudioMessage(properties); + }; + + /** + * Encodes the specified AudioMessage message. Does not implicitly {@link proto.Message.AudioMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.AudioMessage + * @static + * @param {proto.Message.IAudioMessage} message AudioMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AudioMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.mimetype); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.fileSha256); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.fileLength); + if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.seconds); + if (message.ptt != null && Object.hasOwnProperty.call(message, "ptt")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.ptt); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.mediaKey); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.fileEncSha256); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.directPath); + if (message.mediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "mediaKeyTimestamp")) + writer.uint32(/* id 10, wireType 0 =*/80).int64(message.mediaKeyTimestamp); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.streamingSidecar != null && Object.hasOwnProperty.call(message, "streamingSidecar")) + writer.uint32(/* id 18, wireType 2 =*/146).bytes(message.streamingSidecar); + if (message.waveform != null && Object.hasOwnProperty.call(message, "waveform")) + writer.uint32(/* id 19, wireType 2 =*/154).bytes(message.waveform); + if (message.backgroundArgb != null && Object.hasOwnProperty.call(message, "backgroundArgb")) + writer.uint32(/* id 20, wireType 5 =*/165).fixed32(message.backgroundArgb); + return writer; + }; + + /** + * Encodes the specified AudioMessage message, length delimited. Does not implicitly {@link proto.Message.AudioMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.AudioMessage + * @static + * @param {proto.Message.IAudioMessage} message AudioMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AudioMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AudioMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.AudioMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.AudioMessage} AudioMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AudioMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.AudioMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.mimetype = reader.string(); + break; + case 3: + message.fileSha256 = reader.bytes(); + break; + case 4: + message.fileLength = reader.uint64(); + break; + case 5: + message.seconds = reader.uint32(); + break; + case 6: + message.ptt = reader.bool(); + break; + case 7: + message.mediaKey = reader.bytes(); + break; + case 8: + message.fileEncSha256 = reader.bytes(); + break; + case 9: + message.directPath = reader.string(); + break; + case 10: + message.mediaKeyTimestamp = reader.int64(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 18: + message.streamingSidecar = reader.bytes(); + break; + case 19: + message.waveform = reader.bytes(); + break; + case 20: + message.backgroundArgb = reader.fixed32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AudioMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.AudioMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.AudioMessage} AudioMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AudioMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AudioMessage message. + * @function verify + * @memberof proto.Message.AudioMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AudioMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.seconds != null && message.hasOwnProperty("seconds")) + if (!$util.isInteger(message.seconds)) + return "seconds: integer expected"; + if (message.ptt != null && message.hasOwnProperty("ptt")) + if (typeof message.ptt !== "boolean") + return "ptt: boolean expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (!$util.isInteger(message.mediaKeyTimestamp) && !(message.mediaKeyTimestamp && $util.isInteger(message.mediaKeyTimestamp.low) && $util.isInteger(message.mediaKeyTimestamp.high))) + return "mediaKeyTimestamp: integer|Long expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.streamingSidecar != null && message.hasOwnProperty("streamingSidecar")) + if (!(message.streamingSidecar && typeof message.streamingSidecar.length === "number" || $util.isString(message.streamingSidecar))) + return "streamingSidecar: buffer expected"; + if (message.waveform != null && message.hasOwnProperty("waveform")) + if (!(message.waveform && typeof message.waveform.length === "number" || $util.isString(message.waveform))) + return "waveform: buffer expected"; + if (message.backgroundArgb != null && message.hasOwnProperty("backgroundArgb")) + if (!$util.isInteger(message.backgroundArgb)) + return "backgroundArgb: integer expected"; + return null; + }; + + /** + * Creates an AudioMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.AudioMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.AudioMessage} AudioMessage + */ + AudioMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.AudioMessage) + return object; + var message = new $root.proto.Message.AudioMessage(); + if (object.url != null) + message.url = String(object.url); + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.seconds != null) + message.seconds = object.seconds >>> 0; + if (object.ptt != null) + message.ptt = Boolean(object.ptt); + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.mediaKeyTimestamp != null) + if ($util.Long) + (message.mediaKeyTimestamp = $util.Long.fromValue(object.mediaKeyTimestamp)).unsigned = false; + else if (typeof object.mediaKeyTimestamp === "string") + message.mediaKeyTimestamp = parseInt(object.mediaKeyTimestamp, 10); + else if (typeof object.mediaKeyTimestamp === "number") + message.mediaKeyTimestamp = object.mediaKeyTimestamp; + else if (typeof object.mediaKeyTimestamp === "object") + message.mediaKeyTimestamp = new $util.LongBits(object.mediaKeyTimestamp.low >>> 0, object.mediaKeyTimestamp.high >>> 0).toNumber(); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.AudioMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.streamingSidecar != null) + if (typeof object.streamingSidecar === "string") + $util.base64.decode(object.streamingSidecar, message.streamingSidecar = $util.newBuffer($util.base64.length(object.streamingSidecar)), 0); + else if (object.streamingSidecar.length) + message.streamingSidecar = object.streamingSidecar; + if (object.waveform != null) + if (typeof object.waveform === "string") + $util.base64.decode(object.waveform, message.waveform = $util.newBuffer($util.base64.length(object.waveform)), 0); + else if (object.waveform.length) + message.waveform = object.waveform; + if (object.backgroundArgb != null) + message.backgroundArgb = object.backgroundArgb >>> 0; + return message; + }; + + /** + * Creates a plain object from an AudioMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.AudioMessage + * @static + * @param {proto.Message.AudioMessage} message AudioMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AudioMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = ""; + object.mimetype = ""; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + object.seconds = 0; + object.ptt = false; + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + object.directPath = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.mediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.mediaKeyTimestamp = options.longs === String ? "0" : 0; + object.contextInfo = null; + if (options.bytes === String) + object.streamingSidecar = ""; + else { + object.streamingSidecar = []; + if (options.bytes !== Array) + object.streamingSidecar = $util.newBuffer(object.streamingSidecar); + } + if (options.bytes === String) + object.waveform = ""; + else { + object.waveform = []; + if (options.bytes !== Array) + object.waveform = $util.newBuffer(object.waveform); + } + object.backgroundArgb = 0; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.seconds != null && message.hasOwnProperty("seconds")) + object.seconds = message.seconds; + if (message.ptt != null && message.hasOwnProperty("ptt")) + object.ptt = message.ptt; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (typeof message.mediaKeyTimestamp === "number") + object.mediaKeyTimestamp = options.longs === String ? String(message.mediaKeyTimestamp) : message.mediaKeyTimestamp; + else + object.mediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.mediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.mediaKeyTimestamp.low >>> 0, message.mediaKeyTimestamp.high >>> 0).toNumber() : message.mediaKeyTimestamp; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.streamingSidecar != null && message.hasOwnProperty("streamingSidecar")) + object.streamingSidecar = options.bytes === String ? $util.base64.encode(message.streamingSidecar, 0, message.streamingSidecar.length) : options.bytes === Array ? Array.prototype.slice.call(message.streamingSidecar) : message.streamingSidecar; + if (message.waveform != null && message.hasOwnProperty("waveform")) + object.waveform = options.bytes === String ? $util.base64.encode(message.waveform, 0, message.waveform.length) : options.bytes === Array ? Array.prototype.slice.call(message.waveform) : message.waveform; + if (message.backgroundArgb != null && message.hasOwnProperty("backgroundArgb")) + object.backgroundArgb = message.backgroundArgb; + return object; + }; + + /** + * Converts this AudioMessage to JSON. + * @function toJSON + * @memberof proto.Message.AudioMessage + * @instance + * @returns {Object.} JSON object + */ + AudioMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AudioMessage; + })(); + + Message.ButtonsMessage = (function() { + + /** + * Properties of a ButtonsMessage. + * @memberof proto.Message + * @interface IButtonsMessage + * @property {string|null} [contentText] ButtonsMessage contentText + * @property {string|null} [footerText] ButtonsMessage footerText + * @property {proto.IContextInfo|null} [contextInfo] ButtonsMessage contextInfo + * @property {Array.|null} [buttons] ButtonsMessage buttons + * @property {proto.Message.ButtonsMessage.HeaderType|null} [headerType] ButtonsMessage headerType + * @property {string|null} [text] ButtonsMessage text + * @property {proto.Message.IDocumentMessage|null} [documentMessage] ButtonsMessage documentMessage + * @property {proto.Message.IImageMessage|null} [imageMessage] ButtonsMessage imageMessage + * @property {proto.Message.IVideoMessage|null} [videoMessage] ButtonsMessage videoMessage + * @property {proto.Message.ILocationMessage|null} [locationMessage] ButtonsMessage locationMessage + */ + + /** + * Constructs a new ButtonsMessage. + * @memberof proto.Message + * @classdesc Represents a ButtonsMessage. + * @implements IButtonsMessage + * @constructor + * @param {proto.Message.IButtonsMessage=} [properties] Properties to set + */ + function ButtonsMessage(properties) { + this.buttons = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ButtonsMessage contentText. + * @member {string} contentText + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.contentText = ""; + + /** + * ButtonsMessage footerText. + * @member {string} footerText + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.footerText = ""; + + /** + * ButtonsMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.contextInfo = null; + + /** + * ButtonsMessage buttons. + * @member {Array.} buttons + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.buttons = $util.emptyArray; + + /** + * ButtonsMessage headerType. + * @member {proto.Message.ButtonsMessage.HeaderType} headerType + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.headerType = 0; + + /** + * ButtonsMessage text. + * @member {string|null|undefined} text + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.text = null; + + /** + * ButtonsMessage documentMessage. + * @member {proto.Message.IDocumentMessage|null|undefined} documentMessage + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.documentMessage = null; + + /** + * ButtonsMessage imageMessage. + * @member {proto.Message.IImageMessage|null|undefined} imageMessage + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.imageMessage = null; + + /** + * ButtonsMessage videoMessage. + * @member {proto.Message.IVideoMessage|null|undefined} videoMessage + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.videoMessage = null; + + /** + * ButtonsMessage locationMessage. + * @member {proto.Message.ILocationMessage|null|undefined} locationMessage + * @memberof proto.Message.ButtonsMessage + * @instance + */ + ButtonsMessage.prototype.locationMessage = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * ButtonsMessage header. + * @member {"text"|"documentMessage"|"imageMessage"|"videoMessage"|"locationMessage"|undefined} header + * @memberof proto.Message.ButtonsMessage + * @instance + */ + Object.defineProperty(ButtonsMessage.prototype, "header", { + get: $util.oneOfGetter($oneOfFields = ["text", "documentMessage", "imageMessage", "videoMessage", "locationMessage"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new ButtonsMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ButtonsMessage + * @static + * @param {proto.Message.IButtonsMessage=} [properties] Properties to set + * @returns {proto.Message.ButtonsMessage} ButtonsMessage instance + */ + ButtonsMessage.create = function create(properties) { + return new ButtonsMessage(properties); + }; + + /** + * Encodes the specified ButtonsMessage message. Does not implicitly {@link proto.Message.ButtonsMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ButtonsMessage + * @static + * @param {proto.Message.IButtonsMessage} message ButtonsMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ButtonsMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.text); + if (message.documentMessage != null && Object.hasOwnProperty.call(message, "documentMessage")) + $root.proto.Message.DocumentMessage.encode(message.documentMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.imageMessage != null && Object.hasOwnProperty.call(message, "imageMessage")) + $root.proto.Message.ImageMessage.encode(message.imageMessage, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.videoMessage != null && Object.hasOwnProperty.call(message, "videoMessage")) + $root.proto.Message.VideoMessage.encode(message.videoMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.locationMessage != null && Object.hasOwnProperty.call(message, "locationMessage")) + $root.proto.Message.LocationMessage.encode(message.locationMessage, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.contentText != null && Object.hasOwnProperty.call(message, "contentText")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.contentText); + if (message.footerText != null && Object.hasOwnProperty.call(message, "footerText")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.footerText); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.buttons != null && message.buttons.length) + for (var i = 0; i < message.buttons.length; ++i) + $root.proto.Message.ButtonsMessage.Button.encode(message.buttons[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); + if (message.headerType != null && Object.hasOwnProperty.call(message, "headerType")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.headerType); + return writer; + }; + + /** + * Encodes the specified ButtonsMessage message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ButtonsMessage + * @static + * @param {proto.Message.IButtonsMessage} message ButtonsMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ButtonsMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ButtonsMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ButtonsMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ButtonsMessage} ButtonsMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ButtonsMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ButtonsMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 6: + message.contentText = reader.string(); + break; + case 7: + message.footerText = reader.string(); + break; + case 8: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 9: + if (!(message.buttons && message.buttons.length)) + message.buttons = []; + message.buttons.push($root.proto.Message.ButtonsMessage.Button.decode(reader, reader.uint32())); + break; + case 10: + message.headerType = reader.int32(); + break; + case 1: + message.text = reader.string(); + break; + case 2: + message.documentMessage = $root.proto.Message.DocumentMessage.decode(reader, reader.uint32()); + break; + case 3: + message.imageMessage = $root.proto.Message.ImageMessage.decode(reader, reader.uint32()); + break; + case 4: + message.videoMessage = $root.proto.Message.VideoMessage.decode(reader, reader.uint32()); + break; + case 5: + message.locationMessage = $root.proto.Message.LocationMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ButtonsMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ButtonsMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ButtonsMessage} ButtonsMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ButtonsMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ButtonsMessage message. + * @function verify + * @memberof proto.Message.ButtonsMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ButtonsMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.contentText != null && message.hasOwnProperty("contentText")) + if (!$util.isString(message.contentText)) + return "contentText: string expected"; + if (message.footerText != null && message.hasOwnProperty("footerText")) + if (!$util.isString(message.footerText)) + return "footerText: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.buttons != null && message.hasOwnProperty("buttons")) { + if (!Array.isArray(message.buttons)) + return "buttons: array expected"; + for (var i = 0; i < message.buttons.length; ++i) { + var error = $root.proto.Message.ButtonsMessage.Button.verify(message.buttons[i]); + if (error) + return "buttons." + error; + } + } + if (message.headerType != null && message.hasOwnProperty("headerType")) + switch (message.headerType) { + default: + return "headerType: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + break; + } + if (message.text != null && message.hasOwnProperty("text")) { + properties.header = 1; + if (!$util.isString(message.text)) + return "text: string expected"; + } + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + if (properties.header === 1) + return "header: multiple values"; + properties.header = 1; + { + var error = $root.proto.Message.DocumentMessage.verify(message.documentMessage); + if (error) + return "documentMessage." + error; + } + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + if (properties.header === 1) + return "header: multiple values"; + properties.header = 1; + { + var error = $root.proto.Message.ImageMessage.verify(message.imageMessage); + if (error) + return "imageMessage." + error; + } + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + if (properties.header === 1) + return "header: multiple values"; + properties.header = 1; + { + var error = $root.proto.Message.VideoMessage.verify(message.videoMessage); + if (error) + return "videoMessage." + error; + } + } + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) { + if (properties.header === 1) + return "header: multiple values"; + properties.header = 1; + { + var error = $root.proto.Message.LocationMessage.verify(message.locationMessage); + if (error) + return "locationMessage." + error; + } + } + return null; + }; + + /** + * Creates a ButtonsMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ButtonsMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ButtonsMessage} ButtonsMessage + */ + ButtonsMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ButtonsMessage) + return object; + var message = new $root.proto.Message.ButtonsMessage(); + if (object.contentText != null) + message.contentText = String(object.contentText); + if (object.footerText != null) + message.footerText = String(object.footerText); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ButtonsMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.buttons) { + if (!Array.isArray(object.buttons)) + throw TypeError(".proto.Message.ButtonsMessage.buttons: array expected"); + message.buttons = []; + for (var i = 0; i < object.buttons.length; ++i) { + if (typeof object.buttons[i] !== "object") + throw TypeError(".proto.Message.ButtonsMessage.buttons: object expected"); + message.buttons[i] = $root.proto.Message.ButtonsMessage.Button.fromObject(object.buttons[i]); + } + } + switch (object.headerType) { + case "UNKNOWN": + case 0: + message.headerType = 0; + break; + case "EMPTY": + case 1: + message.headerType = 1; + break; + case "TEXT": + case 2: + message.headerType = 2; + break; + case "DOCUMENT": + case 3: + message.headerType = 3; + break; + case "IMAGE": + case 4: + message.headerType = 4; + break; + case "VIDEO": + case 5: + message.headerType = 5; + break; + case "LOCATION": + case 6: + message.headerType = 6; + break; + } + if (object.text != null) + message.text = String(object.text); + if (object.documentMessage != null) { + if (typeof object.documentMessage !== "object") + throw TypeError(".proto.Message.ButtonsMessage.documentMessage: object expected"); + message.documentMessage = $root.proto.Message.DocumentMessage.fromObject(object.documentMessage); + } + if (object.imageMessage != null) { + if (typeof object.imageMessage !== "object") + throw TypeError(".proto.Message.ButtonsMessage.imageMessage: object expected"); + message.imageMessage = $root.proto.Message.ImageMessage.fromObject(object.imageMessage); + } + if (object.videoMessage != null) { + if (typeof object.videoMessage !== "object") + throw TypeError(".proto.Message.ButtonsMessage.videoMessage: object expected"); + message.videoMessage = $root.proto.Message.VideoMessage.fromObject(object.videoMessage); + } + if (object.locationMessage != null) { + if (typeof object.locationMessage !== "object") + throw TypeError(".proto.Message.ButtonsMessage.locationMessage: object expected"); + message.locationMessage = $root.proto.Message.LocationMessage.fromObject(object.locationMessage); + } + return message; + }; + + /** + * Creates a plain object from a ButtonsMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ButtonsMessage + * @static + * @param {proto.Message.ButtonsMessage} message ButtonsMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ButtonsMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.buttons = []; + if (options.defaults) { + object.contentText = ""; + object.footerText = ""; + object.contextInfo = null; + object.headerType = options.enums === String ? "UNKNOWN" : 0; + } + if (message.text != null && message.hasOwnProperty("text")) { + object.text = message.text; + if (options.oneofs) + object.header = "text"; + } + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + object.documentMessage = $root.proto.Message.DocumentMessage.toObject(message.documentMessage, options); + if (options.oneofs) + object.header = "documentMessage"; + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + object.imageMessage = $root.proto.Message.ImageMessage.toObject(message.imageMessage, options); + if (options.oneofs) + object.header = "imageMessage"; + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + object.videoMessage = $root.proto.Message.VideoMessage.toObject(message.videoMessage, options); + if (options.oneofs) + object.header = "videoMessage"; + } + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) { + object.locationMessage = $root.proto.Message.LocationMessage.toObject(message.locationMessage, options); + if (options.oneofs) + object.header = "locationMessage"; + } + if (message.contentText != null && message.hasOwnProperty("contentText")) + object.contentText = message.contentText; + if (message.footerText != null && message.hasOwnProperty("footerText")) + object.footerText = message.footerText; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.buttons && message.buttons.length) { + object.buttons = []; + for (var j = 0; j < message.buttons.length; ++j) + object.buttons[j] = $root.proto.Message.ButtonsMessage.Button.toObject(message.buttons[j], options); + } + if (message.headerType != null && message.hasOwnProperty("headerType")) + object.headerType = options.enums === String ? $root.proto.Message.ButtonsMessage.HeaderType[message.headerType] : message.headerType; + return object; + }; + + /** + * Converts this ButtonsMessage to JSON. + * @function toJSON + * @memberof proto.Message.ButtonsMessage + * @instance + * @returns {Object.} JSON object + */ + ButtonsMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + ButtonsMessage.Button = (function() { + + /** + * Properties of a Button. + * @memberof proto.Message.ButtonsMessage + * @interface IButton + * @property {string|null} [buttonId] Button buttonId + * @property {proto.Message.ButtonsMessage.Button.IButtonText|null} [buttonText] Button buttonText + * @property {proto.Message.ButtonsMessage.Button.Type|null} [type] Button type + * @property {proto.Message.ButtonsMessage.Button.INativeFlowInfo|null} [nativeFlowInfo] Button nativeFlowInfo + */ + + /** + * Constructs a new Button. + * @memberof proto.Message.ButtonsMessage + * @classdesc Represents a Button. + * @implements IButton + * @constructor + * @param {proto.Message.ButtonsMessage.IButton=} [properties] Properties to set + */ + function Button(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Button buttonId. + * @member {string} buttonId + * @memberof proto.Message.ButtonsMessage.Button + * @instance + */ + Button.prototype.buttonId = ""; + + /** + * Button buttonText. + * @member {proto.Message.ButtonsMessage.Button.IButtonText|null|undefined} buttonText + * @memberof proto.Message.ButtonsMessage.Button + * @instance + */ + Button.prototype.buttonText = null; + + /** + * Button type. + * @member {proto.Message.ButtonsMessage.Button.Type} type + * @memberof proto.Message.ButtonsMessage.Button + * @instance + */ + Button.prototype.type = 0; + + /** + * Button nativeFlowInfo. + * @member {proto.Message.ButtonsMessage.Button.INativeFlowInfo|null|undefined} nativeFlowInfo + * @memberof proto.Message.ButtonsMessage.Button + * @instance + */ + Button.prototype.nativeFlowInfo = null; + + /** + * Creates a new Button instance using the specified properties. + * @function create + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {proto.Message.ButtonsMessage.IButton=} [properties] Properties to set + * @returns {proto.Message.ButtonsMessage.Button} Button instance + */ + Button.create = function create(properties) { + return new Button(properties); + }; + + /** + * Encodes the specified Button message. Does not implicitly {@link proto.Message.ButtonsMessage.Button.verify|verify} messages. + * @function encode + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {proto.Message.ButtonsMessage.IButton} message Button message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Button.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.buttonId != null && Object.hasOwnProperty.call(message, "buttonId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.buttonId); + if (message.buttonText != null && Object.hasOwnProperty.call(message, "buttonText")) + $root.proto.Message.ButtonsMessage.Button.ButtonText.encode(message.buttonText, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.type != null && Object.hasOwnProperty.call(message, "type")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.type); + if (message.nativeFlowInfo != null && Object.hasOwnProperty.call(message, "nativeFlowInfo")) + $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo.encode(message.nativeFlowInfo, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Button message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.Button.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {proto.Message.ButtonsMessage.IButton} message Button message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Button.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Button message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ButtonsMessage.Button} Button + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Button.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ButtonsMessage.Button(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.buttonId = reader.string(); + break; + case 2: + message.buttonText = $root.proto.Message.ButtonsMessage.Button.ButtonText.decode(reader, reader.uint32()); + break; + case 3: + message.type = reader.int32(); + break; + case 4: + message.nativeFlowInfo = $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Button message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ButtonsMessage.Button} Button + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Button.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Button message. + * @function verify + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Button.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.buttonId != null && message.hasOwnProperty("buttonId")) + if (!$util.isString(message.buttonId)) + return "buttonId: string expected"; + if (message.buttonText != null && message.hasOwnProperty("buttonText")) { + var error = $root.proto.Message.ButtonsMessage.Button.ButtonText.verify(message.buttonText); + if (error) + return "buttonText." + error; + } + if (message.type != null && message.hasOwnProperty("type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.nativeFlowInfo != null && message.hasOwnProperty("nativeFlowInfo")) { + var error = $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo.verify(message.nativeFlowInfo); + if (error) + return "nativeFlowInfo." + error; + } + return null; + }; + + /** + * Creates a Button message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ButtonsMessage.Button} Button + */ + Button.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ButtonsMessage.Button) + return object; + var message = new $root.proto.Message.ButtonsMessage.Button(); + if (object.buttonId != null) + message.buttonId = String(object.buttonId); + if (object.buttonText != null) { + if (typeof object.buttonText !== "object") + throw TypeError(".proto.Message.ButtonsMessage.Button.buttonText: object expected"); + message.buttonText = $root.proto.Message.ButtonsMessage.Button.ButtonText.fromObject(object.buttonText); + } + switch (object.type) { + case "UNKNOWN": + case 0: + message.type = 0; + break; + case "RESPONSE": + case 1: + message.type = 1; + break; + case "NATIVE_FLOW": + case 2: + message.type = 2; + break; + } + if (object.nativeFlowInfo != null) { + if (typeof object.nativeFlowInfo !== "object") + throw TypeError(".proto.Message.ButtonsMessage.Button.nativeFlowInfo: object expected"); + message.nativeFlowInfo = $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo.fromObject(object.nativeFlowInfo); + } + return message; + }; + + /** + * Creates a plain object from a Button message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ButtonsMessage.Button + * @static + * @param {proto.Message.ButtonsMessage.Button} message Button + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Button.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.buttonId = ""; + object.buttonText = null; + object.type = options.enums === String ? "UNKNOWN" : 0; + object.nativeFlowInfo = null; + } + if (message.buttonId != null && message.hasOwnProperty("buttonId")) + object.buttonId = message.buttonId; + if (message.buttonText != null && message.hasOwnProperty("buttonText")) + object.buttonText = $root.proto.Message.ButtonsMessage.Button.ButtonText.toObject(message.buttonText, options); + if (message.type != null && message.hasOwnProperty("type")) + object.type = options.enums === String ? $root.proto.Message.ButtonsMessage.Button.Type[message.type] : message.type; + if (message.nativeFlowInfo != null && message.hasOwnProperty("nativeFlowInfo")) + object.nativeFlowInfo = $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo.toObject(message.nativeFlowInfo, options); + return object; + }; + + /** + * Converts this Button to JSON. + * @function toJSON + * @memberof proto.Message.ButtonsMessage.Button + * @instance + * @returns {Object.} JSON object + */ + Button.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + Button.ButtonText = (function() { + + /** + * Properties of a ButtonText. + * @memberof proto.Message.ButtonsMessage.Button + * @interface IButtonText + * @property {string|null} [displayText] ButtonText displayText + */ + + /** + * Constructs a new ButtonText. + * @memberof proto.Message.ButtonsMessage.Button + * @classdesc Represents a ButtonText. + * @implements IButtonText + * @constructor + * @param {proto.Message.ButtonsMessage.Button.IButtonText=} [properties] Properties to set + */ + function ButtonText(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ButtonText displayText. + * @member {string} displayText + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @instance + */ + ButtonText.prototype.displayText = ""; + + /** + * Creates a new ButtonText instance using the specified properties. + * @function create + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {proto.Message.ButtonsMessage.Button.IButtonText=} [properties] Properties to set + * @returns {proto.Message.ButtonsMessage.Button.ButtonText} ButtonText instance + */ + ButtonText.create = function create(properties) { + return new ButtonText(properties); + }; + + /** + * Encodes the specified ButtonText message. Does not implicitly {@link proto.Message.ButtonsMessage.Button.ButtonText.verify|verify} messages. + * @function encode + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {proto.Message.ButtonsMessage.Button.IButtonText} message ButtonText message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ButtonText.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayText != null && Object.hasOwnProperty.call(message, "displayText")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.displayText); + return writer; + }; + + /** + * Encodes the specified ButtonText message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.Button.ButtonText.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {proto.Message.ButtonsMessage.Button.IButtonText} message ButtonText message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ButtonText.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ButtonText message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ButtonsMessage.Button.ButtonText} ButtonText + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ButtonText.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ButtonsMessage.Button.ButtonText(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayText = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ButtonText message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ButtonsMessage.Button.ButtonText} ButtonText + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ButtonText.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ButtonText message. + * @function verify + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ButtonText.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayText != null && message.hasOwnProperty("displayText")) + if (!$util.isString(message.displayText)) + return "displayText: string expected"; + return null; + }; + + /** + * Creates a ButtonText message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ButtonsMessage.Button.ButtonText} ButtonText + */ + ButtonText.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ButtonsMessage.Button.ButtonText) + return object; + var message = new $root.proto.Message.ButtonsMessage.Button.ButtonText(); + if (object.displayText != null) + message.displayText = String(object.displayText); + return message; + }; + + /** + * Creates a plain object from a ButtonText message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @static + * @param {proto.Message.ButtonsMessage.Button.ButtonText} message ButtonText + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ButtonText.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.displayText = ""; + if (message.displayText != null && message.hasOwnProperty("displayText")) + object.displayText = message.displayText; + return object; + }; + + /** + * Converts this ButtonText to JSON. + * @function toJSON + * @memberof proto.Message.ButtonsMessage.Button.ButtonText + * @instance + * @returns {Object.} JSON object + */ + ButtonText.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ButtonText; + })(); + + Button.NativeFlowInfo = (function() { + + /** + * Properties of a NativeFlowInfo. + * @memberof proto.Message.ButtonsMessage.Button + * @interface INativeFlowInfo + * @property {string|null} [name] NativeFlowInfo name + * @property {string|null} [paramsJson] NativeFlowInfo paramsJson + */ + + /** + * Constructs a new NativeFlowInfo. + * @memberof proto.Message.ButtonsMessage.Button + * @classdesc Represents a NativeFlowInfo. + * @implements INativeFlowInfo + * @constructor + * @param {proto.Message.ButtonsMessage.Button.INativeFlowInfo=} [properties] Properties to set + */ + function NativeFlowInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NativeFlowInfo name. + * @member {string} name + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @instance + */ + NativeFlowInfo.prototype.name = ""; + + /** + * NativeFlowInfo paramsJson. + * @member {string} paramsJson + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @instance + */ + NativeFlowInfo.prototype.paramsJson = ""; + + /** + * Creates a new NativeFlowInfo instance using the specified properties. + * @function create + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {proto.Message.ButtonsMessage.Button.INativeFlowInfo=} [properties] Properties to set + * @returns {proto.Message.ButtonsMessage.Button.NativeFlowInfo} NativeFlowInfo instance + */ + NativeFlowInfo.create = function create(properties) { + return new NativeFlowInfo(properties); + }; + + /** + * Encodes the specified NativeFlowInfo message. Does not implicitly {@link proto.Message.ButtonsMessage.Button.NativeFlowInfo.verify|verify} messages. + * @function encode + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {proto.Message.ButtonsMessage.Button.INativeFlowInfo} message NativeFlowInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.paramsJson != null && Object.hasOwnProperty.call(message, "paramsJson")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.paramsJson); + return writer; + }; + + /** + * Encodes the specified NativeFlowInfo message, length delimited. Does not implicitly {@link proto.Message.ButtonsMessage.Button.NativeFlowInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {proto.Message.ButtonsMessage.Button.INativeFlowInfo} message NativeFlowInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NativeFlowInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ButtonsMessage.Button.NativeFlowInfo} NativeFlowInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.paramsJson = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NativeFlowInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ButtonsMessage.Button.NativeFlowInfo} NativeFlowInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NativeFlowInfo message. + * @function verify + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NativeFlowInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.paramsJson != null && message.hasOwnProperty("paramsJson")) + if (!$util.isString(message.paramsJson)) + return "paramsJson: string expected"; + return null; + }; + + /** + * Creates a NativeFlowInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ButtonsMessage.Button.NativeFlowInfo} NativeFlowInfo + */ + NativeFlowInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo) + return object; + var message = new $root.proto.Message.ButtonsMessage.Button.NativeFlowInfo(); + if (object.name != null) + message.name = String(object.name); + if (object.paramsJson != null) + message.paramsJson = String(object.paramsJson); + return message; + }; + + /** + * Creates a plain object from a NativeFlowInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @static + * @param {proto.Message.ButtonsMessage.Button.NativeFlowInfo} message NativeFlowInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NativeFlowInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.name = ""; + object.paramsJson = ""; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.paramsJson != null && message.hasOwnProperty("paramsJson")) + object.paramsJson = message.paramsJson; + return object; + }; + + /** + * Converts this NativeFlowInfo to JSON. + * @function toJSON + * @memberof proto.Message.ButtonsMessage.Button.NativeFlowInfo + * @instance + * @returns {Object.} JSON object + */ + NativeFlowInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return NativeFlowInfo; + })(); + + /** + * Type enum. + * @name proto.Message.ButtonsMessage.Button.Type + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} RESPONSE=1 RESPONSE value + * @property {number} NATIVE_FLOW=2 NATIVE_FLOW value + */ + Button.Type = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "RESPONSE"] = 1; + values[valuesById[2] = "NATIVE_FLOW"] = 2; + return values; + })(); + + return Button; + })(); + + /** + * HeaderType enum. + * @name proto.Message.ButtonsMessage.HeaderType + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} EMPTY=1 EMPTY value + * @property {number} TEXT=2 TEXT value + * @property {number} DOCUMENT=3 DOCUMENT value + * @property {number} IMAGE=4 IMAGE value + * @property {number} VIDEO=5 VIDEO value + * @property {number} LOCATION=6 LOCATION value + */ + ButtonsMessage.HeaderType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "EMPTY"] = 1; + values[valuesById[2] = "TEXT"] = 2; + values[valuesById[3] = "DOCUMENT"] = 3; + values[valuesById[4] = "IMAGE"] = 4; + values[valuesById[5] = "VIDEO"] = 5; + values[valuesById[6] = "LOCATION"] = 6; + return values; + })(); + + return ButtonsMessage; + })(); + + Message.ButtonsResponseMessage = (function() { + + /** + * Properties of a ButtonsResponseMessage. + * @memberof proto.Message + * @interface IButtonsResponseMessage + * @property {string|null} [selectedButtonId] ButtonsResponseMessage selectedButtonId + * @property {proto.IContextInfo|null} [contextInfo] ButtonsResponseMessage contextInfo + * @property {proto.Message.ButtonsResponseMessage.Type|null} [type] ButtonsResponseMessage type + * @property {string|null} [selectedDisplayText] ButtonsResponseMessage selectedDisplayText + */ + + /** + * Constructs a new ButtonsResponseMessage. + * @memberof proto.Message + * @classdesc Represents a ButtonsResponseMessage. + * @implements IButtonsResponseMessage + * @constructor + * @param {proto.Message.IButtonsResponseMessage=} [properties] Properties to set + */ + function ButtonsResponseMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ButtonsResponseMessage selectedButtonId. + * @member {string} selectedButtonId + * @memberof proto.Message.ButtonsResponseMessage + * @instance + */ + ButtonsResponseMessage.prototype.selectedButtonId = ""; + + /** + * ButtonsResponseMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ButtonsResponseMessage + * @instance + */ + ButtonsResponseMessage.prototype.contextInfo = null; + + /** + * ButtonsResponseMessage type. + * @member {proto.Message.ButtonsResponseMessage.Type} type + * @memberof proto.Message.ButtonsResponseMessage + * @instance + */ + ButtonsResponseMessage.prototype.type = 0; + + /** + * ButtonsResponseMessage selectedDisplayText. + * @member {string|null|undefined} selectedDisplayText + * @memberof proto.Message.ButtonsResponseMessage + * @instance + */ + ButtonsResponseMessage.prototype.selectedDisplayText = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * ButtonsResponseMessage response. + * @member {"selectedDisplayText"|undefined} response + * @memberof proto.Message.ButtonsResponseMessage + * @instance + */ + Object.defineProperty(ButtonsResponseMessage.prototype, "response", { + get: $util.oneOfGetter($oneOfFields = ["selectedDisplayText"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new ButtonsResponseMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {proto.Message.IButtonsResponseMessage=} [properties] Properties to set + * @returns {proto.Message.ButtonsResponseMessage} ButtonsResponseMessage instance + */ + ButtonsResponseMessage.create = function create(properties) { + return new ButtonsResponseMessage(properties); + }; + + /** + * Encodes the specified ButtonsResponseMessage message. Does not implicitly {@link proto.Message.ButtonsResponseMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {proto.Message.IButtonsResponseMessage} message ButtonsResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ButtonsResponseMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.selectedButtonId != null && Object.hasOwnProperty.call(message, "selectedButtonId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.selectedButtonId); + if (message.selectedDisplayText != null && Object.hasOwnProperty.call(message, "selectedDisplayText")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.selectedDisplayText); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.type != null && Object.hasOwnProperty.call(message, "type")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.type); + return writer; + }; + + /** + * Encodes the specified ButtonsResponseMessage message, length delimited. Does not implicitly {@link proto.Message.ButtonsResponseMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {proto.Message.IButtonsResponseMessage} message ButtonsResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ButtonsResponseMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ButtonsResponseMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ButtonsResponseMessage} ButtonsResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ButtonsResponseMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ButtonsResponseMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.selectedButtonId = reader.string(); + break; + case 3: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 4: + message.type = reader.int32(); + break; + case 2: + message.selectedDisplayText = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ButtonsResponseMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ButtonsResponseMessage} ButtonsResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ButtonsResponseMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ButtonsResponseMessage message. + * @function verify + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ButtonsResponseMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.selectedButtonId != null && message.hasOwnProperty("selectedButtonId")) + if (!$util.isString(message.selectedButtonId)) + return "selectedButtonId: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.type != null && message.hasOwnProperty("type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 1: + break; + } + if (message.selectedDisplayText != null && message.hasOwnProperty("selectedDisplayText")) { + properties.response = 1; + if (!$util.isString(message.selectedDisplayText)) + return "selectedDisplayText: string expected"; + } + return null; + }; + + /** + * Creates a ButtonsResponseMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ButtonsResponseMessage} ButtonsResponseMessage + */ + ButtonsResponseMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ButtonsResponseMessage) + return object; + var message = new $root.proto.Message.ButtonsResponseMessage(); + if (object.selectedButtonId != null) + message.selectedButtonId = String(object.selectedButtonId); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ButtonsResponseMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + switch (object.type) { + case "UNKNOWN": + case 0: + message.type = 0; + break; + case "DISPLAY_TEXT": + case 1: + message.type = 1; + break; + } + if (object.selectedDisplayText != null) + message.selectedDisplayText = String(object.selectedDisplayText); + return message; + }; + + /** + * Creates a plain object from a ButtonsResponseMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ButtonsResponseMessage + * @static + * @param {proto.Message.ButtonsResponseMessage} message ButtonsResponseMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ButtonsResponseMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.selectedButtonId = ""; + object.contextInfo = null; + object.type = options.enums === String ? "UNKNOWN" : 0; + } + if (message.selectedButtonId != null && message.hasOwnProperty("selectedButtonId")) + object.selectedButtonId = message.selectedButtonId; + if (message.selectedDisplayText != null && message.hasOwnProperty("selectedDisplayText")) { + object.selectedDisplayText = message.selectedDisplayText; + if (options.oneofs) + object.response = "selectedDisplayText"; + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.type != null && message.hasOwnProperty("type")) + object.type = options.enums === String ? $root.proto.Message.ButtonsResponseMessage.Type[message.type] : message.type; + return object; + }; + + /** + * Converts this ButtonsResponseMessage to JSON. + * @function toJSON + * @memberof proto.Message.ButtonsResponseMessage + * @instance + * @returns {Object.} JSON object + */ + ButtonsResponseMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Type enum. + * @name proto.Message.ButtonsResponseMessage.Type + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} DISPLAY_TEXT=1 DISPLAY_TEXT value + */ + ButtonsResponseMessage.Type = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "DISPLAY_TEXT"] = 1; + return values; + })(); + + return ButtonsResponseMessage; + })(); + + Message.Call = (function() { + + /** + * Properties of a Call. + * @memberof proto.Message + * @interface ICall + * @property {Uint8Array|null} [callKey] Call callKey + * @property {string|null} [conversionSource] Call conversionSource + * @property {Uint8Array|null} [conversionData] Call conversionData + * @property {number|null} [conversionDelaySeconds] Call conversionDelaySeconds + */ + + /** + * Constructs a new Call. + * @memberof proto.Message + * @classdesc Represents a Call. + * @implements ICall + * @constructor + * @param {proto.Message.ICall=} [properties] Properties to set + */ + function Call(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Call callKey. + * @member {Uint8Array} callKey + * @memberof proto.Message.Call + * @instance + */ + Call.prototype.callKey = $util.newBuffer([]); + + /** + * Call conversionSource. + * @member {string} conversionSource + * @memberof proto.Message.Call + * @instance + */ + Call.prototype.conversionSource = ""; + + /** + * Call conversionData. + * @member {Uint8Array} conversionData + * @memberof proto.Message.Call + * @instance + */ + Call.prototype.conversionData = $util.newBuffer([]); + + /** + * Call conversionDelaySeconds. + * @member {number} conversionDelaySeconds + * @memberof proto.Message.Call + * @instance + */ + Call.prototype.conversionDelaySeconds = 0; + + /** + * Creates a new Call instance using the specified properties. + * @function create + * @memberof proto.Message.Call + * @static + * @param {proto.Message.ICall=} [properties] Properties to set + * @returns {proto.Message.Call} Call instance + */ + Call.create = function create(properties) { + return new Call(properties); + }; + + /** + * Encodes the specified Call message. Does not implicitly {@link proto.Message.Call.verify|verify} messages. + * @function encode + * @memberof proto.Message.Call + * @static + * @param {proto.Message.ICall} message Call message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Call.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.callKey != null && Object.hasOwnProperty.call(message, "callKey")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.callKey); + if (message.conversionSource != null && Object.hasOwnProperty.call(message, "conversionSource")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.conversionSource); + if (message.conversionData != null && Object.hasOwnProperty.call(message, "conversionData")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.conversionData); + if (message.conversionDelaySeconds != null && Object.hasOwnProperty.call(message, "conversionDelaySeconds")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.conversionDelaySeconds); + return writer; + }; + + /** + * Encodes the specified Call message, length delimited. Does not implicitly {@link proto.Message.Call.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.Call + * @static + * @param {proto.Message.ICall} message Call message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Call.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Call message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.Call + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.Call} Call + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Call.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.Call(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.callKey = reader.bytes(); + break; + case 2: + message.conversionSource = reader.string(); + break; + case 3: + message.conversionData = reader.bytes(); + break; + case 4: + message.conversionDelaySeconds = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Call message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.Call + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.Call} Call + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Call.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Call message. + * @function verify + * @memberof proto.Message.Call + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Call.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.callKey != null && message.hasOwnProperty("callKey")) + if (!(message.callKey && typeof message.callKey.length === "number" || $util.isString(message.callKey))) + return "callKey: buffer expected"; + if (message.conversionSource != null && message.hasOwnProperty("conversionSource")) + if (!$util.isString(message.conversionSource)) + return "conversionSource: string expected"; + if (message.conversionData != null && message.hasOwnProperty("conversionData")) + if (!(message.conversionData && typeof message.conversionData.length === "number" || $util.isString(message.conversionData))) + return "conversionData: buffer expected"; + if (message.conversionDelaySeconds != null && message.hasOwnProperty("conversionDelaySeconds")) + if (!$util.isInteger(message.conversionDelaySeconds)) + return "conversionDelaySeconds: integer expected"; + return null; + }; + + /** + * Creates a Call message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.Call + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.Call} Call + */ + Call.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.Call) + return object; + var message = new $root.proto.Message.Call(); + if (object.callKey != null) + if (typeof object.callKey === "string") + $util.base64.decode(object.callKey, message.callKey = $util.newBuffer($util.base64.length(object.callKey)), 0); + else if (object.callKey.length) + message.callKey = object.callKey; + if (object.conversionSource != null) + message.conversionSource = String(object.conversionSource); + if (object.conversionData != null) + if (typeof object.conversionData === "string") + $util.base64.decode(object.conversionData, message.conversionData = $util.newBuffer($util.base64.length(object.conversionData)), 0); + else if (object.conversionData.length) + message.conversionData = object.conversionData; + if (object.conversionDelaySeconds != null) + message.conversionDelaySeconds = object.conversionDelaySeconds >>> 0; + return message; + }; + + /** + * Creates a plain object from a Call message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.Call + * @static + * @param {proto.Message.Call} message Call + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Call.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.callKey = ""; + else { + object.callKey = []; + if (options.bytes !== Array) + object.callKey = $util.newBuffer(object.callKey); + } + object.conversionSource = ""; + if (options.bytes === String) + object.conversionData = ""; + else { + object.conversionData = []; + if (options.bytes !== Array) + object.conversionData = $util.newBuffer(object.conversionData); + } + object.conversionDelaySeconds = 0; + } + if (message.callKey != null && message.hasOwnProperty("callKey")) + object.callKey = options.bytes === String ? $util.base64.encode(message.callKey, 0, message.callKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.callKey) : message.callKey; + if (message.conversionSource != null && message.hasOwnProperty("conversionSource")) + object.conversionSource = message.conversionSource; + if (message.conversionData != null && message.hasOwnProperty("conversionData")) + object.conversionData = options.bytes === String ? $util.base64.encode(message.conversionData, 0, message.conversionData.length) : options.bytes === Array ? Array.prototype.slice.call(message.conversionData) : message.conversionData; + if (message.conversionDelaySeconds != null && message.hasOwnProperty("conversionDelaySeconds")) + object.conversionDelaySeconds = message.conversionDelaySeconds; + return object; + }; + + /** + * Converts this Call to JSON. + * @function toJSON + * @memberof proto.Message.Call + * @instance + * @returns {Object.} JSON object + */ + Call.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Call; + })(); + + Message.CancelPaymentRequestMessage = (function() { + + /** + * Properties of a CancelPaymentRequestMessage. + * @memberof proto.Message + * @interface ICancelPaymentRequestMessage + * @property {proto.IMessageKey|null} [key] CancelPaymentRequestMessage key + */ + + /** + * Constructs a new CancelPaymentRequestMessage. + * @memberof proto.Message + * @classdesc Represents a CancelPaymentRequestMessage. + * @implements ICancelPaymentRequestMessage + * @constructor + * @param {proto.Message.ICancelPaymentRequestMessage=} [properties] Properties to set + */ + function CancelPaymentRequestMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CancelPaymentRequestMessage key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.Message.CancelPaymentRequestMessage + * @instance + */ + CancelPaymentRequestMessage.prototype.key = null; + + /** + * Creates a new CancelPaymentRequestMessage instance using the specified properties. + * @function create + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {proto.Message.ICancelPaymentRequestMessage=} [properties] Properties to set + * @returns {proto.Message.CancelPaymentRequestMessage} CancelPaymentRequestMessage instance + */ + CancelPaymentRequestMessage.create = function create(properties) { + return new CancelPaymentRequestMessage(properties); + }; + + /** + * Encodes the specified CancelPaymentRequestMessage message. Does not implicitly {@link proto.Message.CancelPaymentRequestMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {proto.Message.ICancelPaymentRequestMessage} message CancelPaymentRequestMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CancelPaymentRequestMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified CancelPaymentRequestMessage message, length delimited. Does not implicitly {@link proto.Message.CancelPaymentRequestMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {proto.Message.ICancelPaymentRequestMessage} message CancelPaymentRequestMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CancelPaymentRequestMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CancelPaymentRequestMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.CancelPaymentRequestMessage} CancelPaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CancelPaymentRequestMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.CancelPaymentRequestMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CancelPaymentRequestMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.CancelPaymentRequestMessage} CancelPaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CancelPaymentRequestMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CancelPaymentRequestMessage message. + * @function verify + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CancelPaymentRequestMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + return null; + }; + + /** + * Creates a CancelPaymentRequestMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.CancelPaymentRequestMessage} CancelPaymentRequestMessage + */ + CancelPaymentRequestMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.CancelPaymentRequestMessage) + return object; + var message = new $root.proto.Message.CancelPaymentRequestMessage(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.Message.CancelPaymentRequestMessage.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + return message; + }; + + /** + * Creates a plain object from a CancelPaymentRequestMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.CancelPaymentRequestMessage + * @static + * @param {proto.Message.CancelPaymentRequestMessage} message CancelPaymentRequestMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CancelPaymentRequestMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.key = null; + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + return object; + }; + + /** + * Converts this CancelPaymentRequestMessage to JSON. + * @function toJSON + * @memberof proto.Message.CancelPaymentRequestMessage + * @instance + * @returns {Object.} JSON object + */ + CancelPaymentRequestMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return CancelPaymentRequestMessage; + })(); + + Message.Chat = (function() { + + /** + * Properties of a Chat. + * @memberof proto.Message + * @interface IChat + * @property {string|null} [displayName] Chat displayName + * @property {string|null} [id] Chat id + */ + + /** + * Constructs a new Chat. + * @memberof proto.Message + * @classdesc Represents a Chat. + * @implements IChat + * @constructor + * @param {proto.Message.IChat=} [properties] Properties to set + */ + function Chat(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Chat displayName. + * @member {string} displayName + * @memberof proto.Message.Chat + * @instance + */ + Chat.prototype.displayName = ""; + + /** + * Chat id. + * @member {string} id + * @memberof proto.Message.Chat + * @instance + */ + Chat.prototype.id = ""; + + /** + * Creates a new Chat instance using the specified properties. + * @function create + * @memberof proto.Message.Chat + * @static + * @param {proto.Message.IChat=} [properties] Properties to set + * @returns {proto.Message.Chat} Chat instance + */ + Chat.create = function create(properties) { + return new Chat(properties); + }; + + /** + * Encodes the specified Chat message. Does not implicitly {@link proto.Message.Chat.verify|verify} messages. + * @function encode + * @memberof proto.Message.Chat + * @static + * @param {proto.Message.IChat} message Chat message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Chat.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.displayName); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.id); + return writer; + }; + + /** + * Encodes the specified Chat message, length delimited. Does not implicitly {@link proto.Message.Chat.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.Chat + * @static + * @param {proto.Message.IChat} message Chat message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Chat.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Chat message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.Chat + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.Chat} Chat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Chat.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.Chat(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayName = reader.string(); + break; + case 2: + message.id = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Chat message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.Chat + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.Chat} Chat + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Chat.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Chat message. + * @function verify + * @memberof proto.Message.Chat + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Chat.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayName != null && message.hasOwnProperty("displayName")) + if (!$util.isString(message.displayName)) + return "displayName: string expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + return null; + }; + + /** + * Creates a Chat message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.Chat + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.Chat} Chat + */ + Chat.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.Chat) + return object; + var message = new $root.proto.Message.Chat(); + if (object.displayName != null) + message.displayName = String(object.displayName); + if (object.id != null) + message.id = String(object.id); + return message; + }; + + /** + * Creates a plain object from a Chat message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.Chat + * @static + * @param {proto.Message.Chat} message Chat + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Chat.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayName = ""; + object.id = ""; + } + if (message.displayName != null && message.hasOwnProperty("displayName")) + object.displayName = message.displayName; + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + return object; + }; + + /** + * Converts this Chat to JSON. + * @function toJSON + * @memberof proto.Message.Chat + * @instance + * @returns {Object.} JSON object + */ + Chat.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Chat; + })(); + + Message.ContactMessage = (function() { + + /** + * Properties of a ContactMessage. + * @memberof proto.Message + * @interface IContactMessage + * @property {string|null} [displayName] ContactMessage displayName + * @property {string|null} [vcard] ContactMessage vcard + * @property {proto.IContextInfo|null} [contextInfo] ContactMessage contextInfo + */ + + /** + * Constructs a new ContactMessage. + * @memberof proto.Message + * @classdesc Represents a ContactMessage. + * @implements IContactMessage + * @constructor + * @param {proto.Message.IContactMessage=} [properties] Properties to set + */ + function ContactMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ContactMessage displayName. + * @member {string} displayName + * @memberof proto.Message.ContactMessage + * @instance + */ + ContactMessage.prototype.displayName = ""; + + /** + * ContactMessage vcard. + * @member {string} vcard + * @memberof proto.Message.ContactMessage + * @instance + */ + ContactMessage.prototype.vcard = ""; + + /** + * ContactMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ContactMessage + * @instance + */ + ContactMessage.prototype.contextInfo = null; + + /** + * Creates a new ContactMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ContactMessage + * @static + * @param {proto.Message.IContactMessage=} [properties] Properties to set + * @returns {proto.Message.ContactMessage} ContactMessage instance + */ + ContactMessage.create = function create(properties) { + return new ContactMessage(properties); + }; + + /** + * Encodes the specified ContactMessage message. Does not implicitly {@link proto.Message.ContactMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ContactMessage + * @static + * @param {proto.Message.IContactMessage} message ContactMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContactMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.displayName); + if (message.vcard != null && Object.hasOwnProperty.call(message, "vcard")) + writer.uint32(/* id 16, wireType 2 =*/130).string(message.vcard); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ContactMessage message, length delimited. Does not implicitly {@link proto.Message.ContactMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ContactMessage + * @static + * @param {proto.Message.IContactMessage} message ContactMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContactMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContactMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ContactMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ContactMessage} ContactMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContactMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ContactMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayName = reader.string(); + break; + case 16: + message.vcard = reader.string(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContactMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ContactMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ContactMessage} ContactMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContactMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContactMessage message. + * @function verify + * @memberof proto.Message.ContactMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContactMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayName != null && message.hasOwnProperty("displayName")) + if (!$util.isString(message.displayName)) + return "displayName: string expected"; + if (message.vcard != null && message.hasOwnProperty("vcard")) + if (!$util.isString(message.vcard)) + return "vcard: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a ContactMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ContactMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ContactMessage} ContactMessage + */ + ContactMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ContactMessage) + return object; + var message = new $root.proto.Message.ContactMessage(); + if (object.displayName != null) + message.displayName = String(object.displayName); + if (object.vcard != null) + message.vcard = String(object.vcard); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ContactMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a ContactMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ContactMessage + * @static + * @param {proto.Message.ContactMessage} message ContactMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ContactMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayName = ""; + object.vcard = ""; + object.contextInfo = null; + } + if (message.displayName != null && message.hasOwnProperty("displayName")) + object.displayName = message.displayName; + if (message.vcard != null && message.hasOwnProperty("vcard")) + object.vcard = message.vcard; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this ContactMessage to JSON. + * @function toJSON + * @memberof proto.Message.ContactMessage + * @instance + * @returns {Object.} JSON object + */ + ContactMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ContactMessage; + })(); + + Message.ContactsArrayMessage = (function() { + + /** + * Properties of a ContactsArrayMessage. + * @memberof proto.Message + * @interface IContactsArrayMessage + * @property {string|null} [displayName] ContactsArrayMessage displayName + * @property {Array.|null} [contacts] ContactsArrayMessage contacts + * @property {proto.IContextInfo|null} [contextInfo] ContactsArrayMessage contextInfo + */ + + /** + * Constructs a new ContactsArrayMessage. + * @memberof proto.Message + * @classdesc Represents a ContactsArrayMessage. + * @implements IContactsArrayMessage + * @constructor + * @param {proto.Message.IContactsArrayMessage=} [properties] Properties to set + */ + function ContactsArrayMessage(properties) { + this.contacts = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ContactsArrayMessage displayName. + * @member {string} displayName + * @memberof proto.Message.ContactsArrayMessage + * @instance + */ + ContactsArrayMessage.prototype.displayName = ""; + + /** + * ContactsArrayMessage contacts. + * @member {Array.} contacts + * @memberof proto.Message.ContactsArrayMessage + * @instance + */ + ContactsArrayMessage.prototype.contacts = $util.emptyArray; + + /** + * ContactsArrayMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ContactsArrayMessage + * @instance + */ + ContactsArrayMessage.prototype.contextInfo = null; + + /** + * Creates a new ContactsArrayMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {proto.Message.IContactsArrayMessage=} [properties] Properties to set + * @returns {proto.Message.ContactsArrayMessage} ContactsArrayMessage instance + */ + ContactsArrayMessage.create = function create(properties) { + return new ContactsArrayMessage(properties); + }; + + /** + * Encodes the specified ContactsArrayMessage message. Does not implicitly {@link proto.Message.ContactsArrayMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {proto.Message.IContactsArrayMessage} message ContactsArrayMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContactsArrayMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayName != null && Object.hasOwnProperty.call(message, "displayName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.displayName); + if (message.contacts != null && message.contacts.length) + for (var i = 0; i < message.contacts.length; ++i) + $root.proto.Message.ContactMessage.encode(message.contacts[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ContactsArrayMessage message, length delimited. Does not implicitly {@link proto.Message.ContactsArrayMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {proto.Message.IContactsArrayMessage} message ContactsArrayMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContactsArrayMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContactsArrayMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ContactsArrayMessage} ContactsArrayMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContactsArrayMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ContactsArrayMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayName = reader.string(); + break; + case 2: + if (!(message.contacts && message.contacts.length)) + message.contacts = []; + message.contacts.push($root.proto.Message.ContactMessage.decode(reader, reader.uint32())); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContactsArrayMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ContactsArrayMessage} ContactsArrayMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContactsArrayMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContactsArrayMessage message. + * @function verify + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContactsArrayMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayName != null && message.hasOwnProperty("displayName")) + if (!$util.isString(message.displayName)) + return "displayName: string expected"; + if (message.contacts != null && message.hasOwnProperty("contacts")) { + if (!Array.isArray(message.contacts)) + return "contacts: array expected"; + for (var i = 0; i < message.contacts.length; ++i) { + var error = $root.proto.Message.ContactMessage.verify(message.contacts[i]); + if (error) + return "contacts." + error; + } + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a ContactsArrayMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ContactsArrayMessage} ContactsArrayMessage + */ + ContactsArrayMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ContactsArrayMessage) + return object; + var message = new $root.proto.Message.ContactsArrayMessage(); + if (object.displayName != null) + message.displayName = String(object.displayName); + if (object.contacts) { + if (!Array.isArray(object.contacts)) + throw TypeError(".proto.Message.ContactsArrayMessage.contacts: array expected"); + message.contacts = []; + for (var i = 0; i < object.contacts.length; ++i) { + if (typeof object.contacts[i] !== "object") + throw TypeError(".proto.Message.ContactsArrayMessage.contacts: object expected"); + message.contacts[i] = $root.proto.Message.ContactMessage.fromObject(object.contacts[i]); + } + } + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ContactsArrayMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a ContactsArrayMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ContactsArrayMessage + * @static + * @param {proto.Message.ContactsArrayMessage} message ContactsArrayMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ContactsArrayMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.contacts = []; + if (options.defaults) { + object.displayName = ""; + object.contextInfo = null; + } + if (message.displayName != null && message.hasOwnProperty("displayName")) + object.displayName = message.displayName; + if (message.contacts && message.contacts.length) { + object.contacts = []; + for (var j = 0; j < message.contacts.length; ++j) + object.contacts[j] = $root.proto.Message.ContactMessage.toObject(message.contacts[j], options); + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this ContactsArrayMessage to JSON. + * @function toJSON + * @memberof proto.Message.ContactsArrayMessage + * @instance + * @returns {Object.} JSON object + */ + ContactsArrayMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ContactsArrayMessage; + })(); + + Message.DeclinePaymentRequestMessage = (function() { + + /** + * Properties of a DeclinePaymentRequestMessage. + * @memberof proto.Message + * @interface IDeclinePaymentRequestMessage + * @property {proto.IMessageKey|null} [key] DeclinePaymentRequestMessage key + */ + + /** + * Constructs a new DeclinePaymentRequestMessage. + * @memberof proto.Message + * @classdesc Represents a DeclinePaymentRequestMessage. + * @implements IDeclinePaymentRequestMessage + * @constructor + * @param {proto.Message.IDeclinePaymentRequestMessage=} [properties] Properties to set + */ + function DeclinePaymentRequestMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DeclinePaymentRequestMessage key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.Message.DeclinePaymentRequestMessage + * @instance + */ + DeclinePaymentRequestMessage.prototype.key = null; + + /** + * Creates a new DeclinePaymentRequestMessage instance using the specified properties. + * @function create + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {proto.Message.IDeclinePaymentRequestMessage=} [properties] Properties to set + * @returns {proto.Message.DeclinePaymentRequestMessage} DeclinePaymentRequestMessage instance + */ + DeclinePaymentRequestMessage.create = function create(properties) { + return new DeclinePaymentRequestMessage(properties); + }; + + /** + * Encodes the specified DeclinePaymentRequestMessage message. Does not implicitly {@link proto.Message.DeclinePaymentRequestMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {proto.Message.IDeclinePaymentRequestMessage} message DeclinePaymentRequestMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeclinePaymentRequestMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified DeclinePaymentRequestMessage message, length delimited. Does not implicitly {@link proto.Message.DeclinePaymentRequestMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {proto.Message.IDeclinePaymentRequestMessage} message DeclinePaymentRequestMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeclinePaymentRequestMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeclinePaymentRequestMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.DeclinePaymentRequestMessage} DeclinePaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeclinePaymentRequestMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.DeclinePaymentRequestMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeclinePaymentRequestMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.DeclinePaymentRequestMessage} DeclinePaymentRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeclinePaymentRequestMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeclinePaymentRequestMessage message. + * @function verify + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeclinePaymentRequestMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + return null; + }; + + /** + * Creates a DeclinePaymentRequestMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.DeclinePaymentRequestMessage} DeclinePaymentRequestMessage + */ + DeclinePaymentRequestMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.DeclinePaymentRequestMessage) + return object; + var message = new $root.proto.Message.DeclinePaymentRequestMessage(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.Message.DeclinePaymentRequestMessage.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + return message; + }; + + /** + * Creates a plain object from a DeclinePaymentRequestMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.DeclinePaymentRequestMessage + * @static + * @param {proto.Message.DeclinePaymentRequestMessage} message DeclinePaymentRequestMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeclinePaymentRequestMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.key = null; + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + return object; + }; + + /** + * Converts this DeclinePaymentRequestMessage to JSON. + * @function toJSON + * @memberof proto.Message.DeclinePaymentRequestMessage + * @instance + * @returns {Object.} JSON object + */ + DeclinePaymentRequestMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DeclinePaymentRequestMessage; + })(); + + Message.DeviceSentMessage = (function() { + + /** + * Properties of a DeviceSentMessage. + * @memberof proto.Message + * @interface IDeviceSentMessage + * @property {string|null} [destinationJid] DeviceSentMessage destinationJid + * @property {proto.IMessage|null} [message] DeviceSentMessage message + * @property {string|null} [phash] DeviceSentMessage phash + */ + + /** + * Constructs a new DeviceSentMessage. + * @memberof proto.Message + * @classdesc Represents a DeviceSentMessage. + * @implements IDeviceSentMessage + * @constructor + * @param {proto.Message.IDeviceSentMessage=} [properties] Properties to set + */ + function DeviceSentMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DeviceSentMessage destinationJid. + * @member {string} destinationJid + * @memberof proto.Message.DeviceSentMessage + * @instance + */ + DeviceSentMessage.prototype.destinationJid = ""; + + /** + * DeviceSentMessage message. + * @member {proto.IMessage|null|undefined} message + * @memberof proto.Message.DeviceSentMessage + * @instance + */ + DeviceSentMessage.prototype.message = null; + + /** + * DeviceSentMessage phash. + * @member {string} phash + * @memberof proto.Message.DeviceSentMessage + * @instance + */ + DeviceSentMessage.prototype.phash = ""; + + /** + * Creates a new DeviceSentMessage instance using the specified properties. + * @function create + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {proto.Message.IDeviceSentMessage=} [properties] Properties to set + * @returns {proto.Message.DeviceSentMessage} DeviceSentMessage instance + */ + DeviceSentMessage.create = function create(properties) { + return new DeviceSentMessage(properties); + }; + + /** + * Encodes the specified DeviceSentMessage message. Does not implicitly {@link proto.Message.DeviceSentMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {proto.Message.IDeviceSentMessage} message DeviceSentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeviceSentMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.destinationJid != null && Object.hasOwnProperty.call(message, "destinationJid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.destinationJid); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + $root.proto.Message.encode(message.message, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.phash != null && Object.hasOwnProperty.call(message, "phash")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.phash); + return writer; + }; + + /** + * Encodes the specified DeviceSentMessage message, length delimited. Does not implicitly {@link proto.Message.DeviceSentMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {proto.Message.IDeviceSentMessage} message DeviceSentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeviceSentMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeviceSentMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.DeviceSentMessage} DeviceSentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeviceSentMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.DeviceSentMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.destinationJid = reader.string(); + break; + case 2: + message.message = $root.proto.Message.decode(reader, reader.uint32()); + break; + case 3: + message.phash = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeviceSentMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.DeviceSentMessage} DeviceSentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeviceSentMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeviceSentMessage message. + * @function verify + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeviceSentMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.destinationJid != null && message.hasOwnProperty("destinationJid")) + if (!$util.isString(message.destinationJid)) + return "destinationJid: string expected"; + if (message.message != null && message.hasOwnProperty("message")) { + var error = $root.proto.Message.verify(message.message); + if (error) + return "message." + error; + } + if (message.phash != null && message.hasOwnProperty("phash")) + if (!$util.isString(message.phash)) + return "phash: string expected"; + return null; + }; + + /** + * Creates a DeviceSentMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.DeviceSentMessage} DeviceSentMessage + */ + DeviceSentMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.DeviceSentMessage) + return object; + var message = new $root.proto.Message.DeviceSentMessage(); + if (object.destinationJid != null) + message.destinationJid = String(object.destinationJid); + if (object.message != null) { + if (typeof object.message !== "object") + throw TypeError(".proto.Message.DeviceSentMessage.message: object expected"); + message.message = $root.proto.Message.fromObject(object.message); + } + if (object.phash != null) + message.phash = String(object.phash); + return message; + }; + + /** + * Creates a plain object from a DeviceSentMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.DeviceSentMessage + * @static + * @param {proto.Message.DeviceSentMessage} message DeviceSentMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeviceSentMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.destinationJid = ""; + object.message = null; + object.phash = ""; + } + if (message.destinationJid != null && message.hasOwnProperty("destinationJid")) + object.destinationJid = message.destinationJid; + if (message.message != null && message.hasOwnProperty("message")) + object.message = $root.proto.Message.toObject(message.message, options); + if (message.phash != null && message.hasOwnProperty("phash")) + object.phash = message.phash; + return object; + }; + + /** + * Converts this DeviceSentMessage to JSON. + * @function toJSON + * @memberof proto.Message.DeviceSentMessage + * @instance + * @returns {Object.} JSON object + */ + DeviceSentMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DeviceSentMessage; + })(); + + Message.DocumentMessage = (function() { + + /** + * Properties of a DocumentMessage. + * @memberof proto.Message + * @interface IDocumentMessage + * @property {string|null} [url] DocumentMessage url + * @property {string|null} [mimetype] DocumentMessage mimetype + * @property {string|null} [title] DocumentMessage title + * @property {Uint8Array|null} [fileSha256] DocumentMessage fileSha256 + * @property {number|Long|null} [fileLength] DocumentMessage fileLength + * @property {number|null} [pageCount] DocumentMessage pageCount + * @property {Uint8Array|null} [mediaKey] DocumentMessage mediaKey + * @property {string|null} [fileName] DocumentMessage fileName + * @property {Uint8Array|null} [fileEncSha256] DocumentMessage fileEncSha256 + * @property {string|null} [directPath] DocumentMessage directPath + * @property {number|Long|null} [mediaKeyTimestamp] DocumentMessage mediaKeyTimestamp + * @property {boolean|null} [contactVcard] DocumentMessage contactVcard + * @property {string|null} [thumbnailDirectPath] DocumentMessage thumbnailDirectPath + * @property {Uint8Array|null} [thumbnailSha256] DocumentMessage thumbnailSha256 + * @property {Uint8Array|null} [thumbnailEncSha256] DocumentMessage thumbnailEncSha256 + * @property {Uint8Array|null} [jpegThumbnail] DocumentMessage jpegThumbnail + * @property {proto.IContextInfo|null} [contextInfo] DocumentMessage contextInfo + * @property {number|null} [thumbnailHeight] DocumentMessage thumbnailHeight + * @property {number|null} [thumbnailWidth] DocumentMessage thumbnailWidth + * @property {string|null} [caption] DocumentMessage caption + */ + + /** + * Constructs a new DocumentMessage. + * @memberof proto.Message + * @classdesc Represents a DocumentMessage. + * @implements IDocumentMessage + * @constructor + * @param {proto.Message.IDocumentMessage=} [properties] Properties to set + */ + function DocumentMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DocumentMessage url. + * @member {string} url + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.url = ""; + + /** + * DocumentMessage mimetype. + * @member {string} mimetype + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.mimetype = ""; + + /** + * DocumentMessage title. + * @member {string} title + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.title = ""; + + /** + * DocumentMessage fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.fileSha256 = $util.newBuffer([]); + + /** + * DocumentMessage fileLength. + * @member {number|Long} fileLength + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * DocumentMessage pageCount. + * @member {number} pageCount + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.pageCount = 0; + + /** + * DocumentMessage mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.mediaKey = $util.newBuffer([]); + + /** + * DocumentMessage fileName. + * @member {string} fileName + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.fileName = ""; + + /** + * DocumentMessage fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * DocumentMessage directPath. + * @member {string} directPath + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.directPath = ""; + + /** + * DocumentMessage mediaKeyTimestamp. + * @member {number|Long} mediaKeyTimestamp + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.mediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * DocumentMessage contactVcard. + * @member {boolean} contactVcard + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.contactVcard = false; + + /** + * DocumentMessage thumbnailDirectPath. + * @member {string} thumbnailDirectPath + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.thumbnailDirectPath = ""; + + /** + * DocumentMessage thumbnailSha256. + * @member {Uint8Array} thumbnailSha256 + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.thumbnailSha256 = $util.newBuffer([]); + + /** + * DocumentMessage thumbnailEncSha256. + * @member {Uint8Array} thumbnailEncSha256 + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.thumbnailEncSha256 = $util.newBuffer([]); + + /** + * DocumentMessage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * DocumentMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.contextInfo = null; + + /** + * DocumentMessage thumbnailHeight. + * @member {number} thumbnailHeight + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.thumbnailHeight = 0; + + /** + * DocumentMessage thumbnailWidth. + * @member {number} thumbnailWidth + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.thumbnailWidth = 0; + + /** + * DocumentMessage caption. + * @member {string} caption + * @memberof proto.Message.DocumentMessage + * @instance + */ + DocumentMessage.prototype.caption = ""; + + /** + * Creates a new DocumentMessage instance using the specified properties. + * @function create + * @memberof proto.Message.DocumentMessage + * @static + * @param {proto.Message.IDocumentMessage=} [properties] Properties to set + * @returns {proto.Message.DocumentMessage} DocumentMessage instance + */ + DocumentMessage.create = function create(properties) { + return new DocumentMessage(properties); + }; + + /** + * Encodes the specified DocumentMessage message. Does not implicitly {@link proto.Message.DocumentMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.DocumentMessage + * @static + * @param {proto.Message.IDocumentMessage} message DocumentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DocumentMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.mimetype); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.title); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.fileSha256); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.fileLength); + if (message.pageCount != null && Object.hasOwnProperty.call(message, "pageCount")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.pageCount); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.mediaKey); + if (message.fileName != null && Object.hasOwnProperty.call(message, "fileName")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.fileName); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.fileEncSha256); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 10, wireType 2 =*/82).string(message.directPath); + if (message.mediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "mediaKeyTimestamp")) + writer.uint32(/* id 11, wireType 0 =*/88).int64(message.mediaKeyTimestamp); + if (message.contactVcard != null && Object.hasOwnProperty.call(message, "contactVcard")) + writer.uint32(/* id 12, wireType 0 =*/96).bool(message.contactVcard); + if (message.thumbnailDirectPath != null && Object.hasOwnProperty.call(message, "thumbnailDirectPath")) + writer.uint32(/* id 13, wireType 2 =*/106).string(message.thumbnailDirectPath); + if (message.thumbnailSha256 != null && Object.hasOwnProperty.call(message, "thumbnailSha256")) + writer.uint32(/* id 14, wireType 2 =*/114).bytes(message.thumbnailSha256); + if (message.thumbnailEncSha256 != null && Object.hasOwnProperty.call(message, "thumbnailEncSha256")) + writer.uint32(/* id 15, wireType 2 =*/122).bytes(message.thumbnailEncSha256); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.jpegThumbnail); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.thumbnailHeight != null && Object.hasOwnProperty.call(message, "thumbnailHeight")) + writer.uint32(/* id 18, wireType 0 =*/144).uint32(message.thumbnailHeight); + if (message.thumbnailWidth != null && Object.hasOwnProperty.call(message, "thumbnailWidth")) + writer.uint32(/* id 19, wireType 0 =*/152).uint32(message.thumbnailWidth); + if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) + writer.uint32(/* id 20, wireType 2 =*/162).string(message.caption); + return writer; + }; + + /** + * Encodes the specified DocumentMessage message, length delimited. Does not implicitly {@link proto.Message.DocumentMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.DocumentMessage + * @static + * @param {proto.Message.IDocumentMessage} message DocumentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DocumentMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DocumentMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.DocumentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.DocumentMessage} DocumentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DocumentMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.DocumentMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.mimetype = reader.string(); + break; + case 3: + message.title = reader.string(); + break; + case 4: + message.fileSha256 = reader.bytes(); + break; + case 5: + message.fileLength = reader.uint64(); + break; + case 6: + message.pageCount = reader.uint32(); + break; + case 7: + message.mediaKey = reader.bytes(); + break; + case 8: + message.fileName = reader.string(); + break; + case 9: + message.fileEncSha256 = reader.bytes(); + break; + case 10: + message.directPath = reader.string(); + break; + case 11: + message.mediaKeyTimestamp = reader.int64(); + break; + case 12: + message.contactVcard = reader.bool(); + break; + case 13: + message.thumbnailDirectPath = reader.string(); + break; + case 14: + message.thumbnailSha256 = reader.bytes(); + break; + case 15: + message.thumbnailEncSha256 = reader.bytes(); + break; + case 16: + message.jpegThumbnail = reader.bytes(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 18: + message.thumbnailHeight = reader.uint32(); + break; + case 19: + message.thumbnailWidth = reader.uint32(); + break; + case 20: + message.caption = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DocumentMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.DocumentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.DocumentMessage} DocumentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DocumentMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DocumentMessage message. + * @function verify + * @memberof proto.Message.DocumentMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DocumentMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.pageCount != null && message.hasOwnProperty("pageCount")) + if (!$util.isInteger(message.pageCount)) + return "pageCount: integer expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.fileName != null && message.hasOwnProperty("fileName")) + if (!$util.isString(message.fileName)) + return "fileName: string expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (!$util.isInteger(message.mediaKeyTimestamp) && !(message.mediaKeyTimestamp && $util.isInteger(message.mediaKeyTimestamp.low) && $util.isInteger(message.mediaKeyTimestamp.high))) + return "mediaKeyTimestamp: integer|Long expected"; + if (message.contactVcard != null && message.hasOwnProperty("contactVcard")) + if (typeof message.contactVcard !== "boolean") + return "contactVcard: boolean expected"; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + if (!$util.isString(message.thumbnailDirectPath)) + return "thumbnailDirectPath: string expected"; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + if (!(message.thumbnailSha256 && typeof message.thumbnailSha256.length === "number" || $util.isString(message.thumbnailSha256))) + return "thumbnailSha256: buffer expected"; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + if (!(message.thumbnailEncSha256 && typeof message.thumbnailEncSha256.length === "number" || $util.isString(message.thumbnailEncSha256))) + return "thumbnailEncSha256: buffer expected"; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.thumbnailHeight != null && message.hasOwnProperty("thumbnailHeight")) + if (!$util.isInteger(message.thumbnailHeight)) + return "thumbnailHeight: integer expected"; + if (message.thumbnailWidth != null && message.hasOwnProperty("thumbnailWidth")) + if (!$util.isInteger(message.thumbnailWidth)) + return "thumbnailWidth: integer expected"; + if (message.caption != null && message.hasOwnProperty("caption")) + if (!$util.isString(message.caption)) + return "caption: string expected"; + return null; + }; + + /** + * Creates a DocumentMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.DocumentMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.DocumentMessage} DocumentMessage + */ + DocumentMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.DocumentMessage) + return object; + var message = new $root.proto.Message.DocumentMessage(); + if (object.url != null) + message.url = String(object.url); + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.title != null) + message.title = String(object.title); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.pageCount != null) + message.pageCount = object.pageCount >>> 0; + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.fileName != null) + message.fileName = String(object.fileName); + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.mediaKeyTimestamp != null) + if ($util.Long) + (message.mediaKeyTimestamp = $util.Long.fromValue(object.mediaKeyTimestamp)).unsigned = false; + else if (typeof object.mediaKeyTimestamp === "string") + message.mediaKeyTimestamp = parseInt(object.mediaKeyTimestamp, 10); + else if (typeof object.mediaKeyTimestamp === "number") + message.mediaKeyTimestamp = object.mediaKeyTimestamp; + else if (typeof object.mediaKeyTimestamp === "object") + message.mediaKeyTimestamp = new $util.LongBits(object.mediaKeyTimestamp.low >>> 0, object.mediaKeyTimestamp.high >>> 0).toNumber(); + if (object.contactVcard != null) + message.contactVcard = Boolean(object.contactVcard); + if (object.thumbnailDirectPath != null) + message.thumbnailDirectPath = String(object.thumbnailDirectPath); + if (object.thumbnailSha256 != null) + if (typeof object.thumbnailSha256 === "string") + $util.base64.decode(object.thumbnailSha256, message.thumbnailSha256 = $util.newBuffer($util.base64.length(object.thumbnailSha256)), 0); + else if (object.thumbnailSha256.length) + message.thumbnailSha256 = object.thumbnailSha256; + if (object.thumbnailEncSha256 != null) + if (typeof object.thumbnailEncSha256 === "string") + $util.base64.decode(object.thumbnailEncSha256, message.thumbnailEncSha256 = $util.newBuffer($util.base64.length(object.thumbnailEncSha256)), 0); + else if (object.thumbnailEncSha256.length) + message.thumbnailEncSha256 = object.thumbnailEncSha256; + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.DocumentMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.thumbnailHeight != null) + message.thumbnailHeight = object.thumbnailHeight >>> 0; + if (object.thumbnailWidth != null) + message.thumbnailWidth = object.thumbnailWidth >>> 0; + if (object.caption != null) + message.caption = String(object.caption); + return message; + }; + + /** + * Creates a plain object from a DocumentMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.DocumentMessage + * @static + * @param {proto.Message.DocumentMessage} message DocumentMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DocumentMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = ""; + object.mimetype = ""; + object.title = ""; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + object.pageCount = 0; + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + object.fileName = ""; + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + object.directPath = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.mediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.mediaKeyTimestamp = options.longs === String ? "0" : 0; + object.contactVcard = false; + object.thumbnailDirectPath = ""; + if (options.bytes === String) + object.thumbnailSha256 = ""; + else { + object.thumbnailSha256 = []; + if (options.bytes !== Array) + object.thumbnailSha256 = $util.newBuffer(object.thumbnailSha256); + } + if (options.bytes === String) + object.thumbnailEncSha256 = ""; + else { + object.thumbnailEncSha256 = []; + if (options.bytes !== Array) + object.thumbnailEncSha256 = $util.newBuffer(object.thumbnailEncSha256); + } + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.contextInfo = null; + object.thumbnailHeight = 0; + object.thumbnailWidth = 0; + object.caption = ""; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.pageCount != null && message.hasOwnProperty("pageCount")) + object.pageCount = message.pageCount; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.fileName != null && message.hasOwnProperty("fileName")) + object.fileName = message.fileName; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (typeof message.mediaKeyTimestamp === "number") + object.mediaKeyTimestamp = options.longs === String ? String(message.mediaKeyTimestamp) : message.mediaKeyTimestamp; + else + object.mediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.mediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.mediaKeyTimestamp.low >>> 0, message.mediaKeyTimestamp.high >>> 0).toNumber() : message.mediaKeyTimestamp; + if (message.contactVcard != null && message.hasOwnProperty("contactVcard")) + object.contactVcard = message.contactVcard; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + object.thumbnailDirectPath = message.thumbnailDirectPath; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + object.thumbnailSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailSha256, 0, message.thumbnailSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailSha256) : message.thumbnailSha256; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + object.thumbnailEncSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailEncSha256, 0, message.thumbnailEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailEncSha256) : message.thumbnailEncSha256; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.thumbnailHeight != null && message.hasOwnProperty("thumbnailHeight")) + object.thumbnailHeight = message.thumbnailHeight; + if (message.thumbnailWidth != null && message.hasOwnProperty("thumbnailWidth")) + object.thumbnailWidth = message.thumbnailWidth; + if (message.caption != null && message.hasOwnProperty("caption")) + object.caption = message.caption; + return object; + }; + + /** + * Converts this DocumentMessage to JSON. + * @function toJSON + * @memberof proto.Message.DocumentMessage + * @instance + * @returns {Object.} JSON object + */ + DocumentMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DocumentMessage; + })(); + + Message.EncReactionMessage = (function() { + + /** + * Properties of an EncReactionMessage. + * @memberof proto.Message + * @interface IEncReactionMessage + * @property {proto.IMessageKey|null} [targetMessageKey] EncReactionMessage targetMessageKey + * @property {Uint8Array|null} [encPayload] EncReactionMessage encPayload + * @property {Uint8Array|null} [encIv] EncReactionMessage encIv + */ + + /** + * Constructs a new EncReactionMessage. + * @memberof proto.Message + * @classdesc Represents an EncReactionMessage. + * @implements IEncReactionMessage + * @constructor + * @param {proto.Message.IEncReactionMessage=} [properties] Properties to set + */ + function EncReactionMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * EncReactionMessage targetMessageKey. + * @member {proto.IMessageKey|null|undefined} targetMessageKey + * @memberof proto.Message.EncReactionMessage + * @instance + */ + EncReactionMessage.prototype.targetMessageKey = null; + + /** + * EncReactionMessage encPayload. + * @member {Uint8Array} encPayload + * @memberof proto.Message.EncReactionMessage + * @instance + */ + EncReactionMessage.prototype.encPayload = $util.newBuffer([]); + + /** + * EncReactionMessage encIv. + * @member {Uint8Array} encIv + * @memberof proto.Message.EncReactionMessage + * @instance + */ + EncReactionMessage.prototype.encIv = $util.newBuffer([]); + + /** + * Creates a new EncReactionMessage instance using the specified properties. + * @function create + * @memberof proto.Message.EncReactionMessage + * @static + * @param {proto.Message.IEncReactionMessage=} [properties] Properties to set + * @returns {proto.Message.EncReactionMessage} EncReactionMessage instance + */ + EncReactionMessage.create = function create(properties) { + return new EncReactionMessage(properties); + }; + + /** + * Encodes the specified EncReactionMessage message. Does not implicitly {@link proto.Message.EncReactionMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.EncReactionMessage + * @static + * @param {proto.Message.IEncReactionMessage} message EncReactionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + EncReactionMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.targetMessageKey != null && Object.hasOwnProperty.call(message, "targetMessageKey")) + $root.proto.MessageKey.encode(message.targetMessageKey, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.encPayload != null && Object.hasOwnProperty.call(message, "encPayload")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.encPayload); + if (message.encIv != null && Object.hasOwnProperty.call(message, "encIv")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.encIv); + return writer; + }; + + /** + * Encodes the specified EncReactionMessage message, length delimited. Does not implicitly {@link proto.Message.EncReactionMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.EncReactionMessage + * @static + * @param {proto.Message.IEncReactionMessage} message EncReactionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + EncReactionMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an EncReactionMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.EncReactionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.EncReactionMessage} EncReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + EncReactionMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.EncReactionMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.targetMessageKey = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.encPayload = reader.bytes(); + break; + case 3: + message.encIv = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an EncReactionMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.EncReactionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.EncReactionMessage} EncReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + EncReactionMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an EncReactionMessage message. + * @function verify + * @memberof proto.Message.EncReactionMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + EncReactionMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.targetMessageKey != null && message.hasOwnProperty("targetMessageKey")) { + var error = $root.proto.MessageKey.verify(message.targetMessageKey); + if (error) + return "targetMessageKey." + error; + } + if (message.encPayload != null && message.hasOwnProperty("encPayload")) + if (!(message.encPayload && typeof message.encPayload.length === "number" || $util.isString(message.encPayload))) + return "encPayload: buffer expected"; + if (message.encIv != null && message.hasOwnProperty("encIv")) + if (!(message.encIv && typeof message.encIv.length === "number" || $util.isString(message.encIv))) + return "encIv: buffer expected"; + return null; + }; + + /** + * Creates an EncReactionMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.EncReactionMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.EncReactionMessage} EncReactionMessage + */ + EncReactionMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.EncReactionMessage) + return object; + var message = new $root.proto.Message.EncReactionMessage(); + if (object.targetMessageKey != null) { + if (typeof object.targetMessageKey !== "object") + throw TypeError(".proto.Message.EncReactionMessage.targetMessageKey: object expected"); + message.targetMessageKey = $root.proto.MessageKey.fromObject(object.targetMessageKey); + } + if (object.encPayload != null) + if (typeof object.encPayload === "string") + $util.base64.decode(object.encPayload, message.encPayload = $util.newBuffer($util.base64.length(object.encPayload)), 0); + else if (object.encPayload.length) + message.encPayload = object.encPayload; + if (object.encIv != null) + if (typeof object.encIv === "string") + $util.base64.decode(object.encIv, message.encIv = $util.newBuffer($util.base64.length(object.encIv)), 0); + else if (object.encIv.length) + message.encIv = object.encIv; + return message; + }; + + /** + * Creates a plain object from an EncReactionMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.EncReactionMessage + * @static + * @param {proto.Message.EncReactionMessage} message EncReactionMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + EncReactionMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.targetMessageKey = null; + if (options.bytes === String) + object.encPayload = ""; + else { + object.encPayload = []; + if (options.bytes !== Array) + object.encPayload = $util.newBuffer(object.encPayload); + } + if (options.bytes === String) + object.encIv = ""; + else { + object.encIv = []; + if (options.bytes !== Array) + object.encIv = $util.newBuffer(object.encIv); + } + } + if (message.targetMessageKey != null && message.hasOwnProperty("targetMessageKey")) + object.targetMessageKey = $root.proto.MessageKey.toObject(message.targetMessageKey, options); + if (message.encPayload != null && message.hasOwnProperty("encPayload")) + object.encPayload = options.bytes === String ? $util.base64.encode(message.encPayload, 0, message.encPayload.length) : options.bytes === Array ? Array.prototype.slice.call(message.encPayload) : message.encPayload; + if (message.encIv != null && message.hasOwnProperty("encIv")) + object.encIv = options.bytes === String ? $util.base64.encode(message.encIv, 0, message.encIv.length) : options.bytes === Array ? Array.prototype.slice.call(message.encIv) : message.encIv; + return object; + }; + + /** + * Converts this EncReactionMessage to JSON. + * @function toJSON + * @memberof proto.Message.EncReactionMessage + * @instance + * @returns {Object.} JSON object + */ + EncReactionMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return EncReactionMessage; + })(); + + Message.ExtendedTextMessage = (function() { + + /** + * Properties of an ExtendedTextMessage. + * @memberof proto.Message + * @interface IExtendedTextMessage + * @property {string|null} [text] ExtendedTextMessage text + * @property {string|null} [matchedText] ExtendedTextMessage matchedText + * @property {string|null} [canonicalUrl] ExtendedTextMessage canonicalUrl + * @property {string|null} [description] ExtendedTextMessage description + * @property {string|null} [title] ExtendedTextMessage title + * @property {number|null} [textArgb] ExtendedTextMessage textArgb + * @property {number|null} [backgroundArgb] ExtendedTextMessage backgroundArgb + * @property {proto.Message.ExtendedTextMessage.FontType|null} [font] ExtendedTextMessage font + * @property {proto.Message.ExtendedTextMessage.PreviewType|null} [previewType] ExtendedTextMessage previewType + * @property {Uint8Array|null} [jpegThumbnail] ExtendedTextMessage jpegThumbnail + * @property {proto.IContextInfo|null} [contextInfo] ExtendedTextMessage contextInfo + * @property {boolean|null} [doNotPlayInline] ExtendedTextMessage doNotPlayInline + * @property {string|null} [thumbnailDirectPath] ExtendedTextMessage thumbnailDirectPath + * @property {Uint8Array|null} [thumbnailSha256] ExtendedTextMessage thumbnailSha256 + * @property {Uint8Array|null} [thumbnailEncSha256] ExtendedTextMessage thumbnailEncSha256 + * @property {Uint8Array|null} [mediaKey] ExtendedTextMessage mediaKey + * @property {number|Long|null} [mediaKeyTimestamp] ExtendedTextMessage mediaKeyTimestamp + * @property {number|null} [thumbnailHeight] ExtendedTextMessage thumbnailHeight + * @property {number|null} [thumbnailWidth] ExtendedTextMessage thumbnailWidth + * @property {proto.Message.ExtendedTextMessage.InviteLinkGroupType|null} [inviteLinkGroupType] ExtendedTextMessage inviteLinkGroupType + * @property {string|null} [inviteLinkParentGroupSubjectV2] ExtendedTextMessage inviteLinkParentGroupSubjectV2 + * @property {Uint8Array|null} [inviteLinkParentGroupThumbnailV2] ExtendedTextMessage inviteLinkParentGroupThumbnailV2 + * @property {proto.Message.ExtendedTextMessage.InviteLinkGroupType|null} [inviteLinkGroupTypeV2] ExtendedTextMessage inviteLinkGroupTypeV2 + * @property {boolean|null} [viewOnce] ExtendedTextMessage viewOnce + */ + + /** + * Constructs a new ExtendedTextMessage. + * @memberof proto.Message + * @classdesc Represents an ExtendedTextMessage. + * @implements IExtendedTextMessage + * @constructor + * @param {proto.Message.IExtendedTextMessage=} [properties] Properties to set + */ + function ExtendedTextMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ExtendedTextMessage text. + * @member {string} text + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.text = ""; + + /** + * ExtendedTextMessage matchedText. + * @member {string} matchedText + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.matchedText = ""; + + /** + * ExtendedTextMessage canonicalUrl. + * @member {string} canonicalUrl + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.canonicalUrl = ""; + + /** + * ExtendedTextMessage description. + * @member {string} description + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.description = ""; + + /** + * ExtendedTextMessage title. + * @member {string} title + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.title = ""; + + /** + * ExtendedTextMessage textArgb. + * @member {number} textArgb + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.textArgb = 0; + + /** + * ExtendedTextMessage backgroundArgb. + * @member {number} backgroundArgb + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.backgroundArgb = 0; + + /** + * ExtendedTextMessage font. + * @member {proto.Message.ExtendedTextMessage.FontType} font + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.font = 0; + + /** + * ExtendedTextMessage previewType. + * @member {proto.Message.ExtendedTextMessage.PreviewType} previewType + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.previewType = 0; + + /** + * ExtendedTextMessage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * ExtendedTextMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.contextInfo = null; + + /** + * ExtendedTextMessage doNotPlayInline. + * @member {boolean} doNotPlayInline + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.doNotPlayInline = false; + + /** + * ExtendedTextMessage thumbnailDirectPath. + * @member {string} thumbnailDirectPath + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.thumbnailDirectPath = ""; + + /** + * ExtendedTextMessage thumbnailSha256. + * @member {Uint8Array} thumbnailSha256 + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.thumbnailSha256 = $util.newBuffer([]); + + /** + * ExtendedTextMessage thumbnailEncSha256. + * @member {Uint8Array} thumbnailEncSha256 + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.thumbnailEncSha256 = $util.newBuffer([]); + + /** + * ExtendedTextMessage mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.mediaKey = $util.newBuffer([]); + + /** + * ExtendedTextMessage mediaKeyTimestamp. + * @member {number|Long} mediaKeyTimestamp + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.mediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * ExtendedTextMessage thumbnailHeight. + * @member {number} thumbnailHeight + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.thumbnailHeight = 0; + + /** + * ExtendedTextMessage thumbnailWidth. + * @member {number} thumbnailWidth + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.thumbnailWidth = 0; + + /** + * ExtendedTextMessage inviteLinkGroupType. + * @member {proto.Message.ExtendedTextMessage.InviteLinkGroupType} inviteLinkGroupType + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.inviteLinkGroupType = 0; + + /** + * ExtendedTextMessage inviteLinkParentGroupSubjectV2. + * @member {string} inviteLinkParentGroupSubjectV2 + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.inviteLinkParentGroupSubjectV2 = ""; + + /** + * ExtendedTextMessage inviteLinkParentGroupThumbnailV2. + * @member {Uint8Array} inviteLinkParentGroupThumbnailV2 + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.inviteLinkParentGroupThumbnailV2 = $util.newBuffer([]); + + /** + * ExtendedTextMessage inviteLinkGroupTypeV2. + * @member {proto.Message.ExtendedTextMessage.InviteLinkGroupType} inviteLinkGroupTypeV2 + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.inviteLinkGroupTypeV2 = 0; + + /** + * ExtendedTextMessage viewOnce. + * @member {boolean} viewOnce + * @memberof proto.Message.ExtendedTextMessage + * @instance + */ + ExtendedTextMessage.prototype.viewOnce = false; + + /** + * Creates a new ExtendedTextMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {proto.Message.IExtendedTextMessage=} [properties] Properties to set + * @returns {proto.Message.ExtendedTextMessage} ExtendedTextMessage instance + */ + ExtendedTextMessage.create = function create(properties) { + return new ExtendedTextMessage(properties); + }; + + /** + * Encodes the specified ExtendedTextMessage message. Does not implicitly {@link proto.Message.ExtendedTextMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {proto.Message.IExtendedTextMessage} message ExtendedTextMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExtendedTextMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.text); + if (message.matchedText != null && Object.hasOwnProperty.call(message, "matchedText")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.matchedText); + if (message.canonicalUrl != null && Object.hasOwnProperty.call(message, "canonicalUrl")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.canonicalUrl); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.description); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.title); + if (message.textArgb != null && Object.hasOwnProperty.call(message, "textArgb")) + writer.uint32(/* id 7, wireType 5 =*/61).fixed32(message.textArgb); + if (message.backgroundArgb != null && Object.hasOwnProperty.call(message, "backgroundArgb")) + writer.uint32(/* id 8, wireType 5 =*/69).fixed32(message.backgroundArgb); + if (message.font != null && Object.hasOwnProperty.call(message, "font")) + writer.uint32(/* id 9, wireType 0 =*/72).int32(message.font); + if (message.previewType != null && Object.hasOwnProperty.call(message, "previewType")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.previewType); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.jpegThumbnail); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.doNotPlayInline != null && Object.hasOwnProperty.call(message, "doNotPlayInline")) + writer.uint32(/* id 18, wireType 0 =*/144).bool(message.doNotPlayInline); + if (message.thumbnailDirectPath != null && Object.hasOwnProperty.call(message, "thumbnailDirectPath")) + writer.uint32(/* id 19, wireType 2 =*/154).string(message.thumbnailDirectPath); + if (message.thumbnailSha256 != null && Object.hasOwnProperty.call(message, "thumbnailSha256")) + writer.uint32(/* id 20, wireType 2 =*/162).bytes(message.thumbnailSha256); + if (message.thumbnailEncSha256 != null && Object.hasOwnProperty.call(message, "thumbnailEncSha256")) + writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.thumbnailEncSha256); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 22, wireType 2 =*/178).bytes(message.mediaKey); + if (message.mediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "mediaKeyTimestamp")) + writer.uint32(/* id 23, wireType 0 =*/184).int64(message.mediaKeyTimestamp); + if (message.thumbnailHeight != null && Object.hasOwnProperty.call(message, "thumbnailHeight")) + writer.uint32(/* id 24, wireType 0 =*/192).uint32(message.thumbnailHeight); + if (message.thumbnailWidth != null && Object.hasOwnProperty.call(message, "thumbnailWidth")) + writer.uint32(/* id 25, wireType 0 =*/200).uint32(message.thumbnailWidth); + if (message.inviteLinkGroupType != null && Object.hasOwnProperty.call(message, "inviteLinkGroupType")) + writer.uint32(/* id 26, wireType 0 =*/208).int32(message.inviteLinkGroupType); + if (message.inviteLinkParentGroupSubjectV2 != null && Object.hasOwnProperty.call(message, "inviteLinkParentGroupSubjectV2")) + writer.uint32(/* id 27, wireType 2 =*/218).string(message.inviteLinkParentGroupSubjectV2); + if (message.inviteLinkParentGroupThumbnailV2 != null && Object.hasOwnProperty.call(message, "inviteLinkParentGroupThumbnailV2")) + writer.uint32(/* id 28, wireType 2 =*/226).bytes(message.inviteLinkParentGroupThumbnailV2); + if (message.inviteLinkGroupTypeV2 != null && Object.hasOwnProperty.call(message, "inviteLinkGroupTypeV2")) + writer.uint32(/* id 29, wireType 0 =*/232).int32(message.inviteLinkGroupTypeV2); + if (message.viewOnce != null && Object.hasOwnProperty.call(message, "viewOnce")) + writer.uint32(/* id 30, wireType 0 =*/240).bool(message.viewOnce); + return writer; + }; + + /** + * Encodes the specified ExtendedTextMessage message, length delimited. Does not implicitly {@link proto.Message.ExtendedTextMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {proto.Message.IExtendedTextMessage} message ExtendedTextMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ExtendedTextMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ExtendedTextMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ExtendedTextMessage} ExtendedTextMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExtendedTextMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ExtendedTextMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.text = reader.string(); + break; + case 2: + message.matchedText = reader.string(); + break; + case 4: + message.canonicalUrl = reader.string(); + break; + case 5: + message.description = reader.string(); + break; + case 6: + message.title = reader.string(); + break; + case 7: + message.textArgb = reader.fixed32(); + break; + case 8: + message.backgroundArgb = reader.fixed32(); + break; + case 9: + message.font = reader.int32(); + break; + case 10: + message.previewType = reader.int32(); + break; + case 16: + message.jpegThumbnail = reader.bytes(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 18: + message.doNotPlayInline = reader.bool(); + break; + case 19: + message.thumbnailDirectPath = reader.string(); + break; + case 20: + message.thumbnailSha256 = reader.bytes(); + break; + case 21: + message.thumbnailEncSha256 = reader.bytes(); + break; + case 22: + message.mediaKey = reader.bytes(); + break; + case 23: + message.mediaKeyTimestamp = reader.int64(); + break; + case 24: + message.thumbnailHeight = reader.uint32(); + break; + case 25: + message.thumbnailWidth = reader.uint32(); + break; + case 26: + message.inviteLinkGroupType = reader.int32(); + break; + case 27: + message.inviteLinkParentGroupSubjectV2 = reader.string(); + break; + case 28: + message.inviteLinkParentGroupThumbnailV2 = reader.bytes(); + break; + case 29: + message.inviteLinkGroupTypeV2 = reader.int32(); + break; + case 30: + message.viewOnce = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ExtendedTextMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ExtendedTextMessage} ExtendedTextMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ExtendedTextMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ExtendedTextMessage message. + * @function verify + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ExtendedTextMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + if (message.matchedText != null && message.hasOwnProperty("matchedText")) + if (!$util.isString(message.matchedText)) + return "matchedText: string expected"; + if (message.canonicalUrl != null && message.hasOwnProperty("canonicalUrl")) + if (!$util.isString(message.canonicalUrl)) + return "canonicalUrl: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.textArgb != null && message.hasOwnProperty("textArgb")) + if (!$util.isInteger(message.textArgb)) + return "textArgb: integer expected"; + if (message.backgroundArgb != null && message.hasOwnProperty("backgroundArgb")) + if (!$util.isInteger(message.backgroundArgb)) + return "backgroundArgb: integer expected"; + if (message.font != null && message.hasOwnProperty("font")) + switch (message.font) { + default: + return "font: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } + if (message.previewType != null && message.hasOwnProperty("previewType")) + switch (message.previewType) { + default: + return "previewType: enum value expected"; + case 0: + case 1: + break; + } + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.doNotPlayInline != null && message.hasOwnProperty("doNotPlayInline")) + if (typeof message.doNotPlayInline !== "boolean") + return "doNotPlayInline: boolean expected"; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + if (!$util.isString(message.thumbnailDirectPath)) + return "thumbnailDirectPath: string expected"; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + if (!(message.thumbnailSha256 && typeof message.thumbnailSha256.length === "number" || $util.isString(message.thumbnailSha256))) + return "thumbnailSha256: buffer expected"; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + if (!(message.thumbnailEncSha256 && typeof message.thumbnailEncSha256.length === "number" || $util.isString(message.thumbnailEncSha256))) + return "thumbnailEncSha256: buffer expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (!$util.isInteger(message.mediaKeyTimestamp) && !(message.mediaKeyTimestamp && $util.isInteger(message.mediaKeyTimestamp.low) && $util.isInteger(message.mediaKeyTimestamp.high))) + return "mediaKeyTimestamp: integer|Long expected"; + if (message.thumbnailHeight != null && message.hasOwnProperty("thumbnailHeight")) + if (!$util.isInteger(message.thumbnailHeight)) + return "thumbnailHeight: integer expected"; + if (message.thumbnailWidth != null && message.hasOwnProperty("thumbnailWidth")) + if (!$util.isInteger(message.thumbnailWidth)) + return "thumbnailWidth: integer expected"; + if (message.inviteLinkGroupType != null && message.hasOwnProperty("inviteLinkGroupType")) + switch (message.inviteLinkGroupType) { + default: + return "inviteLinkGroupType: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.inviteLinkParentGroupSubjectV2 != null && message.hasOwnProperty("inviteLinkParentGroupSubjectV2")) + if (!$util.isString(message.inviteLinkParentGroupSubjectV2)) + return "inviteLinkParentGroupSubjectV2: string expected"; + if (message.inviteLinkParentGroupThumbnailV2 != null && message.hasOwnProperty("inviteLinkParentGroupThumbnailV2")) + if (!(message.inviteLinkParentGroupThumbnailV2 && typeof message.inviteLinkParentGroupThumbnailV2.length === "number" || $util.isString(message.inviteLinkParentGroupThumbnailV2))) + return "inviteLinkParentGroupThumbnailV2: buffer expected"; + if (message.inviteLinkGroupTypeV2 != null && message.hasOwnProperty("inviteLinkGroupTypeV2")) + switch (message.inviteLinkGroupTypeV2) { + default: + return "inviteLinkGroupTypeV2: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.viewOnce != null && message.hasOwnProperty("viewOnce")) + if (typeof message.viewOnce !== "boolean") + return "viewOnce: boolean expected"; + return null; + }; + + /** + * Creates an ExtendedTextMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ExtendedTextMessage} ExtendedTextMessage + */ + ExtendedTextMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ExtendedTextMessage) + return object; + var message = new $root.proto.Message.ExtendedTextMessage(); + if (object.text != null) + message.text = String(object.text); + if (object.matchedText != null) + message.matchedText = String(object.matchedText); + if (object.canonicalUrl != null) + message.canonicalUrl = String(object.canonicalUrl); + if (object.description != null) + message.description = String(object.description); + if (object.title != null) + message.title = String(object.title); + if (object.textArgb != null) + message.textArgb = object.textArgb >>> 0; + if (object.backgroundArgb != null) + message.backgroundArgb = object.backgroundArgb >>> 0; + switch (object.font) { + case "SANS_SERIF": + case 0: + message.font = 0; + break; + case "SERIF": + case 1: + message.font = 1; + break; + case "NORICAN_REGULAR": + case 2: + message.font = 2; + break; + case "BRYNDAN_WRITE": + case 3: + message.font = 3; + break; + case "BEBASNEUE_REGULAR": + case 4: + message.font = 4; + break; + case "OSWALD_HEAVY": + case 5: + message.font = 5; + break; + } + switch (object.previewType) { + case "NONE": + case 0: + message.previewType = 0; + break; + case "VIDEO": + case 1: + message.previewType = 1; + break; + } + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ExtendedTextMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.doNotPlayInline != null) + message.doNotPlayInline = Boolean(object.doNotPlayInline); + if (object.thumbnailDirectPath != null) + message.thumbnailDirectPath = String(object.thumbnailDirectPath); + if (object.thumbnailSha256 != null) + if (typeof object.thumbnailSha256 === "string") + $util.base64.decode(object.thumbnailSha256, message.thumbnailSha256 = $util.newBuffer($util.base64.length(object.thumbnailSha256)), 0); + else if (object.thumbnailSha256.length) + message.thumbnailSha256 = object.thumbnailSha256; + if (object.thumbnailEncSha256 != null) + if (typeof object.thumbnailEncSha256 === "string") + $util.base64.decode(object.thumbnailEncSha256, message.thumbnailEncSha256 = $util.newBuffer($util.base64.length(object.thumbnailEncSha256)), 0); + else if (object.thumbnailEncSha256.length) + message.thumbnailEncSha256 = object.thumbnailEncSha256; + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.mediaKeyTimestamp != null) + if ($util.Long) + (message.mediaKeyTimestamp = $util.Long.fromValue(object.mediaKeyTimestamp)).unsigned = false; + else if (typeof object.mediaKeyTimestamp === "string") + message.mediaKeyTimestamp = parseInt(object.mediaKeyTimestamp, 10); + else if (typeof object.mediaKeyTimestamp === "number") + message.mediaKeyTimestamp = object.mediaKeyTimestamp; + else if (typeof object.mediaKeyTimestamp === "object") + message.mediaKeyTimestamp = new $util.LongBits(object.mediaKeyTimestamp.low >>> 0, object.mediaKeyTimestamp.high >>> 0).toNumber(); + if (object.thumbnailHeight != null) + message.thumbnailHeight = object.thumbnailHeight >>> 0; + if (object.thumbnailWidth != null) + message.thumbnailWidth = object.thumbnailWidth >>> 0; + switch (object.inviteLinkGroupType) { + case "DEFAULT": + case 0: + message.inviteLinkGroupType = 0; + break; + case "PARENT": + case 1: + message.inviteLinkGroupType = 1; + break; + case "SUB": + case 2: + message.inviteLinkGroupType = 2; + break; + case "DEFAULT_SUB": + case 3: + message.inviteLinkGroupType = 3; + break; + } + if (object.inviteLinkParentGroupSubjectV2 != null) + message.inviteLinkParentGroupSubjectV2 = String(object.inviteLinkParentGroupSubjectV2); + if (object.inviteLinkParentGroupThumbnailV2 != null) + if (typeof object.inviteLinkParentGroupThumbnailV2 === "string") + $util.base64.decode(object.inviteLinkParentGroupThumbnailV2, message.inviteLinkParentGroupThumbnailV2 = $util.newBuffer($util.base64.length(object.inviteLinkParentGroupThumbnailV2)), 0); + else if (object.inviteLinkParentGroupThumbnailV2.length) + message.inviteLinkParentGroupThumbnailV2 = object.inviteLinkParentGroupThumbnailV2; + switch (object.inviteLinkGroupTypeV2) { + case "DEFAULT": + case 0: + message.inviteLinkGroupTypeV2 = 0; + break; + case "PARENT": + case 1: + message.inviteLinkGroupTypeV2 = 1; + break; + case "SUB": + case 2: + message.inviteLinkGroupTypeV2 = 2; + break; + case "DEFAULT_SUB": + case 3: + message.inviteLinkGroupTypeV2 = 3; + break; + } + if (object.viewOnce != null) + message.viewOnce = Boolean(object.viewOnce); + return message; + }; + + /** + * Creates a plain object from an ExtendedTextMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ExtendedTextMessage + * @static + * @param {proto.Message.ExtendedTextMessage} message ExtendedTextMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ExtendedTextMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.text = ""; + object.matchedText = ""; + object.canonicalUrl = ""; + object.description = ""; + object.title = ""; + object.textArgb = 0; + object.backgroundArgb = 0; + object.font = options.enums === String ? "SANS_SERIF" : 0; + object.previewType = options.enums === String ? "NONE" : 0; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.contextInfo = null; + object.doNotPlayInline = false; + object.thumbnailDirectPath = ""; + if (options.bytes === String) + object.thumbnailSha256 = ""; + else { + object.thumbnailSha256 = []; + if (options.bytes !== Array) + object.thumbnailSha256 = $util.newBuffer(object.thumbnailSha256); + } + if (options.bytes === String) + object.thumbnailEncSha256 = ""; + else { + object.thumbnailEncSha256 = []; + if (options.bytes !== Array) + object.thumbnailEncSha256 = $util.newBuffer(object.thumbnailEncSha256); + } + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.mediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.mediaKeyTimestamp = options.longs === String ? "0" : 0; + object.thumbnailHeight = 0; + object.thumbnailWidth = 0; + object.inviteLinkGroupType = options.enums === String ? "DEFAULT" : 0; + object.inviteLinkParentGroupSubjectV2 = ""; + if (options.bytes === String) + object.inviteLinkParentGroupThumbnailV2 = ""; + else { + object.inviteLinkParentGroupThumbnailV2 = []; + if (options.bytes !== Array) + object.inviteLinkParentGroupThumbnailV2 = $util.newBuffer(object.inviteLinkParentGroupThumbnailV2); + } + object.inviteLinkGroupTypeV2 = options.enums === String ? "DEFAULT" : 0; + object.viewOnce = false; + } + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + if (message.matchedText != null && message.hasOwnProperty("matchedText")) + object.matchedText = message.matchedText; + if (message.canonicalUrl != null && message.hasOwnProperty("canonicalUrl")) + object.canonicalUrl = message.canonicalUrl; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.textArgb != null && message.hasOwnProperty("textArgb")) + object.textArgb = message.textArgb; + if (message.backgroundArgb != null && message.hasOwnProperty("backgroundArgb")) + object.backgroundArgb = message.backgroundArgb; + if (message.font != null && message.hasOwnProperty("font")) + object.font = options.enums === String ? $root.proto.Message.ExtendedTextMessage.FontType[message.font] : message.font; + if (message.previewType != null && message.hasOwnProperty("previewType")) + object.previewType = options.enums === String ? $root.proto.Message.ExtendedTextMessage.PreviewType[message.previewType] : message.previewType; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.doNotPlayInline != null && message.hasOwnProperty("doNotPlayInline")) + object.doNotPlayInline = message.doNotPlayInline; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + object.thumbnailDirectPath = message.thumbnailDirectPath; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + object.thumbnailSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailSha256, 0, message.thumbnailSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailSha256) : message.thumbnailSha256; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + object.thumbnailEncSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailEncSha256, 0, message.thumbnailEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailEncSha256) : message.thumbnailEncSha256; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (typeof message.mediaKeyTimestamp === "number") + object.mediaKeyTimestamp = options.longs === String ? String(message.mediaKeyTimestamp) : message.mediaKeyTimestamp; + else + object.mediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.mediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.mediaKeyTimestamp.low >>> 0, message.mediaKeyTimestamp.high >>> 0).toNumber() : message.mediaKeyTimestamp; + if (message.thumbnailHeight != null && message.hasOwnProperty("thumbnailHeight")) + object.thumbnailHeight = message.thumbnailHeight; + if (message.thumbnailWidth != null && message.hasOwnProperty("thumbnailWidth")) + object.thumbnailWidth = message.thumbnailWidth; + if (message.inviteLinkGroupType != null && message.hasOwnProperty("inviteLinkGroupType")) + object.inviteLinkGroupType = options.enums === String ? $root.proto.Message.ExtendedTextMessage.InviteLinkGroupType[message.inviteLinkGroupType] : message.inviteLinkGroupType; + if (message.inviteLinkParentGroupSubjectV2 != null && message.hasOwnProperty("inviteLinkParentGroupSubjectV2")) + object.inviteLinkParentGroupSubjectV2 = message.inviteLinkParentGroupSubjectV2; + if (message.inviteLinkParentGroupThumbnailV2 != null && message.hasOwnProperty("inviteLinkParentGroupThumbnailV2")) + object.inviteLinkParentGroupThumbnailV2 = options.bytes === String ? $util.base64.encode(message.inviteLinkParentGroupThumbnailV2, 0, message.inviteLinkParentGroupThumbnailV2.length) : options.bytes === Array ? Array.prototype.slice.call(message.inviteLinkParentGroupThumbnailV2) : message.inviteLinkParentGroupThumbnailV2; + if (message.inviteLinkGroupTypeV2 != null && message.hasOwnProperty("inviteLinkGroupTypeV2")) + object.inviteLinkGroupTypeV2 = options.enums === String ? $root.proto.Message.ExtendedTextMessage.InviteLinkGroupType[message.inviteLinkGroupTypeV2] : message.inviteLinkGroupTypeV2; + if (message.viewOnce != null && message.hasOwnProperty("viewOnce")) + object.viewOnce = message.viewOnce; + return object; + }; + + /** + * Converts this ExtendedTextMessage to JSON. + * @function toJSON + * @memberof proto.Message.ExtendedTextMessage + * @instance + * @returns {Object.} JSON object + */ + ExtendedTextMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * FontType enum. + * @name proto.Message.ExtendedTextMessage.FontType + * @enum {number} + * @property {number} SANS_SERIF=0 SANS_SERIF value + * @property {number} SERIF=1 SERIF value + * @property {number} NORICAN_REGULAR=2 NORICAN_REGULAR value + * @property {number} BRYNDAN_WRITE=3 BRYNDAN_WRITE value + * @property {number} BEBASNEUE_REGULAR=4 BEBASNEUE_REGULAR value + * @property {number} OSWALD_HEAVY=5 OSWALD_HEAVY value + */ + ExtendedTextMessage.FontType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "SANS_SERIF"] = 0; + values[valuesById[1] = "SERIF"] = 1; + values[valuesById[2] = "NORICAN_REGULAR"] = 2; + values[valuesById[3] = "BRYNDAN_WRITE"] = 3; + values[valuesById[4] = "BEBASNEUE_REGULAR"] = 4; + values[valuesById[5] = "OSWALD_HEAVY"] = 5; + return values; + })(); + + /** + * InviteLinkGroupType enum. + * @name proto.Message.ExtendedTextMessage.InviteLinkGroupType + * @enum {number} + * @property {number} DEFAULT=0 DEFAULT value + * @property {number} PARENT=1 PARENT value + * @property {number} SUB=2 SUB value + * @property {number} DEFAULT_SUB=3 DEFAULT_SUB value + */ + ExtendedTextMessage.InviteLinkGroupType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "DEFAULT"] = 0; + values[valuesById[1] = "PARENT"] = 1; + values[valuesById[2] = "SUB"] = 2; + values[valuesById[3] = "DEFAULT_SUB"] = 3; + return values; + })(); + + /** + * PreviewType enum. + * @name proto.Message.ExtendedTextMessage.PreviewType + * @enum {number} + * @property {number} NONE=0 NONE value + * @property {number} VIDEO=1 VIDEO value + */ + ExtendedTextMessage.PreviewType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "NONE"] = 0; + values[valuesById[1] = "VIDEO"] = 1; + return values; + })(); + + return ExtendedTextMessage; + })(); + + Message.FutureProofMessage = (function() { + + /** + * Properties of a FutureProofMessage. + * @memberof proto.Message + * @interface IFutureProofMessage + * @property {proto.IMessage|null} [message] FutureProofMessage message + */ + + /** + * Constructs a new FutureProofMessage. + * @memberof proto.Message + * @classdesc Represents a FutureProofMessage. + * @implements IFutureProofMessage + * @constructor + * @param {proto.Message.IFutureProofMessage=} [properties] Properties to set + */ + function FutureProofMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * FutureProofMessage message. + * @member {proto.IMessage|null|undefined} message + * @memberof proto.Message.FutureProofMessage + * @instance + */ + FutureProofMessage.prototype.message = null; + + /** + * Creates a new FutureProofMessage instance using the specified properties. + * @function create + * @memberof proto.Message.FutureProofMessage + * @static + * @param {proto.Message.IFutureProofMessage=} [properties] Properties to set + * @returns {proto.Message.FutureProofMessage} FutureProofMessage instance + */ + FutureProofMessage.create = function create(properties) { + return new FutureProofMessage(properties); + }; + + /** + * Encodes the specified FutureProofMessage message. Does not implicitly {@link proto.Message.FutureProofMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.FutureProofMessage + * @static + * @param {proto.Message.IFutureProofMessage} message FutureProofMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FutureProofMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + $root.proto.Message.encode(message.message, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified FutureProofMessage message, length delimited. Does not implicitly {@link proto.Message.FutureProofMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.FutureProofMessage + * @static + * @param {proto.Message.IFutureProofMessage} message FutureProofMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FutureProofMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a FutureProofMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.FutureProofMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.FutureProofMessage} FutureProofMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FutureProofMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.FutureProofMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.message = $root.proto.Message.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a FutureProofMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.FutureProofMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.FutureProofMessage} FutureProofMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FutureProofMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a FutureProofMessage message. + * @function verify + * @memberof proto.Message.FutureProofMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + FutureProofMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.message != null && message.hasOwnProperty("message")) { + var error = $root.proto.Message.verify(message.message); + if (error) + return "message." + error; + } + return null; + }; + + /** + * Creates a FutureProofMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.FutureProofMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.FutureProofMessage} FutureProofMessage + */ + FutureProofMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.FutureProofMessage) + return object; + var message = new $root.proto.Message.FutureProofMessage(); + if (object.message != null) { + if (typeof object.message !== "object") + throw TypeError(".proto.Message.FutureProofMessage.message: object expected"); + message.message = $root.proto.Message.fromObject(object.message); + } + return message; + }; + + /** + * Creates a plain object from a FutureProofMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.FutureProofMessage + * @static + * @param {proto.Message.FutureProofMessage} message FutureProofMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + FutureProofMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.message = null; + if (message.message != null && message.hasOwnProperty("message")) + object.message = $root.proto.Message.toObject(message.message, options); + return object; + }; + + /** + * Converts this FutureProofMessage to JSON. + * @function toJSON + * @memberof proto.Message.FutureProofMessage + * @instance + * @returns {Object.} JSON object + */ + FutureProofMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return FutureProofMessage; + })(); + + Message.GroupInviteMessage = (function() { + + /** + * Properties of a GroupInviteMessage. + * @memberof proto.Message + * @interface IGroupInviteMessage + * @property {string|null} [groupJid] GroupInviteMessage groupJid + * @property {string|null} [inviteCode] GroupInviteMessage inviteCode + * @property {number|Long|null} [inviteExpiration] GroupInviteMessage inviteExpiration + * @property {string|null} [groupName] GroupInviteMessage groupName + * @property {Uint8Array|null} [jpegThumbnail] GroupInviteMessage jpegThumbnail + * @property {string|null} [caption] GroupInviteMessage caption + * @property {proto.IContextInfo|null} [contextInfo] GroupInviteMessage contextInfo + * @property {proto.Message.GroupInviteMessage.GroupType|null} [groupType] GroupInviteMessage groupType + */ + + /** + * Constructs a new GroupInviteMessage. + * @memberof proto.Message + * @classdesc Represents a GroupInviteMessage. + * @implements IGroupInviteMessage + * @constructor + * @param {proto.Message.IGroupInviteMessage=} [properties] Properties to set + */ + function GroupInviteMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupInviteMessage groupJid. + * @member {string} groupJid + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.groupJid = ""; + + /** + * GroupInviteMessage inviteCode. + * @member {string} inviteCode + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.inviteCode = ""; + + /** + * GroupInviteMessage inviteExpiration. + * @member {number|Long} inviteExpiration + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.inviteExpiration = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * GroupInviteMessage groupName. + * @member {string} groupName + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.groupName = ""; + + /** + * GroupInviteMessage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * GroupInviteMessage caption. + * @member {string} caption + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.caption = ""; + + /** + * GroupInviteMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.contextInfo = null; + + /** + * GroupInviteMessage groupType. + * @member {proto.Message.GroupInviteMessage.GroupType} groupType + * @memberof proto.Message.GroupInviteMessage + * @instance + */ + GroupInviteMessage.prototype.groupType = 0; + + /** + * Creates a new GroupInviteMessage instance using the specified properties. + * @function create + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {proto.Message.IGroupInviteMessage=} [properties] Properties to set + * @returns {proto.Message.GroupInviteMessage} GroupInviteMessage instance + */ + GroupInviteMessage.create = function create(properties) { + return new GroupInviteMessage(properties); + }; + + /** + * Encodes the specified GroupInviteMessage message. Does not implicitly {@link proto.Message.GroupInviteMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {proto.Message.IGroupInviteMessage} message GroupInviteMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInviteMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupJid != null && Object.hasOwnProperty.call(message, "groupJid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.groupJid); + if (message.inviteCode != null && Object.hasOwnProperty.call(message, "inviteCode")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.inviteCode); + if (message.inviteExpiration != null && Object.hasOwnProperty.call(message, "inviteExpiration")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.inviteExpiration); + if (message.groupName != null && Object.hasOwnProperty.call(message, "groupName")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.groupName); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.jpegThumbnail); + if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.caption); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.groupType != null && Object.hasOwnProperty.call(message, "groupType")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.groupType); + return writer; + }; + + /** + * Encodes the specified GroupInviteMessage message, length delimited. Does not implicitly {@link proto.Message.GroupInviteMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {proto.Message.IGroupInviteMessage} message GroupInviteMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInviteMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupInviteMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.GroupInviteMessage} GroupInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInviteMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.GroupInviteMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupJid = reader.string(); + break; + case 2: + message.inviteCode = reader.string(); + break; + case 3: + message.inviteExpiration = reader.int64(); + break; + case 4: + message.groupName = reader.string(); + break; + case 5: + message.jpegThumbnail = reader.bytes(); + break; + case 6: + message.caption = reader.string(); + break; + case 7: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 8: + message.groupType = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupInviteMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.GroupInviteMessage} GroupInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInviteMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupInviteMessage message. + * @function verify + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupInviteMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.groupJid != null && message.hasOwnProperty("groupJid")) + if (!$util.isString(message.groupJid)) + return "groupJid: string expected"; + if (message.inviteCode != null && message.hasOwnProperty("inviteCode")) + if (!$util.isString(message.inviteCode)) + return "inviteCode: string expected"; + if (message.inviteExpiration != null && message.hasOwnProperty("inviteExpiration")) + if (!$util.isInteger(message.inviteExpiration) && !(message.inviteExpiration && $util.isInteger(message.inviteExpiration.low) && $util.isInteger(message.inviteExpiration.high))) + return "inviteExpiration: integer|Long expected"; + if (message.groupName != null && message.hasOwnProperty("groupName")) + if (!$util.isString(message.groupName)) + return "groupName: string expected"; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.caption != null && message.hasOwnProperty("caption")) + if (!$util.isString(message.caption)) + return "caption: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.groupType != null && message.hasOwnProperty("groupType")) + switch (message.groupType) { + default: + return "groupType: enum value expected"; + case 0: + case 1: + break; + } + return null; + }; + + /** + * Creates a GroupInviteMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.GroupInviteMessage} GroupInviteMessage + */ + GroupInviteMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.GroupInviteMessage) + return object; + var message = new $root.proto.Message.GroupInviteMessage(); + if (object.groupJid != null) + message.groupJid = String(object.groupJid); + if (object.inviteCode != null) + message.inviteCode = String(object.inviteCode); + if (object.inviteExpiration != null) + if ($util.Long) + (message.inviteExpiration = $util.Long.fromValue(object.inviteExpiration)).unsigned = false; + else if (typeof object.inviteExpiration === "string") + message.inviteExpiration = parseInt(object.inviteExpiration, 10); + else if (typeof object.inviteExpiration === "number") + message.inviteExpiration = object.inviteExpiration; + else if (typeof object.inviteExpiration === "object") + message.inviteExpiration = new $util.LongBits(object.inviteExpiration.low >>> 0, object.inviteExpiration.high >>> 0).toNumber(); + if (object.groupName != null) + message.groupName = String(object.groupName); + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.caption != null) + message.caption = String(object.caption); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.GroupInviteMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + switch (object.groupType) { + case "DEFAULT": + case 0: + message.groupType = 0; + break; + case "PARENT": + case 1: + message.groupType = 1; + break; + } + return message; + }; + + /** + * Creates a plain object from a GroupInviteMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.GroupInviteMessage + * @static + * @param {proto.Message.GroupInviteMessage} message GroupInviteMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + GroupInviteMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.groupJid = ""; + object.inviteCode = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.inviteExpiration = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.inviteExpiration = options.longs === String ? "0" : 0; + object.groupName = ""; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.caption = ""; + object.contextInfo = null; + object.groupType = options.enums === String ? "DEFAULT" : 0; + } + if (message.groupJid != null && message.hasOwnProperty("groupJid")) + object.groupJid = message.groupJid; + if (message.inviteCode != null && message.hasOwnProperty("inviteCode")) + object.inviteCode = message.inviteCode; + if (message.inviteExpiration != null && message.hasOwnProperty("inviteExpiration")) + if (typeof message.inviteExpiration === "number") + object.inviteExpiration = options.longs === String ? String(message.inviteExpiration) : message.inviteExpiration; + else + object.inviteExpiration = options.longs === String ? $util.Long.prototype.toString.call(message.inviteExpiration) : options.longs === Number ? new $util.LongBits(message.inviteExpiration.low >>> 0, message.inviteExpiration.high >>> 0).toNumber() : message.inviteExpiration; + if (message.groupName != null && message.hasOwnProperty("groupName")) + object.groupName = message.groupName; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.caption != null && message.hasOwnProperty("caption")) + object.caption = message.caption; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.groupType != null && message.hasOwnProperty("groupType")) + object.groupType = options.enums === String ? $root.proto.Message.GroupInviteMessage.GroupType[message.groupType] : message.groupType; + return object; + }; + + /** + * Converts this GroupInviteMessage to JSON. + * @function toJSON + * @memberof proto.Message.GroupInviteMessage + * @instance + * @returns {Object.} JSON object + */ + GroupInviteMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * GroupType enum. + * @name proto.Message.GroupInviteMessage.GroupType + * @enum {number} + * @property {number} DEFAULT=0 DEFAULT value + * @property {number} PARENT=1 PARENT value + */ + GroupInviteMessage.GroupType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "DEFAULT"] = 0; + values[valuesById[1] = "PARENT"] = 1; + return values; + })(); + + return GroupInviteMessage; + })(); + + Message.HighlyStructuredMessage = (function() { + + /** + * Properties of a HighlyStructuredMessage. + * @memberof proto.Message + * @interface IHighlyStructuredMessage + * @property {string|null} [namespace] HighlyStructuredMessage namespace + * @property {string|null} [elementName] HighlyStructuredMessage elementName + * @property {Array.|null} [params] HighlyStructuredMessage params + * @property {string|null} [fallbackLg] HighlyStructuredMessage fallbackLg + * @property {string|null} [fallbackLc] HighlyStructuredMessage fallbackLc + * @property {Array.|null} [localizableParams] HighlyStructuredMessage localizableParams + * @property {string|null} [deterministicLg] HighlyStructuredMessage deterministicLg + * @property {string|null} [deterministicLc] HighlyStructuredMessage deterministicLc + * @property {proto.Message.ITemplateMessage|null} [hydratedHsm] HighlyStructuredMessage hydratedHsm + */ + + /** + * Constructs a new HighlyStructuredMessage. + * @memberof proto.Message + * @classdesc Represents a HighlyStructuredMessage. + * @implements IHighlyStructuredMessage + * @constructor + * @param {proto.Message.IHighlyStructuredMessage=} [properties] Properties to set + */ + function HighlyStructuredMessage(properties) { + this.params = []; + this.localizableParams = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HighlyStructuredMessage namespace. + * @member {string} namespace + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.namespace = ""; + + /** + * HighlyStructuredMessage elementName. + * @member {string} elementName + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.elementName = ""; + + /** + * HighlyStructuredMessage params. + * @member {Array.} params + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.params = $util.emptyArray; + + /** + * HighlyStructuredMessage fallbackLg. + * @member {string} fallbackLg + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.fallbackLg = ""; + + /** + * HighlyStructuredMessage fallbackLc. + * @member {string} fallbackLc + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.fallbackLc = ""; + + /** + * HighlyStructuredMessage localizableParams. + * @member {Array.} localizableParams + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.localizableParams = $util.emptyArray; + + /** + * HighlyStructuredMessage deterministicLg. + * @member {string} deterministicLg + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.deterministicLg = ""; + + /** + * HighlyStructuredMessage deterministicLc. + * @member {string} deterministicLc + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.deterministicLc = ""; + + /** + * HighlyStructuredMessage hydratedHsm. + * @member {proto.Message.ITemplateMessage|null|undefined} hydratedHsm + * @memberof proto.Message.HighlyStructuredMessage + * @instance + */ + HighlyStructuredMessage.prototype.hydratedHsm = null; + + /** + * Creates a new HighlyStructuredMessage instance using the specified properties. + * @function create + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {proto.Message.IHighlyStructuredMessage=} [properties] Properties to set + * @returns {proto.Message.HighlyStructuredMessage} HighlyStructuredMessage instance + */ + HighlyStructuredMessage.create = function create(properties) { + return new HighlyStructuredMessage(properties); + }; + + /** + * Encodes the specified HighlyStructuredMessage message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {proto.Message.IHighlyStructuredMessage} message HighlyStructuredMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HighlyStructuredMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.namespace != null && Object.hasOwnProperty.call(message, "namespace")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.namespace); + if (message.elementName != null && Object.hasOwnProperty.call(message, "elementName")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.elementName); + if (message.params != null && message.params.length) + for (var i = 0; i < message.params.length; ++i) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.params[i]); + if (message.fallbackLg != null && Object.hasOwnProperty.call(message, "fallbackLg")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.fallbackLg); + if (message.fallbackLc != null && Object.hasOwnProperty.call(message, "fallbackLc")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.fallbackLc); + if (message.localizableParams != null && message.localizableParams.length) + for (var i = 0; i < message.localizableParams.length; ++i) + $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.encode(message.localizableParams[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.deterministicLg != null && Object.hasOwnProperty.call(message, "deterministicLg")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.deterministicLg); + if (message.deterministicLc != null && Object.hasOwnProperty.call(message, "deterministicLc")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.deterministicLc); + if (message.hydratedHsm != null && Object.hasOwnProperty.call(message, "hydratedHsm")) + $root.proto.Message.TemplateMessage.encode(message.hydratedHsm, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified HighlyStructuredMessage message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {proto.Message.IHighlyStructuredMessage} message HighlyStructuredMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HighlyStructuredMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HighlyStructuredMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.HighlyStructuredMessage} HighlyStructuredMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HighlyStructuredMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.HighlyStructuredMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.namespace = reader.string(); + break; + case 2: + message.elementName = reader.string(); + break; + case 3: + if (!(message.params && message.params.length)) + message.params = []; + message.params.push(reader.string()); + break; + case 4: + message.fallbackLg = reader.string(); + break; + case 5: + message.fallbackLc = reader.string(); + break; + case 6: + if (!(message.localizableParams && message.localizableParams.length)) + message.localizableParams = []; + message.localizableParams.push($root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.decode(reader, reader.uint32())); + break; + case 7: + message.deterministicLg = reader.string(); + break; + case 8: + message.deterministicLc = reader.string(); + break; + case 9: + message.hydratedHsm = $root.proto.Message.TemplateMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HighlyStructuredMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.HighlyStructuredMessage} HighlyStructuredMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HighlyStructuredMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HighlyStructuredMessage message. + * @function verify + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HighlyStructuredMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.namespace != null && message.hasOwnProperty("namespace")) + if (!$util.isString(message.namespace)) + return "namespace: string expected"; + if (message.elementName != null && message.hasOwnProperty("elementName")) + if (!$util.isString(message.elementName)) + return "elementName: string expected"; + if (message.params != null && message.hasOwnProperty("params")) { + if (!Array.isArray(message.params)) + return "params: array expected"; + for (var i = 0; i < message.params.length; ++i) + if (!$util.isString(message.params[i])) + return "params: string[] expected"; + } + if (message.fallbackLg != null && message.hasOwnProperty("fallbackLg")) + if (!$util.isString(message.fallbackLg)) + return "fallbackLg: string expected"; + if (message.fallbackLc != null && message.hasOwnProperty("fallbackLc")) + if (!$util.isString(message.fallbackLc)) + return "fallbackLc: string expected"; + if (message.localizableParams != null && message.hasOwnProperty("localizableParams")) { + if (!Array.isArray(message.localizableParams)) + return "localizableParams: array expected"; + for (var i = 0; i < message.localizableParams.length; ++i) { + var error = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.verify(message.localizableParams[i]); + if (error) + return "localizableParams." + error; + } + } + if (message.deterministicLg != null && message.hasOwnProperty("deterministicLg")) + if (!$util.isString(message.deterministicLg)) + return "deterministicLg: string expected"; + if (message.deterministicLc != null && message.hasOwnProperty("deterministicLc")) + if (!$util.isString(message.deterministicLc)) + return "deterministicLc: string expected"; + if (message.hydratedHsm != null && message.hasOwnProperty("hydratedHsm")) { + var error = $root.proto.Message.TemplateMessage.verify(message.hydratedHsm); + if (error) + return "hydratedHsm." + error; + } + return null; + }; + + /** + * Creates a HighlyStructuredMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.HighlyStructuredMessage} HighlyStructuredMessage + */ + HighlyStructuredMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.HighlyStructuredMessage) + return object; + var message = new $root.proto.Message.HighlyStructuredMessage(); + if (object.namespace != null) + message.namespace = String(object.namespace); + if (object.elementName != null) + message.elementName = String(object.elementName); + if (object.params) { + if (!Array.isArray(object.params)) + throw TypeError(".proto.Message.HighlyStructuredMessage.params: array expected"); + message.params = []; + for (var i = 0; i < object.params.length; ++i) + message.params[i] = String(object.params[i]); + } + if (object.fallbackLg != null) + message.fallbackLg = String(object.fallbackLg); + if (object.fallbackLc != null) + message.fallbackLc = String(object.fallbackLc); + if (object.localizableParams) { + if (!Array.isArray(object.localizableParams)) + throw TypeError(".proto.Message.HighlyStructuredMessage.localizableParams: array expected"); + message.localizableParams = []; + for (var i = 0; i < object.localizableParams.length; ++i) { + if (typeof object.localizableParams[i] !== "object") + throw TypeError(".proto.Message.HighlyStructuredMessage.localizableParams: object expected"); + message.localizableParams[i] = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.fromObject(object.localizableParams[i]); + } + } + if (object.deterministicLg != null) + message.deterministicLg = String(object.deterministicLg); + if (object.deterministicLc != null) + message.deterministicLc = String(object.deterministicLc); + if (object.hydratedHsm != null) { + if (typeof object.hydratedHsm !== "object") + throw TypeError(".proto.Message.HighlyStructuredMessage.hydratedHsm: object expected"); + message.hydratedHsm = $root.proto.Message.TemplateMessage.fromObject(object.hydratedHsm); + } + return message; + }; + + /** + * Creates a plain object from a HighlyStructuredMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.HighlyStructuredMessage + * @static + * @param {proto.Message.HighlyStructuredMessage} message HighlyStructuredMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HighlyStructuredMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.params = []; + object.localizableParams = []; + } + if (options.defaults) { + object.namespace = ""; + object.elementName = ""; + object.fallbackLg = ""; + object.fallbackLc = ""; + object.deterministicLg = ""; + object.deterministicLc = ""; + object.hydratedHsm = null; + } + if (message.namespace != null && message.hasOwnProperty("namespace")) + object.namespace = message.namespace; + if (message.elementName != null && message.hasOwnProperty("elementName")) + object.elementName = message.elementName; + if (message.params && message.params.length) { + object.params = []; + for (var j = 0; j < message.params.length; ++j) + object.params[j] = message.params[j]; + } + if (message.fallbackLg != null && message.hasOwnProperty("fallbackLg")) + object.fallbackLg = message.fallbackLg; + if (message.fallbackLc != null && message.hasOwnProperty("fallbackLc")) + object.fallbackLc = message.fallbackLc; + if (message.localizableParams && message.localizableParams.length) { + object.localizableParams = []; + for (var j = 0; j < message.localizableParams.length; ++j) + object.localizableParams[j] = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.toObject(message.localizableParams[j], options); + } + if (message.deterministicLg != null && message.hasOwnProperty("deterministicLg")) + object.deterministicLg = message.deterministicLg; + if (message.deterministicLc != null && message.hasOwnProperty("deterministicLc")) + object.deterministicLc = message.deterministicLc; + if (message.hydratedHsm != null && message.hasOwnProperty("hydratedHsm")) + object.hydratedHsm = $root.proto.Message.TemplateMessage.toObject(message.hydratedHsm, options); + return object; + }; + + /** + * Converts this HighlyStructuredMessage to JSON. + * @function toJSON + * @memberof proto.Message.HighlyStructuredMessage + * @instance + * @returns {Object.} JSON object + */ + HighlyStructuredMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + HighlyStructuredMessage.HSMLocalizableParameter = (function() { + + /** + * Properties of a HSMLocalizableParameter. + * @memberof proto.Message.HighlyStructuredMessage + * @interface IHSMLocalizableParameter + * @property {string|null} ["default"] HSMLocalizableParameter default + * @property {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency|null} [currency] HSMLocalizableParameter currency + * @property {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime|null} [dateTime] HSMLocalizableParameter dateTime + */ + + /** + * Constructs a new HSMLocalizableParameter. + * @memberof proto.Message.HighlyStructuredMessage + * @classdesc Represents a HSMLocalizableParameter. + * @implements IHSMLocalizableParameter + * @constructor + * @param {proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter=} [properties] Properties to set + */ + function HSMLocalizableParameter(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HSMLocalizableParameter default. + * @member {string} default + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @instance + */ + HSMLocalizableParameter.prototype["default"] = ""; + + /** + * HSMLocalizableParameter currency. + * @member {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency|null|undefined} currency + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @instance + */ + HSMLocalizableParameter.prototype.currency = null; + + /** + * HSMLocalizableParameter dateTime. + * @member {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime|null|undefined} dateTime + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @instance + */ + HSMLocalizableParameter.prototype.dateTime = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * HSMLocalizableParameter paramOneof. + * @member {"currency"|"dateTime"|undefined} paramOneof + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @instance + */ + Object.defineProperty(HSMLocalizableParameter.prototype, "paramOneof", { + get: $util.oneOfGetter($oneOfFields = ["currency", "dateTime"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new HSMLocalizableParameter instance using the specified properties. + * @function create + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter=} [properties] Properties to set + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter} HSMLocalizableParameter instance + */ + HSMLocalizableParameter.create = function create(properties) { + return new HSMLocalizableParameter(properties); + }; + + /** + * Encodes the specified HSMLocalizableParameter message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.verify|verify} messages. + * @function encode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter} message HSMLocalizableParameter message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMLocalizableParameter.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message["default"] != null && Object.hasOwnProperty.call(message, "default")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message["default"]); + if (message.currency != null && Object.hasOwnProperty.call(message, "currency")) + $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.encode(message.currency, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.dateTime != null && Object.hasOwnProperty.call(message, "dateTime")) + $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.encode(message.dateTime, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified HSMLocalizableParameter message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {proto.Message.HighlyStructuredMessage.IHSMLocalizableParameter} message HSMLocalizableParameter message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMLocalizableParameter.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HSMLocalizableParameter message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter} HSMLocalizableParameter + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMLocalizableParameter.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message["default"] = reader.string(); + break; + case 2: + message.currency = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.decode(reader, reader.uint32()); + break; + case 3: + message.dateTime = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HSMLocalizableParameter message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter} HSMLocalizableParameter + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMLocalizableParameter.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HSMLocalizableParameter message. + * @function verify + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HSMLocalizableParameter.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message["default"] != null && message.hasOwnProperty("default")) + if (!$util.isString(message["default"])) + return "default: string expected"; + if (message.currency != null && message.hasOwnProperty("currency")) { + properties.paramOneof = 1; + { + var error = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.verify(message.currency); + if (error) + return "currency." + error; + } + } + if (message.dateTime != null && message.hasOwnProperty("dateTime")) { + if (properties.paramOneof === 1) + return "paramOneof: multiple values"; + properties.paramOneof = 1; + { + var error = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.verify(message.dateTime); + if (error) + return "dateTime." + error; + } + } + return null; + }; + + /** + * Creates a HSMLocalizableParameter message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter} HSMLocalizableParameter + */ + HSMLocalizableParameter.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter) + return object; + var message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter(); + if (object["default"] != null) + message["default"] = String(object["default"]); + if (object.currency != null) { + if (typeof object.currency !== "object") + throw TypeError(".proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.currency: object expected"); + message.currency = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.fromObject(object.currency); + } + if (object.dateTime != null) { + if (typeof object.dateTime !== "object") + throw TypeError(".proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.dateTime: object expected"); + message.dateTime = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.fromObject(object.dateTime); + } + return message; + }; + + /** + * Creates a plain object from a HSMLocalizableParameter message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter} message HSMLocalizableParameter + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HSMLocalizableParameter.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object["default"] = ""; + if (message["default"] != null && message.hasOwnProperty("default")) + object["default"] = message["default"]; + if (message.currency != null && message.hasOwnProperty("currency")) { + object.currency = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.toObject(message.currency, options); + if (options.oneofs) + object.paramOneof = "currency"; + } + if (message.dateTime != null && message.hasOwnProperty("dateTime")) { + object.dateTime = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.toObject(message.dateTime, options); + if (options.oneofs) + object.paramOneof = "dateTime"; + } + return object; + }; + + /** + * Converts this HSMLocalizableParameter to JSON. + * @function toJSON + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @instance + * @returns {Object.} JSON object + */ + HSMLocalizableParameter.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + HSMLocalizableParameter.HSMCurrency = (function() { + + /** + * Properties of a HSMCurrency. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @interface IHSMCurrency + * @property {string|null} [currencyCode] HSMCurrency currencyCode + * @property {number|Long|null} [amount1000] HSMCurrency amount1000 + */ + + /** + * Constructs a new HSMCurrency. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @classdesc Represents a HSMCurrency. + * @implements IHSMCurrency + * @constructor + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency=} [properties] Properties to set + */ + function HSMCurrency(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HSMCurrency currencyCode. + * @member {string} currencyCode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @instance + */ + HSMCurrency.prototype.currencyCode = ""; + + /** + * HSMCurrency amount1000. + * @member {number|Long} amount1000 + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @instance + */ + HSMCurrency.prototype.amount1000 = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new HSMCurrency instance using the specified properties. + * @function create + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency=} [properties] Properties to set + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency} HSMCurrency instance + */ + HSMCurrency.create = function create(properties) { + return new HSMCurrency(properties); + }; + + /** + * Encodes the specified HSMCurrency message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.verify|verify} messages. + * @function encode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency} message HSMCurrency message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMCurrency.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.currencyCode != null && Object.hasOwnProperty.call(message, "currencyCode")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.currencyCode); + if (message.amount1000 != null && Object.hasOwnProperty.call(message, "amount1000")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.amount1000); + return writer; + }; + + /** + * Encodes the specified HSMCurrency message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMCurrency} message HSMCurrency message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMCurrency.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HSMCurrency message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency} HSMCurrency + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMCurrency.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.currencyCode = reader.string(); + break; + case 2: + message.amount1000 = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HSMCurrency message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency} HSMCurrency + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMCurrency.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HSMCurrency message. + * @function verify + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HSMCurrency.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.currencyCode != null && message.hasOwnProperty("currencyCode")) + if (!$util.isString(message.currencyCode)) + return "currencyCode: string expected"; + if (message.amount1000 != null && message.hasOwnProperty("amount1000")) + if (!$util.isInteger(message.amount1000) && !(message.amount1000 && $util.isInteger(message.amount1000.low) && $util.isInteger(message.amount1000.high))) + return "amount1000: integer|Long expected"; + return null; + }; + + /** + * Creates a HSMCurrency message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency} HSMCurrency + */ + HSMCurrency.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency) + return object; + var message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency(); + if (object.currencyCode != null) + message.currencyCode = String(object.currencyCode); + if (object.amount1000 != null) + if ($util.Long) + (message.amount1000 = $util.Long.fromValue(object.amount1000)).unsigned = false; + else if (typeof object.amount1000 === "string") + message.amount1000 = parseInt(object.amount1000, 10); + else if (typeof object.amount1000 === "number") + message.amount1000 = object.amount1000; + else if (typeof object.amount1000 === "object") + message.amount1000 = new $util.LongBits(object.amount1000.low >>> 0, object.amount1000.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a HSMCurrency message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency} message HSMCurrency + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HSMCurrency.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.currencyCode = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.amount1000 = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount1000 = options.longs === String ? "0" : 0; + } + if (message.currencyCode != null && message.hasOwnProperty("currencyCode")) + object.currencyCode = message.currencyCode; + if (message.amount1000 != null && message.hasOwnProperty("amount1000")) + if (typeof message.amount1000 === "number") + object.amount1000 = options.longs === String ? String(message.amount1000) : message.amount1000; + else + object.amount1000 = options.longs === String ? $util.Long.prototype.toString.call(message.amount1000) : options.longs === Number ? new $util.LongBits(message.amount1000.low >>> 0, message.amount1000.high >>> 0).toNumber() : message.amount1000; + return object; + }; + + /** + * Converts this HSMCurrency to JSON. + * @function toJSON + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMCurrency + * @instance + * @returns {Object.} JSON object + */ + HSMCurrency.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HSMCurrency; + })(); + + HSMLocalizableParameter.HSMDateTime = (function() { + + /** + * Properties of a HSMDateTime. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @interface IHSMDateTime + * @property {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent|null} [component] HSMDateTime component + * @property {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch|null} [unixEpoch] HSMDateTime unixEpoch + */ + + /** + * Constructs a new HSMDateTime. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter + * @classdesc Represents a HSMDateTime. + * @implements IHSMDateTime + * @constructor + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime=} [properties] Properties to set + */ + function HSMDateTime(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HSMDateTime component. + * @member {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent|null|undefined} component + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @instance + */ + HSMDateTime.prototype.component = null; + + /** + * HSMDateTime unixEpoch. + * @member {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch|null|undefined} unixEpoch + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @instance + */ + HSMDateTime.prototype.unixEpoch = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * HSMDateTime datetimeOneof. + * @member {"component"|"unixEpoch"|undefined} datetimeOneof + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @instance + */ + Object.defineProperty(HSMDateTime.prototype, "datetimeOneof", { + get: $util.oneOfGetter($oneOfFields = ["component", "unixEpoch"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new HSMDateTime instance using the specified properties. + * @function create + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime=} [properties] Properties to set + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime} HSMDateTime instance + */ + HSMDateTime.create = function create(properties) { + return new HSMDateTime(properties); + }; + + /** + * Encodes the specified HSMDateTime message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.verify|verify} messages. + * @function encode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime} message HSMDateTime message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMDateTime.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.component != null && Object.hasOwnProperty.call(message, "component")) + $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.encode(message.component, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.unixEpoch != null && Object.hasOwnProperty.call(message, "unixEpoch")) + $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.encode(message.unixEpoch, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified HSMDateTime message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.IHSMDateTime} message HSMDateTime message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMDateTime.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HSMDateTime message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime} HSMDateTime + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMDateTime.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.component = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.decode(reader, reader.uint32()); + break; + case 2: + message.unixEpoch = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HSMDateTime message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime} HSMDateTime + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMDateTime.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HSMDateTime message. + * @function verify + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HSMDateTime.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.component != null && message.hasOwnProperty("component")) { + properties.datetimeOneof = 1; + { + var error = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.verify(message.component); + if (error) + return "component." + error; + } + } + if (message.unixEpoch != null && message.hasOwnProperty("unixEpoch")) { + if (properties.datetimeOneof === 1) + return "datetimeOneof: multiple values"; + properties.datetimeOneof = 1; + { + var error = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.verify(message.unixEpoch); + if (error) + return "unixEpoch." + error; + } + } + return null; + }; + + /** + * Creates a HSMDateTime message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime} HSMDateTime + */ + HSMDateTime.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime) + return object; + var message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime(); + if (object.component != null) { + if (typeof object.component !== "object") + throw TypeError(".proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.component: object expected"); + message.component = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.fromObject(object.component); + } + if (object.unixEpoch != null) { + if (typeof object.unixEpoch !== "object") + throw TypeError(".proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.unixEpoch: object expected"); + message.unixEpoch = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.fromObject(object.unixEpoch); + } + return message; + }; + + /** + * Creates a plain object from a HSMDateTime message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime} message HSMDateTime + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HSMDateTime.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.component != null && message.hasOwnProperty("component")) { + object.component = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.toObject(message.component, options); + if (options.oneofs) + object.datetimeOneof = "component"; + } + if (message.unixEpoch != null && message.hasOwnProperty("unixEpoch")) { + object.unixEpoch = $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.toObject(message.unixEpoch, options); + if (options.oneofs) + object.datetimeOneof = "unixEpoch"; + } + return object; + }; + + /** + * Converts this HSMDateTime to JSON. + * @function toJSON + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @instance + * @returns {Object.} JSON object + */ + HSMDateTime.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + HSMDateTime.HSMDateTimeComponent = (function() { + + /** + * Properties of a HSMDateTimeComponent. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @interface IHSMDateTimeComponent + * @property {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.DayOfWeekType|null} [dayOfWeek] HSMDateTimeComponent dayOfWeek + * @property {number|null} [year] HSMDateTimeComponent year + * @property {number|null} [month] HSMDateTimeComponent month + * @property {number|null} [dayOfMonth] HSMDateTimeComponent dayOfMonth + * @property {number|null} [hour] HSMDateTimeComponent hour + * @property {number|null} [minute] HSMDateTimeComponent minute + * @property {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.CalendarType|null} [calendar] HSMDateTimeComponent calendar + */ + + /** + * Constructs a new HSMDateTimeComponent. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @classdesc Represents a HSMDateTimeComponent. + * @implements IHSMDateTimeComponent + * @constructor + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent=} [properties] Properties to set + */ + function HSMDateTimeComponent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HSMDateTimeComponent dayOfWeek. + * @member {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.DayOfWeekType} dayOfWeek + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + */ + HSMDateTimeComponent.prototype.dayOfWeek = 1; + + /** + * HSMDateTimeComponent year. + * @member {number} year + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + */ + HSMDateTimeComponent.prototype.year = 0; + + /** + * HSMDateTimeComponent month. + * @member {number} month + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + */ + HSMDateTimeComponent.prototype.month = 0; + + /** + * HSMDateTimeComponent dayOfMonth. + * @member {number} dayOfMonth + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + */ + HSMDateTimeComponent.prototype.dayOfMonth = 0; + + /** + * HSMDateTimeComponent hour. + * @member {number} hour + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + */ + HSMDateTimeComponent.prototype.hour = 0; + + /** + * HSMDateTimeComponent minute. + * @member {number} minute + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + */ + HSMDateTimeComponent.prototype.minute = 0; + + /** + * HSMDateTimeComponent calendar. + * @member {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.CalendarType} calendar + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + */ + HSMDateTimeComponent.prototype.calendar = 1; + + /** + * Creates a new HSMDateTimeComponent instance using the specified properties. + * @function create + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent=} [properties] Properties to set + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent} HSMDateTimeComponent instance + */ + HSMDateTimeComponent.create = function create(properties) { + return new HSMDateTimeComponent(properties); + }; + + /** + * Encodes the specified HSMDateTimeComponent message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.verify|verify} messages. + * @function encode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent} message HSMDateTimeComponent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMDateTimeComponent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.dayOfWeek != null && Object.hasOwnProperty.call(message, "dayOfWeek")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.dayOfWeek); + if (message.year != null && Object.hasOwnProperty.call(message, "year")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.year); + if (message.month != null && Object.hasOwnProperty.call(message, "month")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.month); + if (message.dayOfMonth != null && Object.hasOwnProperty.call(message, "dayOfMonth")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.dayOfMonth); + if (message.hour != null && Object.hasOwnProperty.call(message, "hour")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.hour); + if (message.minute != null && Object.hasOwnProperty.call(message, "minute")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.minute); + if (message.calendar != null && Object.hasOwnProperty.call(message, "calendar")) + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.calendar); + return writer; + }; + + /** + * Encodes the specified HSMDateTimeComponent message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeComponent} message HSMDateTimeComponent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMDateTimeComponent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HSMDateTimeComponent message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent} HSMDateTimeComponent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMDateTimeComponent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.dayOfWeek = reader.int32(); + break; + case 2: + message.year = reader.uint32(); + break; + case 3: + message.month = reader.uint32(); + break; + case 4: + message.dayOfMonth = reader.uint32(); + break; + case 5: + message.hour = reader.uint32(); + break; + case 6: + message.minute = reader.uint32(); + break; + case 7: + message.calendar = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HSMDateTimeComponent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent} HSMDateTimeComponent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMDateTimeComponent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HSMDateTimeComponent message. + * @function verify + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HSMDateTimeComponent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.dayOfWeek != null && message.hasOwnProperty("dayOfWeek")) + switch (message.dayOfWeek) { + default: + return "dayOfWeek: enum value expected"; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + break; + } + if (message.year != null && message.hasOwnProperty("year")) + if (!$util.isInteger(message.year)) + return "year: integer expected"; + if (message.month != null && message.hasOwnProperty("month")) + if (!$util.isInteger(message.month)) + return "month: integer expected"; + if (message.dayOfMonth != null && message.hasOwnProperty("dayOfMonth")) + if (!$util.isInteger(message.dayOfMonth)) + return "dayOfMonth: integer expected"; + if (message.hour != null && message.hasOwnProperty("hour")) + if (!$util.isInteger(message.hour)) + return "hour: integer expected"; + if (message.minute != null && message.hasOwnProperty("minute")) + if (!$util.isInteger(message.minute)) + return "minute: integer expected"; + if (message.calendar != null && message.hasOwnProperty("calendar")) + switch (message.calendar) { + default: + return "calendar: enum value expected"; + case 1: + case 2: + break; + } + return null; + }; + + /** + * Creates a HSMDateTimeComponent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent} HSMDateTimeComponent + */ + HSMDateTimeComponent.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent) + return object; + var message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent(); + switch (object.dayOfWeek) { + case "MONDAY": + case 1: + message.dayOfWeek = 1; + break; + case "TUESDAY": + case 2: + message.dayOfWeek = 2; + break; + case "WEDNESDAY": + case 3: + message.dayOfWeek = 3; + break; + case "THURSDAY": + case 4: + message.dayOfWeek = 4; + break; + case "FRIDAY": + case 5: + message.dayOfWeek = 5; + break; + case "SATURDAY": + case 6: + message.dayOfWeek = 6; + break; + case "SUNDAY": + case 7: + message.dayOfWeek = 7; + break; + } + if (object.year != null) + message.year = object.year >>> 0; + if (object.month != null) + message.month = object.month >>> 0; + if (object.dayOfMonth != null) + message.dayOfMonth = object.dayOfMonth >>> 0; + if (object.hour != null) + message.hour = object.hour >>> 0; + if (object.minute != null) + message.minute = object.minute >>> 0; + switch (object.calendar) { + case "GREGORIAN": + case 1: + message.calendar = 1; + break; + case "SOLAR_HIJRI": + case 2: + message.calendar = 2; + break; + } + return message; + }; + + /** + * Creates a plain object from a HSMDateTimeComponent message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent} message HSMDateTimeComponent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HSMDateTimeComponent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.dayOfWeek = options.enums === String ? "MONDAY" : 1; + object.year = 0; + object.month = 0; + object.dayOfMonth = 0; + object.hour = 0; + object.minute = 0; + object.calendar = options.enums === String ? "GREGORIAN" : 1; + } + if (message.dayOfWeek != null && message.hasOwnProperty("dayOfWeek")) + object.dayOfWeek = options.enums === String ? $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.DayOfWeekType[message.dayOfWeek] : message.dayOfWeek; + if (message.year != null && message.hasOwnProperty("year")) + object.year = message.year; + if (message.month != null && message.hasOwnProperty("month")) + object.month = message.month; + if (message.dayOfMonth != null && message.hasOwnProperty("dayOfMonth")) + object.dayOfMonth = message.dayOfMonth; + if (message.hour != null && message.hasOwnProperty("hour")) + object.hour = message.hour; + if (message.minute != null && message.hasOwnProperty("minute")) + object.minute = message.minute; + if (message.calendar != null && message.hasOwnProperty("calendar")) + object.calendar = options.enums === String ? $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.CalendarType[message.calendar] : message.calendar; + return object; + }; + + /** + * Converts this HSMDateTimeComponent to JSON. + * @function toJSON + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent + * @instance + * @returns {Object.} JSON object + */ + HSMDateTimeComponent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * CalendarType enum. + * @name proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.CalendarType + * @enum {number} + * @property {number} GREGORIAN=1 GREGORIAN value + * @property {number} SOLAR_HIJRI=2 SOLAR_HIJRI value + */ + HSMDateTimeComponent.CalendarType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[1] = "GREGORIAN"] = 1; + values[valuesById[2] = "SOLAR_HIJRI"] = 2; + return values; + })(); + + /** + * DayOfWeekType enum. + * @name proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeComponent.DayOfWeekType + * @enum {number} + * @property {number} MONDAY=1 MONDAY value + * @property {number} TUESDAY=2 TUESDAY value + * @property {number} WEDNESDAY=3 WEDNESDAY value + * @property {number} THURSDAY=4 THURSDAY value + * @property {number} FRIDAY=5 FRIDAY value + * @property {number} SATURDAY=6 SATURDAY value + * @property {number} SUNDAY=7 SUNDAY value + */ + HSMDateTimeComponent.DayOfWeekType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[1] = "MONDAY"] = 1; + values[valuesById[2] = "TUESDAY"] = 2; + values[valuesById[3] = "WEDNESDAY"] = 3; + values[valuesById[4] = "THURSDAY"] = 4; + values[valuesById[5] = "FRIDAY"] = 5; + values[valuesById[6] = "SATURDAY"] = 6; + values[valuesById[7] = "SUNDAY"] = 7; + return values; + })(); + + return HSMDateTimeComponent; + })(); + + HSMDateTime.HSMDateTimeUnixEpoch = (function() { + + /** + * Properties of a HSMDateTimeUnixEpoch. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @interface IHSMDateTimeUnixEpoch + * @property {number|Long|null} [timestamp] HSMDateTimeUnixEpoch timestamp + */ + + /** + * Constructs a new HSMDateTimeUnixEpoch. + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime + * @classdesc Represents a HSMDateTimeUnixEpoch. + * @implements IHSMDateTimeUnixEpoch + * @constructor + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch=} [properties] Properties to set + */ + function HSMDateTimeUnixEpoch(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HSMDateTimeUnixEpoch timestamp. + * @member {number|Long} timestamp + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @instance + */ + HSMDateTimeUnixEpoch.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new HSMDateTimeUnixEpoch instance using the specified properties. + * @function create + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch=} [properties] Properties to set + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch} HSMDateTimeUnixEpoch instance + */ + HSMDateTimeUnixEpoch.create = function create(properties) { + return new HSMDateTimeUnixEpoch(properties); + }; + + /** + * Encodes the specified HSMDateTimeUnixEpoch message. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.verify|verify} messages. + * @function encode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch} message HSMDateTimeUnixEpoch message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMDateTimeUnixEpoch.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.timestamp); + return writer; + }; + + /** + * Encodes the specified HSMDateTimeUnixEpoch message, length delimited. Does not implicitly {@link proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.IHSMDateTimeUnixEpoch} message HSMDateTimeUnixEpoch message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HSMDateTimeUnixEpoch.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HSMDateTimeUnixEpoch message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch} HSMDateTimeUnixEpoch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMDateTimeUnixEpoch.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.timestamp = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HSMDateTimeUnixEpoch message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch} HSMDateTimeUnixEpoch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HSMDateTimeUnixEpoch.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HSMDateTimeUnixEpoch message. + * @function verify + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HSMDateTimeUnixEpoch.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a HSMDateTimeUnixEpoch message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch} HSMDateTimeUnixEpoch + */ + HSMDateTimeUnixEpoch.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch) + return object; + var message = new $root.proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch(); + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a HSMDateTimeUnixEpoch message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @static + * @param {proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch} message HSMDateTimeUnixEpoch + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HSMDateTimeUnixEpoch.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp; + return object; + }; + + /** + * Converts this HSMDateTimeUnixEpoch to JSON. + * @function toJSON + * @memberof proto.Message.HighlyStructuredMessage.HSMLocalizableParameter.HSMDateTime.HSMDateTimeUnixEpoch + * @instance + * @returns {Object.} JSON object + */ + HSMDateTimeUnixEpoch.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HSMDateTimeUnixEpoch; + })(); + + return HSMDateTime; + })(); + + return HSMLocalizableParameter; + })(); + + return HighlyStructuredMessage; + })(); + + Message.HistorySyncNotification = (function() { + + /** + * Properties of a HistorySyncNotification. + * @memberof proto.Message + * @interface IHistorySyncNotification + * @property {Uint8Array|null} [fileSha256] HistorySyncNotification fileSha256 + * @property {number|Long|null} [fileLength] HistorySyncNotification fileLength + * @property {Uint8Array|null} [mediaKey] HistorySyncNotification mediaKey + * @property {Uint8Array|null} [fileEncSha256] HistorySyncNotification fileEncSha256 + * @property {string|null} [directPath] HistorySyncNotification directPath + * @property {proto.Message.HistorySyncNotification.HistorySyncType|null} [syncType] HistorySyncNotification syncType + * @property {number|null} [chunkOrder] HistorySyncNotification chunkOrder + * @property {string|null} [originalMessageId] HistorySyncNotification originalMessageId + * @property {number|null} [progress] HistorySyncNotification progress + * @property {number|Long|null} [oldestMsgInChunkTimestampSec] HistorySyncNotification oldestMsgInChunkTimestampSec + */ + + /** + * Constructs a new HistorySyncNotification. + * @memberof proto.Message + * @classdesc Represents a HistorySyncNotification. + * @implements IHistorySyncNotification + * @constructor + * @param {proto.Message.IHistorySyncNotification=} [properties] Properties to set + */ + function HistorySyncNotification(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HistorySyncNotification fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.fileSha256 = $util.newBuffer([]); + + /** + * HistorySyncNotification fileLength. + * @member {number|Long} fileLength + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * HistorySyncNotification mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.mediaKey = $util.newBuffer([]); + + /** + * HistorySyncNotification fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * HistorySyncNotification directPath. + * @member {string} directPath + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.directPath = ""; + + /** + * HistorySyncNotification syncType. + * @member {proto.Message.HistorySyncNotification.HistorySyncType} syncType + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.syncType = 0; + + /** + * HistorySyncNotification chunkOrder. + * @member {number} chunkOrder + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.chunkOrder = 0; + + /** + * HistorySyncNotification originalMessageId. + * @member {string} originalMessageId + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.originalMessageId = ""; + + /** + * HistorySyncNotification progress. + * @member {number} progress + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.progress = 0; + + /** + * HistorySyncNotification oldestMsgInChunkTimestampSec. + * @member {number|Long} oldestMsgInChunkTimestampSec + * @memberof proto.Message.HistorySyncNotification + * @instance + */ + HistorySyncNotification.prototype.oldestMsgInChunkTimestampSec = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new HistorySyncNotification instance using the specified properties. + * @function create + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {proto.Message.IHistorySyncNotification=} [properties] Properties to set + * @returns {proto.Message.HistorySyncNotification} HistorySyncNotification instance + */ + HistorySyncNotification.create = function create(properties) { + return new HistorySyncNotification(properties); + }; + + /** + * Encodes the specified HistorySyncNotification message. Does not implicitly {@link proto.Message.HistorySyncNotification.verify|verify} messages. + * @function encode + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {proto.Message.IHistorySyncNotification} message HistorySyncNotification message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySyncNotification.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.fileSha256); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.fileLength); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.mediaKey); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.fileEncSha256); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.directPath); + if (message.syncType != null && Object.hasOwnProperty.call(message, "syncType")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.syncType); + if (message.chunkOrder != null && Object.hasOwnProperty.call(message, "chunkOrder")) + writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.chunkOrder); + if (message.originalMessageId != null && Object.hasOwnProperty.call(message, "originalMessageId")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.originalMessageId); + if (message.progress != null && Object.hasOwnProperty.call(message, "progress")) + writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.progress); + if (message.oldestMsgInChunkTimestampSec != null && Object.hasOwnProperty.call(message, "oldestMsgInChunkTimestampSec")) + writer.uint32(/* id 10, wireType 0 =*/80).int64(message.oldestMsgInChunkTimestampSec); + return writer; + }; + + /** + * Encodes the specified HistorySyncNotification message, length delimited. Does not implicitly {@link proto.Message.HistorySyncNotification.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {proto.Message.IHistorySyncNotification} message HistorySyncNotification message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HistorySyncNotification.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HistorySyncNotification message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.HistorySyncNotification} HistorySyncNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySyncNotification.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.HistorySyncNotification(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fileSha256 = reader.bytes(); + break; + case 2: + message.fileLength = reader.uint64(); + break; + case 3: + message.mediaKey = reader.bytes(); + break; + case 4: + message.fileEncSha256 = reader.bytes(); + break; + case 5: + message.directPath = reader.string(); + break; + case 6: + message.syncType = reader.int32(); + break; + case 7: + message.chunkOrder = reader.uint32(); + break; + case 8: + message.originalMessageId = reader.string(); + break; + case 9: + message.progress = reader.uint32(); + break; + case 10: + message.oldestMsgInChunkTimestampSec = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HistorySyncNotification message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.HistorySyncNotification} HistorySyncNotification + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HistorySyncNotification.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HistorySyncNotification message. + * @function verify + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HistorySyncNotification.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.syncType != null && message.hasOwnProperty("syncType")) + switch (message.syncType) { + default: + return "syncType: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } + if (message.chunkOrder != null && message.hasOwnProperty("chunkOrder")) + if (!$util.isInteger(message.chunkOrder)) + return "chunkOrder: integer expected"; + if (message.originalMessageId != null && message.hasOwnProperty("originalMessageId")) + if (!$util.isString(message.originalMessageId)) + return "originalMessageId: string expected"; + if (message.progress != null && message.hasOwnProperty("progress")) + if (!$util.isInteger(message.progress)) + return "progress: integer expected"; + if (message.oldestMsgInChunkTimestampSec != null && message.hasOwnProperty("oldestMsgInChunkTimestampSec")) + if (!$util.isInteger(message.oldestMsgInChunkTimestampSec) && !(message.oldestMsgInChunkTimestampSec && $util.isInteger(message.oldestMsgInChunkTimestampSec.low) && $util.isInteger(message.oldestMsgInChunkTimestampSec.high))) + return "oldestMsgInChunkTimestampSec: integer|Long expected"; + return null; + }; + + /** + * Creates a HistorySyncNotification message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.HistorySyncNotification} HistorySyncNotification + */ + HistorySyncNotification.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.HistorySyncNotification) + return object; + var message = new $root.proto.Message.HistorySyncNotification(); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.directPath != null) + message.directPath = String(object.directPath); + switch (object.syncType) { + case "INITIAL_BOOTSTRAP": + case 0: + message.syncType = 0; + break; + case "INITIAL_STATUS_V3": + case 1: + message.syncType = 1; + break; + case "FULL": + case 2: + message.syncType = 2; + break; + case "RECENT": + case 3: + message.syncType = 3; + break; + case "PUSH_NAME": + case 4: + message.syncType = 4; + break; + case "NON_BLOCKING_DATA": + case 5: + message.syncType = 5; + break; + } + if (object.chunkOrder != null) + message.chunkOrder = object.chunkOrder >>> 0; + if (object.originalMessageId != null) + message.originalMessageId = String(object.originalMessageId); + if (object.progress != null) + message.progress = object.progress >>> 0; + if (object.oldestMsgInChunkTimestampSec != null) + if ($util.Long) + (message.oldestMsgInChunkTimestampSec = $util.Long.fromValue(object.oldestMsgInChunkTimestampSec)).unsigned = false; + else if (typeof object.oldestMsgInChunkTimestampSec === "string") + message.oldestMsgInChunkTimestampSec = parseInt(object.oldestMsgInChunkTimestampSec, 10); + else if (typeof object.oldestMsgInChunkTimestampSec === "number") + message.oldestMsgInChunkTimestampSec = object.oldestMsgInChunkTimestampSec; + else if (typeof object.oldestMsgInChunkTimestampSec === "object") + message.oldestMsgInChunkTimestampSec = new $util.LongBits(object.oldestMsgInChunkTimestampSec.low >>> 0, object.oldestMsgInChunkTimestampSec.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a HistorySyncNotification message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.HistorySyncNotification + * @static + * @param {proto.Message.HistorySyncNotification} message HistorySyncNotification + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HistorySyncNotification.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + object.directPath = ""; + object.syncType = options.enums === String ? "INITIAL_BOOTSTRAP" : 0; + object.chunkOrder = 0; + object.originalMessageId = ""; + object.progress = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.oldestMsgInChunkTimestampSec = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.oldestMsgInChunkTimestampSec = options.longs === String ? "0" : 0; + } + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.syncType != null && message.hasOwnProperty("syncType")) + object.syncType = options.enums === String ? $root.proto.Message.HistorySyncNotification.HistorySyncType[message.syncType] : message.syncType; + if (message.chunkOrder != null && message.hasOwnProperty("chunkOrder")) + object.chunkOrder = message.chunkOrder; + if (message.originalMessageId != null && message.hasOwnProperty("originalMessageId")) + object.originalMessageId = message.originalMessageId; + if (message.progress != null && message.hasOwnProperty("progress")) + object.progress = message.progress; + if (message.oldestMsgInChunkTimestampSec != null && message.hasOwnProperty("oldestMsgInChunkTimestampSec")) + if (typeof message.oldestMsgInChunkTimestampSec === "number") + object.oldestMsgInChunkTimestampSec = options.longs === String ? String(message.oldestMsgInChunkTimestampSec) : message.oldestMsgInChunkTimestampSec; + else + object.oldestMsgInChunkTimestampSec = options.longs === String ? $util.Long.prototype.toString.call(message.oldestMsgInChunkTimestampSec) : options.longs === Number ? new $util.LongBits(message.oldestMsgInChunkTimestampSec.low >>> 0, message.oldestMsgInChunkTimestampSec.high >>> 0).toNumber() : message.oldestMsgInChunkTimestampSec; + return object; + }; + + /** + * Converts this HistorySyncNotification to JSON. + * @function toJSON + * @memberof proto.Message.HistorySyncNotification + * @instance + * @returns {Object.} JSON object + */ + HistorySyncNotification.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * HistorySyncType enum. + * @name proto.Message.HistorySyncNotification.HistorySyncType + * @enum {number} + * @property {number} INITIAL_BOOTSTRAP=0 INITIAL_BOOTSTRAP value + * @property {number} INITIAL_STATUS_V3=1 INITIAL_STATUS_V3 value + * @property {number} FULL=2 FULL value + * @property {number} RECENT=3 RECENT value + * @property {number} PUSH_NAME=4 PUSH_NAME value + * @property {number} NON_BLOCKING_DATA=5 NON_BLOCKING_DATA value + */ + HistorySyncNotification.HistorySyncType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "INITIAL_BOOTSTRAP"] = 0; + values[valuesById[1] = "INITIAL_STATUS_V3"] = 1; + values[valuesById[2] = "FULL"] = 2; + values[valuesById[3] = "RECENT"] = 3; + values[valuesById[4] = "PUSH_NAME"] = 4; + values[valuesById[5] = "NON_BLOCKING_DATA"] = 5; + return values; + })(); + + return HistorySyncNotification; + })(); + + Message.ImageMessage = (function() { + + /** + * Properties of an ImageMessage. + * @memberof proto.Message + * @interface IImageMessage + * @property {string|null} [url] ImageMessage url + * @property {string|null} [mimetype] ImageMessage mimetype + * @property {string|null} [caption] ImageMessage caption + * @property {Uint8Array|null} [fileSha256] ImageMessage fileSha256 + * @property {number|Long|null} [fileLength] ImageMessage fileLength + * @property {number|null} [height] ImageMessage height + * @property {number|null} [width] ImageMessage width + * @property {Uint8Array|null} [mediaKey] ImageMessage mediaKey + * @property {Uint8Array|null} [fileEncSha256] ImageMessage fileEncSha256 + * @property {Array.|null} [interactiveAnnotations] ImageMessage interactiveAnnotations + * @property {string|null} [directPath] ImageMessage directPath + * @property {number|Long|null} [mediaKeyTimestamp] ImageMessage mediaKeyTimestamp + * @property {Uint8Array|null} [jpegThumbnail] ImageMessage jpegThumbnail + * @property {proto.IContextInfo|null} [contextInfo] ImageMessage contextInfo + * @property {Uint8Array|null} [firstScanSidecar] ImageMessage firstScanSidecar + * @property {number|null} [firstScanLength] ImageMessage firstScanLength + * @property {number|null} [experimentGroupId] ImageMessage experimentGroupId + * @property {Uint8Array|null} [scansSidecar] ImageMessage scansSidecar + * @property {Array.|null} [scanLengths] ImageMessage scanLengths + * @property {Uint8Array|null} [midQualityFileSha256] ImageMessage midQualityFileSha256 + * @property {Uint8Array|null} [midQualityFileEncSha256] ImageMessage midQualityFileEncSha256 + * @property {boolean|null} [viewOnce] ImageMessage viewOnce + * @property {string|null} [thumbnailDirectPath] ImageMessage thumbnailDirectPath + * @property {Uint8Array|null} [thumbnailSha256] ImageMessage thumbnailSha256 + * @property {Uint8Array|null} [thumbnailEncSha256] ImageMessage thumbnailEncSha256 + * @property {string|null} [staticUrl] ImageMessage staticUrl + */ + + /** + * Constructs a new ImageMessage. + * @memberof proto.Message + * @classdesc Represents an ImageMessage. + * @implements IImageMessage + * @constructor + * @param {proto.Message.IImageMessage=} [properties] Properties to set + */ + function ImageMessage(properties) { + this.interactiveAnnotations = []; + this.scanLengths = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ImageMessage url. + * @member {string} url + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.url = ""; + + /** + * ImageMessage mimetype. + * @member {string} mimetype + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.mimetype = ""; + + /** + * ImageMessage caption. + * @member {string} caption + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.caption = ""; + + /** + * ImageMessage fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.fileSha256 = $util.newBuffer([]); + + /** + * ImageMessage fileLength. + * @member {number|Long} fileLength + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * ImageMessage height. + * @member {number} height + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.height = 0; + + /** + * ImageMessage width. + * @member {number} width + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.width = 0; + + /** + * ImageMessage mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.mediaKey = $util.newBuffer([]); + + /** + * ImageMessage fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * ImageMessage interactiveAnnotations. + * @member {Array.} interactiveAnnotations + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.interactiveAnnotations = $util.emptyArray; + + /** + * ImageMessage directPath. + * @member {string} directPath + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.directPath = ""; + + /** + * ImageMessage mediaKeyTimestamp. + * @member {number|Long} mediaKeyTimestamp + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.mediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * ImageMessage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * ImageMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.contextInfo = null; + + /** + * ImageMessage firstScanSidecar. + * @member {Uint8Array} firstScanSidecar + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.firstScanSidecar = $util.newBuffer([]); + + /** + * ImageMessage firstScanLength. + * @member {number} firstScanLength + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.firstScanLength = 0; + + /** + * ImageMessage experimentGroupId. + * @member {number} experimentGroupId + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.experimentGroupId = 0; + + /** + * ImageMessage scansSidecar. + * @member {Uint8Array} scansSidecar + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.scansSidecar = $util.newBuffer([]); + + /** + * ImageMessage scanLengths. + * @member {Array.} scanLengths + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.scanLengths = $util.emptyArray; + + /** + * ImageMessage midQualityFileSha256. + * @member {Uint8Array} midQualityFileSha256 + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.midQualityFileSha256 = $util.newBuffer([]); + + /** + * ImageMessage midQualityFileEncSha256. + * @member {Uint8Array} midQualityFileEncSha256 + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.midQualityFileEncSha256 = $util.newBuffer([]); + + /** + * ImageMessage viewOnce. + * @member {boolean} viewOnce + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.viewOnce = false; + + /** + * ImageMessage thumbnailDirectPath. + * @member {string} thumbnailDirectPath + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.thumbnailDirectPath = ""; + + /** + * ImageMessage thumbnailSha256. + * @member {Uint8Array} thumbnailSha256 + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.thumbnailSha256 = $util.newBuffer([]); + + /** + * ImageMessage thumbnailEncSha256. + * @member {Uint8Array} thumbnailEncSha256 + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.thumbnailEncSha256 = $util.newBuffer([]); + + /** + * ImageMessage staticUrl. + * @member {string} staticUrl + * @memberof proto.Message.ImageMessage + * @instance + */ + ImageMessage.prototype.staticUrl = ""; + + /** + * Creates a new ImageMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ImageMessage + * @static + * @param {proto.Message.IImageMessage=} [properties] Properties to set + * @returns {proto.Message.ImageMessage} ImageMessage instance + */ + ImageMessage.create = function create(properties) { + return new ImageMessage(properties); + }; + + /** + * Encodes the specified ImageMessage message. Does not implicitly {@link proto.Message.ImageMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ImageMessage + * @static + * @param {proto.Message.IImageMessage} message ImageMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ImageMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.mimetype); + if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.caption); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.fileSha256); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.fileLength); + if (message.height != null && Object.hasOwnProperty.call(message, "height")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.height); + if (message.width != null && Object.hasOwnProperty.call(message, "width")) + writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.width); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.mediaKey); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.fileEncSha256); + if (message.interactiveAnnotations != null && message.interactiveAnnotations.length) + for (var i = 0; i < message.interactiveAnnotations.length; ++i) + $root.proto.InteractiveAnnotation.encode(message.interactiveAnnotations[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.directPath); + if (message.mediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "mediaKeyTimestamp")) + writer.uint32(/* id 12, wireType 0 =*/96).int64(message.mediaKeyTimestamp); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.jpegThumbnail); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.firstScanSidecar != null && Object.hasOwnProperty.call(message, "firstScanSidecar")) + writer.uint32(/* id 18, wireType 2 =*/146).bytes(message.firstScanSidecar); + if (message.firstScanLength != null && Object.hasOwnProperty.call(message, "firstScanLength")) + writer.uint32(/* id 19, wireType 0 =*/152).uint32(message.firstScanLength); + if (message.experimentGroupId != null && Object.hasOwnProperty.call(message, "experimentGroupId")) + writer.uint32(/* id 20, wireType 0 =*/160).uint32(message.experimentGroupId); + if (message.scansSidecar != null && Object.hasOwnProperty.call(message, "scansSidecar")) + writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.scansSidecar); + if (message.scanLengths != null && message.scanLengths.length) + for (var i = 0; i < message.scanLengths.length; ++i) + writer.uint32(/* id 22, wireType 0 =*/176).uint32(message.scanLengths[i]); + if (message.midQualityFileSha256 != null && Object.hasOwnProperty.call(message, "midQualityFileSha256")) + writer.uint32(/* id 23, wireType 2 =*/186).bytes(message.midQualityFileSha256); + if (message.midQualityFileEncSha256 != null && Object.hasOwnProperty.call(message, "midQualityFileEncSha256")) + writer.uint32(/* id 24, wireType 2 =*/194).bytes(message.midQualityFileEncSha256); + if (message.viewOnce != null && Object.hasOwnProperty.call(message, "viewOnce")) + writer.uint32(/* id 25, wireType 0 =*/200).bool(message.viewOnce); + if (message.thumbnailDirectPath != null && Object.hasOwnProperty.call(message, "thumbnailDirectPath")) + writer.uint32(/* id 26, wireType 2 =*/210).string(message.thumbnailDirectPath); + if (message.thumbnailSha256 != null && Object.hasOwnProperty.call(message, "thumbnailSha256")) + writer.uint32(/* id 27, wireType 2 =*/218).bytes(message.thumbnailSha256); + if (message.thumbnailEncSha256 != null && Object.hasOwnProperty.call(message, "thumbnailEncSha256")) + writer.uint32(/* id 28, wireType 2 =*/226).bytes(message.thumbnailEncSha256); + if (message.staticUrl != null && Object.hasOwnProperty.call(message, "staticUrl")) + writer.uint32(/* id 29, wireType 2 =*/234).string(message.staticUrl); + return writer; + }; + + /** + * Encodes the specified ImageMessage message, length delimited. Does not implicitly {@link proto.Message.ImageMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ImageMessage + * @static + * @param {proto.Message.IImageMessage} message ImageMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ImageMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ImageMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ImageMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ImageMessage} ImageMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ImageMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ImageMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.mimetype = reader.string(); + break; + case 3: + message.caption = reader.string(); + break; + case 4: + message.fileSha256 = reader.bytes(); + break; + case 5: + message.fileLength = reader.uint64(); + break; + case 6: + message.height = reader.uint32(); + break; + case 7: + message.width = reader.uint32(); + break; + case 8: + message.mediaKey = reader.bytes(); + break; + case 9: + message.fileEncSha256 = reader.bytes(); + break; + case 10: + if (!(message.interactiveAnnotations && message.interactiveAnnotations.length)) + message.interactiveAnnotations = []; + message.interactiveAnnotations.push($root.proto.InteractiveAnnotation.decode(reader, reader.uint32())); + break; + case 11: + message.directPath = reader.string(); + break; + case 12: + message.mediaKeyTimestamp = reader.int64(); + break; + case 16: + message.jpegThumbnail = reader.bytes(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 18: + message.firstScanSidecar = reader.bytes(); + break; + case 19: + message.firstScanLength = reader.uint32(); + break; + case 20: + message.experimentGroupId = reader.uint32(); + break; + case 21: + message.scansSidecar = reader.bytes(); + break; + case 22: + if (!(message.scanLengths && message.scanLengths.length)) + message.scanLengths = []; + if ((tag & 7) === 2) { + var end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.scanLengths.push(reader.uint32()); + } else + message.scanLengths.push(reader.uint32()); + break; + case 23: + message.midQualityFileSha256 = reader.bytes(); + break; + case 24: + message.midQualityFileEncSha256 = reader.bytes(); + break; + case 25: + message.viewOnce = reader.bool(); + break; + case 26: + message.thumbnailDirectPath = reader.string(); + break; + case 27: + message.thumbnailSha256 = reader.bytes(); + break; + case 28: + message.thumbnailEncSha256 = reader.bytes(); + break; + case 29: + message.staticUrl = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ImageMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ImageMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ImageMessage} ImageMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ImageMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ImageMessage message. + * @function verify + * @memberof proto.Message.ImageMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ImageMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.caption != null && message.hasOwnProperty("caption")) + if (!$util.isString(message.caption)) + return "caption: string expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + if (message.width != null && message.hasOwnProperty("width")) + if (!$util.isInteger(message.width)) + return "width: integer expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.interactiveAnnotations != null && message.hasOwnProperty("interactiveAnnotations")) { + if (!Array.isArray(message.interactiveAnnotations)) + return "interactiveAnnotations: array expected"; + for (var i = 0; i < message.interactiveAnnotations.length; ++i) { + var error = $root.proto.InteractiveAnnotation.verify(message.interactiveAnnotations[i]); + if (error) + return "interactiveAnnotations." + error; + } + } + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (!$util.isInteger(message.mediaKeyTimestamp) && !(message.mediaKeyTimestamp && $util.isInteger(message.mediaKeyTimestamp.low) && $util.isInteger(message.mediaKeyTimestamp.high))) + return "mediaKeyTimestamp: integer|Long expected"; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.firstScanSidecar != null && message.hasOwnProperty("firstScanSidecar")) + if (!(message.firstScanSidecar && typeof message.firstScanSidecar.length === "number" || $util.isString(message.firstScanSidecar))) + return "firstScanSidecar: buffer expected"; + if (message.firstScanLength != null && message.hasOwnProperty("firstScanLength")) + if (!$util.isInteger(message.firstScanLength)) + return "firstScanLength: integer expected"; + if (message.experimentGroupId != null && message.hasOwnProperty("experimentGroupId")) + if (!$util.isInteger(message.experimentGroupId)) + return "experimentGroupId: integer expected"; + if (message.scansSidecar != null && message.hasOwnProperty("scansSidecar")) + if (!(message.scansSidecar && typeof message.scansSidecar.length === "number" || $util.isString(message.scansSidecar))) + return "scansSidecar: buffer expected"; + if (message.scanLengths != null && message.hasOwnProperty("scanLengths")) { + if (!Array.isArray(message.scanLengths)) + return "scanLengths: array expected"; + for (var i = 0; i < message.scanLengths.length; ++i) + if (!$util.isInteger(message.scanLengths[i])) + return "scanLengths: integer[] expected"; + } + if (message.midQualityFileSha256 != null && message.hasOwnProperty("midQualityFileSha256")) + if (!(message.midQualityFileSha256 && typeof message.midQualityFileSha256.length === "number" || $util.isString(message.midQualityFileSha256))) + return "midQualityFileSha256: buffer expected"; + if (message.midQualityFileEncSha256 != null && message.hasOwnProperty("midQualityFileEncSha256")) + if (!(message.midQualityFileEncSha256 && typeof message.midQualityFileEncSha256.length === "number" || $util.isString(message.midQualityFileEncSha256))) + return "midQualityFileEncSha256: buffer expected"; + if (message.viewOnce != null && message.hasOwnProperty("viewOnce")) + if (typeof message.viewOnce !== "boolean") + return "viewOnce: boolean expected"; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + if (!$util.isString(message.thumbnailDirectPath)) + return "thumbnailDirectPath: string expected"; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + if (!(message.thumbnailSha256 && typeof message.thumbnailSha256.length === "number" || $util.isString(message.thumbnailSha256))) + return "thumbnailSha256: buffer expected"; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + if (!(message.thumbnailEncSha256 && typeof message.thumbnailEncSha256.length === "number" || $util.isString(message.thumbnailEncSha256))) + return "thumbnailEncSha256: buffer expected"; + if (message.staticUrl != null && message.hasOwnProperty("staticUrl")) + if (!$util.isString(message.staticUrl)) + return "staticUrl: string expected"; + return null; + }; + + /** + * Creates an ImageMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ImageMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ImageMessage} ImageMessage + */ + ImageMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ImageMessage) + return object; + var message = new $root.proto.Message.ImageMessage(); + if (object.url != null) + message.url = String(object.url); + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.caption != null) + message.caption = String(object.caption); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.height != null) + message.height = object.height >>> 0; + if (object.width != null) + message.width = object.width >>> 0; + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.interactiveAnnotations) { + if (!Array.isArray(object.interactiveAnnotations)) + throw TypeError(".proto.Message.ImageMessage.interactiveAnnotations: array expected"); + message.interactiveAnnotations = []; + for (var i = 0; i < object.interactiveAnnotations.length; ++i) { + if (typeof object.interactiveAnnotations[i] !== "object") + throw TypeError(".proto.Message.ImageMessage.interactiveAnnotations: object expected"); + message.interactiveAnnotations[i] = $root.proto.InteractiveAnnotation.fromObject(object.interactiveAnnotations[i]); + } + } + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.mediaKeyTimestamp != null) + if ($util.Long) + (message.mediaKeyTimestamp = $util.Long.fromValue(object.mediaKeyTimestamp)).unsigned = false; + else if (typeof object.mediaKeyTimestamp === "string") + message.mediaKeyTimestamp = parseInt(object.mediaKeyTimestamp, 10); + else if (typeof object.mediaKeyTimestamp === "number") + message.mediaKeyTimestamp = object.mediaKeyTimestamp; + else if (typeof object.mediaKeyTimestamp === "object") + message.mediaKeyTimestamp = new $util.LongBits(object.mediaKeyTimestamp.low >>> 0, object.mediaKeyTimestamp.high >>> 0).toNumber(); + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ImageMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.firstScanSidecar != null) + if (typeof object.firstScanSidecar === "string") + $util.base64.decode(object.firstScanSidecar, message.firstScanSidecar = $util.newBuffer($util.base64.length(object.firstScanSidecar)), 0); + else if (object.firstScanSidecar.length) + message.firstScanSidecar = object.firstScanSidecar; + if (object.firstScanLength != null) + message.firstScanLength = object.firstScanLength >>> 0; + if (object.experimentGroupId != null) + message.experimentGroupId = object.experimentGroupId >>> 0; + if (object.scansSidecar != null) + if (typeof object.scansSidecar === "string") + $util.base64.decode(object.scansSidecar, message.scansSidecar = $util.newBuffer($util.base64.length(object.scansSidecar)), 0); + else if (object.scansSidecar.length) + message.scansSidecar = object.scansSidecar; + if (object.scanLengths) { + if (!Array.isArray(object.scanLengths)) + throw TypeError(".proto.Message.ImageMessage.scanLengths: array expected"); + message.scanLengths = []; + for (var i = 0; i < object.scanLengths.length; ++i) + message.scanLengths[i] = object.scanLengths[i] >>> 0; + } + if (object.midQualityFileSha256 != null) + if (typeof object.midQualityFileSha256 === "string") + $util.base64.decode(object.midQualityFileSha256, message.midQualityFileSha256 = $util.newBuffer($util.base64.length(object.midQualityFileSha256)), 0); + else if (object.midQualityFileSha256.length) + message.midQualityFileSha256 = object.midQualityFileSha256; + if (object.midQualityFileEncSha256 != null) + if (typeof object.midQualityFileEncSha256 === "string") + $util.base64.decode(object.midQualityFileEncSha256, message.midQualityFileEncSha256 = $util.newBuffer($util.base64.length(object.midQualityFileEncSha256)), 0); + else if (object.midQualityFileEncSha256.length) + message.midQualityFileEncSha256 = object.midQualityFileEncSha256; + if (object.viewOnce != null) + message.viewOnce = Boolean(object.viewOnce); + if (object.thumbnailDirectPath != null) + message.thumbnailDirectPath = String(object.thumbnailDirectPath); + if (object.thumbnailSha256 != null) + if (typeof object.thumbnailSha256 === "string") + $util.base64.decode(object.thumbnailSha256, message.thumbnailSha256 = $util.newBuffer($util.base64.length(object.thumbnailSha256)), 0); + else if (object.thumbnailSha256.length) + message.thumbnailSha256 = object.thumbnailSha256; + if (object.thumbnailEncSha256 != null) + if (typeof object.thumbnailEncSha256 === "string") + $util.base64.decode(object.thumbnailEncSha256, message.thumbnailEncSha256 = $util.newBuffer($util.base64.length(object.thumbnailEncSha256)), 0); + else if (object.thumbnailEncSha256.length) + message.thumbnailEncSha256 = object.thumbnailEncSha256; + if (object.staticUrl != null) + message.staticUrl = String(object.staticUrl); + return message; + }; + + /** + * Creates a plain object from an ImageMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ImageMessage + * @static + * @param {proto.Message.ImageMessage} message ImageMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ImageMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.interactiveAnnotations = []; + object.scanLengths = []; + } + if (options.defaults) { + object.url = ""; + object.mimetype = ""; + object.caption = ""; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + object.height = 0; + object.width = 0; + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + object.directPath = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.mediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.mediaKeyTimestamp = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.contextInfo = null; + if (options.bytes === String) + object.firstScanSidecar = ""; + else { + object.firstScanSidecar = []; + if (options.bytes !== Array) + object.firstScanSidecar = $util.newBuffer(object.firstScanSidecar); + } + object.firstScanLength = 0; + object.experimentGroupId = 0; + if (options.bytes === String) + object.scansSidecar = ""; + else { + object.scansSidecar = []; + if (options.bytes !== Array) + object.scansSidecar = $util.newBuffer(object.scansSidecar); + } + if (options.bytes === String) + object.midQualityFileSha256 = ""; + else { + object.midQualityFileSha256 = []; + if (options.bytes !== Array) + object.midQualityFileSha256 = $util.newBuffer(object.midQualityFileSha256); + } + if (options.bytes === String) + object.midQualityFileEncSha256 = ""; + else { + object.midQualityFileEncSha256 = []; + if (options.bytes !== Array) + object.midQualityFileEncSha256 = $util.newBuffer(object.midQualityFileEncSha256); + } + object.viewOnce = false; + object.thumbnailDirectPath = ""; + if (options.bytes === String) + object.thumbnailSha256 = ""; + else { + object.thumbnailSha256 = []; + if (options.bytes !== Array) + object.thumbnailSha256 = $util.newBuffer(object.thumbnailSha256); + } + if (options.bytes === String) + object.thumbnailEncSha256 = ""; + else { + object.thumbnailEncSha256 = []; + if (options.bytes !== Array) + object.thumbnailEncSha256 = $util.newBuffer(object.thumbnailEncSha256); + } + object.staticUrl = ""; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.caption != null && message.hasOwnProperty("caption")) + object.caption = message.caption; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + if (message.width != null && message.hasOwnProperty("width")) + object.width = message.width; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.interactiveAnnotations && message.interactiveAnnotations.length) { + object.interactiveAnnotations = []; + for (var j = 0; j < message.interactiveAnnotations.length; ++j) + object.interactiveAnnotations[j] = $root.proto.InteractiveAnnotation.toObject(message.interactiveAnnotations[j], options); + } + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (typeof message.mediaKeyTimestamp === "number") + object.mediaKeyTimestamp = options.longs === String ? String(message.mediaKeyTimestamp) : message.mediaKeyTimestamp; + else + object.mediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.mediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.mediaKeyTimestamp.low >>> 0, message.mediaKeyTimestamp.high >>> 0).toNumber() : message.mediaKeyTimestamp; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.firstScanSidecar != null && message.hasOwnProperty("firstScanSidecar")) + object.firstScanSidecar = options.bytes === String ? $util.base64.encode(message.firstScanSidecar, 0, message.firstScanSidecar.length) : options.bytes === Array ? Array.prototype.slice.call(message.firstScanSidecar) : message.firstScanSidecar; + if (message.firstScanLength != null && message.hasOwnProperty("firstScanLength")) + object.firstScanLength = message.firstScanLength; + if (message.experimentGroupId != null && message.hasOwnProperty("experimentGroupId")) + object.experimentGroupId = message.experimentGroupId; + if (message.scansSidecar != null && message.hasOwnProperty("scansSidecar")) + object.scansSidecar = options.bytes === String ? $util.base64.encode(message.scansSidecar, 0, message.scansSidecar.length) : options.bytes === Array ? Array.prototype.slice.call(message.scansSidecar) : message.scansSidecar; + if (message.scanLengths && message.scanLengths.length) { + object.scanLengths = []; + for (var j = 0; j < message.scanLengths.length; ++j) + object.scanLengths[j] = message.scanLengths[j]; + } + if (message.midQualityFileSha256 != null && message.hasOwnProperty("midQualityFileSha256")) + object.midQualityFileSha256 = options.bytes === String ? $util.base64.encode(message.midQualityFileSha256, 0, message.midQualityFileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.midQualityFileSha256) : message.midQualityFileSha256; + if (message.midQualityFileEncSha256 != null && message.hasOwnProperty("midQualityFileEncSha256")) + object.midQualityFileEncSha256 = options.bytes === String ? $util.base64.encode(message.midQualityFileEncSha256, 0, message.midQualityFileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.midQualityFileEncSha256) : message.midQualityFileEncSha256; + if (message.viewOnce != null && message.hasOwnProperty("viewOnce")) + object.viewOnce = message.viewOnce; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + object.thumbnailDirectPath = message.thumbnailDirectPath; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + object.thumbnailSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailSha256, 0, message.thumbnailSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailSha256) : message.thumbnailSha256; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + object.thumbnailEncSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailEncSha256, 0, message.thumbnailEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailEncSha256) : message.thumbnailEncSha256; + if (message.staticUrl != null && message.hasOwnProperty("staticUrl")) + object.staticUrl = message.staticUrl; + return object; + }; + + /** + * Converts this ImageMessage to JSON. + * @function toJSON + * @memberof proto.Message.ImageMessage + * @instance + * @returns {Object.} JSON object + */ + ImageMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ImageMessage; + })(); + + Message.InitialSecurityNotificationSettingSync = (function() { + + /** + * Properties of an InitialSecurityNotificationSettingSync. + * @memberof proto.Message + * @interface IInitialSecurityNotificationSettingSync + * @property {boolean|null} [securityNotificationEnabled] InitialSecurityNotificationSettingSync securityNotificationEnabled + */ + + /** + * Constructs a new InitialSecurityNotificationSettingSync. + * @memberof proto.Message + * @classdesc Represents an InitialSecurityNotificationSettingSync. + * @implements IInitialSecurityNotificationSettingSync + * @constructor + * @param {proto.Message.IInitialSecurityNotificationSettingSync=} [properties] Properties to set + */ + function InitialSecurityNotificationSettingSync(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * InitialSecurityNotificationSettingSync securityNotificationEnabled. + * @member {boolean} securityNotificationEnabled + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @instance + */ + InitialSecurityNotificationSettingSync.prototype.securityNotificationEnabled = false; + + /** + * Creates a new InitialSecurityNotificationSettingSync instance using the specified properties. + * @function create + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {proto.Message.IInitialSecurityNotificationSettingSync=} [properties] Properties to set + * @returns {proto.Message.InitialSecurityNotificationSettingSync} InitialSecurityNotificationSettingSync instance + */ + InitialSecurityNotificationSettingSync.create = function create(properties) { + return new InitialSecurityNotificationSettingSync(properties); + }; + + /** + * Encodes the specified InitialSecurityNotificationSettingSync message. Does not implicitly {@link proto.Message.InitialSecurityNotificationSettingSync.verify|verify} messages. + * @function encode + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {proto.Message.IInitialSecurityNotificationSettingSync} message InitialSecurityNotificationSettingSync message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InitialSecurityNotificationSettingSync.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.securityNotificationEnabled != null && Object.hasOwnProperty.call(message, "securityNotificationEnabled")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.securityNotificationEnabled); + return writer; + }; + + /** + * Encodes the specified InitialSecurityNotificationSettingSync message, length delimited. Does not implicitly {@link proto.Message.InitialSecurityNotificationSettingSync.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {proto.Message.IInitialSecurityNotificationSettingSync} message InitialSecurityNotificationSettingSync message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InitialSecurityNotificationSettingSync.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an InitialSecurityNotificationSettingSync message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InitialSecurityNotificationSettingSync} InitialSecurityNotificationSettingSync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InitialSecurityNotificationSettingSync.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InitialSecurityNotificationSettingSync(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.securityNotificationEnabled = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an InitialSecurityNotificationSettingSync message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InitialSecurityNotificationSettingSync} InitialSecurityNotificationSettingSync + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InitialSecurityNotificationSettingSync.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an InitialSecurityNotificationSettingSync message. + * @function verify + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + InitialSecurityNotificationSettingSync.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.securityNotificationEnabled != null && message.hasOwnProperty("securityNotificationEnabled")) + if (typeof message.securityNotificationEnabled !== "boolean") + return "securityNotificationEnabled: boolean expected"; + return null; + }; + + /** + * Creates an InitialSecurityNotificationSettingSync message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InitialSecurityNotificationSettingSync} InitialSecurityNotificationSettingSync + */ + InitialSecurityNotificationSettingSync.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InitialSecurityNotificationSettingSync) + return object; + var message = new $root.proto.Message.InitialSecurityNotificationSettingSync(); + if (object.securityNotificationEnabled != null) + message.securityNotificationEnabled = Boolean(object.securityNotificationEnabled); + return message; + }; + + /** + * Creates a plain object from an InitialSecurityNotificationSettingSync message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @static + * @param {proto.Message.InitialSecurityNotificationSettingSync} message InitialSecurityNotificationSettingSync + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + InitialSecurityNotificationSettingSync.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.securityNotificationEnabled = false; + if (message.securityNotificationEnabled != null && message.hasOwnProperty("securityNotificationEnabled")) + object.securityNotificationEnabled = message.securityNotificationEnabled; + return object; + }; + + /** + * Converts this InitialSecurityNotificationSettingSync to JSON. + * @function toJSON + * @memberof proto.Message.InitialSecurityNotificationSettingSync + * @instance + * @returns {Object.} JSON object + */ + InitialSecurityNotificationSettingSync.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return InitialSecurityNotificationSettingSync; + })(); + + Message.InteractiveMessage = (function() { + + /** + * Properties of an InteractiveMessage. + * @memberof proto.Message + * @interface IInteractiveMessage + * @property {proto.Message.InteractiveMessage.IHeader|null} [header] InteractiveMessage header + * @property {proto.Message.InteractiveMessage.IBody|null} [body] InteractiveMessage body + * @property {proto.Message.InteractiveMessage.IFooter|null} [footer] InteractiveMessage footer + * @property {proto.IContextInfo|null} [contextInfo] InteractiveMessage contextInfo + * @property {proto.Message.InteractiveMessage.IShopMessage|null} [shopStorefrontMessage] InteractiveMessage shopStorefrontMessage + * @property {proto.Message.InteractiveMessage.ICollectionMessage|null} [collectionMessage] InteractiveMessage collectionMessage + * @property {proto.Message.InteractiveMessage.INativeFlowMessage|null} [nativeFlowMessage] InteractiveMessage nativeFlowMessage + */ + + /** + * Constructs a new InteractiveMessage. + * @memberof proto.Message + * @classdesc Represents an InteractiveMessage. + * @implements IInteractiveMessage + * @constructor + * @param {proto.Message.IInteractiveMessage=} [properties] Properties to set + */ + function InteractiveMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * InteractiveMessage header. + * @member {proto.Message.InteractiveMessage.IHeader|null|undefined} header + * @memberof proto.Message.InteractiveMessage + * @instance + */ + InteractiveMessage.prototype.header = null; + + /** + * InteractiveMessage body. + * @member {proto.Message.InteractiveMessage.IBody|null|undefined} body + * @memberof proto.Message.InteractiveMessage + * @instance + */ + InteractiveMessage.prototype.body = null; + + /** + * InteractiveMessage footer. + * @member {proto.Message.InteractiveMessage.IFooter|null|undefined} footer + * @memberof proto.Message.InteractiveMessage + * @instance + */ + InteractiveMessage.prototype.footer = null; + + /** + * InteractiveMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.InteractiveMessage + * @instance + */ + InteractiveMessage.prototype.contextInfo = null; + + /** + * InteractiveMessage shopStorefrontMessage. + * @member {proto.Message.InteractiveMessage.IShopMessage|null|undefined} shopStorefrontMessage + * @memberof proto.Message.InteractiveMessage + * @instance + */ + InteractiveMessage.prototype.shopStorefrontMessage = null; + + /** + * InteractiveMessage collectionMessage. + * @member {proto.Message.InteractiveMessage.ICollectionMessage|null|undefined} collectionMessage + * @memberof proto.Message.InteractiveMessage + * @instance + */ + InteractiveMessage.prototype.collectionMessage = null; + + /** + * InteractiveMessage nativeFlowMessage. + * @member {proto.Message.InteractiveMessage.INativeFlowMessage|null|undefined} nativeFlowMessage + * @memberof proto.Message.InteractiveMessage + * @instance + */ + InteractiveMessage.prototype.nativeFlowMessage = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * InteractiveMessage interactiveMessage. + * @member {"shopStorefrontMessage"|"collectionMessage"|"nativeFlowMessage"|undefined} interactiveMessage + * @memberof proto.Message.InteractiveMessage + * @instance + */ + Object.defineProperty(InteractiveMessage.prototype, "interactiveMessage", { + get: $util.oneOfGetter($oneOfFields = ["shopStorefrontMessage", "collectionMessage", "nativeFlowMessage"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new InteractiveMessage instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage + * @static + * @param {proto.Message.IInteractiveMessage=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage} InteractiveMessage instance + */ + InteractiveMessage.create = function create(properties) { + return new InteractiveMessage(properties); + }; + + /** + * Encodes the specified InteractiveMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage + * @static + * @param {proto.Message.IInteractiveMessage} message InteractiveMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InteractiveMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.header != null && Object.hasOwnProperty.call(message, "header")) + $root.proto.Message.InteractiveMessage.Header.encode(message.header, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + $root.proto.Message.InteractiveMessage.Body.encode(message.body, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.footer != null && Object.hasOwnProperty.call(message, "footer")) + $root.proto.Message.InteractiveMessage.Footer.encode(message.footer, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.shopStorefrontMessage != null && Object.hasOwnProperty.call(message, "shopStorefrontMessage")) + $root.proto.Message.InteractiveMessage.ShopMessage.encode(message.shopStorefrontMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.collectionMessage != null && Object.hasOwnProperty.call(message, "collectionMessage")) + $root.proto.Message.InteractiveMessage.CollectionMessage.encode(message.collectionMessage, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.nativeFlowMessage != null && Object.hasOwnProperty.call(message, "nativeFlowMessage")) + $root.proto.Message.InteractiveMessage.NativeFlowMessage.encode(message.nativeFlowMessage, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified InteractiveMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage + * @static + * @param {proto.Message.IInteractiveMessage} message InteractiveMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InteractiveMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an InteractiveMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage} InteractiveMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InteractiveMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.header = $root.proto.Message.InteractiveMessage.Header.decode(reader, reader.uint32()); + break; + case 2: + message.body = $root.proto.Message.InteractiveMessage.Body.decode(reader, reader.uint32()); + break; + case 3: + message.footer = $root.proto.Message.InteractiveMessage.Footer.decode(reader, reader.uint32()); + break; + case 15: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 4: + message.shopStorefrontMessage = $root.proto.Message.InteractiveMessage.ShopMessage.decode(reader, reader.uint32()); + break; + case 5: + message.collectionMessage = $root.proto.Message.InteractiveMessage.CollectionMessage.decode(reader, reader.uint32()); + break; + case 6: + message.nativeFlowMessage = $root.proto.Message.InteractiveMessage.NativeFlowMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an InteractiveMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage} InteractiveMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InteractiveMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an InteractiveMessage message. + * @function verify + * @memberof proto.Message.InteractiveMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + InteractiveMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.header != null && message.hasOwnProperty("header")) { + var error = $root.proto.Message.InteractiveMessage.Header.verify(message.header); + if (error) + return "header." + error; + } + if (message.body != null && message.hasOwnProperty("body")) { + var error = $root.proto.Message.InteractiveMessage.Body.verify(message.body); + if (error) + return "body." + error; + } + if (message.footer != null && message.hasOwnProperty("footer")) { + var error = $root.proto.Message.InteractiveMessage.Footer.verify(message.footer); + if (error) + return "footer." + error; + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.shopStorefrontMessage != null && message.hasOwnProperty("shopStorefrontMessage")) { + properties.interactiveMessage = 1; + { + var error = $root.proto.Message.InteractiveMessage.ShopMessage.verify(message.shopStorefrontMessage); + if (error) + return "shopStorefrontMessage." + error; + } + } + if (message.collectionMessage != null && message.hasOwnProperty("collectionMessage")) { + if (properties.interactiveMessage === 1) + return "interactiveMessage: multiple values"; + properties.interactiveMessage = 1; + { + var error = $root.proto.Message.InteractiveMessage.CollectionMessage.verify(message.collectionMessage); + if (error) + return "collectionMessage." + error; + } + } + if (message.nativeFlowMessage != null && message.hasOwnProperty("nativeFlowMessage")) { + if (properties.interactiveMessage === 1) + return "interactiveMessage: multiple values"; + properties.interactiveMessage = 1; + { + var error = $root.proto.Message.InteractiveMessage.NativeFlowMessage.verify(message.nativeFlowMessage); + if (error) + return "nativeFlowMessage." + error; + } + } + return null; + }; + + /** + * Creates an InteractiveMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage} InteractiveMessage + */ + InteractiveMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage) + return object; + var message = new $root.proto.Message.InteractiveMessage(); + if (object.header != null) { + if (typeof object.header !== "object") + throw TypeError(".proto.Message.InteractiveMessage.header: object expected"); + message.header = $root.proto.Message.InteractiveMessage.Header.fromObject(object.header); + } + if (object.body != null) { + if (typeof object.body !== "object") + throw TypeError(".proto.Message.InteractiveMessage.body: object expected"); + message.body = $root.proto.Message.InteractiveMessage.Body.fromObject(object.body); + } + if (object.footer != null) { + if (typeof object.footer !== "object") + throw TypeError(".proto.Message.InteractiveMessage.footer: object expected"); + message.footer = $root.proto.Message.InteractiveMessage.Footer.fromObject(object.footer); + } + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.InteractiveMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.shopStorefrontMessage != null) { + if (typeof object.shopStorefrontMessage !== "object") + throw TypeError(".proto.Message.InteractiveMessage.shopStorefrontMessage: object expected"); + message.shopStorefrontMessage = $root.proto.Message.InteractiveMessage.ShopMessage.fromObject(object.shopStorefrontMessage); + } + if (object.collectionMessage != null) { + if (typeof object.collectionMessage !== "object") + throw TypeError(".proto.Message.InteractiveMessage.collectionMessage: object expected"); + message.collectionMessage = $root.proto.Message.InteractiveMessage.CollectionMessage.fromObject(object.collectionMessage); + } + if (object.nativeFlowMessage != null) { + if (typeof object.nativeFlowMessage !== "object") + throw TypeError(".proto.Message.InteractiveMessage.nativeFlowMessage: object expected"); + message.nativeFlowMessage = $root.proto.Message.InteractiveMessage.NativeFlowMessage.fromObject(object.nativeFlowMessage); + } + return message; + }; + + /** + * Creates a plain object from an InteractiveMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage + * @static + * @param {proto.Message.InteractiveMessage} message InteractiveMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + InteractiveMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.header = null; + object.body = null; + object.footer = null; + object.contextInfo = null; + } + if (message.header != null && message.hasOwnProperty("header")) + object.header = $root.proto.Message.InteractiveMessage.Header.toObject(message.header, options); + if (message.body != null && message.hasOwnProperty("body")) + object.body = $root.proto.Message.InteractiveMessage.Body.toObject(message.body, options); + if (message.footer != null && message.hasOwnProperty("footer")) + object.footer = $root.proto.Message.InteractiveMessage.Footer.toObject(message.footer, options); + if (message.shopStorefrontMessage != null && message.hasOwnProperty("shopStorefrontMessage")) { + object.shopStorefrontMessage = $root.proto.Message.InteractiveMessage.ShopMessage.toObject(message.shopStorefrontMessage, options); + if (options.oneofs) + object.interactiveMessage = "shopStorefrontMessage"; + } + if (message.collectionMessage != null && message.hasOwnProperty("collectionMessage")) { + object.collectionMessage = $root.proto.Message.InteractiveMessage.CollectionMessage.toObject(message.collectionMessage, options); + if (options.oneofs) + object.interactiveMessage = "collectionMessage"; + } + if (message.nativeFlowMessage != null && message.hasOwnProperty("nativeFlowMessage")) { + object.nativeFlowMessage = $root.proto.Message.InteractiveMessage.NativeFlowMessage.toObject(message.nativeFlowMessage, options); + if (options.oneofs) + object.interactiveMessage = "nativeFlowMessage"; + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this InteractiveMessage to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage + * @instance + * @returns {Object.} JSON object + */ + InteractiveMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + InteractiveMessage.Body = (function() { + + /** + * Properties of a Body. + * @memberof proto.Message.InteractiveMessage + * @interface IBody + * @property {string|null} [text] Body text + */ + + /** + * Constructs a new Body. + * @memberof proto.Message.InteractiveMessage + * @classdesc Represents a Body. + * @implements IBody + * @constructor + * @param {proto.Message.InteractiveMessage.IBody=} [properties] Properties to set + */ + function Body(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Body text. + * @member {string} text + * @memberof proto.Message.InteractiveMessage.Body + * @instance + */ + Body.prototype.text = ""; + + /** + * Creates a new Body instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {proto.Message.InteractiveMessage.IBody=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage.Body} Body instance + */ + Body.create = function create(properties) { + return new Body(properties); + }; + + /** + * Encodes the specified Body message. Does not implicitly {@link proto.Message.InteractiveMessage.Body.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {proto.Message.InteractiveMessage.IBody} message Body message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Body.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.text); + return writer; + }; + + /** + * Encodes the specified Body message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.Body.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {proto.Message.InteractiveMessage.IBody} message Body message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Body.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Body message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage.Body} Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Body.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage.Body(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.text = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Body message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage.Body} Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Body.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Body message. + * @function verify + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Body.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + return null; + }; + + /** + * Creates a Body message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage.Body} Body + */ + Body.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage.Body) + return object; + var message = new $root.proto.Message.InteractiveMessage.Body(); + if (object.text != null) + message.text = String(object.text); + return message; + }; + + /** + * Creates a plain object from a Body message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage.Body + * @static + * @param {proto.Message.InteractiveMessage.Body} message Body + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Body.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.text = ""; + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + return object; + }; + + /** + * Converts this Body to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage.Body + * @instance + * @returns {Object.} JSON object + */ + Body.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Body; + })(); + + InteractiveMessage.CollectionMessage = (function() { + + /** + * Properties of a CollectionMessage. + * @memberof proto.Message.InteractiveMessage + * @interface ICollectionMessage + * @property {string|null} [bizJid] CollectionMessage bizJid + * @property {string|null} [id] CollectionMessage id + * @property {number|null} [messageVersion] CollectionMessage messageVersion + */ + + /** + * Constructs a new CollectionMessage. + * @memberof proto.Message.InteractiveMessage + * @classdesc Represents a CollectionMessage. + * @implements ICollectionMessage + * @constructor + * @param {proto.Message.InteractiveMessage.ICollectionMessage=} [properties] Properties to set + */ + function CollectionMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CollectionMessage bizJid. + * @member {string} bizJid + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @instance + */ + CollectionMessage.prototype.bizJid = ""; + + /** + * CollectionMessage id. + * @member {string} id + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @instance + */ + CollectionMessage.prototype.id = ""; + + /** + * CollectionMessage messageVersion. + * @member {number} messageVersion + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @instance + */ + CollectionMessage.prototype.messageVersion = 0; + + /** + * Creates a new CollectionMessage instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {proto.Message.InteractiveMessage.ICollectionMessage=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage.CollectionMessage} CollectionMessage instance + */ + CollectionMessage.create = function create(properties) { + return new CollectionMessage(properties); + }; + + /** + * Encodes the specified CollectionMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.CollectionMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {proto.Message.InteractiveMessage.ICollectionMessage} message CollectionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CollectionMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.bizJid != null && Object.hasOwnProperty.call(message, "bizJid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.bizJid); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.id); + if (message.messageVersion != null && Object.hasOwnProperty.call(message, "messageVersion")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.messageVersion); + return writer; + }; + + /** + * Encodes the specified CollectionMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.CollectionMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {proto.Message.InteractiveMessage.ICollectionMessage} message CollectionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CollectionMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CollectionMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage.CollectionMessage} CollectionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CollectionMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage.CollectionMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.bizJid = reader.string(); + break; + case 2: + message.id = reader.string(); + break; + case 3: + message.messageVersion = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CollectionMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage.CollectionMessage} CollectionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CollectionMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CollectionMessage message. + * @function verify + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CollectionMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.bizJid != null && message.hasOwnProperty("bizJid")) + if (!$util.isString(message.bizJid)) + return "bizJid: string expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + if (message.messageVersion != null && message.hasOwnProperty("messageVersion")) + if (!$util.isInteger(message.messageVersion)) + return "messageVersion: integer expected"; + return null; + }; + + /** + * Creates a CollectionMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage.CollectionMessage} CollectionMessage + */ + CollectionMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage.CollectionMessage) + return object; + var message = new $root.proto.Message.InteractiveMessage.CollectionMessage(); + if (object.bizJid != null) + message.bizJid = String(object.bizJid); + if (object.id != null) + message.id = String(object.id); + if (object.messageVersion != null) + message.messageVersion = object.messageVersion | 0; + return message; + }; + + /** + * Creates a plain object from a CollectionMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @static + * @param {proto.Message.InteractiveMessage.CollectionMessage} message CollectionMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CollectionMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.bizJid = ""; + object.id = ""; + object.messageVersion = 0; + } + if (message.bizJid != null && message.hasOwnProperty("bizJid")) + object.bizJid = message.bizJid; + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.messageVersion != null && message.hasOwnProperty("messageVersion")) + object.messageVersion = message.messageVersion; + return object; + }; + + /** + * Converts this CollectionMessage to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage.CollectionMessage + * @instance + * @returns {Object.} JSON object + */ + CollectionMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return CollectionMessage; + })(); + + InteractiveMessage.Footer = (function() { + + /** + * Properties of a Footer. + * @memberof proto.Message.InteractiveMessage + * @interface IFooter + * @property {string|null} [text] Footer text + */ + + /** + * Constructs a new Footer. + * @memberof proto.Message.InteractiveMessage + * @classdesc Represents a Footer. + * @implements IFooter + * @constructor + * @param {proto.Message.InteractiveMessage.IFooter=} [properties] Properties to set + */ + function Footer(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Footer text. + * @member {string} text + * @memberof proto.Message.InteractiveMessage.Footer + * @instance + */ + Footer.prototype.text = ""; + + /** + * Creates a new Footer instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {proto.Message.InteractiveMessage.IFooter=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage.Footer} Footer instance + */ + Footer.create = function create(properties) { + return new Footer(properties); + }; + + /** + * Encodes the specified Footer message. Does not implicitly {@link proto.Message.InteractiveMessage.Footer.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {proto.Message.InteractiveMessage.IFooter} message Footer message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Footer.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.text); + return writer; + }; + + /** + * Encodes the specified Footer message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.Footer.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {proto.Message.InteractiveMessage.IFooter} message Footer message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Footer.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Footer message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage.Footer} Footer + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Footer.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage.Footer(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.text = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Footer message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage.Footer} Footer + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Footer.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Footer message. + * @function verify + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Footer.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + return null; + }; + + /** + * Creates a Footer message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage.Footer} Footer + */ + Footer.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage.Footer) + return object; + var message = new $root.proto.Message.InteractiveMessage.Footer(); + if (object.text != null) + message.text = String(object.text); + return message; + }; + + /** + * Creates a plain object from a Footer message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage.Footer + * @static + * @param {proto.Message.InteractiveMessage.Footer} message Footer + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Footer.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.text = ""; + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + return object; + }; + + /** + * Converts this Footer to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage.Footer + * @instance + * @returns {Object.} JSON object + */ + Footer.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Footer; + })(); + + InteractiveMessage.Header = (function() { + + /** + * Properties of a Header. + * @memberof proto.Message.InteractiveMessage + * @interface IHeader + * @property {string|null} [title] Header title + * @property {string|null} [subtitle] Header subtitle + * @property {boolean|null} [hasMediaAttachment] Header hasMediaAttachment + * @property {proto.Message.IDocumentMessage|null} [documentMessage] Header documentMessage + * @property {proto.Message.IImageMessage|null} [imageMessage] Header imageMessage + * @property {Uint8Array|null} [jpegThumbnail] Header jpegThumbnail + * @property {proto.Message.IVideoMessage|null} [videoMessage] Header videoMessage + */ + + /** + * Constructs a new Header. + * @memberof proto.Message.InteractiveMessage + * @classdesc Represents a Header. + * @implements IHeader + * @constructor + * @param {proto.Message.InteractiveMessage.IHeader=} [properties] Properties to set + */ + function Header(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Header title. + * @member {string} title + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Header.prototype.title = ""; + + /** + * Header subtitle. + * @member {string} subtitle + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Header.prototype.subtitle = ""; + + /** + * Header hasMediaAttachment. + * @member {boolean} hasMediaAttachment + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Header.prototype.hasMediaAttachment = false; + + /** + * Header documentMessage. + * @member {proto.Message.IDocumentMessage|null|undefined} documentMessage + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Header.prototype.documentMessage = null; + + /** + * Header imageMessage. + * @member {proto.Message.IImageMessage|null|undefined} imageMessage + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Header.prototype.imageMessage = null; + + /** + * Header jpegThumbnail. + * @member {Uint8Array|null|undefined} jpegThumbnail + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Header.prototype.jpegThumbnail = null; + + /** + * Header videoMessage. + * @member {proto.Message.IVideoMessage|null|undefined} videoMessage + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Header.prototype.videoMessage = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * Header media. + * @member {"documentMessage"|"imageMessage"|"jpegThumbnail"|"videoMessage"|undefined} media + * @memberof proto.Message.InteractiveMessage.Header + * @instance + */ + Object.defineProperty(Header.prototype, "media", { + get: $util.oneOfGetter($oneOfFields = ["documentMessage", "imageMessage", "jpegThumbnail", "videoMessage"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new Header instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {proto.Message.InteractiveMessage.IHeader=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage.Header} Header instance + */ + Header.create = function create(properties) { + return new Header(properties); + }; + + /** + * Encodes the specified Header message. Does not implicitly {@link proto.Message.InteractiveMessage.Header.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {proto.Message.InteractiveMessage.IHeader} message Header message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Header.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); + if (message.subtitle != null && Object.hasOwnProperty.call(message, "subtitle")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.subtitle); + if (message.documentMessage != null && Object.hasOwnProperty.call(message, "documentMessage")) + $root.proto.Message.DocumentMessage.encode(message.documentMessage, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.imageMessage != null && Object.hasOwnProperty.call(message, "imageMessage")) + $root.proto.Message.ImageMessage.encode(message.imageMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.hasMediaAttachment != null && Object.hasOwnProperty.call(message, "hasMediaAttachment")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.hasMediaAttachment); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.jpegThumbnail); + if (message.videoMessage != null && Object.hasOwnProperty.call(message, "videoMessage")) + $root.proto.Message.VideoMessage.encode(message.videoMessage, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Header message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.Header.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {proto.Message.InteractiveMessage.IHeader} message Header message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Header.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Header message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage.Header} Header + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Header.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage.Header(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.title = reader.string(); + break; + case 2: + message.subtitle = reader.string(); + break; + case 5: + message.hasMediaAttachment = reader.bool(); + break; + case 3: + message.documentMessage = $root.proto.Message.DocumentMessage.decode(reader, reader.uint32()); + break; + case 4: + message.imageMessage = $root.proto.Message.ImageMessage.decode(reader, reader.uint32()); + break; + case 6: + message.jpegThumbnail = reader.bytes(); + break; + case 7: + message.videoMessage = $root.proto.Message.VideoMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Header message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage.Header} Header + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Header.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Header message. + * @function verify + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Header.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.subtitle != null && message.hasOwnProperty("subtitle")) + if (!$util.isString(message.subtitle)) + return "subtitle: string expected"; + if (message.hasMediaAttachment != null && message.hasOwnProperty("hasMediaAttachment")) + if (typeof message.hasMediaAttachment !== "boolean") + return "hasMediaAttachment: boolean expected"; + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + properties.media = 1; + { + var error = $root.proto.Message.DocumentMessage.verify(message.documentMessage); + if (error) + return "documentMessage." + error; + } + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + if (properties.media === 1) + return "media: multiple values"; + properties.media = 1; + { + var error = $root.proto.Message.ImageMessage.verify(message.imageMessage); + if (error) + return "imageMessage." + error; + } + } + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) { + if (properties.media === 1) + return "media: multiple values"; + properties.media = 1; + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + if (properties.media === 1) + return "media: multiple values"; + properties.media = 1; + { + var error = $root.proto.Message.VideoMessage.verify(message.videoMessage); + if (error) + return "videoMessage." + error; + } + } + return null; + }; + + /** + * Creates a Header message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage.Header} Header + */ + Header.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage.Header) + return object; + var message = new $root.proto.Message.InteractiveMessage.Header(); + if (object.title != null) + message.title = String(object.title); + if (object.subtitle != null) + message.subtitle = String(object.subtitle); + if (object.hasMediaAttachment != null) + message.hasMediaAttachment = Boolean(object.hasMediaAttachment); + if (object.documentMessage != null) { + if (typeof object.documentMessage !== "object") + throw TypeError(".proto.Message.InteractiveMessage.Header.documentMessage: object expected"); + message.documentMessage = $root.proto.Message.DocumentMessage.fromObject(object.documentMessage); + } + if (object.imageMessage != null) { + if (typeof object.imageMessage !== "object") + throw TypeError(".proto.Message.InteractiveMessage.Header.imageMessage: object expected"); + message.imageMessage = $root.proto.Message.ImageMessage.fromObject(object.imageMessage); + } + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.videoMessage != null) { + if (typeof object.videoMessage !== "object") + throw TypeError(".proto.Message.InteractiveMessage.Header.videoMessage: object expected"); + message.videoMessage = $root.proto.Message.VideoMessage.fromObject(object.videoMessage); + } + return message; + }; + + /** + * Creates a plain object from a Header message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage.Header + * @static + * @param {proto.Message.InteractiveMessage.Header} message Header + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Header.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.title = ""; + object.subtitle = ""; + object.hasMediaAttachment = false; + } + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.subtitle != null && message.hasOwnProperty("subtitle")) + object.subtitle = message.subtitle; + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + object.documentMessage = $root.proto.Message.DocumentMessage.toObject(message.documentMessage, options); + if (options.oneofs) + object.media = "documentMessage"; + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + object.imageMessage = $root.proto.Message.ImageMessage.toObject(message.imageMessage, options); + if (options.oneofs) + object.media = "imageMessage"; + } + if (message.hasMediaAttachment != null && message.hasOwnProperty("hasMediaAttachment")) + object.hasMediaAttachment = message.hasMediaAttachment; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) { + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (options.oneofs) + object.media = "jpegThumbnail"; + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + object.videoMessage = $root.proto.Message.VideoMessage.toObject(message.videoMessage, options); + if (options.oneofs) + object.media = "videoMessage"; + } + return object; + }; + + /** + * Converts this Header to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage.Header + * @instance + * @returns {Object.} JSON object + */ + Header.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Header; + })(); + + InteractiveMessage.NativeFlowMessage = (function() { + + /** + * Properties of a NativeFlowMessage. + * @memberof proto.Message.InteractiveMessage + * @interface INativeFlowMessage + * @property {Array.|null} [buttons] NativeFlowMessage buttons + * @property {string|null} [messageParamsJson] NativeFlowMessage messageParamsJson + * @property {number|null} [messageVersion] NativeFlowMessage messageVersion + */ + + /** + * Constructs a new NativeFlowMessage. + * @memberof proto.Message.InteractiveMessage + * @classdesc Represents a NativeFlowMessage. + * @implements INativeFlowMessage + * @constructor + * @param {proto.Message.InteractiveMessage.INativeFlowMessage=} [properties] Properties to set + */ + function NativeFlowMessage(properties) { + this.buttons = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NativeFlowMessage buttons. + * @member {Array.} buttons + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @instance + */ + NativeFlowMessage.prototype.buttons = $util.emptyArray; + + /** + * NativeFlowMessage messageParamsJson. + * @member {string} messageParamsJson + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @instance + */ + NativeFlowMessage.prototype.messageParamsJson = ""; + + /** + * NativeFlowMessage messageVersion. + * @member {number} messageVersion + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @instance + */ + NativeFlowMessage.prototype.messageVersion = 0; + + /** + * Creates a new NativeFlowMessage instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {proto.Message.InteractiveMessage.INativeFlowMessage=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage} NativeFlowMessage instance + */ + NativeFlowMessage.create = function create(properties) { + return new NativeFlowMessage(properties); + }; + + /** + * Encodes the specified NativeFlowMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {proto.Message.InteractiveMessage.INativeFlowMessage} message NativeFlowMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.buttons != null && message.buttons.length) + for (var i = 0; i < message.buttons.length; ++i) + $root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.encode(message.buttons[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.messageParamsJson != null && Object.hasOwnProperty.call(message, "messageParamsJson")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.messageParamsJson); + if (message.messageVersion != null && Object.hasOwnProperty.call(message, "messageVersion")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.messageVersion); + return writer; + }; + + /** + * Encodes the specified NativeFlowMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {proto.Message.InteractiveMessage.INativeFlowMessage} message NativeFlowMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NativeFlowMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage} NativeFlowMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage.NativeFlowMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.buttons && message.buttons.length)) + message.buttons = []; + message.buttons.push($root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.decode(reader, reader.uint32())); + break; + case 2: + message.messageParamsJson = reader.string(); + break; + case 3: + message.messageVersion = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NativeFlowMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage} NativeFlowMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NativeFlowMessage message. + * @function verify + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NativeFlowMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.buttons != null && message.hasOwnProperty("buttons")) { + if (!Array.isArray(message.buttons)) + return "buttons: array expected"; + for (var i = 0; i < message.buttons.length; ++i) { + var error = $root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.verify(message.buttons[i]); + if (error) + return "buttons." + error; + } + } + if (message.messageParamsJson != null && message.hasOwnProperty("messageParamsJson")) + if (!$util.isString(message.messageParamsJson)) + return "messageParamsJson: string expected"; + if (message.messageVersion != null && message.hasOwnProperty("messageVersion")) + if (!$util.isInteger(message.messageVersion)) + return "messageVersion: integer expected"; + return null; + }; + + /** + * Creates a NativeFlowMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage} NativeFlowMessage + */ + NativeFlowMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage.NativeFlowMessage) + return object; + var message = new $root.proto.Message.InteractiveMessage.NativeFlowMessage(); + if (object.buttons) { + if (!Array.isArray(object.buttons)) + throw TypeError(".proto.Message.InteractiveMessage.NativeFlowMessage.buttons: array expected"); + message.buttons = []; + for (var i = 0; i < object.buttons.length; ++i) { + if (typeof object.buttons[i] !== "object") + throw TypeError(".proto.Message.InteractiveMessage.NativeFlowMessage.buttons: object expected"); + message.buttons[i] = $root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.fromObject(object.buttons[i]); + } + } + if (object.messageParamsJson != null) + message.messageParamsJson = String(object.messageParamsJson); + if (object.messageVersion != null) + message.messageVersion = object.messageVersion | 0; + return message; + }; + + /** + * Creates a plain object from a NativeFlowMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @static + * @param {proto.Message.InteractiveMessage.NativeFlowMessage} message NativeFlowMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NativeFlowMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.buttons = []; + if (options.defaults) { + object.messageParamsJson = ""; + object.messageVersion = 0; + } + if (message.buttons && message.buttons.length) { + object.buttons = []; + for (var j = 0; j < message.buttons.length; ++j) + object.buttons[j] = $root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.toObject(message.buttons[j], options); + } + if (message.messageParamsJson != null && message.hasOwnProperty("messageParamsJson")) + object.messageParamsJson = message.messageParamsJson; + if (message.messageVersion != null && message.hasOwnProperty("messageVersion")) + object.messageVersion = message.messageVersion; + return object; + }; + + /** + * Converts this NativeFlowMessage to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @instance + * @returns {Object.} JSON object + */ + NativeFlowMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + NativeFlowMessage.NativeFlowButton = (function() { + + /** + * Properties of a NativeFlowButton. + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @interface INativeFlowButton + * @property {string|null} [name] NativeFlowButton name + * @property {string|null} [buttonParamsJson] NativeFlowButton buttonParamsJson + */ + + /** + * Constructs a new NativeFlowButton. + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage + * @classdesc Represents a NativeFlowButton. + * @implements INativeFlowButton + * @constructor + * @param {proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton=} [properties] Properties to set + */ + function NativeFlowButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NativeFlowButton name. + * @member {string} name + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @instance + */ + NativeFlowButton.prototype.name = ""; + + /** + * NativeFlowButton buttonParamsJson. + * @member {string} buttonParamsJson + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @instance + */ + NativeFlowButton.prototype.buttonParamsJson = ""; + + /** + * Creates a new NativeFlowButton instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton} NativeFlowButton instance + */ + NativeFlowButton.create = function create(properties) { + return new NativeFlowButton(properties); + }; + + /** + * Encodes the specified NativeFlowButton message. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton} message NativeFlowButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.buttonParamsJson != null && Object.hasOwnProperty.call(message, "buttonParamsJson")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.buttonParamsJson); + return writer; + }; + + /** + * Encodes the specified NativeFlowButton message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {proto.Message.InteractiveMessage.NativeFlowMessage.INativeFlowButton} message NativeFlowButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NativeFlowButton message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton} NativeFlowButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.buttonParamsJson = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NativeFlowButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton} NativeFlowButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NativeFlowButton message. + * @function verify + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NativeFlowButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.buttonParamsJson != null && message.hasOwnProperty("buttonParamsJson")) + if (!$util.isString(message.buttonParamsJson)) + return "buttonParamsJson: string expected"; + return null; + }; + + /** + * Creates a NativeFlowButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton} NativeFlowButton + */ + NativeFlowButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton) + return object; + var message = new $root.proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton(); + if (object.name != null) + message.name = String(object.name); + if (object.buttonParamsJson != null) + message.buttonParamsJson = String(object.buttonParamsJson); + return message; + }; + + /** + * Creates a plain object from a NativeFlowButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @static + * @param {proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton} message NativeFlowButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NativeFlowButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.name = ""; + object.buttonParamsJson = ""; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.buttonParamsJson != null && message.hasOwnProperty("buttonParamsJson")) + object.buttonParamsJson = message.buttonParamsJson; + return object; + }; + + /** + * Converts this NativeFlowButton to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage.NativeFlowMessage.NativeFlowButton + * @instance + * @returns {Object.} JSON object + */ + NativeFlowButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return NativeFlowButton; + })(); + + return NativeFlowMessage; + })(); + + InteractiveMessage.ShopMessage = (function() { + + /** + * Properties of a ShopMessage. + * @memberof proto.Message.InteractiveMessage + * @interface IShopMessage + * @property {string|null} [id] ShopMessage id + * @property {proto.Message.InteractiveMessage.ShopMessage.Surface|null} [surface] ShopMessage surface + * @property {number|null} [messageVersion] ShopMessage messageVersion + */ + + /** + * Constructs a new ShopMessage. + * @memberof proto.Message.InteractiveMessage + * @classdesc Represents a ShopMessage. + * @implements IShopMessage + * @constructor + * @param {proto.Message.InteractiveMessage.IShopMessage=} [properties] Properties to set + */ + function ShopMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ShopMessage id. + * @member {string} id + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @instance + */ + ShopMessage.prototype.id = ""; + + /** + * ShopMessage surface. + * @member {proto.Message.InteractiveMessage.ShopMessage.Surface} surface + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @instance + */ + ShopMessage.prototype.surface = 0; + + /** + * ShopMessage messageVersion. + * @member {number} messageVersion + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @instance + */ + ShopMessage.prototype.messageVersion = 0; + + /** + * Creates a new ShopMessage instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {proto.Message.InteractiveMessage.IShopMessage=} [properties] Properties to set + * @returns {proto.Message.InteractiveMessage.ShopMessage} ShopMessage instance + */ + ShopMessage.create = function create(properties) { + return new ShopMessage(properties); + }; + + /** + * Encodes the specified ShopMessage message. Does not implicitly {@link proto.Message.InteractiveMessage.ShopMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {proto.Message.InteractiveMessage.IShopMessage} message ShopMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShopMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.id); + if (message.surface != null && Object.hasOwnProperty.call(message, "surface")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.surface); + if (message.messageVersion != null && Object.hasOwnProperty.call(message, "messageVersion")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.messageVersion); + return writer; + }; + + /** + * Encodes the specified ShopMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveMessage.ShopMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {proto.Message.InteractiveMessage.IShopMessage} message ShopMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShopMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ShopMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveMessage.ShopMessage} ShopMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShopMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveMessage.ShopMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.string(); + break; + case 2: + message.surface = reader.int32(); + break; + case 3: + message.messageVersion = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ShopMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveMessage.ShopMessage} ShopMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShopMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ShopMessage message. + * @function verify + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ShopMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + if (message.surface != null && message.hasOwnProperty("surface")) + switch (message.surface) { + default: + return "surface: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.messageVersion != null && message.hasOwnProperty("messageVersion")) + if (!$util.isInteger(message.messageVersion)) + return "messageVersion: integer expected"; + return null; + }; + + /** + * Creates a ShopMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveMessage.ShopMessage} ShopMessage + */ + ShopMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveMessage.ShopMessage) + return object; + var message = new $root.proto.Message.InteractiveMessage.ShopMessage(); + if (object.id != null) + message.id = String(object.id); + switch (object.surface) { + case "UNKNOWN_SURFACE": + case 0: + message.surface = 0; + break; + case "FB": + case 1: + message.surface = 1; + break; + case "IG": + case 2: + message.surface = 2; + break; + case "WA": + case 3: + message.surface = 3; + break; + } + if (object.messageVersion != null) + message.messageVersion = object.messageVersion | 0; + return message; + }; + + /** + * Creates a plain object from a ShopMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @static + * @param {proto.Message.InteractiveMessage.ShopMessage} message ShopMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ShopMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.id = ""; + object.surface = options.enums === String ? "UNKNOWN_SURFACE" : 0; + object.messageVersion = 0; + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.surface != null && message.hasOwnProperty("surface")) + object.surface = options.enums === String ? $root.proto.Message.InteractiveMessage.ShopMessage.Surface[message.surface] : message.surface; + if (message.messageVersion != null && message.hasOwnProperty("messageVersion")) + object.messageVersion = message.messageVersion; + return object; + }; + + /** + * Converts this ShopMessage to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveMessage.ShopMessage + * @instance + * @returns {Object.} JSON object + */ + ShopMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Surface enum. + * @name proto.Message.InteractiveMessage.ShopMessage.Surface + * @enum {number} + * @property {number} UNKNOWN_SURFACE=0 UNKNOWN_SURFACE value + * @property {number} FB=1 FB value + * @property {number} IG=2 IG value + * @property {number} WA=3 WA value + */ + ShopMessage.Surface = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN_SURFACE"] = 0; + values[valuesById[1] = "FB"] = 1; + values[valuesById[2] = "IG"] = 2; + values[valuesById[3] = "WA"] = 3; + return values; + })(); + + return ShopMessage; + })(); + + return InteractiveMessage; + })(); + + Message.InteractiveResponseMessage = (function() { + + /** + * Properties of an InteractiveResponseMessage. + * @memberof proto.Message + * @interface IInteractiveResponseMessage + * @property {proto.Message.InteractiveResponseMessage.IBody|null} [body] InteractiveResponseMessage body + * @property {proto.IContextInfo|null} [contextInfo] InteractiveResponseMessage contextInfo + * @property {proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage|null} [nativeFlowResponseMessage] InteractiveResponseMessage nativeFlowResponseMessage + */ + + /** + * Constructs a new InteractiveResponseMessage. + * @memberof proto.Message + * @classdesc Represents an InteractiveResponseMessage. + * @implements IInteractiveResponseMessage + * @constructor + * @param {proto.Message.IInteractiveResponseMessage=} [properties] Properties to set + */ + function InteractiveResponseMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * InteractiveResponseMessage body. + * @member {proto.Message.InteractiveResponseMessage.IBody|null|undefined} body + * @memberof proto.Message.InteractiveResponseMessage + * @instance + */ + InteractiveResponseMessage.prototype.body = null; + + /** + * InteractiveResponseMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.InteractiveResponseMessage + * @instance + */ + InteractiveResponseMessage.prototype.contextInfo = null; + + /** + * InteractiveResponseMessage nativeFlowResponseMessage. + * @member {proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage|null|undefined} nativeFlowResponseMessage + * @memberof proto.Message.InteractiveResponseMessage + * @instance + */ + InteractiveResponseMessage.prototype.nativeFlowResponseMessage = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * InteractiveResponseMessage interactiveResponseMessage. + * @member {"nativeFlowResponseMessage"|undefined} interactiveResponseMessage + * @memberof proto.Message.InteractiveResponseMessage + * @instance + */ + Object.defineProperty(InteractiveResponseMessage.prototype, "interactiveResponseMessage", { + get: $util.oneOfGetter($oneOfFields = ["nativeFlowResponseMessage"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new InteractiveResponseMessage instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {proto.Message.IInteractiveResponseMessage=} [properties] Properties to set + * @returns {proto.Message.InteractiveResponseMessage} InteractiveResponseMessage instance + */ + InteractiveResponseMessage.create = function create(properties) { + return new InteractiveResponseMessage(properties); + }; + + /** + * Encodes the specified InteractiveResponseMessage message. Does not implicitly {@link proto.Message.InteractiveResponseMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {proto.Message.IInteractiveResponseMessage} message InteractiveResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InteractiveResponseMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + $root.proto.Message.InteractiveResponseMessage.Body.encode(message.body, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.nativeFlowResponseMessage != null && Object.hasOwnProperty.call(message, "nativeFlowResponseMessage")) + $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.encode(message.nativeFlowResponseMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified InteractiveResponseMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveResponseMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {proto.Message.IInteractiveResponseMessage} message InteractiveResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InteractiveResponseMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an InteractiveResponseMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveResponseMessage} InteractiveResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InteractiveResponseMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveResponseMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.body = $root.proto.Message.InteractiveResponseMessage.Body.decode(reader, reader.uint32()); + break; + case 15: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 2: + message.nativeFlowResponseMessage = $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an InteractiveResponseMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveResponseMessage} InteractiveResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InteractiveResponseMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an InteractiveResponseMessage message. + * @function verify + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + InteractiveResponseMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.body != null && message.hasOwnProperty("body")) { + var error = $root.proto.Message.InteractiveResponseMessage.Body.verify(message.body); + if (error) + return "body." + error; + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.nativeFlowResponseMessage != null && message.hasOwnProperty("nativeFlowResponseMessage")) { + properties.interactiveResponseMessage = 1; + { + var error = $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.verify(message.nativeFlowResponseMessage); + if (error) + return "nativeFlowResponseMessage." + error; + } + } + return null; + }; + + /** + * Creates an InteractiveResponseMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveResponseMessage} InteractiveResponseMessage + */ + InteractiveResponseMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveResponseMessage) + return object; + var message = new $root.proto.Message.InteractiveResponseMessage(); + if (object.body != null) { + if (typeof object.body !== "object") + throw TypeError(".proto.Message.InteractiveResponseMessage.body: object expected"); + message.body = $root.proto.Message.InteractiveResponseMessage.Body.fromObject(object.body); + } + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.InteractiveResponseMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.nativeFlowResponseMessage != null) { + if (typeof object.nativeFlowResponseMessage !== "object") + throw TypeError(".proto.Message.InteractiveResponseMessage.nativeFlowResponseMessage: object expected"); + message.nativeFlowResponseMessage = $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.fromObject(object.nativeFlowResponseMessage); + } + return message; + }; + + /** + * Creates a plain object from an InteractiveResponseMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveResponseMessage + * @static + * @param {proto.Message.InteractiveResponseMessage} message InteractiveResponseMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + InteractiveResponseMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.body = null; + object.contextInfo = null; + } + if (message.body != null && message.hasOwnProperty("body")) + object.body = $root.proto.Message.InteractiveResponseMessage.Body.toObject(message.body, options); + if (message.nativeFlowResponseMessage != null && message.hasOwnProperty("nativeFlowResponseMessage")) { + object.nativeFlowResponseMessage = $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.toObject(message.nativeFlowResponseMessage, options); + if (options.oneofs) + object.interactiveResponseMessage = "nativeFlowResponseMessage"; + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this InteractiveResponseMessage to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveResponseMessage + * @instance + * @returns {Object.} JSON object + */ + InteractiveResponseMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + InteractiveResponseMessage.Body = (function() { + + /** + * Properties of a Body. + * @memberof proto.Message.InteractiveResponseMessage + * @interface IBody + * @property {string|null} [text] Body text + */ + + /** + * Constructs a new Body. + * @memberof proto.Message.InteractiveResponseMessage + * @classdesc Represents a Body. + * @implements IBody + * @constructor + * @param {proto.Message.InteractiveResponseMessage.IBody=} [properties] Properties to set + */ + function Body(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Body text. + * @member {string} text + * @memberof proto.Message.InteractiveResponseMessage.Body + * @instance + */ + Body.prototype.text = ""; + + /** + * Creates a new Body instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {proto.Message.InteractiveResponseMessage.IBody=} [properties] Properties to set + * @returns {proto.Message.InteractiveResponseMessage.Body} Body instance + */ + Body.create = function create(properties) { + return new Body(properties); + }; + + /** + * Encodes the specified Body message. Does not implicitly {@link proto.Message.InteractiveResponseMessage.Body.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {proto.Message.InteractiveResponseMessage.IBody} message Body message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Body.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.text); + return writer; + }; + + /** + * Encodes the specified Body message, length delimited. Does not implicitly {@link proto.Message.InteractiveResponseMessage.Body.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {proto.Message.InteractiveResponseMessage.IBody} message Body message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Body.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Body message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveResponseMessage.Body} Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Body.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveResponseMessage.Body(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.text = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Body message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveResponseMessage.Body} Body + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Body.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Body message. + * @function verify + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Body.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + return null; + }; + + /** + * Creates a Body message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveResponseMessage.Body} Body + */ + Body.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveResponseMessage.Body) + return object; + var message = new $root.proto.Message.InteractiveResponseMessage.Body(); + if (object.text != null) + message.text = String(object.text); + return message; + }; + + /** + * Creates a plain object from a Body message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveResponseMessage.Body + * @static + * @param {proto.Message.InteractiveResponseMessage.Body} message Body + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Body.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.text = ""; + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + return object; + }; + + /** + * Converts this Body to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveResponseMessage.Body + * @instance + * @returns {Object.} JSON object + */ + Body.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Body; + })(); + + InteractiveResponseMessage.NativeFlowResponseMessage = (function() { + + /** + * Properties of a NativeFlowResponseMessage. + * @memberof proto.Message.InteractiveResponseMessage + * @interface INativeFlowResponseMessage + * @property {string|null} [name] NativeFlowResponseMessage name + * @property {string|null} [paramsJson] NativeFlowResponseMessage paramsJson + * @property {number|null} [version] NativeFlowResponseMessage version + */ + + /** + * Constructs a new NativeFlowResponseMessage. + * @memberof proto.Message.InteractiveResponseMessage + * @classdesc Represents a NativeFlowResponseMessage. + * @implements INativeFlowResponseMessage + * @constructor + * @param {proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage=} [properties] Properties to set + */ + function NativeFlowResponseMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NativeFlowResponseMessage name. + * @member {string} name + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @instance + */ + NativeFlowResponseMessage.prototype.name = ""; + + /** + * NativeFlowResponseMessage paramsJson. + * @member {string} paramsJson + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @instance + */ + NativeFlowResponseMessage.prototype.paramsJson = ""; + + /** + * NativeFlowResponseMessage version. + * @member {number} version + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @instance + */ + NativeFlowResponseMessage.prototype.version = 0; + + /** + * Creates a new NativeFlowResponseMessage instance using the specified properties. + * @function create + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage=} [properties] Properties to set + * @returns {proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage} NativeFlowResponseMessage instance + */ + NativeFlowResponseMessage.create = function create(properties) { + return new NativeFlowResponseMessage(properties); + }; + + /** + * Encodes the specified NativeFlowResponseMessage message. Does not implicitly {@link proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage} message NativeFlowResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowResponseMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.paramsJson != null && Object.hasOwnProperty.call(message, "paramsJson")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.paramsJson); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.version); + return writer; + }; + + /** + * Encodes the specified NativeFlowResponseMessage message, length delimited. Does not implicitly {@link proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {proto.Message.InteractiveResponseMessage.INativeFlowResponseMessage} message NativeFlowResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NativeFlowResponseMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NativeFlowResponseMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage} NativeFlowResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowResponseMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.paramsJson = reader.string(); + break; + case 3: + message.version = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NativeFlowResponseMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage} NativeFlowResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NativeFlowResponseMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NativeFlowResponseMessage message. + * @function verify + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NativeFlowResponseMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.paramsJson != null && message.hasOwnProperty("paramsJson")) + if (!$util.isString(message.paramsJson)) + return "paramsJson: string expected"; + if (message.version != null && message.hasOwnProperty("version")) + if (!$util.isInteger(message.version)) + return "version: integer expected"; + return null; + }; + + /** + * Creates a NativeFlowResponseMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage} NativeFlowResponseMessage + */ + NativeFlowResponseMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage) + return object; + var message = new $root.proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage(); + if (object.name != null) + message.name = String(object.name); + if (object.paramsJson != null) + message.paramsJson = String(object.paramsJson); + if (object.version != null) + message.version = object.version | 0; + return message; + }; + + /** + * Creates a plain object from a NativeFlowResponseMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @static + * @param {proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage} message NativeFlowResponseMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NativeFlowResponseMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.name = ""; + object.paramsJson = ""; + object.version = 0; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.paramsJson != null && message.hasOwnProperty("paramsJson")) + object.paramsJson = message.paramsJson; + if (message.version != null && message.hasOwnProperty("version")) + object.version = message.version; + return object; + }; + + /** + * Converts this NativeFlowResponseMessage to JSON. + * @function toJSON + * @memberof proto.Message.InteractiveResponseMessage.NativeFlowResponseMessage + * @instance + * @returns {Object.} JSON object + */ + NativeFlowResponseMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return NativeFlowResponseMessage; + })(); + + return InteractiveResponseMessage; + })(); + + Message.InvoiceMessage = (function() { + + /** + * Properties of an InvoiceMessage. + * @memberof proto.Message + * @interface IInvoiceMessage + * @property {string|null} [note] InvoiceMessage note + * @property {string|null} [token] InvoiceMessage token + * @property {proto.Message.InvoiceMessage.AttachmentType|null} [attachmentType] InvoiceMessage attachmentType + * @property {string|null} [attachmentMimetype] InvoiceMessage attachmentMimetype + * @property {Uint8Array|null} [attachmentMediaKey] InvoiceMessage attachmentMediaKey + * @property {number|Long|null} [attachmentMediaKeyTimestamp] InvoiceMessage attachmentMediaKeyTimestamp + * @property {Uint8Array|null} [attachmentFileSha256] InvoiceMessage attachmentFileSha256 + * @property {Uint8Array|null} [attachmentFileEncSha256] InvoiceMessage attachmentFileEncSha256 + * @property {string|null} [attachmentDirectPath] InvoiceMessage attachmentDirectPath + * @property {Uint8Array|null} [attachmentJpegThumbnail] InvoiceMessage attachmentJpegThumbnail + */ + + /** + * Constructs a new InvoiceMessage. + * @memberof proto.Message + * @classdesc Represents an InvoiceMessage. + * @implements IInvoiceMessage + * @constructor + * @param {proto.Message.IInvoiceMessage=} [properties] Properties to set + */ + function InvoiceMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * InvoiceMessage note. + * @member {string} note + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.note = ""; + + /** + * InvoiceMessage token. + * @member {string} token + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.token = ""; + + /** + * InvoiceMessage attachmentType. + * @member {proto.Message.InvoiceMessage.AttachmentType} attachmentType + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentType = 0; + + /** + * InvoiceMessage attachmentMimetype. + * @member {string} attachmentMimetype + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentMimetype = ""; + + /** + * InvoiceMessage attachmentMediaKey. + * @member {Uint8Array} attachmentMediaKey + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentMediaKey = $util.newBuffer([]); + + /** + * InvoiceMessage attachmentMediaKeyTimestamp. + * @member {number|Long} attachmentMediaKeyTimestamp + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentMediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * InvoiceMessage attachmentFileSha256. + * @member {Uint8Array} attachmentFileSha256 + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentFileSha256 = $util.newBuffer([]); + + /** + * InvoiceMessage attachmentFileEncSha256. + * @member {Uint8Array} attachmentFileEncSha256 + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentFileEncSha256 = $util.newBuffer([]); + + /** + * InvoiceMessage attachmentDirectPath. + * @member {string} attachmentDirectPath + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentDirectPath = ""; + + /** + * InvoiceMessage attachmentJpegThumbnail. + * @member {Uint8Array} attachmentJpegThumbnail + * @memberof proto.Message.InvoiceMessage + * @instance + */ + InvoiceMessage.prototype.attachmentJpegThumbnail = $util.newBuffer([]); + + /** + * Creates a new InvoiceMessage instance using the specified properties. + * @function create + * @memberof proto.Message.InvoiceMessage + * @static + * @param {proto.Message.IInvoiceMessage=} [properties] Properties to set + * @returns {proto.Message.InvoiceMessage} InvoiceMessage instance + */ + InvoiceMessage.create = function create(properties) { + return new InvoiceMessage(properties); + }; + + /** + * Encodes the specified InvoiceMessage message. Does not implicitly {@link proto.Message.InvoiceMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.InvoiceMessage + * @static + * @param {proto.Message.IInvoiceMessage} message InvoiceMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InvoiceMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.note != null && Object.hasOwnProperty.call(message, "note")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.note); + if (message.token != null && Object.hasOwnProperty.call(message, "token")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.token); + if (message.attachmentType != null && Object.hasOwnProperty.call(message, "attachmentType")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.attachmentType); + if (message.attachmentMimetype != null && Object.hasOwnProperty.call(message, "attachmentMimetype")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.attachmentMimetype); + if (message.attachmentMediaKey != null && Object.hasOwnProperty.call(message, "attachmentMediaKey")) + writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.attachmentMediaKey); + if (message.attachmentMediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "attachmentMediaKeyTimestamp")) + writer.uint32(/* id 6, wireType 0 =*/48).int64(message.attachmentMediaKeyTimestamp); + if (message.attachmentFileSha256 != null && Object.hasOwnProperty.call(message, "attachmentFileSha256")) + writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.attachmentFileSha256); + if (message.attachmentFileEncSha256 != null && Object.hasOwnProperty.call(message, "attachmentFileEncSha256")) + writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.attachmentFileEncSha256); + if (message.attachmentDirectPath != null && Object.hasOwnProperty.call(message, "attachmentDirectPath")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.attachmentDirectPath); + if (message.attachmentJpegThumbnail != null && Object.hasOwnProperty.call(message, "attachmentJpegThumbnail")) + writer.uint32(/* id 10, wireType 2 =*/82).bytes(message.attachmentJpegThumbnail); + return writer; + }; + + /** + * Encodes the specified InvoiceMessage message, length delimited. Does not implicitly {@link proto.Message.InvoiceMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.InvoiceMessage + * @static + * @param {proto.Message.IInvoiceMessage} message InvoiceMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + InvoiceMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an InvoiceMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.InvoiceMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.InvoiceMessage} InvoiceMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InvoiceMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.InvoiceMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.note = reader.string(); + break; + case 2: + message.token = reader.string(); + break; + case 3: + message.attachmentType = reader.int32(); + break; + case 4: + message.attachmentMimetype = reader.string(); + break; + case 5: + message.attachmentMediaKey = reader.bytes(); + break; + case 6: + message.attachmentMediaKeyTimestamp = reader.int64(); + break; + case 7: + message.attachmentFileSha256 = reader.bytes(); + break; + case 8: + message.attachmentFileEncSha256 = reader.bytes(); + break; + case 9: + message.attachmentDirectPath = reader.string(); + break; + case 10: + message.attachmentJpegThumbnail = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an InvoiceMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.InvoiceMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.InvoiceMessage} InvoiceMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + InvoiceMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an InvoiceMessage message. + * @function verify + * @memberof proto.Message.InvoiceMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + InvoiceMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.note != null && message.hasOwnProperty("note")) + if (!$util.isString(message.note)) + return "note: string expected"; + if (message.token != null && message.hasOwnProperty("token")) + if (!$util.isString(message.token)) + return "token: string expected"; + if (message.attachmentType != null && message.hasOwnProperty("attachmentType")) + switch (message.attachmentType) { + default: + return "attachmentType: enum value expected"; + case 0: + case 1: + break; + } + if (message.attachmentMimetype != null && message.hasOwnProperty("attachmentMimetype")) + if (!$util.isString(message.attachmentMimetype)) + return "attachmentMimetype: string expected"; + if (message.attachmentMediaKey != null && message.hasOwnProperty("attachmentMediaKey")) + if (!(message.attachmentMediaKey && typeof message.attachmentMediaKey.length === "number" || $util.isString(message.attachmentMediaKey))) + return "attachmentMediaKey: buffer expected"; + if (message.attachmentMediaKeyTimestamp != null && message.hasOwnProperty("attachmentMediaKeyTimestamp")) + if (!$util.isInteger(message.attachmentMediaKeyTimestamp) && !(message.attachmentMediaKeyTimestamp && $util.isInteger(message.attachmentMediaKeyTimestamp.low) && $util.isInteger(message.attachmentMediaKeyTimestamp.high))) + return "attachmentMediaKeyTimestamp: integer|Long expected"; + if (message.attachmentFileSha256 != null && message.hasOwnProperty("attachmentFileSha256")) + if (!(message.attachmentFileSha256 && typeof message.attachmentFileSha256.length === "number" || $util.isString(message.attachmentFileSha256))) + return "attachmentFileSha256: buffer expected"; + if (message.attachmentFileEncSha256 != null && message.hasOwnProperty("attachmentFileEncSha256")) + if (!(message.attachmentFileEncSha256 && typeof message.attachmentFileEncSha256.length === "number" || $util.isString(message.attachmentFileEncSha256))) + return "attachmentFileEncSha256: buffer expected"; + if (message.attachmentDirectPath != null && message.hasOwnProperty("attachmentDirectPath")) + if (!$util.isString(message.attachmentDirectPath)) + return "attachmentDirectPath: string expected"; + if (message.attachmentJpegThumbnail != null && message.hasOwnProperty("attachmentJpegThumbnail")) + if (!(message.attachmentJpegThumbnail && typeof message.attachmentJpegThumbnail.length === "number" || $util.isString(message.attachmentJpegThumbnail))) + return "attachmentJpegThumbnail: buffer expected"; + return null; + }; + + /** + * Creates an InvoiceMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.InvoiceMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.InvoiceMessage} InvoiceMessage + */ + InvoiceMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.InvoiceMessage) + return object; + var message = new $root.proto.Message.InvoiceMessage(); + if (object.note != null) + message.note = String(object.note); + if (object.token != null) + message.token = String(object.token); + switch (object.attachmentType) { + case "IMAGE": + case 0: + message.attachmentType = 0; + break; + case "PDF": + case 1: + message.attachmentType = 1; + break; + } + if (object.attachmentMimetype != null) + message.attachmentMimetype = String(object.attachmentMimetype); + if (object.attachmentMediaKey != null) + if (typeof object.attachmentMediaKey === "string") + $util.base64.decode(object.attachmentMediaKey, message.attachmentMediaKey = $util.newBuffer($util.base64.length(object.attachmentMediaKey)), 0); + else if (object.attachmentMediaKey.length) + message.attachmentMediaKey = object.attachmentMediaKey; + if (object.attachmentMediaKeyTimestamp != null) + if ($util.Long) + (message.attachmentMediaKeyTimestamp = $util.Long.fromValue(object.attachmentMediaKeyTimestamp)).unsigned = false; + else if (typeof object.attachmentMediaKeyTimestamp === "string") + message.attachmentMediaKeyTimestamp = parseInt(object.attachmentMediaKeyTimestamp, 10); + else if (typeof object.attachmentMediaKeyTimestamp === "number") + message.attachmentMediaKeyTimestamp = object.attachmentMediaKeyTimestamp; + else if (typeof object.attachmentMediaKeyTimestamp === "object") + message.attachmentMediaKeyTimestamp = new $util.LongBits(object.attachmentMediaKeyTimestamp.low >>> 0, object.attachmentMediaKeyTimestamp.high >>> 0).toNumber(); + if (object.attachmentFileSha256 != null) + if (typeof object.attachmentFileSha256 === "string") + $util.base64.decode(object.attachmentFileSha256, message.attachmentFileSha256 = $util.newBuffer($util.base64.length(object.attachmentFileSha256)), 0); + else if (object.attachmentFileSha256.length) + message.attachmentFileSha256 = object.attachmentFileSha256; + if (object.attachmentFileEncSha256 != null) + if (typeof object.attachmentFileEncSha256 === "string") + $util.base64.decode(object.attachmentFileEncSha256, message.attachmentFileEncSha256 = $util.newBuffer($util.base64.length(object.attachmentFileEncSha256)), 0); + else if (object.attachmentFileEncSha256.length) + message.attachmentFileEncSha256 = object.attachmentFileEncSha256; + if (object.attachmentDirectPath != null) + message.attachmentDirectPath = String(object.attachmentDirectPath); + if (object.attachmentJpegThumbnail != null) + if (typeof object.attachmentJpegThumbnail === "string") + $util.base64.decode(object.attachmentJpegThumbnail, message.attachmentJpegThumbnail = $util.newBuffer($util.base64.length(object.attachmentJpegThumbnail)), 0); + else if (object.attachmentJpegThumbnail.length) + message.attachmentJpegThumbnail = object.attachmentJpegThumbnail; + return message; + }; + + /** + * Creates a plain object from an InvoiceMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.InvoiceMessage + * @static + * @param {proto.Message.InvoiceMessage} message InvoiceMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + InvoiceMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.note = ""; + object.token = ""; + object.attachmentType = options.enums === String ? "IMAGE" : 0; + object.attachmentMimetype = ""; + if (options.bytes === String) + object.attachmentMediaKey = ""; + else { + object.attachmentMediaKey = []; + if (options.bytes !== Array) + object.attachmentMediaKey = $util.newBuffer(object.attachmentMediaKey); + } + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.attachmentMediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.attachmentMediaKeyTimestamp = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.attachmentFileSha256 = ""; + else { + object.attachmentFileSha256 = []; + if (options.bytes !== Array) + object.attachmentFileSha256 = $util.newBuffer(object.attachmentFileSha256); + } + if (options.bytes === String) + object.attachmentFileEncSha256 = ""; + else { + object.attachmentFileEncSha256 = []; + if (options.bytes !== Array) + object.attachmentFileEncSha256 = $util.newBuffer(object.attachmentFileEncSha256); + } + object.attachmentDirectPath = ""; + if (options.bytes === String) + object.attachmentJpegThumbnail = ""; + else { + object.attachmentJpegThumbnail = []; + if (options.bytes !== Array) + object.attachmentJpegThumbnail = $util.newBuffer(object.attachmentJpegThumbnail); + } + } + if (message.note != null && message.hasOwnProperty("note")) + object.note = message.note; + if (message.token != null && message.hasOwnProperty("token")) + object.token = message.token; + if (message.attachmentType != null && message.hasOwnProperty("attachmentType")) + object.attachmentType = options.enums === String ? $root.proto.Message.InvoiceMessage.AttachmentType[message.attachmentType] : message.attachmentType; + if (message.attachmentMimetype != null && message.hasOwnProperty("attachmentMimetype")) + object.attachmentMimetype = message.attachmentMimetype; + if (message.attachmentMediaKey != null && message.hasOwnProperty("attachmentMediaKey")) + object.attachmentMediaKey = options.bytes === String ? $util.base64.encode(message.attachmentMediaKey, 0, message.attachmentMediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.attachmentMediaKey) : message.attachmentMediaKey; + if (message.attachmentMediaKeyTimestamp != null && message.hasOwnProperty("attachmentMediaKeyTimestamp")) + if (typeof message.attachmentMediaKeyTimestamp === "number") + object.attachmentMediaKeyTimestamp = options.longs === String ? String(message.attachmentMediaKeyTimestamp) : message.attachmentMediaKeyTimestamp; + else + object.attachmentMediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.attachmentMediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.attachmentMediaKeyTimestamp.low >>> 0, message.attachmentMediaKeyTimestamp.high >>> 0).toNumber() : message.attachmentMediaKeyTimestamp; + if (message.attachmentFileSha256 != null && message.hasOwnProperty("attachmentFileSha256")) + object.attachmentFileSha256 = options.bytes === String ? $util.base64.encode(message.attachmentFileSha256, 0, message.attachmentFileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.attachmentFileSha256) : message.attachmentFileSha256; + if (message.attachmentFileEncSha256 != null && message.hasOwnProperty("attachmentFileEncSha256")) + object.attachmentFileEncSha256 = options.bytes === String ? $util.base64.encode(message.attachmentFileEncSha256, 0, message.attachmentFileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.attachmentFileEncSha256) : message.attachmentFileEncSha256; + if (message.attachmentDirectPath != null && message.hasOwnProperty("attachmentDirectPath")) + object.attachmentDirectPath = message.attachmentDirectPath; + if (message.attachmentJpegThumbnail != null && message.hasOwnProperty("attachmentJpegThumbnail")) + object.attachmentJpegThumbnail = options.bytes === String ? $util.base64.encode(message.attachmentJpegThumbnail, 0, message.attachmentJpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.attachmentJpegThumbnail) : message.attachmentJpegThumbnail; + return object; + }; + + /** + * Converts this InvoiceMessage to JSON. + * @function toJSON + * @memberof proto.Message.InvoiceMessage + * @instance + * @returns {Object.} JSON object + */ + InvoiceMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * AttachmentType enum. + * @name proto.Message.InvoiceMessage.AttachmentType + * @enum {number} + * @property {number} IMAGE=0 IMAGE value + * @property {number} PDF=1 PDF value + */ + InvoiceMessage.AttachmentType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "IMAGE"] = 0; + values[valuesById[1] = "PDF"] = 1; + return values; + })(); + + return InvoiceMessage; + })(); + + Message.KeepInChatMessage = (function() { + + /** + * Properties of a KeepInChatMessage. + * @memberof proto.Message + * @interface IKeepInChatMessage + * @property {proto.IMessageKey|null} [key] KeepInChatMessage key + * @property {proto.KeepType|null} [keepType] KeepInChatMessage keepType + * @property {number|Long|null} [timestampMs] KeepInChatMessage timestampMs + */ + + /** + * Constructs a new KeepInChatMessage. + * @memberof proto.Message + * @classdesc Represents a KeepInChatMessage. + * @implements IKeepInChatMessage + * @constructor + * @param {proto.Message.IKeepInChatMessage=} [properties] Properties to set + */ + function KeepInChatMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * KeepInChatMessage key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.Message.KeepInChatMessage + * @instance + */ + KeepInChatMessage.prototype.key = null; + + /** + * KeepInChatMessage keepType. + * @member {proto.KeepType} keepType + * @memberof proto.Message.KeepInChatMessage + * @instance + */ + KeepInChatMessage.prototype.keepType = 0; + + /** + * KeepInChatMessage timestampMs. + * @member {number|Long} timestampMs + * @memberof proto.Message.KeepInChatMessage + * @instance + */ + KeepInChatMessage.prototype.timestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new KeepInChatMessage instance using the specified properties. + * @function create + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {proto.Message.IKeepInChatMessage=} [properties] Properties to set + * @returns {proto.Message.KeepInChatMessage} KeepInChatMessage instance + */ + KeepInChatMessage.create = function create(properties) { + return new KeepInChatMessage(properties); + }; + + /** + * Encodes the specified KeepInChatMessage message. Does not implicitly {@link proto.Message.KeepInChatMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {proto.Message.IKeepInChatMessage} message KeepInChatMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeepInChatMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.keepType != null && Object.hasOwnProperty.call(message, "keepType")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.keepType); + if (message.timestampMs != null && Object.hasOwnProperty.call(message, "timestampMs")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.timestampMs); + return writer; + }; + + /** + * Encodes the specified KeepInChatMessage message, length delimited. Does not implicitly {@link proto.Message.KeepInChatMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {proto.Message.IKeepInChatMessage} message KeepInChatMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeepInChatMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a KeepInChatMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.KeepInChatMessage} KeepInChatMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeepInChatMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.KeepInChatMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.keepType = reader.int32(); + break; + case 3: + message.timestampMs = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a KeepInChatMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.KeepInChatMessage} KeepInChatMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeepInChatMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a KeepInChatMessage message. + * @function verify + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + KeepInChatMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.keepType != null && message.hasOwnProperty("keepType")) + switch (message.keepType) { + default: + return "keepType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.timestampMs != null && message.hasOwnProperty("timestampMs")) + if (!$util.isInteger(message.timestampMs) && !(message.timestampMs && $util.isInteger(message.timestampMs.low) && $util.isInteger(message.timestampMs.high))) + return "timestampMs: integer|Long expected"; + return null; + }; + + /** + * Creates a KeepInChatMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.KeepInChatMessage} KeepInChatMessage + */ + KeepInChatMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.KeepInChatMessage) + return object; + var message = new $root.proto.Message.KeepInChatMessage(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.Message.KeepInChatMessage.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + switch (object.keepType) { + case "UNKNOWN": + case 0: + message.keepType = 0; + break; + case "KEEP_FOR_ALL": + case 1: + message.keepType = 1; + break; + case "UNDO_KEEP_FOR_ALL": + case 2: + message.keepType = 2; + break; + } + if (object.timestampMs != null) + if ($util.Long) + (message.timestampMs = $util.Long.fromValue(object.timestampMs)).unsigned = false; + else if (typeof object.timestampMs === "string") + message.timestampMs = parseInt(object.timestampMs, 10); + else if (typeof object.timestampMs === "number") + message.timestampMs = object.timestampMs; + else if (typeof object.timestampMs === "object") + message.timestampMs = new $util.LongBits(object.timestampMs.low >>> 0, object.timestampMs.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a KeepInChatMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.KeepInChatMessage + * @static + * @param {proto.Message.KeepInChatMessage} message KeepInChatMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + KeepInChatMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.key = null; + object.keepType = options.enums === String ? "UNKNOWN" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestampMs = options.longs === String ? "0" : 0; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.keepType != null && message.hasOwnProperty("keepType")) + object.keepType = options.enums === String ? $root.proto.KeepType[message.keepType] : message.keepType; + if (message.timestampMs != null && message.hasOwnProperty("timestampMs")) + if (typeof message.timestampMs === "number") + object.timestampMs = options.longs === String ? String(message.timestampMs) : message.timestampMs; + else + object.timestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.timestampMs) : options.longs === Number ? new $util.LongBits(message.timestampMs.low >>> 0, message.timestampMs.high >>> 0).toNumber() : message.timestampMs; + return object; + }; + + /** + * Converts this KeepInChatMessage to JSON. + * @function toJSON + * @memberof proto.Message.KeepInChatMessage + * @instance + * @returns {Object.} JSON object + */ + KeepInChatMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return KeepInChatMessage; + })(); + + Message.ListMessage = (function() { + + /** + * Properties of a ListMessage. + * @memberof proto.Message + * @interface IListMessage + * @property {string|null} [title] ListMessage title + * @property {string|null} [description] ListMessage description + * @property {string|null} [buttonText] ListMessage buttonText + * @property {proto.Message.ListMessage.ListType|null} [listType] ListMessage listType + * @property {Array.|null} [sections] ListMessage sections + * @property {proto.Message.ListMessage.IProductListInfo|null} [productListInfo] ListMessage productListInfo + * @property {string|null} [footerText] ListMessage footerText + * @property {proto.IContextInfo|null} [contextInfo] ListMessage contextInfo + */ + + /** + * Constructs a new ListMessage. + * @memberof proto.Message + * @classdesc Represents a ListMessage. + * @implements IListMessage + * @constructor + * @param {proto.Message.IListMessage=} [properties] Properties to set + */ + function ListMessage(properties) { + this.sections = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ListMessage title. + * @member {string} title + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.title = ""; + + /** + * ListMessage description. + * @member {string} description + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.description = ""; + + /** + * ListMessage buttonText. + * @member {string} buttonText + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.buttonText = ""; + + /** + * ListMessage listType. + * @member {proto.Message.ListMessage.ListType} listType + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.listType = 0; + + /** + * ListMessage sections. + * @member {Array.} sections + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.sections = $util.emptyArray; + + /** + * ListMessage productListInfo. + * @member {proto.Message.ListMessage.IProductListInfo|null|undefined} productListInfo + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.productListInfo = null; + + /** + * ListMessage footerText. + * @member {string} footerText + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.footerText = ""; + + /** + * ListMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ListMessage + * @instance + */ + ListMessage.prototype.contextInfo = null; + + /** + * Creates a new ListMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ListMessage + * @static + * @param {proto.Message.IListMessage=} [properties] Properties to set + * @returns {proto.Message.ListMessage} ListMessage instance + */ + ListMessage.create = function create(properties) { + return new ListMessage(properties); + }; + + /** + * Encodes the specified ListMessage message. Does not implicitly {@link proto.Message.ListMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListMessage + * @static + * @param {proto.Message.IListMessage} message ListMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ListMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.description); + if (message.buttonText != null && Object.hasOwnProperty.call(message, "buttonText")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.buttonText); + if (message.listType != null && Object.hasOwnProperty.call(message, "listType")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.listType); + if (message.sections != null && message.sections.length) + for (var i = 0; i < message.sections.length; ++i) + $root.proto.Message.ListMessage.Section.encode(message.sections[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.productListInfo != null && Object.hasOwnProperty.call(message, "productListInfo")) + $root.proto.Message.ListMessage.ProductListInfo.encode(message.productListInfo, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.footerText != null && Object.hasOwnProperty.call(message, "footerText")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.footerText); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ListMessage message, length delimited. Does not implicitly {@link proto.Message.ListMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListMessage + * @static + * @param {proto.Message.IListMessage} message ListMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ListMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ListMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListMessage} ListMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ListMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.title = reader.string(); + break; + case 2: + message.description = reader.string(); + break; + case 3: + message.buttonText = reader.string(); + break; + case 4: + message.listType = reader.int32(); + break; + case 5: + if (!(message.sections && message.sections.length)) + message.sections = []; + message.sections.push($root.proto.Message.ListMessage.Section.decode(reader, reader.uint32())); + break; + case 6: + message.productListInfo = $root.proto.Message.ListMessage.ProductListInfo.decode(reader, reader.uint32()); + break; + case 7: + message.footerText = reader.string(); + break; + case 8: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ListMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListMessage} ListMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ListMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ListMessage message. + * @function verify + * @memberof proto.Message.ListMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ListMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.buttonText != null && message.hasOwnProperty("buttonText")) + if (!$util.isString(message.buttonText)) + return "buttonText: string expected"; + if (message.listType != null && message.hasOwnProperty("listType")) + switch (message.listType) { + default: + return "listType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.sections != null && message.hasOwnProperty("sections")) { + if (!Array.isArray(message.sections)) + return "sections: array expected"; + for (var i = 0; i < message.sections.length; ++i) { + var error = $root.proto.Message.ListMessage.Section.verify(message.sections[i]); + if (error) + return "sections." + error; + } + } + if (message.productListInfo != null && message.hasOwnProperty("productListInfo")) { + var error = $root.proto.Message.ListMessage.ProductListInfo.verify(message.productListInfo); + if (error) + return "productListInfo." + error; + } + if (message.footerText != null && message.hasOwnProperty("footerText")) + if (!$util.isString(message.footerText)) + return "footerText: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a ListMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListMessage} ListMessage + */ + ListMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListMessage) + return object; + var message = new $root.proto.Message.ListMessage(); + if (object.title != null) + message.title = String(object.title); + if (object.description != null) + message.description = String(object.description); + if (object.buttonText != null) + message.buttonText = String(object.buttonText); + switch (object.listType) { + case "UNKNOWN": + case 0: + message.listType = 0; + break; + case "SINGLE_SELECT": + case 1: + message.listType = 1; + break; + case "PRODUCT_LIST": + case 2: + message.listType = 2; + break; + } + if (object.sections) { + if (!Array.isArray(object.sections)) + throw TypeError(".proto.Message.ListMessage.sections: array expected"); + message.sections = []; + for (var i = 0; i < object.sections.length; ++i) { + if (typeof object.sections[i] !== "object") + throw TypeError(".proto.Message.ListMessage.sections: object expected"); + message.sections[i] = $root.proto.Message.ListMessage.Section.fromObject(object.sections[i]); + } + } + if (object.productListInfo != null) { + if (typeof object.productListInfo !== "object") + throw TypeError(".proto.Message.ListMessage.productListInfo: object expected"); + message.productListInfo = $root.proto.Message.ListMessage.ProductListInfo.fromObject(object.productListInfo); + } + if (object.footerText != null) + message.footerText = String(object.footerText); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ListMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a ListMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListMessage + * @static + * @param {proto.Message.ListMessage} message ListMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ListMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.sections = []; + if (options.defaults) { + object.title = ""; + object.description = ""; + object.buttonText = ""; + object.listType = options.enums === String ? "UNKNOWN" : 0; + object.productListInfo = null; + object.footerText = ""; + object.contextInfo = null; + } + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + if (message.buttonText != null && message.hasOwnProperty("buttonText")) + object.buttonText = message.buttonText; + if (message.listType != null && message.hasOwnProperty("listType")) + object.listType = options.enums === String ? $root.proto.Message.ListMessage.ListType[message.listType] : message.listType; + if (message.sections && message.sections.length) { + object.sections = []; + for (var j = 0; j < message.sections.length; ++j) + object.sections[j] = $root.proto.Message.ListMessage.Section.toObject(message.sections[j], options); + } + if (message.productListInfo != null && message.hasOwnProperty("productListInfo")) + object.productListInfo = $root.proto.Message.ListMessage.ProductListInfo.toObject(message.productListInfo, options); + if (message.footerText != null && message.hasOwnProperty("footerText")) + object.footerText = message.footerText; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this ListMessage to JSON. + * @function toJSON + * @memberof proto.Message.ListMessage + * @instance + * @returns {Object.} JSON object + */ + ListMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ListType enum. + * @name proto.Message.ListMessage.ListType + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} SINGLE_SELECT=1 SINGLE_SELECT value + * @property {number} PRODUCT_LIST=2 PRODUCT_LIST value + */ + ListMessage.ListType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "SINGLE_SELECT"] = 1; + values[valuesById[2] = "PRODUCT_LIST"] = 2; + return values; + })(); + + ListMessage.Product = (function() { + + /** + * Properties of a Product. + * @memberof proto.Message.ListMessage + * @interface IProduct + * @property {string|null} [productId] Product productId + */ + + /** + * Constructs a new Product. + * @memberof proto.Message.ListMessage + * @classdesc Represents a Product. + * @implements IProduct + * @constructor + * @param {proto.Message.ListMessage.IProduct=} [properties] Properties to set + */ + function Product(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Product productId. + * @member {string} productId + * @memberof proto.Message.ListMessage.Product + * @instance + */ + Product.prototype.productId = ""; + + /** + * Creates a new Product instance using the specified properties. + * @function create + * @memberof proto.Message.ListMessage.Product + * @static + * @param {proto.Message.ListMessage.IProduct=} [properties] Properties to set + * @returns {proto.Message.ListMessage.Product} Product instance + */ + Product.create = function create(properties) { + return new Product(properties); + }; + + /** + * Encodes the specified Product message. Does not implicitly {@link proto.Message.ListMessage.Product.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListMessage.Product + * @static + * @param {proto.Message.ListMessage.IProduct} message Product message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Product.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.productId != null && Object.hasOwnProperty.call(message, "productId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.productId); + return writer; + }; + + /** + * Encodes the specified Product message, length delimited. Does not implicitly {@link proto.Message.ListMessage.Product.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListMessage.Product + * @static + * @param {proto.Message.ListMessage.IProduct} message Product message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Product.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Product message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListMessage.Product + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListMessage.Product} Product + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Product.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListMessage.Product(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.productId = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Product message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListMessage.Product + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListMessage.Product} Product + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Product.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Product message. + * @function verify + * @memberof proto.Message.ListMessage.Product + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Product.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.productId != null && message.hasOwnProperty("productId")) + if (!$util.isString(message.productId)) + return "productId: string expected"; + return null; + }; + + /** + * Creates a Product message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListMessage.Product + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListMessage.Product} Product + */ + Product.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListMessage.Product) + return object; + var message = new $root.proto.Message.ListMessage.Product(); + if (object.productId != null) + message.productId = String(object.productId); + return message; + }; + + /** + * Creates a plain object from a Product message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListMessage.Product + * @static + * @param {proto.Message.ListMessage.Product} message Product + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Product.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.productId = ""; + if (message.productId != null && message.hasOwnProperty("productId")) + object.productId = message.productId; + return object; + }; + + /** + * Converts this Product to JSON. + * @function toJSON + * @memberof proto.Message.ListMessage.Product + * @instance + * @returns {Object.} JSON object + */ + Product.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Product; + })(); + + ListMessage.ProductListHeaderImage = (function() { + + /** + * Properties of a ProductListHeaderImage. + * @memberof proto.Message.ListMessage + * @interface IProductListHeaderImage + * @property {string|null} [productId] ProductListHeaderImage productId + * @property {Uint8Array|null} [jpegThumbnail] ProductListHeaderImage jpegThumbnail + */ + + /** + * Constructs a new ProductListHeaderImage. + * @memberof proto.Message.ListMessage + * @classdesc Represents a ProductListHeaderImage. + * @implements IProductListHeaderImage + * @constructor + * @param {proto.Message.ListMessage.IProductListHeaderImage=} [properties] Properties to set + */ + function ProductListHeaderImage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ProductListHeaderImage productId. + * @member {string} productId + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @instance + */ + ProductListHeaderImage.prototype.productId = ""; + + /** + * ProductListHeaderImage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @instance + */ + ProductListHeaderImage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * Creates a new ProductListHeaderImage instance using the specified properties. + * @function create + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {proto.Message.ListMessage.IProductListHeaderImage=} [properties] Properties to set + * @returns {proto.Message.ListMessage.ProductListHeaderImage} ProductListHeaderImage instance + */ + ProductListHeaderImage.create = function create(properties) { + return new ProductListHeaderImage(properties); + }; + + /** + * Encodes the specified ProductListHeaderImage message. Does not implicitly {@link proto.Message.ListMessage.ProductListHeaderImage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {proto.Message.ListMessage.IProductListHeaderImage} message ProductListHeaderImage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductListHeaderImage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.productId != null && Object.hasOwnProperty.call(message, "productId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.productId); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.jpegThumbnail); + return writer; + }; + + /** + * Encodes the specified ProductListHeaderImage message, length delimited. Does not implicitly {@link proto.Message.ListMessage.ProductListHeaderImage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {proto.Message.ListMessage.IProductListHeaderImage} message ProductListHeaderImage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductListHeaderImage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ProductListHeaderImage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListMessage.ProductListHeaderImage} ProductListHeaderImage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductListHeaderImage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListMessage.ProductListHeaderImage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.productId = reader.string(); + break; + case 2: + message.jpegThumbnail = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ProductListHeaderImage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListMessage.ProductListHeaderImage} ProductListHeaderImage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductListHeaderImage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ProductListHeaderImage message. + * @function verify + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ProductListHeaderImage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.productId != null && message.hasOwnProperty("productId")) + if (!$util.isString(message.productId)) + return "productId: string expected"; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + return null; + }; + + /** + * Creates a ProductListHeaderImage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListMessage.ProductListHeaderImage} ProductListHeaderImage + */ + ProductListHeaderImage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListMessage.ProductListHeaderImage) + return object; + var message = new $root.proto.Message.ListMessage.ProductListHeaderImage(); + if (object.productId != null) + message.productId = String(object.productId); + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + return message; + }; + + /** + * Creates a plain object from a ProductListHeaderImage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @static + * @param {proto.Message.ListMessage.ProductListHeaderImage} message ProductListHeaderImage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ProductListHeaderImage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.productId = ""; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + } + if (message.productId != null && message.hasOwnProperty("productId")) + object.productId = message.productId; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + return object; + }; + + /** + * Converts this ProductListHeaderImage to JSON. + * @function toJSON + * @memberof proto.Message.ListMessage.ProductListHeaderImage + * @instance + * @returns {Object.} JSON object + */ + ProductListHeaderImage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ProductListHeaderImage; + })(); + + ListMessage.ProductListInfo = (function() { + + /** + * Properties of a ProductListInfo. + * @memberof proto.Message.ListMessage + * @interface IProductListInfo + * @property {Array.|null} [productSections] ProductListInfo productSections + * @property {proto.Message.ListMessage.IProductListHeaderImage|null} [headerImage] ProductListInfo headerImage + * @property {string|null} [businessOwnerJid] ProductListInfo businessOwnerJid + */ + + /** + * Constructs a new ProductListInfo. + * @memberof proto.Message.ListMessage + * @classdesc Represents a ProductListInfo. + * @implements IProductListInfo + * @constructor + * @param {proto.Message.ListMessage.IProductListInfo=} [properties] Properties to set + */ + function ProductListInfo(properties) { + this.productSections = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ProductListInfo productSections. + * @member {Array.} productSections + * @memberof proto.Message.ListMessage.ProductListInfo + * @instance + */ + ProductListInfo.prototype.productSections = $util.emptyArray; + + /** + * ProductListInfo headerImage. + * @member {proto.Message.ListMessage.IProductListHeaderImage|null|undefined} headerImage + * @memberof proto.Message.ListMessage.ProductListInfo + * @instance + */ + ProductListInfo.prototype.headerImage = null; + + /** + * ProductListInfo businessOwnerJid. + * @member {string} businessOwnerJid + * @memberof proto.Message.ListMessage.ProductListInfo + * @instance + */ + ProductListInfo.prototype.businessOwnerJid = ""; + + /** + * Creates a new ProductListInfo instance using the specified properties. + * @function create + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {proto.Message.ListMessage.IProductListInfo=} [properties] Properties to set + * @returns {proto.Message.ListMessage.ProductListInfo} ProductListInfo instance + */ + ProductListInfo.create = function create(properties) { + return new ProductListInfo(properties); + }; + + /** + * Encodes the specified ProductListInfo message. Does not implicitly {@link proto.Message.ListMessage.ProductListInfo.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {proto.Message.ListMessage.IProductListInfo} message ProductListInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductListInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.productSections != null && message.productSections.length) + for (var i = 0; i < message.productSections.length; ++i) + $root.proto.Message.ListMessage.ProductSection.encode(message.productSections[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.headerImage != null && Object.hasOwnProperty.call(message, "headerImage")) + $root.proto.Message.ListMessage.ProductListHeaderImage.encode(message.headerImage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.businessOwnerJid != null && Object.hasOwnProperty.call(message, "businessOwnerJid")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.businessOwnerJid); + return writer; + }; + + /** + * Encodes the specified ProductListInfo message, length delimited. Does not implicitly {@link proto.Message.ListMessage.ProductListInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {proto.Message.ListMessage.IProductListInfo} message ProductListInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductListInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ProductListInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListMessage.ProductListInfo} ProductListInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductListInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListMessage.ProductListInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.productSections && message.productSections.length)) + message.productSections = []; + message.productSections.push($root.proto.Message.ListMessage.ProductSection.decode(reader, reader.uint32())); + break; + case 2: + message.headerImage = $root.proto.Message.ListMessage.ProductListHeaderImage.decode(reader, reader.uint32()); + break; + case 3: + message.businessOwnerJid = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ProductListInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListMessage.ProductListInfo} ProductListInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductListInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ProductListInfo message. + * @function verify + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ProductListInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.productSections != null && message.hasOwnProperty("productSections")) { + if (!Array.isArray(message.productSections)) + return "productSections: array expected"; + for (var i = 0; i < message.productSections.length; ++i) { + var error = $root.proto.Message.ListMessage.ProductSection.verify(message.productSections[i]); + if (error) + return "productSections." + error; + } + } + if (message.headerImage != null && message.hasOwnProperty("headerImage")) { + var error = $root.proto.Message.ListMessage.ProductListHeaderImage.verify(message.headerImage); + if (error) + return "headerImage." + error; + } + if (message.businessOwnerJid != null && message.hasOwnProperty("businessOwnerJid")) + if (!$util.isString(message.businessOwnerJid)) + return "businessOwnerJid: string expected"; + return null; + }; + + /** + * Creates a ProductListInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListMessage.ProductListInfo} ProductListInfo + */ + ProductListInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListMessage.ProductListInfo) + return object; + var message = new $root.proto.Message.ListMessage.ProductListInfo(); + if (object.productSections) { + if (!Array.isArray(object.productSections)) + throw TypeError(".proto.Message.ListMessage.ProductListInfo.productSections: array expected"); + message.productSections = []; + for (var i = 0; i < object.productSections.length; ++i) { + if (typeof object.productSections[i] !== "object") + throw TypeError(".proto.Message.ListMessage.ProductListInfo.productSections: object expected"); + message.productSections[i] = $root.proto.Message.ListMessage.ProductSection.fromObject(object.productSections[i]); + } + } + if (object.headerImage != null) { + if (typeof object.headerImage !== "object") + throw TypeError(".proto.Message.ListMessage.ProductListInfo.headerImage: object expected"); + message.headerImage = $root.proto.Message.ListMessage.ProductListHeaderImage.fromObject(object.headerImage); + } + if (object.businessOwnerJid != null) + message.businessOwnerJid = String(object.businessOwnerJid); + return message; + }; + + /** + * Creates a plain object from a ProductListInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListMessage.ProductListInfo + * @static + * @param {proto.Message.ListMessage.ProductListInfo} message ProductListInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ProductListInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.productSections = []; + if (options.defaults) { + object.headerImage = null; + object.businessOwnerJid = ""; + } + if (message.productSections && message.productSections.length) { + object.productSections = []; + for (var j = 0; j < message.productSections.length; ++j) + object.productSections[j] = $root.proto.Message.ListMessage.ProductSection.toObject(message.productSections[j], options); + } + if (message.headerImage != null && message.hasOwnProperty("headerImage")) + object.headerImage = $root.proto.Message.ListMessage.ProductListHeaderImage.toObject(message.headerImage, options); + if (message.businessOwnerJid != null && message.hasOwnProperty("businessOwnerJid")) + object.businessOwnerJid = message.businessOwnerJid; + return object; + }; + + /** + * Converts this ProductListInfo to JSON. + * @function toJSON + * @memberof proto.Message.ListMessage.ProductListInfo + * @instance + * @returns {Object.} JSON object + */ + ProductListInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ProductListInfo; + })(); + + ListMessage.ProductSection = (function() { + + /** + * Properties of a ProductSection. + * @memberof proto.Message.ListMessage + * @interface IProductSection + * @property {string|null} [title] ProductSection title + * @property {Array.|null} [products] ProductSection products + */ + + /** + * Constructs a new ProductSection. + * @memberof proto.Message.ListMessage + * @classdesc Represents a ProductSection. + * @implements IProductSection + * @constructor + * @param {proto.Message.ListMessage.IProductSection=} [properties] Properties to set + */ + function ProductSection(properties) { + this.products = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ProductSection title. + * @member {string} title + * @memberof proto.Message.ListMessage.ProductSection + * @instance + */ + ProductSection.prototype.title = ""; + + /** + * ProductSection products. + * @member {Array.} products + * @memberof proto.Message.ListMessage.ProductSection + * @instance + */ + ProductSection.prototype.products = $util.emptyArray; + + /** + * Creates a new ProductSection instance using the specified properties. + * @function create + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {proto.Message.ListMessage.IProductSection=} [properties] Properties to set + * @returns {proto.Message.ListMessage.ProductSection} ProductSection instance + */ + ProductSection.create = function create(properties) { + return new ProductSection(properties); + }; + + /** + * Encodes the specified ProductSection message. Does not implicitly {@link proto.Message.ListMessage.ProductSection.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {proto.Message.ListMessage.IProductSection} message ProductSection message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductSection.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); + if (message.products != null && message.products.length) + for (var i = 0; i < message.products.length; ++i) + $root.proto.Message.ListMessage.Product.encode(message.products[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ProductSection message, length delimited. Does not implicitly {@link proto.Message.ListMessage.ProductSection.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {proto.Message.ListMessage.IProductSection} message ProductSection message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductSection.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ProductSection message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListMessage.ProductSection} ProductSection + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductSection.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListMessage.ProductSection(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.title = reader.string(); + break; + case 2: + if (!(message.products && message.products.length)) + message.products = []; + message.products.push($root.proto.Message.ListMessage.Product.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ProductSection message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListMessage.ProductSection} ProductSection + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductSection.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ProductSection message. + * @function verify + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ProductSection.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.products != null && message.hasOwnProperty("products")) { + if (!Array.isArray(message.products)) + return "products: array expected"; + for (var i = 0; i < message.products.length; ++i) { + var error = $root.proto.Message.ListMessage.Product.verify(message.products[i]); + if (error) + return "products." + error; + } + } + return null; + }; + + /** + * Creates a ProductSection message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListMessage.ProductSection} ProductSection + */ + ProductSection.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListMessage.ProductSection) + return object; + var message = new $root.proto.Message.ListMessage.ProductSection(); + if (object.title != null) + message.title = String(object.title); + if (object.products) { + if (!Array.isArray(object.products)) + throw TypeError(".proto.Message.ListMessage.ProductSection.products: array expected"); + message.products = []; + for (var i = 0; i < object.products.length; ++i) { + if (typeof object.products[i] !== "object") + throw TypeError(".proto.Message.ListMessage.ProductSection.products: object expected"); + message.products[i] = $root.proto.Message.ListMessage.Product.fromObject(object.products[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a ProductSection message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListMessage.ProductSection + * @static + * @param {proto.Message.ListMessage.ProductSection} message ProductSection + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ProductSection.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.products = []; + if (options.defaults) + object.title = ""; + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.products && message.products.length) { + object.products = []; + for (var j = 0; j < message.products.length; ++j) + object.products[j] = $root.proto.Message.ListMessage.Product.toObject(message.products[j], options); + } + return object; + }; + + /** + * Converts this ProductSection to JSON. + * @function toJSON + * @memberof proto.Message.ListMessage.ProductSection + * @instance + * @returns {Object.} JSON object + */ + ProductSection.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ProductSection; + })(); + + ListMessage.Row = (function() { + + /** + * Properties of a Row. + * @memberof proto.Message.ListMessage + * @interface IRow + * @property {string|null} [title] Row title + * @property {string|null} [description] Row description + * @property {string|null} [rowId] Row rowId + */ + + /** + * Constructs a new Row. + * @memberof proto.Message.ListMessage + * @classdesc Represents a Row. + * @implements IRow + * @constructor + * @param {proto.Message.ListMessage.IRow=} [properties] Properties to set + */ + function Row(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Row title. + * @member {string} title + * @memberof proto.Message.ListMessage.Row + * @instance + */ + Row.prototype.title = ""; + + /** + * Row description. + * @member {string} description + * @memberof proto.Message.ListMessage.Row + * @instance + */ + Row.prototype.description = ""; + + /** + * Row rowId. + * @member {string} rowId + * @memberof proto.Message.ListMessage.Row + * @instance + */ + Row.prototype.rowId = ""; + + /** + * Creates a new Row instance using the specified properties. + * @function create + * @memberof proto.Message.ListMessage.Row + * @static + * @param {proto.Message.ListMessage.IRow=} [properties] Properties to set + * @returns {proto.Message.ListMessage.Row} Row instance + */ + Row.create = function create(properties) { + return new Row(properties); + }; + + /** + * Encodes the specified Row message. Does not implicitly {@link proto.Message.ListMessage.Row.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListMessage.Row + * @static + * @param {proto.Message.ListMessage.IRow} message Row message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Row.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.description); + if (message.rowId != null && Object.hasOwnProperty.call(message, "rowId")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.rowId); + return writer; + }; + + /** + * Encodes the specified Row message, length delimited. Does not implicitly {@link proto.Message.ListMessage.Row.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListMessage.Row + * @static + * @param {proto.Message.ListMessage.IRow} message Row message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Row.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Row message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListMessage.Row + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListMessage.Row} Row + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Row.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListMessage.Row(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.title = reader.string(); + break; + case 2: + message.description = reader.string(); + break; + case 3: + message.rowId = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Row message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListMessage.Row + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListMessage.Row} Row + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Row.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Row message. + * @function verify + * @memberof proto.Message.ListMessage.Row + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Row.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.rowId != null && message.hasOwnProperty("rowId")) + if (!$util.isString(message.rowId)) + return "rowId: string expected"; + return null; + }; + + /** + * Creates a Row message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListMessage.Row + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListMessage.Row} Row + */ + Row.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListMessage.Row) + return object; + var message = new $root.proto.Message.ListMessage.Row(); + if (object.title != null) + message.title = String(object.title); + if (object.description != null) + message.description = String(object.description); + if (object.rowId != null) + message.rowId = String(object.rowId); + return message; + }; + + /** + * Creates a plain object from a Row message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListMessage.Row + * @static + * @param {proto.Message.ListMessage.Row} message Row + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Row.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.title = ""; + object.description = ""; + object.rowId = ""; + } + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + if (message.rowId != null && message.hasOwnProperty("rowId")) + object.rowId = message.rowId; + return object; + }; + + /** + * Converts this Row to JSON. + * @function toJSON + * @memberof proto.Message.ListMessage.Row + * @instance + * @returns {Object.} JSON object + */ + Row.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Row; + })(); + + ListMessage.Section = (function() { + + /** + * Properties of a Section. + * @memberof proto.Message.ListMessage + * @interface ISection + * @property {string|null} [title] Section title + * @property {Array.|null} [rows] Section rows + */ + + /** + * Constructs a new Section. + * @memberof proto.Message.ListMessage + * @classdesc Represents a Section. + * @implements ISection + * @constructor + * @param {proto.Message.ListMessage.ISection=} [properties] Properties to set + */ + function Section(properties) { + this.rows = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Section title. + * @member {string} title + * @memberof proto.Message.ListMessage.Section + * @instance + */ + Section.prototype.title = ""; + + /** + * Section rows. + * @member {Array.} rows + * @memberof proto.Message.ListMessage.Section + * @instance + */ + Section.prototype.rows = $util.emptyArray; + + /** + * Creates a new Section instance using the specified properties. + * @function create + * @memberof proto.Message.ListMessage.Section + * @static + * @param {proto.Message.ListMessage.ISection=} [properties] Properties to set + * @returns {proto.Message.ListMessage.Section} Section instance + */ + Section.create = function create(properties) { + return new Section(properties); + }; + + /** + * Encodes the specified Section message. Does not implicitly {@link proto.Message.ListMessage.Section.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListMessage.Section + * @static + * @param {proto.Message.ListMessage.ISection} message Section message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Section.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); + if (message.rows != null && message.rows.length) + for (var i = 0; i < message.rows.length; ++i) + $root.proto.Message.ListMessage.Row.encode(message.rows[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Section message, length delimited. Does not implicitly {@link proto.Message.ListMessage.Section.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListMessage.Section + * @static + * @param {proto.Message.ListMessage.ISection} message Section message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Section.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Section message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListMessage.Section + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListMessage.Section} Section + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Section.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListMessage.Section(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.title = reader.string(); + break; + case 2: + if (!(message.rows && message.rows.length)) + message.rows = []; + message.rows.push($root.proto.Message.ListMessage.Row.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Section message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListMessage.Section + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListMessage.Section} Section + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Section.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Section message. + * @function verify + * @memberof proto.Message.ListMessage.Section + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Section.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.rows != null && message.hasOwnProperty("rows")) { + if (!Array.isArray(message.rows)) + return "rows: array expected"; + for (var i = 0; i < message.rows.length; ++i) { + var error = $root.proto.Message.ListMessage.Row.verify(message.rows[i]); + if (error) + return "rows." + error; + } + } + return null; + }; + + /** + * Creates a Section message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListMessage.Section + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListMessage.Section} Section + */ + Section.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListMessage.Section) + return object; + var message = new $root.proto.Message.ListMessage.Section(); + if (object.title != null) + message.title = String(object.title); + if (object.rows) { + if (!Array.isArray(object.rows)) + throw TypeError(".proto.Message.ListMessage.Section.rows: array expected"); + message.rows = []; + for (var i = 0; i < object.rows.length; ++i) { + if (typeof object.rows[i] !== "object") + throw TypeError(".proto.Message.ListMessage.Section.rows: object expected"); + message.rows[i] = $root.proto.Message.ListMessage.Row.fromObject(object.rows[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a Section message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListMessage.Section + * @static + * @param {proto.Message.ListMessage.Section} message Section + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Section.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.rows = []; + if (options.defaults) + object.title = ""; + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.rows && message.rows.length) { + object.rows = []; + for (var j = 0; j < message.rows.length; ++j) + object.rows[j] = $root.proto.Message.ListMessage.Row.toObject(message.rows[j], options); + } + return object; + }; + + /** + * Converts this Section to JSON. + * @function toJSON + * @memberof proto.Message.ListMessage.Section + * @instance + * @returns {Object.} JSON object + */ + Section.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Section; + })(); + + return ListMessage; + })(); + + Message.ListResponseMessage = (function() { + + /** + * Properties of a ListResponseMessage. + * @memberof proto.Message + * @interface IListResponseMessage + * @property {string|null} [title] ListResponseMessage title + * @property {proto.Message.ListResponseMessage.ListType|null} [listType] ListResponseMessage listType + * @property {proto.Message.ListResponseMessage.ISingleSelectReply|null} [singleSelectReply] ListResponseMessage singleSelectReply + * @property {proto.IContextInfo|null} [contextInfo] ListResponseMessage contextInfo + * @property {string|null} [description] ListResponseMessage description + */ + + /** + * Constructs a new ListResponseMessage. + * @memberof proto.Message + * @classdesc Represents a ListResponseMessage. + * @implements IListResponseMessage + * @constructor + * @param {proto.Message.IListResponseMessage=} [properties] Properties to set + */ + function ListResponseMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ListResponseMessage title. + * @member {string} title + * @memberof proto.Message.ListResponseMessage + * @instance + */ + ListResponseMessage.prototype.title = ""; + + /** + * ListResponseMessage listType. + * @member {proto.Message.ListResponseMessage.ListType} listType + * @memberof proto.Message.ListResponseMessage + * @instance + */ + ListResponseMessage.prototype.listType = 0; + + /** + * ListResponseMessage singleSelectReply. + * @member {proto.Message.ListResponseMessage.ISingleSelectReply|null|undefined} singleSelectReply + * @memberof proto.Message.ListResponseMessage + * @instance + */ + ListResponseMessage.prototype.singleSelectReply = null; + + /** + * ListResponseMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ListResponseMessage + * @instance + */ + ListResponseMessage.prototype.contextInfo = null; + + /** + * ListResponseMessage description. + * @member {string} description + * @memberof proto.Message.ListResponseMessage + * @instance + */ + ListResponseMessage.prototype.description = ""; + + /** + * Creates a new ListResponseMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ListResponseMessage + * @static + * @param {proto.Message.IListResponseMessage=} [properties] Properties to set + * @returns {proto.Message.ListResponseMessage} ListResponseMessage instance + */ + ListResponseMessage.create = function create(properties) { + return new ListResponseMessage(properties); + }; + + /** + * Encodes the specified ListResponseMessage message. Does not implicitly {@link proto.Message.ListResponseMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListResponseMessage + * @static + * @param {proto.Message.IListResponseMessage} message ListResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ListResponseMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.title); + if (message.listType != null && Object.hasOwnProperty.call(message, "listType")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.listType); + if (message.singleSelectReply != null && Object.hasOwnProperty.call(message, "singleSelectReply")) + $root.proto.Message.ListResponseMessage.SingleSelectReply.encode(message.singleSelectReply, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.description); + return writer; + }; + + /** + * Encodes the specified ListResponseMessage message, length delimited. Does not implicitly {@link proto.Message.ListResponseMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListResponseMessage + * @static + * @param {proto.Message.IListResponseMessage} message ListResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ListResponseMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ListResponseMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListResponseMessage} ListResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ListResponseMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListResponseMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.title = reader.string(); + break; + case 2: + message.listType = reader.int32(); + break; + case 3: + message.singleSelectReply = $root.proto.Message.ListResponseMessage.SingleSelectReply.decode(reader, reader.uint32()); + break; + case 4: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 5: + message.description = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ListResponseMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListResponseMessage} ListResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ListResponseMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ListResponseMessage message. + * @function verify + * @memberof proto.Message.ListResponseMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ListResponseMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.listType != null && message.hasOwnProperty("listType")) + switch (message.listType) { + default: + return "listType: enum value expected"; + case 0: + case 1: + break; + } + if (message.singleSelectReply != null && message.hasOwnProperty("singleSelectReply")) { + var error = $root.proto.Message.ListResponseMessage.SingleSelectReply.verify(message.singleSelectReply); + if (error) + return "singleSelectReply." + error; + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + return null; + }; + + /** + * Creates a ListResponseMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListResponseMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListResponseMessage} ListResponseMessage + */ + ListResponseMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListResponseMessage) + return object; + var message = new $root.proto.Message.ListResponseMessage(); + if (object.title != null) + message.title = String(object.title); + switch (object.listType) { + case "UNKNOWN": + case 0: + message.listType = 0; + break; + case "SINGLE_SELECT": + case 1: + message.listType = 1; + break; + } + if (object.singleSelectReply != null) { + if (typeof object.singleSelectReply !== "object") + throw TypeError(".proto.Message.ListResponseMessage.singleSelectReply: object expected"); + message.singleSelectReply = $root.proto.Message.ListResponseMessage.SingleSelectReply.fromObject(object.singleSelectReply); + } + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ListResponseMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.description != null) + message.description = String(object.description); + return message; + }; + + /** + * Creates a plain object from a ListResponseMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListResponseMessage + * @static + * @param {proto.Message.ListResponseMessage} message ListResponseMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ListResponseMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.title = ""; + object.listType = options.enums === String ? "UNKNOWN" : 0; + object.singleSelectReply = null; + object.contextInfo = null; + object.description = ""; + } + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.listType != null && message.hasOwnProperty("listType")) + object.listType = options.enums === String ? $root.proto.Message.ListResponseMessage.ListType[message.listType] : message.listType; + if (message.singleSelectReply != null && message.hasOwnProperty("singleSelectReply")) + object.singleSelectReply = $root.proto.Message.ListResponseMessage.SingleSelectReply.toObject(message.singleSelectReply, options); + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + return object; + }; + + /** + * Converts this ListResponseMessage to JSON. + * @function toJSON + * @memberof proto.Message.ListResponseMessage + * @instance + * @returns {Object.} JSON object + */ + ListResponseMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ListType enum. + * @name proto.Message.ListResponseMessage.ListType + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} SINGLE_SELECT=1 SINGLE_SELECT value + */ + ListResponseMessage.ListType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "SINGLE_SELECT"] = 1; + return values; + })(); + + ListResponseMessage.SingleSelectReply = (function() { + + /** + * Properties of a SingleSelectReply. + * @memberof proto.Message.ListResponseMessage + * @interface ISingleSelectReply + * @property {string|null} [selectedRowId] SingleSelectReply selectedRowId + */ + + /** + * Constructs a new SingleSelectReply. + * @memberof proto.Message.ListResponseMessage + * @classdesc Represents a SingleSelectReply. + * @implements ISingleSelectReply + * @constructor + * @param {proto.Message.ListResponseMessage.ISingleSelectReply=} [properties] Properties to set + */ + function SingleSelectReply(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SingleSelectReply selectedRowId. + * @member {string} selectedRowId + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @instance + */ + SingleSelectReply.prototype.selectedRowId = ""; + + /** + * Creates a new SingleSelectReply instance using the specified properties. + * @function create + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {proto.Message.ListResponseMessage.ISingleSelectReply=} [properties] Properties to set + * @returns {proto.Message.ListResponseMessage.SingleSelectReply} SingleSelectReply instance + */ + SingleSelectReply.create = function create(properties) { + return new SingleSelectReply(properties); + }; + + /** + * Encodes the specified SingleSelectReply message. Does not implicitly {@link proto.Message.ListResponseMessage.SingleSelectReply.verify|verify} messages. + * @function encode + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {proto.Message.ListResponseMessage.ISingleSelectReply} message SingleSelectReply message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SingleSelectReply.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.selectedRowId != null && Object.hasOwnProperty.call(message, "selectedRowId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.selectedRowId); + return writer; + }; + + /** + * Encodes the specified SingleSelectReply message, length delimited. Does not implicitly {@link proto.Message.ListResponseMessage.SingleSelectReply.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {proto.Message.ListResponseMessage.ISingleSelectReply} message SingleSelectReply message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SingleSelectReply.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SingleSelectReply message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ListResponseMessage.SingleSelectReply} SingleSelectReply + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SingleSelectReply.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ListResponseMessage.SingleSelectReply(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.selectedRowId = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SingleSelectReply message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ListResponseMessage.SingleSelectReply} SingleSelectReply + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SingleSelectReply.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SingleSelectReply message. + * @function verify + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SingleSelectReply.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.selectedRowId != null && message.hasOwnProperty("selectedRowId")) + if (!$util.isString(message.selectedRowId)) + return "selectedRowId: string expected"; + return null; + }; + + /** + * Creates a SingleSelectReply message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ListResponseMessage.SingleSelectReply} SingleSelectReply + */ + SingleSelectReply.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ListResponseMessage.SingleSelectReply) + return object; + var message = new $root.proto.Message.ListResponseMessage.SingleSelectReply(); + if (object.selectedRowId != null) + message.selectedRowId = String(object.selectedRowId); + return message; + }; + + /** + * Creates a plain object from a SingleSelectReply message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @static + * @param {proto.Message.ListResponseMessage.SingleSelectReply} message SingleSelectReply + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SingleSelectReply.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.selectedRowId = ""; + if (message.selectedRowId != null && message.hasOwnProperty("selectedRowId")) + object.selectedRowId = message.selectedRowId; + return object; + }; + + /** + * Converts this SingleSelectReply to JSON. + * @function toJSON + * @memberof proto.Message.ListResponseMessage.SingleSelectReply + * @instance + * @returns {Object.} JSON object + */ + SingleSelectReply.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SingleSelectReply; + })(); + + return ListResponseMessage; + })(); + + Message.LiveLocationMessage = (function() { + + /** + * Properties of a LiveLocationMessage. + * @memberof proto.Message + * @interface ILiveLocationMessage + * @property {number|null} [degreesLatitude] LiveLocationMessage degreesLatitude + * @property {number|null} [degreesLongitude] LiveLocationMessage degreesLongitude + * @property {number|null} [accuracyInMeters] LiveLocationMessage accuracyInMeters + * @property {number|null} [speedInMps] LiveLocationMessage speedInMps + * @property {number|null} [degreesClockwiseFromMagneticNorth] LiveLocationMessage degreesClockwiseFromMagneticNorth + * @property {string|null} [caption] LiveLocationMessage caption + * @property {number|Long|null} [sequenceNumber] LiveLocationMessage sequenceNumber + * @property {number|null} [timeOffset] LiveLocationMessage timeOffset + * @property {Uint8Array|null} [jpegThumbnail] LiveLocationMessage jpegThumbnail + * @property {proto.IContextInfo|null} [contextInfo] LiveLocationMessage contextInfo + */ + + /** + * Constructs a new LiveLocationMessage. + * @memberof proto.Message + * @classdesc Represents a LiveLocationMessage. + * @implements ILiveLocationMessage + * @constructor + * @param {proto.Message.ILiveLocationMessage=} [properties] Properties to set + */ + function LiveLocationMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LiveLocationMessage degreesLatitude. + * @member {number} degreesLatitude + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.degreesLatitude = 0; + + /** + * LiveLocationMessage degreesLongitude. + * @member {number} degreesLongitude + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.degreesLongitude = 0; + + /** + * LiveLocationMessage accuracyInMeters. + * @member {number} accuracyInMeters + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.accuracyInMeters = 0; + + /** + * LiveLocationMessage speedInMps. + * @member {number} speedInMps + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.speedInMps = 0; + + /** + * LiveLocationMessage degreesClockwiseFromMagneticNorth. + * @member {number} degreesClockwiseFromMagneticNorth + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.degreesClockwiseFromMagneticNorth = 0; + + /** + * LiveLocationMessage caption. + * @member {string} caption + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.caption = ""; + + /** + * LiveLocationMessage sequenceNumber. + * @member {number|Long} sequenceNumber + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.sequenceNumber = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * LiveLocationMessage timeOffset. + * @member {number} timeOffset + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.timeOffset = 0; + + /** + * LiveLocationMessage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * LiveLocationMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.LiveLocationMessage + * @instance + */ + LiveLocationMessage.prototype.contextInfo = null; + + /** + * Creates a new LiveLocationMessage instance using the specified properties. + * @function create + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {proto.Message.ILiveLocationMessage=} [properties] Properties to set + * @returns {proto.Message.LiveLocationMessage} LiveLocationMessage instance + */ + LiveLocationMessage.create = function create(properties) { + return new LiveLocationMessage(properties); + }; + + /** + * Encodes the specified LiveLocationMessage message. Does not implicitly {@link proto.Message.LiveLocationMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {proto.Message.ILiveLocationMessage} message LiveLocationMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LiveLocationMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.degreesLatitude != null && Object.hasOwnProperty.call(message, "degreesLatitude")) + writer.uint32(/* id 1, wireType 1 =*/9).double(message.degreesLatitude); + if (message.degreesLongitude != null && Object.hasOwnProperty.call(message, "degreesLongitude")) + writer.uint32(/* id 2, wireType 1 =*/17).double(message.degreesLongitude); + if (message.accuracyInMeters != null && Object.hasOwnProperty.call(message, "accuracyInMeters")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.accuracyInMeters); + if (message.speedInMps != null && Object.hasOwnProperty.call(message, "speedInMps")) + writer.uint32(/* id 4, wireType 5 =*/37).float(message.speedInMps); + if (message.degreesClockwiseFromMagneticNorth != null && Object.hasOwnProperty.call(message, "degreesClockwiseFromMagneticNorth")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.degreesClockwiseFromMagneticNorth); + if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.caption); + if (message.sequenceNumber != null && Object.hasOwnProperty.call(message, "sequenceNumber")) + writer.uint32(/* id 7, wireType 0 =*/56).int64(message.sequenceNumber); + if (message.timeOffset != null && Object.hasOwnProperty.call(message, "timeOffset")) + writer.uint32(/* id 8, wireType 0 =*/64).uint32(message.timeOffset); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.jpegThumbnail); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified LiveLocationMessage message, length delimited. Does not implicitly {@link proto.Message.LiveLocationMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {proto.Message.ILiveLocationMessage} message LiveLocationMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LiveLocationMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LiveLocationMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.LiveLocationMessage} LiveLocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LiveLocationMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.LiveLocationMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.degreesLatitude = reader.double(); + break; + case 2: + message.degreesLongitude = reader.double(); + break; + case 3: + message.accuracyInMeters = reader.uint32(); + break; + case 4: + message.speedInMps = reader.float(); + break; + case 5: + message.degreesClockwiseFromMagneticNorth = reader.uint32(); + break; + case 6: + message.caption = reader.string(); + break; + case 7: + message.sequenceNumber = reader.int64(); + break; + case 8: + message.timeOffset = reader.uint32(); + break; + case 16: + message.jpegThumbnail = reader.bytes(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LiveLocationMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.LiveLocationMessage} LiveLocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LiveLocationMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LiveLocationMessage message. + * @function verify + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LiveLocationMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.degreesLatitude != null && message.hasOwnProperty("degreesLatitude")) + if (typeof message.degreesLatitude !== "number") + return "degreesLatitude: number expected"; + if (message.degreesLongitude != null && message.hasOwnProperty("degreesLongitude")) + if (typeof message.degreesLongitude !== "number") + return "degreesLongitude: number expected"; + if (message.accuracyInMeters != null && message.hasOwnProperty("accuracyInMeters")) + if (!$util.isInteger(message.accuracyInMeters)) + return "accuracyInMeters: integer expected"; + if (message.speedInMps != null && message.hasOwnProperty("speedInMps")) + if (typeof message.speedInMps !== "number") + return "speedInMps: number expected"; + if (message.degreesClockwiseFromMagneticNorth != null && message.hasOwnProperty("degreesClockwiseFromMagneticNorth")) + if (!$util.isInteger(message.degreesClockwiseFromMagneticNorth)) + return "degreesClockwiseFromMagneticNorth: integer expected"; + if (message.caption != null && message.hasOwnProperty("caption")) + if (!$util.isString(message.caption)) + return "caption: string expected"; + if (message.sequenceNumber != null && message.hasOwnProperty("sequenceNumber")) + if (!$util.isInteger(message.sequenceNumber) && !(message.sequenceNumber && $util.isInteger(message.sequenceNumber.low) && $util.isInteger(message.sequenceNumber.high))) + return "sequenceNumber: integer|Long expected"; + if (message.timeOffset != null && message.hasOwnProperty("timeOffset")) + if (!$util.isInteger(message.timeOffset)) + return "timeOffset: integer expected"; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a LiveLocationMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.LiveLocationMessage} LiveLocationMessage + */ + LiveLocationMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.LiveLocationMessage) + return object; + var message = new $root.proto.Message.LiveLocationMessage(); + if (object.degreesLatitude != null) + message.degreesLatitude = Number(object.degreesLatitude); + if (object.degreesLongitude != null) + message.degreesLongitude = Number(object.degreesLongitude); + if (object.accuracyInMeters != null) + message.accuracyInMeters = object.accuracyInMeters >>> 0; + if (object.speedInMps != null) + message.speedInMps = Number(object.speedInMps); + if (object.degreesClockwiseFromMagneticNorth != null) + message.degreesClockwiseFromMagneticNorth = object.degreesClockwiseFromMagneticNorth >>> 0; + if (object.caption != null) + message.caption = String(object.caption); + if (object.sequenceNumber != null) + if ($util.Long) + (message.sequenceNumber = $util.Long.fromValue(object.sequenceNumber)).unsigned = false; + else if (typeof object.sequenceNumber === "string") + message.sequenceNumber = parseInt(object.sequenceNumber, 10); + else if (typeof object.sequenceNumber === "number") + message.sequenceNumber = object.sequenceNumber; + else if (typeof object.sequenceNumber === "object") + message.sequenceNumber = new $util.LongBits(object.sequenceNumber.low >>> 0, object.sequenceNumber.high >>> 0).toNumber(); + if (object.timeOffset != null) + message.timeOffset = object.timeOffset >>> 0; + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.LiveLocationMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a LiveLocationMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.LiveLocationMessage + * @static + * @param {proto.Message.LiveLocationMessage} message LiveLocationMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LiveLocationMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.degreesLatitude = 0; + object.degreesLongitude = 0; + object.accuracyInMeters = 0; + object.speedInMps = 0; + object.degreesClockwiseFromMagneticNorth = 0; + object.caption = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.sequenceNumber = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.sequenceNumber = options.longs === String ? "0" : 0; + object.timeOffset = 0; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.contextInfo = null; + } + if (message.degreesLatitude != null && message.hasOwnProperty("degreesLatitude")) + object.degreesLatitude = options.json && !isFinite(message.degreesLatitude) ? String(message.degreesLatitude) : message.degreesLatitude; + if (message.degreesLongitude != null && message.hasOwnProperty("degreesLongitude")) + object.degreesLongitude = options.json && !isFinite(message.degreesLongitude) ? String(message.degreesLongitude) : message.degreesLongitude; + if (message.accuracyInMeters != null && message.hasOwnProperty("accuracyInMeters")) + object.accuracyInMeters = message.accuracyInMeters; + if (message.speedInMps != null && message.hasOwnProperty("speedInMps")) + object.speedInMps = options.json && !isFinite(message.speedInMps) ? String(message.speedInMps) : message.speedInMps; + if (message.degreesClockwiseFromMagneticNorth != null && message.hasOwnProperty("degreesClockwiseFromMagneticNorth")) + object.degreesClockwiseFromMagneticNorth = message.degreesClockwiseFromMagneticNorth; + if (message.caption != null && message.hasOwnProperty("caption")) + object.caption = message.caption; + if (message.sequenceNumber != null && message.hasOwnProperty("sequenceNumber")) + if (typeof message.sequenceNumber === "number") + object.sequenceNumber = options.longs === String ? String(message.sequenceNumber) : message.sequenceNumber; + else + object.sequenceNumber = options.longs === String ? $util.Long.prototype.toString.call(message.sequenceNumber) : options.longs === Number ? new $util.LongBits(message.sequenceNumber.low >>> 0, message.sequenceNumber.high >>> 0).toNumber() : message.sequenceNumber; + if (message.timeOffset != null && message.hasOwnProperty("timeOffset")) + object.timeOffset = message.timeOffset; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this LiveLocationMessage to JSON. + * @function toJSON + * @memberof proto.Message.LiveLocationMessage + * @instance + * @returns {Object.} JSON object + */ + LiveLocationMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return LiveLocationMessage; + })(); + + Message.LocationMessage = (function() { + + /** + * Properties of a LocationMessage. + * @memberof proto.Message + * @interface ILocationMessage + * @property {number|null} [degreesLatitude] LocationMessage degreesLatitude + * @property {number|null} [degreesLongitude] LocationMessage degreesLongitude + * @property {string|null} [name] LocationMessage name + * @property {string|null} [address] LocationMessage address + * @property {string|null} [url] LocationMessage url + * @property {boolean|null} [isLive] LocationMessage isLive + * @property {number|null} [accuracyInMeters] LocationMessage accuracyInMeters + * @property {number|null} [speedInMps] LocationMessage speedInMps + * @property {number|null} [degreesClockwiseFromMagneticNorth] LocationMessage degreesClockwiseFromMagneticNorth + * @property {string|null} [comment] LocationMessage comment + * @property {Uint8Array|null} [jpegThumbnail] LocationMessage jpegThumbnail + * @property {proto.IContextInfo|null} [contextInfo] LocationMessage contextInfo + */ + + /** + * Constructs a new LocationMessage. + * @memberof proto.Message + * @classdesc Represents a LocationMessage. + * @implements ILocationMessage + * @constructor + * @param {proto.Message.ILocationMessage=} [properties] Properties to set + */ + function LocationMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LocationMessage degreesLatitude. + * @member {number} degreesLatitude + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.degreesLatitude = 0; + + /** + * LocationMessage degreesLongitude. + * @member {number} degreesLongitude + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.degreesLongitude = 0; + + /** + * LocationMessage name. + * @member {string} name + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.name = ""; + + /** + * LocationMessage address. + * @member {string} address + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.address = ""; + + /** + * LocationMessage url. + * @member {string} url + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.url = ""; + + /** + * LocationMessage isLive. + * @member {boolean} isLive + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.isLive = false; + + /** + * LocationMessage accuracyInMeters. + * @member {number} accuracyInMeters + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.accuracyInMeters = 0; + + /** + * LocationMessage speedInMps. + * @member {number} speedInMps + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.speedInMps = 0; + + /** + * LocationMessage degreesClockwiseFromMagneticNorth. + * @member {number} degreesClockwiseFromMagneticNorth + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.degreesClockwiseFromMagneticNorth = 0; + + /** + * LocationMessage comment. + * @member {string} comment + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.comment = ""; + + /** + * LocationMessage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * LocationMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.LocationMessage + * @instance + */ + LocationMessage.prototype.contextInfo = null; + + /** + * Creates a new LocationMessage instance using the specified properties. + * @function create + * @memberof proto.Message.LocationMessage + * @static + * @param {proto.Message.ILocationMessage=} [properties] Properties to set + * @returns {proto.Message.LocationMessage} LocationMessage instance + */ + LocationMessage.create = function create(properties) { + return new LocationMessage(properties); + }; + + /** + * Encodes the specified LocationMessage message. Does not implicitly {@link proto.Message.LocationMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.LocationMessage + * @static + * @param {proto.Message.ILocationMessage} message LocationMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LocationMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.degreesLatitude != null && Object.hasOwnProperty.call(message, "degreesLatitude")) + writer.uint32(/* id 1, wireType 1 =*/9).double(message.degreesLatitude); + if (message.degreesLongitude != null && Object.hasOwnProperty.call(message, "degreesLongitude")) + writer.uint32(/* id 2, wireType 1 =*/17).double(message.degreesLongitude); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.name); + if (message.address != null && Object.hasOwnProperty.call(message, "address")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.address); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.url); + if (message.isLive != null && Object.hasOwnProperty.call(message, "isLive")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isLive); + if (message.accuracyInMeters != null && Object.hasOwnProperty.call(message, "accuracyInMeters")) + writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.accuracyInMeters); + if (message.speedInMps != null && Object.hasOwnProperty.call(message, "speedInMps")) + writer.uint32(/* id 8, wireType 5 =*/69).float(message.speedInMps); + if (message.degreesClockwiseFromMagneticNorth != null && Object.hasOwnProperty.call(message, "degreesClockwiseFromMagneticNorth")) + writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.degreesClockwiseFromMagneticNorth); + if (message.comment != null && Object.hasOwnProperty.call(message, "comment")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.comment); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.jpegThumbnail); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified LocationMessage message, length delimited. Does not implicitly {@link proto.Message.LocationMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.LocationMessage + * @static + * @param {proto.Message.ILocationMessage} message LocationMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LocationMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LocationMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.LocationMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.LocationMessage} LocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LocationMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.LocationMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.degreesLatitude = reader.double(); + break; + case 2: + message.degreesLongitude = reader.double(); + break; + case 3: + message.name = reader.string(); + break; + case 4: + message.address = reader.string(); + break; + case 5: + message.url = reader.string(); + break; + case 6: + message.isLive = reader.bool(); + break; + case 7: + message.accuracyInMeters = reader.uint32(); + break; + case 8: + message.speedInMps = reader.float(); + break; + case 9: + message.degreesClockwiseFromMagneticNorth = reader.uint32(); + break; + case 11: + message.comment = reader.string(); + break; + case 16: + message.jpegThumbnail = reader.bytes(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LocationMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.LocationMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.LocationMessage} LocationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LocationMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LocationMessage message. + * @function verify + * @memberof proto.Message.LocationMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LocationMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.degreesLatitude != null && message.hasOwnProperty("degreesLatitude")) + if (typeof message.degreesLatitude !== "number") + return "degreesLatitude: number expected"; + if (message.degreesLongitude != null && message.hasOwnProperty("degreesLongitude")) + if (typeof message.degreesLongitude !== "number") + return "degreesLongitude: number expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.address != null && message.hasOwnProperty("address")) + if (!$util.isString(message.address)) + return "address: string expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.isLive != null && message.hasOwnProperty("isLive")) + if (typeof message.isLive !== "boolean") + return "isLive: boolean expected"; + if (message.accuracyInMeters != null && message.hasOwnProperty("accuracyInMeters")) + if (!$util.isInteger(message.accuracyInMeters)) + return "accuracyInMeters: integer expected"; + if (message.speedInMps != null && message.hasOwnProperty("speedInMps")) + if (typeof message.speedInMps !== "number") + return "speedInMps: number expected"; + if (message.degreesClockwiseFromMagneticNorth != null && message.hasOwnProperty("degreesClockwiseFromMagneticNorth")) + if (!$util.isInteger(message.degreesClockwiseFromMagneticNorth)) + return "degreesClockwiseFromMagneticNorth: integer expected"; + if (message.comment != null && message.hasOwnProperty("comment")) + if (!$util.isString(message.comment)) + return "comment: string expected"; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a LocationMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.LocationMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.LocationMessage} LocationMessage + */ + LocationMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.LocationMessage) + return object; + var message = new $root.proto.Message.LocationMessage(); + if (object.degreesLatitude != null) + message.degreesLatitude = Number(object.degreesLatitude); + if (object.degreesLongitude != null) + message.degreesLongitude = Number(object.degreesLongitude); + if (object.name != null) + message.name = String(object.name); + if (object.address != null) + message.address = String(object.address); + if (object.url != null) + message.url = String(object.url); + if (object.isLive != null) + message.isLive = Boolean(object.isLive); + if (object.accuracyInMeters != null) + message.accuracyInMeters = object.accuracyInMeters >>> 0; + if (object.speedInMps != null) + message.speedInMps = Number(object.speedInMps); + if (object.degreesClockwiseFromMagneticNorth != null) + message.degreesClockwiseFromMagneticNorth = object.degreesClockwiseFromMagneticNorth >>> 0; + if (object.comment != null) + message.comment = String(object.comment); + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.LocationMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a LocationMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.LocationMessage + * @static + * @param {proto.Message.LocationMessage} message LocationMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LocationMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.degreesLatitude = 0; + object.degreesLongitude = 0; + object.name = ""; + object.address = ""; + object.url = ""; + object.isLive = false; + object.accuracyInMeters = 0; + object.speedInMps = 0; + object.degreesClockwiseFromMagneticNorth = 0; + object.comment = ""; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.contextInfo = null; + } + if (message.degreesLatitude != null && message.hasOwnProperty("degreesLatitude")) + object.degreesLatitude = options.json && !isFinite(message.degreesLatitude) ? String(message.degreesLatitude) : message.degreesLatitude; + if (message.degreesLongitude != null && message.hasOwnProperty("degreesLongitude")) + object.degreesLongitude = options.json && !isFinite(message.degreesLongitude) ? String(message.degreesLongitude) : message.degreesLongitude; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.address != null && message.hasOwnProperty("address")) + object.address = message.address; + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.isLive != null && message.hasOwnProperty("isLive")) + object.isLive = message.isLive; + if (message.accuracyInMeters != null && message.hasOwnProperty("accuracyInMeters")) + object.accuracyInMeters = message.accuracyInMeters; + if (message.speedInMps != null && message.hasOwnProperty("speedInMps")) + object.speedInMps = options.json && !isFinite(message.speedInMps) ? String(message.speedInMps) : message.speedInMps; + if (message.degreesClockwiseFromMagneticNorth != null && message.hasOwnProperty("degreesClockwiseFromMagneticNorth")) + object.degreesClockwiseFromMagneticNorth = message.degreesClockwiseFromMagneticNorth; + if (message.comment != null && message.hasOwnProperty("comment")) + object.comment = message.comment; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this LocationMessage to JSON. + * @function toJSON + * @memberof proto.Message.LocationMessage + * @instance + * @returns {Object.} JSON object + */ + LocationMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return LocationMessage; + })(); + + Message.OrderMessage = (function() { + + /** + * Properties of an OrderMessage. + * @memberof proto.Message + * @interface IOrderMessage + * @property {string|null} [orderId] OrderMessage orderId + * @property {Uint8Array|null} [thumbnail] OrderMessage thumbnail + * @property {number|null} [itemCount] OrderMessage itemCount + * @property {proto.Message.OrderMessage.OrderStatus|null} [status] OrderMessage status + * @property {proto.Message.OrderMessage.OrderSurface|null} [surface] OrderMessage surface + * @property {string|null} [message] OrderMessage message + * @property {string|null} [orderTitle] OrderMessage orderTitle + * @property {string|null} [sellerJid] OrderMessage sellerJid + * @property {string|null} [token] OrderMessage token + * @property {number|Long|null} [totalAmount1000] OrderMessage totalAmount1000 + * @property {string|null} [totalCurrencyCode] OrderMessage totalCurrencyCode + * @property {proto.IContextInfo|null} [contextInfo] OrderMessage contextInfo + */ + + /** + * Constructs a new OrderMessage. + * @memberof proto.Message + * @classdesc Represents an OrderMessage. + * @implements IOrderMessage + * @constructor + * @param {proto.Message.IOrderMessage=} [properties] Properties to set + */ + function OrderMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * OrderMessage orderId. + * @member {string} orderId + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.orderId = ""; + + /** + * OrderMessage thumbnail. + * @member {Uint8Array} thumbnail + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.thumbnail = $util.newBuffer([]); + + /** + * OrderMessage itemCount. + * @member {number} itemCount + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.itemCount = 0; + + /** + * OrderMessage status. + * @member {proto.Message.OrderMessage.OrderStatus} status + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.status = 1; + + /** + * OrderMessage surface. + * @member {proto.Message.OrderMessage.OrderSurface} surface + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.surface = 1; + + /** + * OrderMessage message. + * @member {string} message + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.message = ""; + + /** + * OrderMessage orderTitle. + * @member {string} orderTitle + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.orderTitle = ""; + + /** + * OrderMessage sellerJid. + * @member {string} sellerJid + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.sellerJid = ""; + + /** + * OrderMessage token. + * @member {string} token + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.token = ""; + + /** + * OrderMessage totalAmount1000. + * @member {number|Long} totalAmount1000 + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.totalAmount1000 = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * OrderMessage totalCurrencyCode. + * @member {string} totalCurrencyCode + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.totalCurrencyCode = ""; + + /** + * OrderMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.OrderMessage + * @instance + */ + OrderMessage.prototype.contextInfo = null; + + /** + * Creates a new OrderMessage instance using the specified properties. + * @function create + * @memberof proto.Message.OrderMessage + * @static + * @param {proto.Message.IOrderMessage=} [properties] Properties to set + * @returns {proto.Message.OrderMessage} OrderMessage instance + */ + OrderMessage.create = function create(properties) { + return new OrderMessage(properties); + }; + + /** + * Encodes the specified OrderMessage message. Does not implicitly {@link proto.Message.OrderMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.OrderMessage + * @static + * @param {proto.Message.IOrderMessage} message OrderMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + OrderMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.orderId != null && Object.hasOwnProperty.call(message, "orderId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.orderId); + if (message.thumbnail != null && Object.hasOwnProperty.call(message, "thumbnail")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.thumbnail); + if (message.itemCount != null && Object.hasOwnProperty.call(message, "itemCount")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.itemCount); + if (message.status != null && Object.hasOwnProperty.call(message, "status")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.status); + if (message.surface != null && Object.hasOwnProperty.call(message, "surface")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.surface); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.message); + if (message.orderTitle != null && Object.hasOwnProperty.call(message, "orderTitle")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.orderTitle); + if (message.sellerJid != null && Object.hasOwnProperty.call(message, "sellerJid")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.sellerJid); + if (message.token != null && Object.hasOwnProperty.call(message, "token")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.token); + if (message.totalAmount1000 != null && Object.hasOwnProperty.call(message, "totalAmount1000")) + writer.uint32(/* id 10, wireType 0 =*/80).int64(message.totalAmount1000); + if (message.totalCurrencyCode != null && Object.hasOwnProperty.call(message, "totalCurrencyCode")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.totalCurrencyCode); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified OrderMessage message, length delimited. Does not implicitly {@link proto.Message.OrderMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.OrderMessage + * @static + * @param {proto.Message.IOrderMessage} message OrderMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + OrderMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an OrderMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.OrderMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.OrderMessage} OrderMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + OrderMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.OrderMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.orderId = reader.string(); + break; + case 2: + message.thumbnail = reader.bytes(); + break; + case 3: + message.itemCount = reader.int32(); + break; + case 4: + message.status = reader.int32(); + break; + case 5: + message.surface = reader.int32(); + break; + case 6: + message.message = reader.string(); + break; + case 7: + message.orderTitle = reader.string(); + break; + case 8: + message.sellerJid = reader.string(); + break; + case 9: + message.token = reader.string(); + break; + case 10: + message.totalAmount1000 = reader.int64(); + break; + case 11: + message.totalCurrencyCode = reader.string(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an OrderMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.OrderMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.OrderMessage} OrderMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + OrderMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an OrderMessage message. + * @function verify + * @memberof proto.Message.OrderMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + OrderMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.orderId != null && message.hasOwnProperty("orderId")) + if (!$util.isString(message.orderId)) + return "orderId: string expected"; + if (message.thumbnail != null && message.hasOwnProperty("thumbnail")) + if (!(message.thumbnail && typeof message.thumbnail.length === "number" || $util.isString(message.thumbnail))) + return "thumbnail: buffer expected"; + if (message.itemCount != null && message.hasOwnProperty("itemCount")) + if (!$util.isInteger(message.itemCount)) + return "itemCount: integer expected"; + if (message.status != null && message.hasOwnProperty("status")) + switch (message.status) { + default: + return "status: enum value expected"; + case 1: + break; + } + if (message.surface != null && message.hasOwnProperty("surface")) + switch (message.surface) { + default: + return "surface: enum value expected"; + case 1: + break; + } + if (message.message != null && message.hasOwnProperty("message")) + if (!$util.isString(message.message)) + return "message: string expected"; + if (message.orderTitle != null && message.hasOwnProperty("orderTitle")) + if (!$util.isString(message.orderTitle)) + return "orderTitle: string expected"; + if (message.sellerJid != null && message.hasOwnProperty("sellerJid")) + if (!$util.isString(message.sellerJid)) + return "sellerJid: string expected"; + if (message.token != null && message.hasOwnProperty("token")) + if (!$util.isString(message.token)) + return "token: string expected"; + if (message.totalAmount1000 != null && message.hasOwnProperty("totalAmount1000")) + if (!$util.isInteger(message.totalAmount1000) && !(message.totalAmount1000 && $util.isInteger(message.totalAmount1000.low) && $util.isInteger(message.totalAmount1000.high))) + return "totalAmount1000: integer|Long expected"; + if (message.totalCurrencyCode != null && message.hasOwnProperty("totalCurrencyCode")) + if (!$util.isString(message.totalCurrencyCode)) + return "totalCurrencyCode: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates an OrderMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.OrderMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.OrderMessage} OrderMessage + */ + OrderMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.OrderMessage) + return object; + var message = new $root.proto.Message.OrderMessage(); + if (object.orderId != null) + message.orderId = String(object.orderId); + if (object.thumbnail != null) + if (typeof object.thumbnail === "string") + $util.base64.decode(object.thumbnail, message.thumbnail = $util.newBuffer($util.base64.length(object.thumbnail)), 0); + else if (object.thumbnail.length) + message.thumbnail = object.thumbnail; + if (object.itemCount != null) + message.itemCount = object.itemCount | 0; + switch (object.status) { + case "INQUIRY": + case 1: + message.status = 1; + break; + } + switch (object.surface) { + case "CATALOG": + case 1: + message.surface = 1; + break; + } + if (object.message != null) + message.message = String(object.message); + if (object.orderTitle != null) + message.orderTitle = String(object.orderTitle); + if (object.sellerJid != null) + message.sellerJid = String(object.sellerJid); + if (object.token != null) + message.token = String(object.token); + if (object.totalAmount1000 != null) + if ($util.Long) + (message.totalAmount1000 = $util.Long.fromValue(object.totalAmount1000)).unsigned = false; + else if (typeof object.totalAmount1000 === "string") + message.totalAmount1000 = parseInt(object.totalAmount1000, 10); + else if (typeof object.totalAmount1000 === "number") + message.totalAmount1000 = object.totalAmount1000; + else if (typeof object.totalAmount1000 === "object") + message.totalAmount1000 = new $util.LongBits(object.totalAmount1000.low >>> 0, object.totalAmount1000.high >>> 0).toNumber(); + if (object.totalCurrencyCode != null) + message.totalCurrencyCode = String(object.totalCurrencyCode); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.OrderMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from an OrderMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.OrderMessage + * @static + * @param {proto.Message.OrderMessage} message OrderMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + OrderMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.orderId = ""; + if (options.bytes === String) + object.thumbnail = ""; + else { + object.thumbnail = []; + if (options.bytes !== Array) + object.thumbnail = $util.newBuffer(object.thumbnail); + } + object.itemCount = 0; + object.status = options.enums === String ? "INQUIRY" : 1; + object.surface = options.enums === String ? "CATALOG" : 1; + object.message = ""; + object.orderTitle = ""; + object.sellerJid = ""; + object.token = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.totalAmount1000 = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.totalAmount1000 = options.longs === String ? "0" : 0; + object.totalCurrencyCode = ""; + object.contextInfo = null; + } + if (message.orderId != null && message.hasOwnProperty("orderId")) + object.orderId = message.orderId; + if (message.thumbnail != null && message.hasOwnProperty("thumbnail")) + object.thumbnail = options.bytes === String ? $util.base64.encode(message.thumbnail, 0, message.thumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnail) : message.thumbnail; + if (message.itemCount != null && message.hasOwnProperty("itemCount")) + object.itemCount = message.itemCount; + if (message.status != null && message.hasOwnProperty("status")) + object.status = options.enums === String ? $root.proto.Message.OrderMessage.OrderStatus[message.status] : message.status; + if (message.surface != null && message.hasOwnProperty("surface")) + object.surface = options.enums === String ? $root.proto.Message.OrderMessage.OrderSurface[message.surface] : message.surface; + if (message.message != null && message.hasOwnProperty("message")) + object.message = message.message; + if (message.orderTitle != null && message.hasOwnProperty("orderTitle")) + object.orderTitle = message.orderTitle; + if (message.sellerJid != null && message.hasOwnProperty("sellerJid")) + object.sellerJid = message.sellerJid; + if (message.token != null && message.hasOwnProperty("token")) + object.token = message.token; + if (message.totalAmount1000 != null && message.hasOwnProperty("totalAmount1000")) + if (typeof message.totalAmount1000 === "number") + object.totalAmount1000 = options.longs === String ? String(message.totalAmount1000) : message.totalAmount1000; + else + object.totalAmount1000 = options.longs === String ? $util.Long.prototype.toString.call(message.totalAmount1000) : options.longs === Number ? new $util.LongBits(message.totalAmount1000.low >>> 0, message.totalAmount1000.high >>> 0).toNumber() : message.totalAmount1000; + if (message.totalCurrencyCode != null && message.hasOwnProperty("totalCurrencyCode")) + object.totalCurrencyCode = message.totalCurrencyCode; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this OrderMessage to JSON. + * @function toJSON + * @memberof proto.Message.OrderMessage + * @instance + * @returns {Object.} JSON object + */ + OrderMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * OrderStatus enum. + * @name proto.Message.OrderMessage.OrderStatus + * @enum {number} + * @property {number} INQUIRY=1 INQUIRY value + */ + OrderMessage.OrderStatus = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[1] = "INQUIRY"] = 1; + return values; + })(); + + /** + * OrderSurface enum. + * @name proto.Message.OrderMessage.OrderSurface + * @enum {number} + * @property {number} CATALOG=1 CATALOG value + */ + OrderMessage.OrderSurface = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[1] = "CATALOG"] = 1; + return values; + })(); + + return OrderMessage; + })(); + + Message.PaymentInviteMessage = (function() { + + /** + * Properties of a PaymentInviteMessage. + * @memberof proto.Message + * @interface IPaymentInviteMessage + * @property {proto.Message.PaymentInviteMessage.ServiceType|null} [serviceType] PaymentInviteMessage serviceType + * @property {number|Long|null} [expiryTimestamp] PaymentInviteMessage expiryTimestamp + */ + + /** + * Constructs a new PaymentInviteMessage. + * @memberof proto.Message + * @classdesc Represents a PaymentInviteMessage. + * @implements IPaymentInviteMessage + * @constructor + * @param {proto.Message.IPaymentInviteMessage=} [properties] Properties to set + */ + function PaymentInviteMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PaymentInviteMessage serviceType. + * @member {proto.Message.PaymentInviteMessage.ServiceType} serviceType + * @memberof proto.Message.PaymentInviteMessage + * @instance + */ + PaymentInviteMessage.prototype.serviceType = 0; + + /** + * PaymentInviteMessage expiryTimestamp. + * @member {number|Long} expiryTimestamp + * @memberof proto.Message.PaymentInviteMessage + * @instance + */ + PaymentInviteMessage.prototype.expiryTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new PaymentInviteMessage instance using the specified properties. + * @function create + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {proto.Message.IPaymentInviteMessage=} [properties] Properties to set + * @returns {proto.Message.PaymentInviteMessage} PaymentInviteMessage instance + */ + PaymentInviteMessage.create = function create(properties) { + return new PaymentInviteMessage(properties); + }; + + /** + * Encodes the specified PaymentInviteMessage message. Does not implicitly {@link proto.Message.PaymentInviteMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {proto.Message.IPaymentInviteMessage} message PaymentInviteMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PaymentInviteMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.serviceType != null && Object.hasOwnProperty.call(message, "serviceType")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.serviceType); + if (message.expiryTimestamp != null && Object.hasOwnProperty.call(message, "expiryTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.expiryTimestamp); + return writer; + }; + + /** + * Encodes the specified PaymentInviteMessage message, length delimited. Does not implicitly {@link proto.Message.PaymentInviteMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {proto.Message.IPaymentInviteMessage} message PaymentInviteMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PaymentInviteMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PaymentInviteMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PaymentInviteMessage} PaymentInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PaymentInviteMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PaymentInviteMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.serviceType = reader.int32(); + break; + case 2: + message.expiryTimestamp = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PaymentInviteMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PaymentInviteMessage} PaymentInviteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PaymentInviteMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PaymentInviteMessage message. + * @function verify + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PaymentInviteMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.serviceType != null && message.hasOwnProperty("serviceType")) + switch (message.serviceType) { + default: + return "serviceType: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.expiryTimestamp != null && message.hasOwnProperty("expiryTimestamp")) + if (!$util.isInteger(message.expiryTimestamp) && !(message.expiryTimestamp && $util.isInteger(message.expiryTimestamp.low) && $util.isInteger(message.expiryTimestamp.high))) + return "expiryTimestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a PaymentInviteMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PaymentInviteMessage} PaymentInviteMessage + */ + PaymentInviteMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PaymentInviteMessage) + return object; + var message = new $root.proto.Message.PaymentInviteMessage(); + switch (object.serviceType) { + case "UNKNOWN": + case 0: + message.serviceType = 0; + break; + case "FBPAY": + case 1: + message.serviceType = 1; + break; + case "NOVI": + case 2: + message.serviceType = 2; + break; + case "UPI": + case 3: + message.serviceType = 3; + break; + } + if (object.expiryTimestamp != null) + if ($util.Long) + (message.expiryTimestamp = $util.Long.fromValue(object.expiryTimestamp)).unsigned = false; + else if (typeof object.expiryTimestamp === "string") + message.expiryTimestamp = parseInt(object.expiryTimestamp, 10); + else if (typeof object.expiryTimestamp === "number") + message.expiryTimestamp = object.expiryTimestamp; + else if (typeof object.expiryTimestamp === "object") + message.expiryTimestamp = new $util.LongBits(object.expiryTimestamp.low >>> 0, object.expiryTimestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a PaymentInviteMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PaymentInviteMessage + * @static + * @param {proto.Message.PaymentInviteMessage} message PaymentInviteMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PaymentInviteMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.serviceType = options.enums === String ? "UNKNOWN" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.expiryTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.expiryTimestamp = options.longs === String ? "0" : 0; + } + if (message.serviceType != null && message.hasOwnProperty("serviceType")) + object.serviceType = options.enums === String ? $root.proto.Message.PaymentInviteMessage.ServiceType[message.serviceType] : message.serviceType; + if (message.expiryTimestamp != null && message.hasOwnProperty("expiryTimestamp")) + if (typeof message.expiryTimestamp === "number") + object.expiryTimestamp = options.longs === String ? String(message.expiryTimestamp) : message.expiryTimestamp; + else + object.expiryTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.expiryTimestamp) : options.longs === Number ? new $util.LongBits(message.expiryTimestamp.low >>> 0, message.expiryTimestamp.high >>> 0).toNumber() : message.expiryTimestamp; + return object; + }; + + /** + * Converts this PaymentInviteMessage to JSON. + * @function toJSON + * @memberof proto.Message.PaymentInviteMessage + * @instance + * @returns {Object.} JSON object + */ + PaymentInviteMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ServiceType enum. + * @name proto.Message.PaymentInviteMessage.ServiceType + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} FBPAY=1 FBPAY value + * @property {number} NOVI=2 NOVI value + * @property {number} UPI=3 UPI value + */ + PaymentInviteMessage.ServiceType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "FBPAY"] = 1; + values[valuesById[2] = "NOVI"] = 2; + values[valuesById[3] = "UPI"] = 3; + return values; + })(); + + return PaymentInviteMessage; + })(); + + Message.PeerDataOperationRequestMessage = (function() { + + /** + * Properties of a PeerDataOperationRequestMessage. + * @memberof proto.Message + * @interface IPeerDataOperationRequestMessage + * @property {proto.Message.PeerDataOperationRequestType|null} [peerDataOperationRequestType] PeerDataOperationRequestMessage peerDataOperationRequestType + * @property {Array.|null} [requestStickerReupload] PeerDataOperationRequestMessage requestStickerReupload + * @property {Array.|null} [requestUrlPreview] PeerDataOperationRequestMessage requestUrlPreview + */ + + /** + * Constructs a new PeerDataOperationRequestMessage. + * @memberof proto.Message + * @classdesc Represents a PeerDataOperationRequestMessage. + * @implements IPeerDataOperationRequestMessage + * @constructor + * @param {proto.Message.IPeerDataOperationRequestMessage=} [properties] Properties to set + */ + function PeerDataOperationRequestMessage(properties) { + this.requestStickerReupload = []; + this.requestUrlPreview = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PeerDataOperationRequestMessage peerDataOperationRequestType. + * @member {proto.Message.PeerDataOperationRequestType} peerDataOperationRequestType + * @memberof proto.Message.PeerDataOperationRequestMessage + * @instance + */ + PeerDataOperationRequestMessage.prototype.peerDataOperationRequestType = 0; + + /** + * PeerDataOperationRequestMessage requestStickerReupload. + * @member {Array.} requestStickerReupload + * @memberof proto.Message.PeerDataOperationRequestMessage + * @instance + */ + PeerDataOperationRequestMessage.prototype.requestStickerReupload = $util.emptyArray; + + /** + * PeerDataOperationRequestMessage requestUrlPreview. + * @member {Array.} requestUrlPreview + * @memberof proto.Message.PeerDataOperationRequestMessage + * @instance + */ + PeerDataOperationRequestMessage.prototype.requestUrlPreview = $util.emptyArray; + + /** + * Creates a new PeerDataOperationRequestMessage instance using the specified properties. + * @function create + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {proto.Message.IPeerDataOperationRequestMessage=} [properties] Properties to set + * @returns {proto.Message.PeerDataOperationRequestMessage} PeerDataOperationRequestMessage instance + */ + PeerDataOperationRequestMessage.create = function create(properties) { + return new PeerDataOperationRequestMessage(properties); + }; + + /** + * Encodes the specified PeerDataOperationRequestMessage message. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {proto.Message.IPeerDataOperationRequestMessage} message PeerDataOperationRequestMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerDataOperationRequestMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.peerDataOperationRequestType != null && Object.hasOwnProperty.call(message, "peerDataOperationRequestType")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.peerDataOperationRequestType); + if (message.requestStickerReupload != null && message.requestStickerReupload.length) + for (var i = 0; i < message.requestStickerReupload.length; ++i) + $root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.encode(message.requestStickerReupload[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.requestUrlPreview != null && message.requestUrlPreview.length) + for (var i = 0; i < message.requestUrlPreview.length; ++i) + $root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.encode(message.requestUrlPreview[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PeerDataOperationRequestMessage message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {proto.Message.IPeerDataOperationRequestMessage} message PeerDataOperationRequestMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerDataOperationRequestMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PeerDataOperationRequestMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PeerDataOperationRequestMessage} PeerDataOperationRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerDataOperationRequestMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PeerDataOperationRequestMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.peerDataOperationRequestType = reader.int32(); + break; + case 2: + if (!(message.requestStickerReupload && message.requestStickerReupload.length)) + message.requestStickerReupload = []; + message.requestStickerReupload.push($root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.decode(reader, reader.uint32())); + break; + case 3: + if (!(message.requestUrlPreview && message.requestUrlPreview.length)) + message.requestUrlPreview = []; + message.requestUrlPreview.push($root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PeerDataOperationRequestMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PeerDataOperationRequestMessage} PeerDataOperationRequestMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerDataOperationRequestMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PeerDataOperationRequestMessage message. + * @function verify + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PeerDataOperationRequestMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.peerDataOperationRequestType != null && message.hasOwnProperty("peerDataOperationRequestType")) + switch (message.peerDataOperationRequestType) { + default: + return "peerDataOperationRequestType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.requestStickerReupload != null && message.hasOwnProperty("requestStickerReupload")) { + if (!Array.isArray(message.requestStickerReupload)) + return "requestStickerReupload: array expected"; + for (var i = 0; i < message.requestStickerReupload.length; ++i) { + var error = $root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.verify(message.requestStickerReupload[i]); + if (error) + return "requestStickerReupload." + error; + } + } + if (message.requestUrlPreview != null && message.hasOwnProperty("requestUrlPreview")) { + if (!Array.isArray(message.requestUrlPreview)) + return "requestUrlPreview: array expected"; + for (var i = 0; i < message.requestUrlPreview.length; ++i) { + var error = $root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.verify(message.requestUrlPreview[i]); + if (error) + return "requestUrlPreview." + error; + } + } + return null; + }; + + /** + * Creates a PeerDataOperationRequestMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PeerDataOperationRequestMessage} PeerDataOperationRequestMessage + */ + PeerDataOperationRequestMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PeerDataOperationRequestMessage) + return object; + var message = new $root.proto.Message.PeerDataOperationRequestMessage(); + switch (object.peerDataOperationRequestType) { + case "UPLOAD_STICKER": + case 0: + message.peerDataOperationRequestType = 0; + break; + case "SEND_RECENT_STICKER_BOOTSTRAP": + case 1: + message.peerDataOperationRequestType = 1; + break; + case "GENERATE_LINK_PREVIEW": + case 2: + message.peerDataOperationRequestType = 2; + break; + } + if (object.requestStickerReupload) { + if (!Array.isArray(object.requestStickerReupload)) + throw TypeError(".proto.Message.PeerDataOperationRequestMessage.requestStickerReupload: array expected"); + message.requestStickerReupload = []; + for (var i = 0; i < object.requestStickerReupload.length; ++i) { + if (typeof object.requestStickerReupload[i] !== "object") + throw TypeError(".proto.Message.PeerDataOperationRequestMessage.requestStickerReupload: object expected"); + message.requestStickerReupload[i] = $root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.fromObject(object.requestStickerReupload[i]); + } + } + if (object.requestUrlPreview) { + if (!Array.isArray(object.requestUrlPreview)) + throw TypeError(".proto.Message.PeerDataOperationRequestMessage.requestUrlPreview: array expected"); + message.requestUrlPreview = []; + for (var i = 0; i < object.requestUrlPreview.length; ++i) { + if (typeof object.requestUrlPreview[i] !== "object") + throw TypeError(".proto.Message.PeerDataOperationRequestMessage.requestUrlPreview: object expected"); + message.requestUrlPreview[i] = $root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.fromObject(object.requestUrlPreview[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a PeerDataOperationRequestMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PeerDataOperationRequestMessage + * @static + * @param {proto.Message.PeerDataOperationRequestMessage} message PeerDataOperationRequestMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PeerDataOperationRequestMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.requestStickerReupload = []; + object.requestUrlPreview = []; + } + if (options.defaults) + object.peerDataOperationRequestType = options.enums === String ? "UPLOAD_STICKER" : 0; + if (message.peerDataOperationRequestType != null && message.hasOwnProperty("peerDataOperationRequestType")) + object.peerDataOperationRequestType = options.enums === String ? $root.proto.Message.PeerDataOperationRequestType[message.peerDataOperationRequestType] : message.peerDataOperationRequestType; + if (message.requestStickerReupload && message.requestStickerReupload.length) { + object.requestStickerReupload = []; + for (var j = 0; j < message.requestStickerReupload.length; ++j) + object.requestStickerReupload[j] = $root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.toObject(message.requestStickerReupload[j], options); + } + if (message.requestUrlPreview && message.requestUrlPreview.length) { + object.requestUrlPreview = []; + for (var j = 0; j < message.requestUrlPreview.length; ++j) + object.requestUrlPreview[j] = $root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.toObject(message.requestUrlPreview[j], options); + } + return object; + }; + + /** + * Converts this PeerDataOperationRequestMessage to JSON. + * @function toJSON + * @memberof proto.Message.PeerDataOperationRequestMessage + * @instance + * @returns {Object.} JSON object + */ + PeerDataOperationRequestMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PeerDataOperationRequestMessage.RequestStickerReupload = (function() { + + /** + * Properties of a RequestStickerReupload. + * @memberof proto.Message.PeerDataOperationRequestMessage + * @interface IRequestStickerReupload + * @property {string|null} [fileSha256] RequestStickerReupload fileSha256 + */ + + /** + * Constructs a new RequestStickerReupload. + * @memberof proto.Message.PeerDataOperationRequestMessage + * @classdesc Represents a RequestStickerReupload. + * @implements IRequestStickerReupload + * @constructor + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload=} [properties] Properties to set + */ + function RequestStickerReupload(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RequestStickerReupload fileSha256. + * @member {string} fileSha256 + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @instance + */ + RequestStickerReupload.prototype.fileSha256 = ""; + + /** + * Creates a new RequestStickerReupload instance using the specified properties. + * @function create + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload=} [properties] Properties to set + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload} RequestStickerReupload instance + */ + RequestStickerReupload.create = function create(properties) { + return new RequestStickerReupload(properties); + }; + + /** + * Encodes the specified RequestStickerReupload message. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.verify|verify} messages. + * @function encode + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload} message RequestStickerReupload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestStickerReupload.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.fileSha256); + return writer; + }; + + /** + * Encodes the specified RequestStickerReupload message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestStickerReupload} message RequestStickerReupload message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestStickerReupload.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RequestStickerReupload message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload} RequestStickerReupload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestStickerReupload.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fileSha256 = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RequestStickerReupload message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload} RequestStickerReupload + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestStickerReupload.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RequestStickerReupload message. + * @function verify + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RequestStickerReupload.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!$util.isString(message.fileSha256)) + return "fileSha256: string expected"; + return null; + }; + + /** + * Creates a RequestStickerReupload message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload} RequestStickerReupload + */ + RequestStickerReupload.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload) + return object; + var message = new $root.proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload(); + if (object.fileSha256 != null) + message.fileSha256 = String(object.fileSha256); + return message; + }; + + /** + * Creates a plain object from a RequestStickerReupload message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload} message RequestStickerReupload + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RequestStickerReupload.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.fileSha256 = ""; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = message.fileSha256; + return object; + }; + + /** + * Converts this RequestStickerReupload to JSON. + * @function toJSON + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestStickerReupload + * @instance + * @returns {Object.} JSON object + */ + RequestStickerReupload.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RequestStickerReupload; + })(); + + PeerDataOperationRequestMessage.RequestUrlPreview = (function() { + + /** + * Properties of a RequestUrlPreview. + * @memberof proto.Message.PeerDataOperationRequestMessage + * @interface IRequestUrlPreview + * @property {string|null} [url] RequestUrlPreview url + */ + + /** + * Constructs a new RequestUrlPreview. + * @memberof proto.Message.PeerDataOperationRequestMessage + * @classdesc Represents a RequestUrlPreview. + * @implements IRequestUrlPreview + * @constructor + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview=} [properties] Properties to set + */ + function RequestUrlPreview(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RequestUrlPreview url. + * @member {string} url + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @instance + */ + RequestUrlPreview.prototype.url = ""; + + /** + * Creates a new RequestUrlPreview instance using the specified properties. + * @function create + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview=} [properties] Properties to set + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview} RequestUrlPreview instance + */ + RequestUrlPreview.create = function create(properties) { + return new RequestUrlPreview(properties); + }; + + /** + * Encodes the specified RequestUrlPreview message. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.verify|verify} messages. + * @function encode + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview} message RequestUrlPreview message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestUrlPreview.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + return writer; + }; + + /** + * Encodes the specified RequestUrlPreview message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.IRequestUrlPreview} message RequestUrlPreview message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestUrlPreview.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RequestUrlPreview message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview} RequestUrlPreview + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestUrlPreview.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RequestUrlPreview message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview} RequestUrlPreview + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestUrlPreview.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RequestUrlPreview message. + * @function verify + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RequestUrlPreview.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + return null; + }; + + /** + * Creates a RequestUrlPreview message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview} RequestUrlPreview + */ + RequestUrlPreview.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview) + return object; + var message = new $root.proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview(); + if (object.url != null) + message.url = String(object.url); + return message; + }; + + /** + * Creates a plain object from a RequestUrlPreview message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @static + * @param {proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview} message RequestUrlPreview + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RequestUrlPreview.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.url = ""; + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + return object; + }; + + /** + * Converts this RequestUrlPreview to JSON. + * @function toJSON + * @memberof proto.Message.PeerDataOperationRequestMessage.RequestUrlPreview + * @instance + * @returns {Object.} JSON object + */ + RequestUrlPreview.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RequestUrlPreview; + })(); + + return PeerDataOperationRequestMessage; + })(); + + Message.PeerDataOperationRequestResponseMessage = (function() { + + /** + * Properties of a PeerDataOperationRequestResponseMessage. + * @memberof proto.Message + * @interface IPeerDataOperationRequestResponseMessage + * @property {proto.Message.PeerDataOperationRequestType|null} [peerDataOperationRequestType] PeerDataOperationRequestResponseMessage peerDataOperationRequestType + * @property {string|null} [stanzaId] PeerDataOperationRequestResponseMessage stanzaId + * @property {Array.|null} [peerDataOperationResult] PeerDataOperationRequestResponseMessage peerDataOperationResult + */ + + /** + * Constructs a new PeerDataOperationRequestResponseMessage. + * @memberof proto.Message + * @classdesc Represents a PeerDataOperationRequestResponseMessage. + * @implements IPeerDataOperationRequestResponseMessage + * @constructor + * @param {proto.Message.IPeerDataOperationRequestResponseMessage=} [properties] Properties to set + */ + function PeerDataOperationRequestResponseMessage(properties) { + this.peerDataOperationResult = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PeerDataOperationRequestResponseMessage peerDataOperationRequestType. + * @member {proto.Message.PeerDataOperationRequestType} peerDataOperationRequestType + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @instance + */ + PeerDataOperationRequestResponseMessage.prototype.peerDataOperationRequestType = 0; + + /** + * PeerDataOperationRequestResponseMessage stanzaId. + * @member {string} stanzaId + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @instance + */ + PeerDataOperationRequestResponseMessage.prototype.stanzaId = ""; + + /** + * PeerDataOperationRequestResponseMessage peerDataOperationResult. + * @member {Array.} peerDataOperationResult + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @instance + */ + PeerDataOperationRequestResponseMessage.prototype.peerDataOperationResult = $util.emptyArray; + + /** + * Creates a new PeerDataOperationRequestResponseMessage instance using the specified properties. + * @function create + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {proto.Message.IPeerDataOperationRequestResponseMessage=} [properties] Properties to set + * @returns {proto.Message.PeerDataOperationRequestResponseMessage} PeerDataOperationRequestResponseMessage instance + */ + PeerDataOperationRequestResponseMessage.create = function create(properties) { + return new PeerDataOperationRequestResponseMessage(properties); + }; + + /** + * Encodes the specified PeerDataOperationRequestResponseMessage message. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {proto.Message.IPeerDataOperationRequestResponseMessage} message PeerDataOperationRequestResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerDataOperationRequestResponseMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.peerDataOperationRequestType != null && Object.hasOwnProperty.call(message, "peerDataOperationRequestType")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.peerDataOperationRequestType); + if (message.stanzaId != null && Object.hasOwnProperty.call(message, "stanzaId")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.stanzaId); + if (message.peerDataOperationResult != null && message.peerDataOperationResult.length) + for (var i = 0; i < message.peerDataOperationResult.length; ++i) + $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.encode(message.peerDataOperationResult[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PeerDataOperationRequestResponseMessage message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {proto.Message.IPeerDataOperationRequestResponseMessage} message PeerDataOperationRequestResponseMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerDataOperationRequestResponseMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PeerDataOperationRequestResponseMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PeerDataOperationRequestResponseMessage} PeerDataOperationRequestResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerDataOperationRequestResponseMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PeerDataOperationRequestResponseMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.peerDataOperationRequestType = reader.int32(); + break; + case 2: + message.stanzaId = reader.string(); + break; + case 3: + if (!(message.peerDataOperationResult && message.peerDataOperationResult.length)) + message.peerDataOperationResult = []; + message.peerDataOperationResult.push($root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PeerDataOperationRequestResponseMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PeerDataOperationRequestResponseMessage} PeerDataOperationRequestResponseMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerDataOperationRequestResponseMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PeerDataOperationRequestResponseMessage message. + * @function verify + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PeerDataOperationRequestResponseMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.peerDataOperationRequestType != null && message.hasOwnProperty("peerDataOperationRequestType")) + switch (message.peerDataOperationRequestType) { + default: + return "peerDataOperationRequestType: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + if (!$util.isString(message.stanzaId)) + return "stanzaId: string expected"; + if (message.peerDataOperationResult != null && message.hasOwnProperty("peerDataOperationResult")) { + if (!Array.isArray(message.peerDataOperationResult)) + return "peerDataOperationResult: array expected"; + for (var i = 0; i < message.peerDataOperationResult.length; ++i) { + var error = $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.verify(message.peerDataOperationResult[i]); + if (error) + return "peerDataOperationResult." + error; + } + } + return null; + }; + + /** + * Creates a PeerDataOperationRequestResponseMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PeerDataOperationRequestResponseMessage} PeerDataOperationRequestResponseMessage + */ + PeerDataOperationRequestResponseMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PeerDataOperationRequestResponseMessage) + return object; + var message = new $root.proto.Message.PeerDataOperationRequestResponseMessage(); + switch (object.peerDataOperationRequestType) { + case "UPLOAD_STICKER": + case 0: + message.peerDataOperationRequestType = 0; + break; + case "SEND_RECENT_STICKER_BOOTSTRAP": + case 1: + message.peerDataOperationRequestType = 1; + break; + case "GENERATE_LINK_PREVIEW": + case 2: + message.peerDataOperationRequestType = 2; + break; + } + if (object.stanzaId != null) + message.stanzaId = String(object.stanzaId); + if (object.peerDataOperationResult) { + if (!Array.isArray(object.peerDataOperationResult)) + throw TypeError(".proto.Message.PeerDataOperationRequestResponseMessage.peerDataOperationResult: array expected"); + message.peerDataOperationResult = []; + for (var i = 0; i < object.peerDataOperationResult.length; ++i) { + if (typeof object.peerDataOperationResult[i] !== "object") + throw TypeError(".proto.Message.PeerDataOperationRequestResponseMessage.peerDataOperationResult: object expected"); + message.peerDataOperationResult[i] = $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.fromObject(object.peerDataOperationResult[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a PeerDataOperationRequestResponseMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage} message PeerDataOperationRequestResponseMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PeerDataOperationRequestResponseMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.peerDataOperationResult = []; + if (options.defaults) { + object.peerDataOperationRequestType = options.enums === String ? "UPLOAD_STICKER" : 0; + object.stanzaId = ""; + } + if (message.peerDataOperationRequestType != null && message.hasOwnProperty("peerDataOperationRequestType")) + object.peerDataOperationRequestType = options.enums === String ? $root.proto.Message.PeerDataOperationRequestType[message.peerDataOperationRequestType] : message.peerDataOperationRequestType; + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + object.stanzaId = message.stanzaId; + if (message.peerDataOperationResult && message.peerDataOperationResult.length) { + object.peerDataOperationResult = []; + for (var j = 0; j < message.peerDataOperationResult.length; ++j) + object.peerDataOperationResult[j] = $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.toObject(message.peerDataOperationResult[j], options); + } + return object; + }; + + /** + * Converts this PeerDataOperationRequestResponseMessage to JSON. + * @function toJSON + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @instance + * @returns {Object.} JSON object + */ + PeerDataOperationRequestResponseMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PeerDataOperationRequestResponseMessage.PeerDataOperationResult = (function() { + + /** + * Properties of a PeerDataOperationResult. + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @interface IPeerDataOperationResult + * @property {proto.MediaRetryNotification.ResultType|null} [mediaUploadResult] PeerDataOperationResult mediaUploadResult + * @property {proto.Message.IStickerMessage|null} [stickerMessage] PeerDataOperationResult stickerMessage + * @property {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse|null} [linkPreviewResponse] PeerDataOperationResult linkPreviewResponse + */ + + /** + * Constructs a new PeerDataOperationResult. + * @memberof proto.Message.PeerDataOperationRequestResponseMessage + * @classdesc Represents a PeerDataOperationResult. + * @implements IPeerDataOperationResult + * @constructor + * @param {proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult=} [properties] Properties to set + */ + function PeerDataOperationResult(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PeerDataOperationResult mediaUploadResult. + * @member {proto.MediaRetryNotification.ResultType} mediaUploadResult + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @instance + */ + PeerDataOperationResult.prototype.mediaUploadResult = 0; + + /** + * PeerDataOperationResult stickerMessage. + * @member {proto.Message.IStickerMessage|null|undefined} stickerMessage + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @instance + */ + PeerDataOperationResult.prototype.stickerMessage = null; + + /** + * PeerDataOperationResult linkPreviewResponse. + * @member {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse|null|undefined} linkPreviewResponse + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @instance + */ + PeerDataOperationResult.prototype.linkPreviewResponse = null; + + /** + * Creates a new PeerDataOperationResult instance using the specified properties. + * @function create + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult=} [properties] Properties to set + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult} PeerDataOperationResult instance + */ + PeerDataOperationResult.create = function create(properties) { + return new PeerDataOperationResult(properties); + }; + + /** + * Encodes the specified PeerDataOperationResult message. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.verify|verify} messages. + * @function encode + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult} message PeerDataOperationResult message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerDataOperationResult.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.mediaUploadResult != null && Object.hasOwnProperty.call(message, "mediaUploadResult")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.mediaUploadResult); + if (message.stickerMessage != null && Object.hasOwnProperty.call(message, "stickerMessage")) + $root.proto.Message.StickerMessage.encode(message.stickerMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.linkPreviewResponse != null && Object.hasOwnProperty.call(message, "linkPreviewResponse")) + $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.encode(message.linkPreviewResponse, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PeerDataOperationResult message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.IPeerDataOperationResult} message PeerDataOperationResult message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PeerDataOperationResult.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PeerDataOperationResult message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult} PeerDataOperationResult + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerDataOperationResult.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.mediaUploadResult = reader.int32(); + break; + case 2: + message.stickerMessage = $root.proto.Message.StickerMessage.decode(reader, reader.uint32()); + break; + case 3: + message.linkPreviewResponse = $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PeerDataOperationResult message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult} PeerDataOperationResult + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PeerDataOperationResult.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PeerDataOperationResult message. + * @function verify + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PeerDataOperationResult.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.mediaUploadResult != null && message.hasOwnProperty("mediaUploadResult")) + switch (message.mediaUploadResult) { + default: + return "mediaUploadResult: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.stickerMessage != null && message.hasOwnProperty("stickerMessage")) { + var error = $root.proto.Message.StickerMessage.verify(message.stickerMessage); + if (error) + return "stickerMessage." + error; + } + if (message.linkPreviewResponse != null && message.hasOwnProperty("linkPreviewResponse")) { + var error = $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.verify(message.linkPreviewResponse); + if (error) + return "linkPreviewResponse." + error; + } + return null; + }; + + /** + * Creates a PeerDataOperationResult message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult} PeerDataOperationResult + */ + PeerDataOperationResult.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult) + return object; + var message = new $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult(); + switch (object.mediaUploadResult) { + case "GENERAL_ERROR": + case 0: + message.mediaUploadResult = 0; + break; + case "SUCCESS": + case 1: + message.mediaUploadResult = 1; + break; + case "NOT_FOUND": + case 2: + message.mediaUploadResult = 2; + break; + case "DECRYPTION_ERROR": + case 3: + message.mediaUploadResult = 3; + break; + } + if (object.stickerMessage != null) { + if (typeof object.stickerMessage !== "object") + throw TypeError(".proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.stickerMessage: object expected"); + message.stickerMessage = $root.proto.Message.StickerMessage.fromObject(object.stickerMessage); + } + if (object.linkPreviewResponse != null) { + if (typeof object.linkPreviewResponse !== "object") + throw TypeError(".proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.linkPreviewResponse: object expected"); + message.linkPreviewResponse = $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.fromObject(object.linkPreviewResponse); + } + return message; + }; + + /** + * Creates a plain object from a PeerDataOperationResult message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult} message PeerDataOperationResult + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PeerDataOperationResult.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.mediaUploadResult = options.enums === String ? "GENERAL_ERROR" : 0; + object.stickerMessage = null; + object.linkPreviewResponse = null; + } + if (message.mediaUploadResult != null && message.hasOwnProperty("mediaUploadResult")) + object.mediaUploadResult = options.enums === String ? $root.proto.MediaRetryNotification.ResultType[message.mediaUploadResult] : message.mediaUploadResult; + if (message.stickerMessage != null && message.hasOwnProperty("stickerMessage")) + object.stickerMessage = $root.proto.Message.StickerMessage.toObject(message.stickerMessage, options); + if (message.linkPreviewResponse != null && message.hasOwnProperty("linkPreviewResponse")) + object.linkPreviewResponse = $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.toObject(message.linkPreviewResponse, options); + return object; + }; + + /** + * Converts this PeerDataOperationResult to JSON. + * @function toJSON + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @instance + * @returns {Object.} JSON object + */ + PeerDataOperationResult.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PeerDataOperationResult.LinkPreviewResponse = (function() { + + /** + * Properties of a LinkPreviewResponse. + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @interface ILinkPreviewResponse + * @property {string|null} [url] LinkPreviewResponse url + * @property {string|null} [title] LinkPreviewResponse title + * @property {string|null} [description] LinkPreviewResponse description + * @property {Uint8Array|null} [thumbData] LinkPreviewResponse thumbData + * @property {string|null} [canonicalUrl] LinkPreviewResponse canonicalUrl + * @property {string|null} [matchText] LinkPreviewResponse matchText + * @property {string|null} [previewType] LinkPreviewResponse previewType + */ + + /** + * Constructs a new LinkPreviewResponse. + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult + * @classdesc Represents a LinkPreviewResponse. + * @implements ILinkPreviewResponse + * @constructor + * @param {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse=} [properties] Properties to set + */ + function LinkPreviewResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LinkPreviewResponse url. + * @member {string} url + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + */ + LinkPreviewResponse.prototype.url = ""; + + /** + * LinkPreviewResponse title. + * @member {string} title + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + */ + LinkPreviewResponse.prototype.title = ""; + + /** + * LinkPreviewResponse description. + * @member {string} description + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + */ + LinkPreviewResponse.prototype.description = ""; + + /** + * LinkPreviewResponse thumbData. + * @member {Uint8Array} thumbData + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + */ + LinkPreviewResponse.prototype.thumbData = $util.newBuffer([]); + + /** + * LinkPreviewResponse canonicalUrl. + * @member {string} canonicalUrl + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + */ + LinkPreviewResponse.prototype.canonicalUrl = ""; + + /** + * LinkPreviewResponse matchText. + * @member {string} matchText + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + */ + LinkPreviewResponse.prototype.matchText = ""; + + /** + * LinkPreviewResponse previewType. + * @member {string} previewType + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + */ + LinkPreviewResponse.prototype.previewType = ""; + + /** + * Creates a new LinkPreviewResponse instance using the specified properties. + * @function create + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse=} [properties] Properties to set + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse} LinkPreviewResponse instance + */ + LinkPreviewResponse.create = function create(properties) { + return new LinkPreviewResponse(properties); + }; + + /** + * Encodes the specified LinkPreviewResponse message. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.verify|verify} messages. + * @function encode + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse} message LinkPreviewResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LinkPreviewResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.title); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.description); + if (message.thumbData != null && Object.hasOwnProperty.call(message, "thumbData")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.thumbData); + if (message.canonicalUrl != null && Object.hasOwnProperty.call(message, "canonicalUrl")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.canonicalUrl); + if (message.matchText != null && Object.hasOwnProperty.call(message, "matchText")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.matchText); + if (message.previewType != null && Object.hasOwnProperty.call(message, "previewType")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.previewType); + return writer; + }; + + /** + * Encodes the specified LinkPreviewResponse message, length delimited. Does not implicitly {@link proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.ILinkPreviewResponse} message LinkPreviewResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LinkPreviewResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LinkPreviewResponse message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse} LinkPreviewResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LinkPreviewResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.title = reader.string(); + break; + case 3: + message.description = reader.string(); + break; + case 4: + message.thumbData = reader.bytes(); + break; + case 5: + message.canonicalUrl = reader.string(); + break; + case 6: + message.matchText = reader.string(); + break; + case 7: + message.previewType = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LinkPreviewResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse} LinkPreviewResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LinkPreviewResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LinkPreviewResponse message. + * @function verify + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LinkPreviewResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.thumbData != null && message.hasOwnProperty("thumbData")) + if (!(message.thumbData && typeof message.thumbData.length === "number" || $util.isString(message.thumbData))) + return "thumbData: buffer expected"; + if (message.canonicalUrl != null && message.hasOwnProperty("canonicalUrl")) + if (!$util.isString(message.canonicalUrl)) + return "canonicalUrl: string expected"; + if (message.matchText != null && message.hasOwnProperty("matchText")) + if (!$util.isString(message.matchText)) + return "matchText: string expected"; + if (message.previewType != null && message.hasOwnProperty("previewType")) + if (!$util.isString(message.previewType)) + return "previewType: string expected"; + return null; + }; + + /** + * Creates a LinkPreviewResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse} LinkPreviewResponse + */ + LinkPreviewResponse.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse) + return object; + var message = new $root.proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse(); + if (object.url != null) + message.url = String(object.url); + if (object.title != null) + message.title = String(object.title); + if (object.description != null) + message.description = String(object.description); + if (object.thumbData != null) + if (typeof object.thumbData === "string") + $util.base64.decode(object.thumbData, message.thumbData = $util.newBuffer($util.base64.length(object.thumbData)), 0); + else if (object.thumbData.length) + message.thumbData = object.thumbData; + if (object.canonicalUrl != null) + message.canonicalUrl = String(object.canonicalUrl); + if (object.matchText != null) + message.matchText = String(object.matchText); + if (object.previewType != null) + message.previewType = String(object.previewType); + return message; + }; + + /** + * Creates a plain object from a LinkPreviewResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @static + * @param {proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse} message LinkPreviewResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LinkPreviewResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = ""; + object.title = ""; + object.description = ""; + if (options.bytes === String) + object.thumbData = ""; + else { + object.thumbData = []; + if (options.bytes !== Array) + object.thumbData = $util.newBuffer(object.thumbData); + } + object.canonicalUrl = ""; + object.matchText = ""; + object.previewType = ""; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + if (message.thumbData != null && message.hasOwnProperty("thumbData")) + object.thumbData = options.bytes === String ? $util.base64.encode(message.thumbData, 0, message.thumbData.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbData) : message.thumbData; + if (message.canonicalUrl != null && message.hasOwnProperty("canonicalUrl")) + object.canonicalUrl = message.canonicalUrl; + if (message.matchText != null && message.hasOwnProperty("matchText")) + object.matchText = message.matchText; + if (message.previewType != null && message.hasOwnProperty("previewType")) + object.previewType = message.previewType; + return object; + }; + + /** + * Converts this LinkPreviewResponse to JSON. + * @function toJSON + * @memberof proto.Message.PeerDataOperationRequestResponseMessage.PeerDataOperationResult.LinkPreviewResponse + * @instance + * @returns {Object.} JSON object + */ + LinkPreviewResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return LinkPreviewResponse; + })(); + + return PeerDataOperationResult; + })(); + + return PeerDataOperationRequestResponseMessage; + })(); + + /** + * PeerDataOperationRequestType enum. + * @name proto.Message.PeerDataOperationRequestType + * @enum {number} + * @property {number} UPLOAD_STICKER=0 UPLOAD_STICKER value + * @property {number} SEND_RECENT_STICKER_BOOTSTRAP=1 SEND_RECENT_STICKER_BOOTSTRAP value + * @property {number} GENERATE_LINK_PREVIEW=2 GENERATE_LINK_PREVIEW value + */ + Message.PeerDataOperationRequestType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UPLOAD_STICKER"] = 0; + values[valuesById[1] = "SEND_RECENT_STICKER_BOOTSTRAP"] = 1; + values[valuesById[2] = "GENERATE_LINK_PREVIEW"] = 2; + return values; + })(); + + Message.PollCreationMessage = (function() { + + /** + * Properties of a PollCreationMessage. + * @memberof proto.Message + * @interface IPollCreationMessage + * @property {Uint8Array|null} [encKey] PollCreationMessage encKey + * @property {string|null} [name] PollCreationMessage name + * @property {Array.|null} [options] PollCreationMessage options + * @property {number|null} [selectableOptionsCount] PollCreationMessage selectableOptionsCount + * @property {proto.IContextInfo|null} [contextInfo] PollCreationMessage contextInfo + */ + + /** + * Constructs a new PollCreationMessage. + * @memberof proto.Message + * @classdesc Represents a PollCreationMessage. + * @implements IPollCreationMessage + * @constructor + * @param {proto.Message.IPollCreationMessage=} [properties] Properties to set + */ + function PollCreationMessage(properties) { + this.options = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollCreationMessage encKey. + * @member {Uint8Array} encKey + * @memberof proto.Message.PollCreationMessage + * @instance + */ + PollCreationMessage.prototype.encKey = $util.newBuffer([]); + + /** + * PollCreationMessage name. + * @member {string} name + * @memberof proto.Message.PollCreationMessage + * @instance + */ + PollCreationMessage.prototype.name = ""; + + /** + * PollCreationMessage options. + * @member {Array.} options + * @memberof proto.Message.PollCreationMessage + * @instance + */ + PollCreationMessage.prototype.options = $util.emptyArray; + + /** + * PollCreationMessage selectableOptionsCount. + * @member {number} selectableOptionsCount + * @memberof proto.Message.PollCreationMessage + * @instance + */ + PollCreationMessage.prototype.selectableOptionsCount = 0; + + /** + * PollCreationMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.PollCreationMessage + * @instance + */ + PollCreationMessage.prototype.contextInfo = null; + + /** + * Creates a new PollCreationMessage instance using the specified properties. + * @function create + * @memberof proto.Message.PollCreationMessage + * @static + * @param {proto.Message.IPollCreationMessage=} [properties] Properties to set + * @returns {proto.Message.PollCreationMessage} PollCreationMessage instance + */ + PollCreationMessage.create = function create(properties) { + return new PollCreationMessage(properties); + }; + + /** + * Encodes the specified PollCreationMessage message. Does not implicitly {@link proto.Message.PollCreationMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.PollCreationMessage + * @static + * @param {proto.Message.IPollCreationMessage} message PollCreationMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollCreationMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.encKey != null && Object.hasOwnProperty.call(message, "encKey")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.encKey); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.name); + if (message.options != null && message.options.length) + for (var i = 0; i < message.options.length; ++i) + $root.proto.Message.PollCreationMessage.Option.encode(message.options[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.selectableOptionsCount != null && Object.hasOwnProperty.call(message, "selectableOptionsCount")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.selectableOptionsCount); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PollCreationMessage message, length delimited. Does not implicitly {@link proto.Message.PollCreationMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PollCreationMessage + * @static + * @param {proto.Message.IPollCreationMessage} message PollCreationMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollCreationMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollCreationMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PollCreationMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PollCreationMessage} PollCreationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollCreationMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PollCreationMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.encKey = reader.bytes(); + break; + case 2: + message.name = reader.string(); + break; + case 3: + if (!(message.options && message.options.length)) + message.options = []; + message.options.push($root.proto.Message.PollCreationMessage.Option.decode(reader, reader.uint32())); + break; + case 4: + message.selectableOptionsCount = reader.uint32(); + break; + case 5: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollCreationMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PollCreationMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PollCreationMessage} PollCreationMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollCreationMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollCreationMessage message. + * @function verify + * @memberof proto.Message.PollCreationMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollCreationMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.encKey != null && message.hasOwnProperty("encKey")) + if (!(message.encKey && typeof message.encKey.length === "number" || $util.isString(message.encKey))) + return "encKey: buffer expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.options != null && message.hasOwnProperty("options")) { + if (!Array.isArray(message.options)) + return "options: array expected"; + for (var i = 0; i < message.options.length; ++i) { + var error = $root.proto.Message.PollCreationMessage.Option.verify(message.options[i]); + if (error) + return "options." + error; + } + } + if (message.selectableOptionsCount != null && message.hasOwnProperty("selectableOptionsCount")) + if (!$util.isInteger(message.selectableOptionsCount)) + return "selectableOptionsCount: integer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a PollCreationMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PollCreationMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PollCreationMessage} PollCreationMessage + */ + PollCreationMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PollCreationMessage) + return object; + var message = new $root.proto.Message.PollCreationMessage(); + if (object.encKey != null) + if (typeof object.encKey === "string") + $util.base64.decode(object.encKey, message.encKey = $util.newBuffer($util.base64.length(object.encKey)), 0); + else if (object.encKey.length) + message.encKey = object.encKey; + if (object.name != null) + message.name = String(object.name); + if (object.options) { + if (!Array.isArray(object.options)) + throw TypeError(".proto.Message.PollCreationMessage.options: array expected"); + message.options = []; + for (var i = 0; i < object.options.length; ++i) { + if (typeof object.options[i] !== "object") + throw TypeError(".proto.Message.PollCreationMessage.options: object expected"); + message.options[i] = $root.proto.Message.PollCreationMessage.Option.fromObject(object.options[i]); + } + } + if (object.selectableOptionsCount != null) + message.selectableOptionsCount = object.selectableOptionsCount >>> 0; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.PollCreationMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a PollCreationMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PollCreationMessage + * @static + * @param {proto.Message.PollCreationMessage} message PollCreationMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollCreationMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.options = []; + if (options.defaults) { + if (options.bytes === String) + object.encKey = ""; + else { + object.encKey = []; + if (options.bytes !== Array) + object.encKey = $util.newBuffer(object.encKey); + } + object.name = ""; + object.selectableOptionsCount = 0; + object.contextInfo = null; + } + if (message.encKey != null && message.hasOwnProperty("encKey")) + object.encKey = options.bytes === String ? $util.base64.encode(message.encKey, 0, message.encKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.encKey) : message.encKey; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.options && message.options.length) { + object.options = []; + for (var j = 0; j < message.options.length; ++j) + object.options[j] = $root.proto.Message.PollCreationMessage.Option.toObject(message.options[j], options); + } + if (message.selectableOptionsCount != null && message.hasOwnProperty("selectableOptionsCount")) + object.selectableOptionsCount = message.selectableOptionsCount; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this PollCreationMessage to JSON. + * @function toJSON + * @memberof proto.Message.PollCreationMessage + * @instance + * @returns {Object.} JSON object + */ + PollCreationMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PollCreationMessage.Option = (function() { + + /** + * Properties of an Option. + * @memberof proto.Message.PollCreationMessage + * @interface IOption + * @property {string|null} [optionName] Option optionName + */ + + /** + * Constructs a new Option. + * @memberof proto.Message.PollCreationMessage + * @classdesc Represents an Option. + * @implements IOption + * @constructor + * @param {proto.Message.PollCreationMessage.IOption=} [properties] Properties to set + */ + function Option(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Option optionName. + * @member {string} optionName + * @memberof proto.Message.PollCreationMessage.Option + * @instance + */ + Option.prototype.optionName = ""; + + /** + * Creates a new Option instance using the specified properties. + * @function create + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {proto.Message.PollCreationMessage.IOption=} [properties] Properties to set + * @returns {proto.Message.PollCreationMessage.Option} Option instance + */ + Option.create = function create(properties) { + return new Option(properties); + }; + + /** + * Encodes the specified Option message. Does not implicitly {@link proto.Message.PollCreationMessage.Option.verify|verify} messages. + * @function encode + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {proto.Message.PollCreationMessage.IOption} message Option message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Option.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.optionName != null && Object.hasOwnProperty.call(message, "optionName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.optionName); + return writer; + }; + + /** + * Encodes the specified Option message, length delimited. Does not implicitly {@link proto.Message.PollCreationMessage.Option.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {proto.Message.PollCreationMessage.IOption} message Option message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Option.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an Option message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PollCreationMessage.Option} Option + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Option.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PollCreationMessage.Option(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.optionName = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an Option message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PollCreationMessage.Option} Option + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Option.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an Option message. + * @function verify + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Option.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.optionName != null && message.hasOwnProperty("optionName")) + if (!$util.isString(message.optionName)) + return "optionName: string expected"; + return null; + }; + + /** + * Creates an Option message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PollCreationMessage.Option} Option + */ + Option.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PollCreationMessage.Option) + return object; + var message = new $root.proto.Message.PollCreationMessage.Option(); + if (object.optionName != null) + message.optionName = String(object.optionName); + return message; + }; + + /** + * Creates a plain object from an Option message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PollCreationMessage.Option + * @static + * @param {proto.Message.PollCreationMessage.Option} message Option + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Option.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.optionName = ""; + if (message.optionName != null && message.hasOwnProperty("optionName")) + object.optionName = message.optionName; + return object; + }; + + /** + * Converts this Option to JSON. + * @function toJSON + * @memberof proto.Message.PollCreationMessage.Option + * @instance + * @returns {Object.} JSON object + */ + Option.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Option; + })(); + + return PollCreationMessage; + })(); + + Message.PollEncValue = (function() { + + /** + * Properties of a PollEncValue. + * @memberof proto.Message + * @interface IPollEncValue + * @property {Uint8Array|null} [encPayload] PollEncValue encPayload + * @property {Uint8Array|null} [encIv] PollEncValue encIv + */ + + /** + * Constructs a new PollEncValue. + * @memberof proto.Message + * @classdesc Represents a PollEncValue. + * @implements IPollEncValue + * @constructor + * @param {proto.Message.IPollEncValue=} [properties] Properties to set + */ + function PollEncValue(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollEncValue encPayload. + * @member {Uint8Array} encPayload + * @memberof proto.Message.PollEncValue + * @instance + */ + PollEncValue.prototype.encPayload = $util.newBuffer([]); + + /** + * PollEncValue encIv. + * @member {Uint8Array} encIv + * @memberof proto.Message.PollEncValue + * @instance + */ + PollEncValue.prototype.encIv = $util.newBuffer([]); + + /** + * Creates a new PollEncValue instance using the specified properties. + * @function create + * @memberof proto.Message.PollEncValue + * @static + * @param {proto.Message.IPollEncValue=} [properties] Properties to set + * @returns {proto.Message.PollEncValue} PollEncValue instance + */ + PollEncValue.create = function create(properties) { + return new PollEncValue(properties); + }; + + /** + * Encodes the specified PollEncValue message. Does not implicitly {@link proto.Message.PollEncValue.verify|verify} messages. + * @function encode + * @memberof proto.Message.PollEncValue + * @static + * @param {proto.Message.IPollEncValue} message PollEncValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollEncValue.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.encPayload != null && Object.hasOwnProperty.call(message, "encPayload")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.encPayload); + if (message.encIv != null && Object.hasOwnProperty.call(message, "encIv")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.encIv); + return writer; + }; + + /** + * Encodes the specified PollEncValue message, length delimited. Does not implicitly {@link proto.Message.PollEncValue.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PollEncValue + * @static + * @param {proto.Message.IPollEncValue} message PollEncValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollEncValue.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollEncValue message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PollEncValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PollEncValue} PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollEncValue.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PollEncValue(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.encPayload = reader.bytes(); + break; + case 2: + message.encIv = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollEncValue message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PollEncValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PollEncValue} PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollEncValue.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollEncValue message. + * @function verify + * @memberof proto.Message.PollEncValue + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollEncValue.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.encPayload != null && message.hasOwnProperty("encPayload")) + if (!(message.encPayload && typeof message.encPayload.length === "number" || $util.isString(message.encPayload))) + return "encPayload: buffer expected"; + if (message.encIv != null && message.hasOwnProperty("encIv")) + if (!(message.encIv && typeof message.encIv.length === "number" || $util.isString(message.encIv))) + return "encIv: buffer expected"; + return null; + }; + + /** + * Creates a PollEncValue message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PollEncValue + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PollEncValue} PollEncValue + */ + PollEncValue.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PollEncValue) + return object; + var message = new $root.proto.Message.PollEncValue(); + if (object.encPayload != null) + if (typeof object.encPayload === "string") + $util.base64.decode(object.encPayload, message.encPayload = $util.newBuffer($util.base64.length(object.encPayload)), 0); + else if (object.encPayload.length) + message.encPayload = object.encPayload; + if (object.encIv != null) + if (typeof object.encIv === "string") + $util.base64.decode(object.encIv, message.encIv = $util.newBuffer($util.base64.length(object.encIv)), 0); + else if (object.encIv.length) + message.encIv = object.encIv; + return message; + }; + + /** + * Creates a plain object from a PollEncValue message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PollEncValue + * @static + * @param {proto.Message.PollEncValue} message PollEncValue + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollEncValue.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.encPayload = ""; + else { + object.encPayload = []; + if (options.bytes !== Array) + object.encPayload = $util.newBuffer(object.encPayload); + } + if (options.bytes === String) + object.encIv = ""; + else { + object.encIv = []; + if (options.bytes !== Array) + object.encIv = $util.newBuffer(object.encIv); + } + } + if (message.encPayload != null && message.hasOwnProperty("encPayload")) + object.encPayload = options.bytes === String ? $util.base64.encode(message.encPayload, 0, message.encPayload.length) : options.bytes === Array ? Array.prototype.slice.call(message.encPayload) : message.encPayload; + if (message.encIv != null && message.hasOwnProperty("encIv")) + object.encIv = options.bytes === String ? $util.base64.encode(message.encIv, 0, message.encIv.length) : options.bytes === Array ? Array.prototype.slice.call(message.encIv) : message.encIv; + return object; + }; + + /** + * Converts this PollEncValue to JSON. + * @function toJSON + * @memberof proto.Message.PollEncValue + * @instance + * @returns {Object.} JSON object + */ + PollEncValue.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollEncValue; + })(); + + Message.PollUpdateMessage = (function() { + + /** + * Properties of a PollUpdateMessage. + * @memberof proto.Message + * @interface IPollUpdateMessage + * @property {proto.IMessageKey|null} [pollCreationMessageKey] PollUpdateMessage pollCreationMessageKey + * @property {proto.Message.IPollEncValue|null} [vote] PollUpdateMessage vote + * @property {proto.Message.IPollUpdateMessageMetadata|null} [metadata] PollUpdateMessage metadata + * @property {number|Long|null} [senderTimestampMs] PollUpdateMessage senderTimestampMs + */ + + /** + * Constructs a new PollUpdateMessage. + * @memberof proto.Message + * @classdesc Represents a PollUpdateMessage. + * @implements IPollUpdateMessage + * @constructor + * @param {proto.Message.IPollUpdateMessage=} [properties] Properties to set + */ + function PollUpdateMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollUpdateMessage pollCreationMessageKey. + * @member {proto.IMessageKey|null|undefined} pollCreationMessageKey + * @memberof proto.Message.PollUpdateMessage + * @instance + */ + PollUpdateMessage.prototype.pollCreationMessageKey = null; + + /** + * PollUpdateMessage vote. + * @member {proto.Message.IPollEncValue|null|undefined} vote + * @memberof proto.Message.PollUpdateMessage + * @instance + */ + PollUpdateMessage.prototype.vote = null; + + /** + * PollUpdateMessage metadata. + * @member {proto.Message.IPollUpdateMessageMetadata|null|undefined} metadata + * @memberof proto.Message.PollUpdateMessage + * @instance + */ + PollUpdateMessage.prototype.metadata = null; + + /** + * PollUpdateMessage senderTimestampMs. + * @member {number|Long} senderTimestampMs + * @memberof proto.Message.PollUpdateMessage + * @instance + */ + PollUpdateMessage.prototype.senderTimestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new PollUpdateMessage instance using the specified properties. + * @function create + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {proto.Message.IPollUpdateMessage=} [properties] Properties to set + * @returns {proto.Message.PollUpdateMessage} PollUpdateMessage instance + */ + PollUpdateMessage.create = function create(properties) { + return new PollUpdateMessage(properties); + }; + + /** + * Encodes the specified PollUpdateMessage message. Does not implicitly {@link proto.Message.PollUpdateMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {proto.Message.IPollUpdateMessage} message PollUpdateMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollUpdateMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.pollCreationMessageKey != null && Object.hasOwnProperty.call(message, "pollCreationMessageKey")) + $root.proto.MessageKey.encode(message.pollCreationMessageKey, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.vote != null && Object.hasOwnProperty.call(message, "vote")) + $root.proto.Message.PollEncValue.encode(message.vote, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.proto.Message.PollUpdateMessageMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.senderTimestampMs != null && Object.hasOwnProperty.call(message, "senderTimestampMs")) + writer.uint32(/* id 4, wireType 0 =*/32).int64(message.senderTimestampMs); + return writer; + }; + + /** + * Encodes the specified PollUpdateMessage message, length delimited. Does not implicitly {@link proto.Message.PollUpdateMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {proto.Message.IPollUpdateMessage} message PollUpdateMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollUpdateMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollUpdateMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PollUpdateMessage} PollUpdateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollUpdateMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PollUpdateMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.pollCreationMessageKey = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.vote = $root.proto.Message.PollEncValue.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.proto.Message.PollUpdateMessageMetadata.decode(reader, reader.uint32()); + break; + case 4: + message.senderTimestampMs = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollUpdateMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PollUpdateMessage} PollUpdateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollUpdateMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollUpdateMessage message. + * @function verify + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollUpdateMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.pollCreationMessageKey != null && message.hasOwnProperty("pollCreationMessageKey")) { + var error = $root.proto.MessageKey.verify(message.pollCreationMessageKey); + if (error) + return "pollCreationMessageKey." + error; + } + if (message.vote != null && message.hasOwnProperty("vote")) { + var error = $root.proto.Message.PollEncValue.verify(message.vote); + if (error) + return "vote." + error; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.proto.Message.PollUpdateMessageMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (!$util.isInteger(message.senderTimestampMs) && !(message.senderTimestampMs && $util.isInteger(message.senderTimestampMs.low) && $util.isInteger(message.senderTimestampMs.high))) + return "senderTimestampMs: integer|Long expected"; + return null; + }; + + /** + * Creates a PollUpdateMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PollUpdateMessage} PollUpdateMessage + */ + PollUpdateMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PollUpdateMessage) + return object; + var message = new $root.proto.Message.PollUpdateMessage(); + if (object.pollCreationMessageKey != null) { + if (typeof object.pollCreationMessageKey !== "object") + throw TypeError(".proto.Message.PollUpdateMessage.pollCreationMessageKey: object expected"); + message.pollCreationMessageKey = $root.proto.MessageKey.fromObject(object.pollCreationMessageKey); + } + if (object.vote != null) { + if (typeof object.vote !== "object") + throw TypeError(".proto.Message.PollUpdateMessage.vote: object expected"); + message.vote = $root.proto.Message.PollEncValue.fromObject(object.vote); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".proto.Message.PollUpdateMessage.metadata: object expected"); + message.metadata = $root.proto.Message.PollUpdateMessageMetadata.fromObject(object.metadata); + } + if (object.senderTimestampMs != null) + if ($util.Long) + (message.senderTimestampMs = $util.Long.fromValue(object.senderTimestampMs)).unsigned = false; + else if (typeof object.senderTimestampMs === "string") + message.senderTimestampMs = parseInt(object.senderTimestampMs, 10); + else if (typeof object.senderTimestampMs === "number") + message.senderTimestampMs = object.senderTimestampMs; + else if (typeof object.senderTimestampMs === "object") + message.senderTimestampMs = new $util.LongBits(object.senderTimestampMs.low >>> 0, object.senderTimestampMs.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a PollUpdateMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PollUpdateMessage + * @static + * @param {proto.Message.PollUpdateMessage} message PollUpdateMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollUpdateMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.pollCreationMessageKey = null; + object.vote = null; + object.metadata = null; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.senderTimestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.senderTimestampMs = options.longs === String ? "0" : 0; + } + if (message.pollCreationMessageKey != null && message.hasOwnProperty("pollCreationMessageKey")) + object.pollCreationMessageKey = $root.proto.MessageKey.toObject(message.pollCreationMessageKey, options); + if (message.vote != null && message.hasOwnProperty("vote")) + object.vote = $root.proto.Message.PollEncValue.toObject(message.vote, options); + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.proto.Message.PollUpdateMessageMetadata.toObject(message.metadata, options); + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (typeof message.senderTimestampMs === "number") + object.senderTimestampMs = options.longs === String ? String(message.senderTimestampMs) : message.senderTimestampMs; + else + object.senderTimestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.senderTimestampMs) : options.longs === Number ? new $util.LongBits(message.senderTimestampMs.low >>> 0, message.senderTimestampMs.high >>> 0).toNumber() : message.senderTimestampMs; + return object; + }; + + /** + * Converts this PollUpdateMessage to JSON. + * @function toJSON + * @memberof proto.Message.PollUpdateMessage + * @instance + * @returns {Object.} JSON object + */ + PollUpdateMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollUpdateMessage; + })(); + + Message.PollUpdateMessageMetadata = (function() { + + /** + * Properties of a PollUpdateMessageMetadata. + * @memberof proto.Message + * @interface IPollUpdateMessageMetadata + */ + + /** + * Constructs a new PollUpdateMessageMetadata. + * @memberof proto.Message + * @classdesc Represents a PollUpdateMessageMetadata. + * @implements IPollUpdateMessageMetadata + * @constructor + * @param {proto.Message.IPollUpdateMessageMetadata=} [properties] Properties to set + */ + function PollUpdateMessageMetadata(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Creates a new PollUpdateMessageMetadata instance using the specified properties. + * @function create + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {proto.Message.IPollUpdateMessageMetadata=} [properties] Properties to set + * @returns {proto.Message.PollUpdateMessageMetadata} PollUpdateMessageMetadata instance + */ + PollUpdateMessageMetadata.create = function create(properties) { + return new PollUpdateMessageMetadata(properties); + }; + + /** + * Encodes the specified PollUpdateMessageMetadata message. Does not implicitly {@link proto.Message.PollUpdateMessageMetadata.verify|verify} messages. + * @function encode + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {proto.Message.IPollUpdateMessageMetadata} message PollUpdateMessageMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollUpdateMessageMetadata.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + return writer; + }; + + /** + * Encodes the specified PollUpdateMessageMetadata message, length delimited. Does not implicitly {@link proto.Message.PollUpdateMessageMetadata.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {proto.Message.IPollUpdateMessageMetadata} message PollUpdateMessageMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollUpdateMessageMetadata.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollUpdateMessageMetadata message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PollUpdateMessageMetadata} PollUpdateMessageMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollUpdateMessageMetadata.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PollUpdateMessageMetadata(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollUpdateMessageMetadata message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PollUpdateMessageMetadata} PollUpdateMessageMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollUpdateMessageMetadata.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollUpdateMessageMetadata message. + * @function verify + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollUpdateMessageMetadata.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + return null; + }; + + /** + * Creates a PollUpdateMessageMetadata message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PollUpdateMessageMetadata} PollUpdateMessageMetadata + */ + PollUpdateMessageMetadata.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PollUpdateMessageMetadata) + return object; + return new $root.proto.Message.PollUpdateMessageMetadata(); + }; + + /** + * Creates a plain object from a PollUpdateMessageMetadata message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PollUpdateMessageMetadata + * @static + * @param {proto.Message.PollUpdateMessageMetadata} message PollUpdateMessageMetadata + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollUpdateMessageMetadata.toObject = function toObject() { + return {}; + }; + + /** + * Converts this PollUpdateMessageMetadata to JSON. + * @function toJSON + * @memberof proto.Message.PollUpdateMessageMetadata + * @instance + * @returns {Object.} JSON object + */ + PollUpdateMessageMetadata.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollUpdateMessageMetadata; + })(); + + Message.PollVoteMessage = (function() { + + /** + * Properties of a PollVoteMessage. + * @memberof proto.Message + * @interface IPollVoteMessage + * @property {Array.|null} [selectedOptions] PollVoteMessage selectedOptions + */ + + /** + * Constructs a new PollVoteMessage. + * @memberof proto.Message + * @classdesc Represents a PollVoteMessage. + * @implements IPollVoteMessage + * @constructor + * @param {proto.Message.IPollVoteMessage=} [properties] Properties to set + */ + function PollVoteMessage(properties) { + this.selectedOptions = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollVoteMessage selectedOptions. + * @member {Array.} selectedOptions + * @memberof proto.Message.PollVoteMessage + * @instance + */ + PollVoteMessage.prototype.selectedOptions = $util.emptyArray; + + /** + * Creates a new PollVoteMessage instance using the specified properties. + * @function create + * @memberof proto.Message.PollVoteMessage + * @static + * @param {proto.Message.IPollVoteMessage=} [properties] Properties to set + * @returns {proto.Message.PollVoteMessage} PollVoteMessage instance + */ + PollVoteMessage.create = function create(properties) { + return new PollVoteMessage(properties); + }; + + /** + * Encodes the specified PollVoteMessage message. Does not implicitly {@link proto.Message.PollVoteMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.PollVoteMessage + * @static + * @param {proto.Message.IPollVoteMessage} message PollVoteMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollVoteMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.selectedOptions != null && message.selectedOptions.length) + for (var i = 0; i < message.selectedOptions.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.selectedOptions[i]); + return writer; + }; + + /** + * Encodes the specified PollVoteMessage message, length delimited. Does not implicitly {@link proto.Message.PollVoteMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.PollVoteMessage + * @static + * @param {proto.Message.IPollVoteMessage} message PollVoteMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollVoteMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollVoteMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.PollVoteMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.PollVoteMessage} PollVoteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollVoteMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.PollVoteMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.selectedOptions && message.selectedOptions.length)) + message.selectedOptions = []; + message.selectedOptions.push(reader.bytes()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollVoteMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.PollVoteMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.PollVoteMessage} PollVoteMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollVoteMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollVoteMessage message. + * @function verify + * @memberof proto.Message.PollVoteMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollVoteMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.selectedOptions != null && message.hasOwnProperty("selectedOptions")) { + if (!Array.isArray(message.selectedOptions)) + return "selectedOptions: array expected"; + for (var i = 0; i < message.selectedOptions.length; ++i) + if (!(message.selectedOptions[i] && typeof message.selectedOptions[i].length === "number" || $util.isString(message.selectedOptions[i]))) + return "selectedOptions: buffer[] expected"; + } + return null; + }; + + /** + * Creates a PollVoteMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.PollVoteMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.PollVoteMessage} PollVoteMessage + */ + PollVoteMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.PollVoteMessage) + return object; + var message = new $root.proto.Message.PollVoteMessage(); + if (object.selectedOptions) { + if (!Array.isArray(object.selectedOptions)) + throw TypeError(".proto.Message.PollVoteMessage.selectedOptions: array expected"); + message.selectedOptions = []; + for (var i = 0; i < object.selectedOptions.length; ++i) + if (typeof object.selectedOptions[i] === "string") + $util.base64.decode(object.selectedOptions[i], message.selectedOptions[i] = $util.newBuffer($util.base64.length(object.selectedOptions[i])), 0); + else if (object.selectedOptions[i].length) + message.selectedOptions[i] = object.selectedOptions[i]; + } + return message; + }; + + /** + * Creates a plain object from a PollVoteMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.PollVoteMessage + * @static + * @param {proto.Message.PollVoteMessage} message PollVoteMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollVoteMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.selectedOptions = []; + if (message.selectedOptions && message.selectedOptions.length) { + object.selectedOptions = []; + for (var j = 0; j < message.selectedOptions.length; ++j) + object.selectedOptions[j] = options.bytes === String ? $util.base64.encode(message.selectedOptions[j], 0, message.selectedOptions[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.selectedOptions[j]) : message.selectedOptions[j]; + } + return object; + }; + + /** + * Converts this PollVoteMessage to JSON. + * @function toJSON + * @memberof proto.Message.PollVoteMessage + * @instance + * @returns {Object.} JSON object + */ + PollVoteMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollVoteMessage; + })(); + + Message.ProductMessage = (function() { + + /** + * Properties of a ProductMessage. + * @memberof proto.Message + * @interface IProductMessage + * @property {proto.Message.ProductMessage.IProductSnapshot|null} [product] ProductMessage product + * @property {string|null} [businessOwnerJid] ProductMessage businessOwnerJid + * @property {proto.Message.ProductMessage.ICatalogSnapshot|null} [catalog] ProductMessage catalog + * @property {string|null} [body] ProductMessage body + * @property {string|null} [footer] ProductMessage footer + * @property {proto.IContextInfo|null} [contextInfo] ProductMessage contextInfo + */ + + /** + * Constructs a new ProductMessage. + * @memberof proto.Message + * @classdesc Represents a ProductMessage. + * @implements IProductMessage + * @constructor + * @param {proto.Message.IProductMessage=} [properties] Properties to set + */ + function ProductMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ProductMessage product. + * @member {proto.Message.ProductMessage.IProductSnapshot|null|undefined} product + * @memberof proto.Message.ProductMessage + * @instance + */ + ProductMessage.prototype.product = null; + + /** + * ProductMessage businessOwnerJid. + * @member {string} businessOwnerJid + * @memberof proto.Message.ProductMessage + * @instance + */ + ProductMessage.prototype.businessOwnerJid = ""; + + /** + * ProductMessage catalog. + * @member {proto.Message.ProductMessage.ICatalogSnapshot|null|undefined} catalog + * @memberof proto.Message.ProductMessage + * @instance + */ + ProductMessage.prototype.catalog = null; + + /** + * ProductMessage body. + * @member {string} body + * @memberof proto.Message.ProductMessage + * @instance + */ + ProductMessage.prototype.body = ""; + + /** + * ProductMessage footer. + * @member {string} footer + * @memberof proto.Message.ProductMessage + * @instance + */ + ProductMessage.prototype.footer = ""; + + /** + * ProductMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.ProductMessage + * @instance + */ + ProductMessage.prototype.contextInfo = null; + + /** + * Creates a new ProductMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ProductMessage + * @static + * @param {proto.Message.IProductMessage=} [properties] Properties to set + * @returns {proto.Message.ProductMessage} ProductMessage instance + */ + ProductMessage.create = function create(properties) { + return new ProductMessage(properties); + }; + + /** + * Encodes the specified ProductMessage message. Does not implicitly {@link proto.Message.ProductMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ProductMessage + * @static + * @param {proto.Message.IProductMessage} message ProductMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.product != null && Object.hasOwnProperty.call(message, "product")) + $root.proto.Message.ProductMessage.ProductSnapshot.encode(message.product, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.businessOwnerJid != null && Object.hasOwnProperty.call(message, "businessOwnerJid")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.businessOwnerJid); + if (message.catalog != null && Object.hasOwnProperty.call(message, "catalog")) + $root.proto.Message.ProductMessage.CatalogSnapshot.encode(message.catalog, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.body); + if (message.footer != null && Object.hasOwnProperty.call(message, "footer")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.footer); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ProductMessage message, length delimited. Does not implicitly {@link proto.Message.ProductMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ProductMessage + * @static + * @param {proto.Message.IProductMessage} message ProductMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ProductMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ProductMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ProductMessage} ProductMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ProductMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.product = $root.proto.Message.ProductMessage.ProductSnapshot.decode(reader, reader.uint32()); + break; + case 2: + message.businessOwnerJid = reader.string(); + break; + case 4: + message.catalog = $root.proto.Message.ProductMessage.CatalogSnapshot.decode(reader, reader.uint32()); + break; + case 5: + message.body = reader.string(); + break; + case 6: + message.footer = reader.string(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ProductMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ProductMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ProductMessage} ProductMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ProductMessage message. + * @function verify + * @memberof proto.Message.ProductMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ProductMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.product != null && message.hasOwnProperty("product")) { + var error = $root.proto.Message.ProductMessage.ProductSnapshot.verify(message.product); + if (error) + return "product." + error; + } + if (message.businessOwnerJid != null && message.hasOwnProperty("businessOwnerJid")) + if (!$util.isString(message.businessOwnerJid)) + return "businessOwnerJid: string expected"; + if (message.catalog != null && message.hasOwnProperty("catalog")) { + var error = $root.proto.Message.ProductMessage.CatalogSnapshot.verify(message.catalog); + if (error) + return "catalog." + error; + } + if (message.body != null && message.hasOwnProperty("body")) + if (!$util.isString(message.body)) + return "body: string expected"; + if (message.footer != null && message.hasOwnProperty("footer")) + if (!$util.isString(message.footer)) + return "footer: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a ProductMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ProductMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ProductMessage} ProductMessage + */ + ProductMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ProductMessage) + return object; + var message = new $root.proto.Message.ProductMessage(); + if (object.product != null) { + if (typeof object.product !== "object") + throw TypeError(".proto.Message.ProductMessage.product: object expected"); + message.product = $root.proto.Message.ProductMessage.ProductSnapshot.fromObject(object.product); + } + if (object.businessOwnerJid != null) + message.businessOwnerJid = String(object.businessOwnerJid); + if (object.catalog != null) { + if (typeof object.catalog !== "object") + throw TypeError(".proto.Message.ProductMessage.catalog: object expected"); + message.catalog = $root.proto.Message.ProductMessage.CatalogSnapshot.fromObject(object.catalog); + } + if (object.body != null) + message.body = String(object.body); + if (object.footer != null) + message.footer = String(object.footer); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.ProductMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a ProductMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ProductMessage + * @static + * @param {proto.Message.ProductMessage} message ProductMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ProductMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.product = null; + object.businessOwnerJid = ""; + object.catalog = null; + object.body = ""; + object.footer = ""; + object.contextInfo = null; + } + if (message.product != null && message.hasOwnProperty("product")) + object.product = $root.proto.Message.ProductMessage.ProductSnapshot.toObject(message.product, options); + if (message.businessOwnerJid != null && message.hasOwnProperty("businessOwnerJid")) + object.businessOwnerJid = message.businessOwnerJid; + if (message.catalog != null && message.hasOwnProperty("catalog")) + object.catalog = $root.proto.Message.ProductMessage.CatalogSnapshot.toObject(message.catalog, options); + if (message.body != null && message.hasOwnProperty("body")) + object.body = message.body; + if (message.footer != null && message.hasOwnProperty("footer")) + object.footer = message.footer; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this ProductMessage to JSON. + * @function toJSON + * @memberof proto.Message.ProductMessage + * @instance + * @returns {Object.} JSON object + */ + ProductMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + ProductMessage.CatalogSnapshot = (function() { + + /** + * Properties of a CatalogSnapshot. + * @memberof proto.Message.ProductMessage + * @interface ICatalogSnapshot + * @property {proto.Message.IImageMessage|null} [catalogImage] CatalogSnapshot catalogImage + * @property {string|null} [title] CatalogSnapshot title + * @property {string|null} [description] CatalogSnapshot description + */ + + /** + * Constructs a new CatalogSnapshot. + * @memberof proto.Message.ProductMessage + * @classdesc Represents a CatalogSnapshot. + * @implements ICatalogSnapshot + * @constructor + * @param {proto.Message.ProductMessage.ICatalogSnapshot=} [properties] Properties to set + */ + function CatalogSnapshot(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CatalogSnapshot catalogImage. + * @member {proto.Message.IImageMessage|null|undefined} catalogImage + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @instance + */ + CatalogSnapshot.prototype.catalogImage = null; + + /** + * CatalogSnapshot title. + * @member {string} title + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @instance + */ + CatalogSnapshot.prototype.title = ""; + + /** + * CatalogSnapshot description. + * @member {string} description + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @instance + */ + CatalogSnapshot.prototype.description = ""; + + /** + * Creates a new CatalogSnapshot instance using the specified properties. + * @function create + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {proto.Message.ProductMessage.ICatalogSnapshot=} [properties] Properties to set + * @returns {proto.Message.ProductMessage.CatalogSnapshot} CatalogSnapshot instance + */ + CatalogSnapshot.create = function create(properties) { + return new CatalogSnapshot(properties); + }; + + /** + * Encodes the specified CatalogSnapshot message. Does not implicitly {@link proto.Message.ProductMessage.CatalogSnapshot.verify|verify} messages. + * @function encode + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {proto.Message.ProductMessage.ICatalogSnapshot} message CatalogSnapshot message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CatalogSnapshot.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.catalogImage != null && Object.hasOwnProperty.call(message, "catalogImage")) + $root.proto.Message.ImageMessage.encode(message.catalogImage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.title); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.description); + return writer; + }; + + /** + * Encodes the specified CatalogSnapshot message, length delimited. Does not implicitly {@link proto.Message.ProductMessage.CatalogSnapshot.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {proto.Message.ProductMessage.ICatalogSnapshot} message CatalogSnapshot message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CatalogSnapshot.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CatalogSnapshot message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ProductMessage.CatalogSnapshot} CatalogSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CatalogSnapshot.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ProductMessage.CatalogSnapshot(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.catalogImage = $root.proto.Message.ImageMessage.decode(reader, reader.uint32()); + break; + case 2: + message.title = reader.string(); + break; + case 3: + message.description = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CatalogSnapshot message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ProductMessage.CatalogSnapshot} CatalogSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CatalogSnapshot.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CatalogSnapshot message. + * @function verify + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CatalogSnapshot.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.catalogImage != null && message.hasOwnProperty("catalogImage")) { + var error = $root.proto.Message.ImageMessage.verify(message.catalogImage); + if (error) + return "catalogImage." + error; + } + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + return null; + }; + + /** + * Creates a CatalogSnapshot message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ProductMessage.CatalogSnapshot} CatalogSnapshot + */ + CatalogSnapshot.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ProductMessage.CatalogSnapshot) + return object; + var message = new $root.proto.Message.ProductMessage.CatalogSnapshot(); + if (object.catalogImage != null) { + if (typeof object.catalogImage !== "object") + throw TypeError(".proto.Message.ProductMessage.CatalogSnapshot.catalogImage: object expected"); + message.catalogImage = $root.proto.Message.ImageMessage.fromObject(object.catalogImage); + } + if (object.title != null) + message.title = String(object.title); + if (object.description != null) + message.description = String(object.description); + return message; + }; + + /** + * Creates a plain object from a CatalogSnapshot message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @static + * @param {proto.Message.ProductMessage.CatalogSnapshot} message CatalogSnapshot + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CatalogSnapshot.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.catalogImage = null; + object.title = ""; + object.description = ""; + } + if (message.catalogImage != null && message.hasOwnProperty("catalogImage")) + object.catalogImage = $root.proto.Message.ImageMessage.toObject(message.catalogImage, options); + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + return object; + }; + + /** + * Converts this CatalogSnapshot to JSON. + * @function toJSON + * @memberof proto.Message.ProductMessage.CatalogSnapshot + * @instance + * @returns {Object.} JSON object + */ + CatalogSnapshot.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return CatalogSnapshot; + })(); + + ProductMessage.ProductSnapshot = (function() { + + /** + * Properties of a ProductSnapshot. + * @memberof proto.Message.ProductMessage + * @interface IProductSnapshot + * @property {proto.Message.IImageMessage|null} [productImage] ProductSnapshot productImage + * @property {string|null} [productId] ProductSnapshot productId + * @property {string|null} [title] ProductSnapshot title + * @property {string|null} [description] ProductSnapshot description + * @property {string|null} [currencyCode] ProductSnapshot currencyCode + * @property {number|Long|null} [priceAmount1000] ProductSnapshot priceAmount1000 + * @property {string|null} [retailerId] ProductSnapshot retailerId + * @property {string|null} [url] ProductSnapshot url + * @property {number|null} [productImageCount] ProductSnapshot productImageCount + * @property {string|null} [firstImageId] ProductSnapshot firstImageId + * @property {number|Long|null} [salePriceAmount1000] ProductSnapshot salePriceAmount1000 + */ + + /** + * Constructs a new ProductSnapshot. + * @memberof proto.Message.ProductMessage + * @classdesc Represents a ProductSnapshot. + * @implements IProductSnapshot + * @constructor + * @param {proto.Message.ProductMessage.IProductSnapshot=} [properties] Properties to set + */ + function ProductSnapshot(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ProductSnapshot productImage. + * @member {proto.Message.IImageMessage|null|undefined} productImage + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.productImage = null; + + /** + * ProductSnapshot productId. + * @member {string} productId + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.productId = ""; + + /** + * ProductSnapshot title. + * @member {string} title + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.title = ""; + + /** + * ProductSnapshot description. + * @member {string} description + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.description = ""; + + /** + * ProductSnapshot currencyCode. + * @member {string} currencyCode + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.currencyCode = ""; + + /** + * ProductSnapshot priceAmount1000. + * @member {number|Long} priceAmount1000 + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.priceAmount1000 = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * ProductSnapshot retailerId. + * @member {string} retailerId + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.retailerId = ""; + + /** + * ProductSnapshot url. + * @member {string} url + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.url = ""; + + /** + * ProductSnapshot productImageCount. + * @member {number} productImageCount + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.productImageCount = 0; + + /** + * ProductSnapshot firstImageId. + * @member {string} firstImageId + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.firstImageId = ""; + + /** + * ProductSnapshot salePriceAmount1000. + * @member {number|Long} salePriceAmount1000 + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + */ + ProductSnapshot.prototype.salePriceAmount1000 = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new ProductSnapshot instance using the specified properties. + * @function create + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {proto.Message.ProductMessage.IProductSnapshot=} [properties] Properties to set + * @returns {proto.Message.ProductMessage.ProductSnapshot} ProductSnapshot instance + */ + ProductSnapshot.create = function create(properties) { + return new ProductSnapshot(properties); + }; + + /** + * Encodes the specified ProductSnapshot message. Does not implicitly {@link proto.Message.ProductMessage.ProductSnapshot.verify|verify} messages. + * @function encode + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {proto.Message.ProductMessage.IProductSnapshot} message ProductSnapshot message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductSnapshot.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.productImage != null && Object.hasOwnProperty.call(message, "productImage")) + $root.proto.Message.ImageMessage.encode(message.productImage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.productId != null && Object.hasOwnProperty.call(message, "productId")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.productId); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.title); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.description); + if (message.currencyCode != null && Object.hasOwnProperty.call(message, "currencyCode")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.currencyCode); + if (message.priceAmount1000 != null && Object.hasOwnProperty.call(message, "priceAmount1000")) + writer.uint32(/* id 6, wireType 0 =*/48).int64(message.priceAmount1000); + if (message.retailerId != null && Object.hasOwnProperty.call(message, "retailerId")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.retailerId); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.url); + if (message.productImageCount != null && Object.hasOwnProperty.call(message, "productImageCount")) + writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.productImageCount); + if (message.firstImageId != null && Object.hasOwnProperty.call(message, "firstImageId")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.firstImageId); + if (message.salePriceAmount1000 != null && Object.hasOwnProperty.call(message, "salePriceAmount1000")) + writer.uint32(/* id 12, wireType 0 =*/96).int64(message.salePriceAmount1000); + return writer; + }; + + /** + * Encodes the specified ProductSnapshot message, length delimited. Does not implicitly {@link proto.Message.ProductMessage.ProductSnapshot.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {proto.Message.ProductMessage.IProductSnapshot} message ProductSnapshot message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProductSnapshot.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ProductSnapshot message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ProductMessage.ProductSnapshot} ProductSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductSnapshot.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ProductMessage.ProductSnapshot(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.productImage = $root.proto.Message.ImageMessage.decode(reader, reader.uint32()); + break; + case 2: + message.productId = reader.string(); + break; + case 3: + message.title = reader.string(); + break; + case 4: + message.description = reader.string(); + break; + case 5: + message.currencyCode = reader.string(); + break; + case 6: + message.priceAmount1000 = reader.int64(); + break; + case 7: + message.retailerId = reader.string(); + break; + case 8: + message.url = reader.string(); + break; + case 9: + message.productImageCount = reader.uint32(); + break; + case 11: + message.firstImageId = reader.string(); + break; + case 12: + message.salePriceAmount1000 = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ProductSnapshot message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ProductMessage.ProductSnapshot} ProductSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProductSnapshot.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ProductSnapshot message. + * @function verify + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ProductSnapshot.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.productImage != null && message.hasOwnProperty("productImage")) { + var error = $root.proto.Message.ImageMessage.verify(message.productImage); + if (error) + return "productImage." + error; + } + if (message.productId != null && message.hasOwnProperty("productId")) + if (!$util.isString(message.productId)) + return "productId: string expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.currencyCode != null && message.hasOwnProperty("currencyCode")) + if (!$util.isString(message.currencyCode)) + return "currencyCode: string expected"; + if (message.priceAmount1000 != null && message.hasOwnProperty("priceAmount1000")) + if (!$util.isInteger(message.priceAmount1000) && !(message.priceAmount1000 && $util.isInteger(message.priceAmount1000.low) && $util.isInteger(message.priceAmount1000.high))) + return "priceAmount1000: integer|Long expected"; + if (message.retailerId != null && message.hasOwnProperty("retailerId")) + if (!$util.isString(message.retailerId)) + return "retailerId: string expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.productImageCount != null && message.hasOwnProperty("productImageCount")) + if (!$util.isInteger(message.productImageCount)) + return "productImageCount: integer expected"; + if (message.firstImageId != null && message.hasOwnProperty("firstImageId")) + if (!$util.isString(message.firstImageId)) + return "firstImageId: string expected"; + if (message.salePriceAmount1000 != null && message.hasOwnProperty("salePriceAmount1000")) + if (!$util.isInteger(message.salePriceAmount1000) && !(message.salePriceAmount1000 && $util.isInteger(message.salePriceAmount1000.low) && $util.isInteger(message.salePriceAmount1000.high))) + return "salePriceAmount1000: integer|Long expected"; + return null; + }; + + /** + * Creates a ProductSnapshot message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ProductMessage.ProductSnapshot} ProductSnapshot + */ + ProductSnapshot.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ProductMessage.ProductSnapshot) + return object; + var message = new $root.proto.Message.ProductMessage.ProductSnapshot(); + if (object.productImage != null) { + if (typeof object.productImage !== "object") + throw TypeError(".proto.Message.ProductMessage.ProductSnapshot.productImage: object expected"); + message.productImage = $root.proto.Message.ImageMessage.fromObject(object.productImage); + } + if (object.productId != null) + message.productId = String(object.productId); + if (object.title != null) + message.title = String(object.title); + if (object.description != null) + message.description = String(object.description); + if (object.currencyCode != null) + message.currencyCode = String(object.currencyCode); + if (object.priceAmount1000 != null) + if ($util.Long) + (message.priceAmount1000 = $util.Long.fromValue(object.priceAmount1000)).unsigned = false; + else if (typeof object.priceAmount1000 === "string") + message.priceAmount1000 = parseInt(object.priceAmount1000, 10); + else if (typeof object.priceAmount1000 === "number") + message.priceAmount1000 = object.priceAmount1000; + else if (typeof object.priceAmount1000 === "object") + message.priceAmount1000 = new $util.LongBits(object.priceAmount1000.low >>> 0, object.priceAmount1000.high >>> 0).toNumber(); + if (object.retailerId != null) + message.retailerId = String(object.retailerId); + if (object.url != null) + message.url = String(object.url); + if (object.productImageCount != null) + message.productImageCount = object.productImageCount >>> 0; + if (object.firstImageId != null) + message.firstImageId = String(object.firstImageId); + if (object.salePriceAmount1000 != null) + if ($util.Long) + (message.salePriceAmount1000 = $util.Long.fromValue(object.salePriceAmount1000)).unsigned = false; + else if (typeof object.salePriceAmount1000 === "string") + message.salePriceAmount1000 = parseInt(object.salePriceAmount1000, 10); + else if (typeof object.salePriceAmount1000 === "number") + message.salePriceAmount1000 = object.salePriceAmount1000; + else if (typeof object.salePriceAmount1000 === "object") + message.salePriceAmount1000 = new $util.LongBits(object.salePriceAmount1000.low >>> 0, object.salePriceAmount1000.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a ProductSnapshot message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @static + * @param {proto.Message.ProductMessage.ProductSnapshot} message ProductSnapshot + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ProductSnapshot.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.productImage = null; + object.productId = ""; + object.title = ""; + object.description = ""; + object.currencyCode = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.priceAmount1000 = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.priceAmount1000 = options.longs === String ? "0" : 0; + object.retailerId = ""; + object.url = ""; + object.productImageCount = 0; + object.firstImageId = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.salePriceAmount1000 = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.salePriceAmount1000 = options.longs === String ? "0" : 0; + } + if (message.productImage != null && message.hasOwnProperty("productImage")) + object.productImage = $root.proto.Message.ImageMessage.toObject(message.productImage, options); + if (message.productId != null && message.hasOwnProperty("productId")) + object.productId = message.productId; + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + if (message.currencyCode != null && message.hasOwnProperty("currencyCode")) + object.currencyCode = message.currencyCode; + if (message.priceAmount1000 != null && message.hasOwnProperty("priceAmount1000")) + if (typeof message.priceAmount1000 === "number") + object.priceAmount1000 = options.longs === String ? String(message.priceAmount1000) : message.priceAmount1000; + else + object.priceAmount1000 = options.longs === String ? $util.Long.prototype.toString.call(message.priceAmount1000) : options.longs === Number ? new $util.LongBits(message.priceAmount1000.low >>> 0, message.priceAmount1000.high >>> 0).toNumber() : message.priceAmount1000; + if (message.retailerId != null && message.hasOwnProperty("retailerId")) + object.retailerId = message.retailerId; + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.productImageCount != null && message.hasOwnProperty("productImageCount")) + object.productImageCount = message.productImageCount; + if (message.firstImageId != null && message.hasOwnProperty("firstImageId")) + object.firstImageId = message.firstImageId; + if (message.salePriceAmount1000 != null && message.hasOwnProperty("salePriceAmount1000")) + if (typeof message.salePriceAmount1000 === "number") + object.salePriceAmount1000 = options.longs === String ? String(message.salePriceAmount1000) : message.salePriceAmount1000; + else + object.salePriceAmount1000 = options.longs === String ? $util.Long.prototype.toString.call(message.salePriceAmount1000) : options.longs === Number ? new $util.LongBits(message.salePriceAmount1000.low >>> 0, message.salePriceAmount1000.high >>> 0).toNumber() : message.salePriceAmount1000; + return object; + }; + + /** + * Converts this ProductSnapshot to JSON. + * @function toJSON + * @memberof proto.Message.ProductMessage.ProductSnapshot + * @instance + * @returns {Object.} JSON object + */ + ProductSnapshot.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ProductSnapshot; + })(); + + return ProductMessage; + })(); + + Message.ProtocolMessage = (function() { + + /** + * Properties of a ProtocolMessage. + * @memberof proto.Message + * @interface IProtocolMessage + * @property {proto.IMessageKey|null} [key] ProtocolMessage key + * @property {proto.Message.ProtocolMessage.Type|null} [type] ProtocolMessage type + * @property {number|null} [ephemeralExpiration] ProtocolMessage ephemeralExpiration + * @property {number|Long|null} [ephemeralSettingTimestamp] ProtocolMessage ephemeralSettingTimestamp + * @property {proto.Message.IHistorySyncNotification|null} [historySyncNotification] ProtocolMessage historySyncNotification + * @property {proto.Message.IAppStateSyncKeyShare|null} [appStateSyncKeyShare] ProtocolMessage appStateSyncKeyShare + * @property {proto.Message.IAppStateSyncKeyRequest|null} [appStateSyncKeyRequest] ProtocolMessage appStateSyncKeyRequest + * @property {proto.Message.IInitialSecurityNotificationSettingSync|null} [initialSecurityNotificationSettingSync] ProtocolMessage initialSecurityNotificationSettingSync + * @property {proto.Message.IAppStateFatalExceptionNotification|null} [appStateFatalExceptionNotification] ProtocolMessage appStateFatalExceptionNotification + * @property {proto.IDisappearingMode|null} [disappearingMode] ProtocolMessage disappearingMode + * @property {proto.IMessage|null} [editedMessage] ProtocolMessage editedMessage + * @property {number|Long|null} [timestampMs] ProtocolMessage timestampMs + * @property {proto.Message.IPeerDataOperationRequestMessage|null} [peerDataOperationRequestMessage] ProtocolMessage peerDataOperationRequestMessage + * @property {proto.Message.IPeerDataOperationRequestResponseMessage|null} [peerDataOperationRequestResponseMessage] ProtocolMessage peerDataOperationRequestResponseMessage + */ + + /** + * Constructs a new ProtocolMessage. + * @memberof proto.Message + * @classdesc Represents a ProtocolMessage. + * @implements IProtocolMessage + * @constructor + * @param {proto.Message.IProtocolMessage=} [properties] Properties to set + */ + function ProtocolMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ProtocolMessage key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.key = null; + + /** + * ProtocolMessage type. + * @member {proto.Message.ProtocolMessage.Type} type + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.type = 0; + + /** + * ProtocolMessage ephemeralExpiration. + * @member {number} ephemeralExpiration + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.ephemeralExpiration = 0; + + /** + * ProtocolMessage ephemeralSettingTimestamp. + * @member {number|Long} ephemeralSettingTimestamp + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.ephemeralSettingTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * ProtocolMessage historySyncNotification. + * @member {proto.Message.IHistorySyncNotification|null|undefined} historySyncNotification + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.historySyncNotification = null; + + /** + * ProtocolMessage appStateSyncKeyShare. + * @member {proto.Message.IAppStateSyncKeyShare|null|undefined} appStateSyncKeyShare + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.appStateSyncKeyShare = null; + + /** + * ProtocolMessage appStateSyncKeyRequest. + * @member {proto.Message.IAppStateSyncKeyRequest|null|undefined} appStateSyncKeyRequest + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.appStateSyncKeyRequest = null; + + /** + * ProtocolMessage initialSecurityNotificationSettingSync. + * @member {proto.Message.IInitialSecurityNotificationSettingSync|null|undefined} initialSecurityNotificationSettingSync + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.initialSecurityNotificationSettingSync = null; + + /** + * ProtocolMessage appStateFatalExceptionNotification. + * @member {proto.Message.IAppStateFatalExceptionNotification|null|undefined} appStateFatalExceptionNotification + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.appStateFatalExceptionNotification = null; + + /** + * ProtocolMessage disappearingMode. + * @member {proto.IDisappearingMode|null|undefined} disappearingMode + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.disappearingMode = null; + + /** + * ProtocolMessage editedMessage. + * @member {proto.IMessage|null|undefined} editedMessage + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.editedMessage = null; + + /** + * ProtocolMessage timestampMs. + * @member {number|Long} timestampMs + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.timestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * ProtocolMessage peerDataOperationRequestMessage. + * @member {proto.Message.IPeerDataOperationRequestMessage|null|undefined} peerDataOperationRequestMessage + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.peerDataOperationRequestMessage = null; + + /** + * ProtocolMessage peerDataOperationRequestResponseMessage. + * @member {proto.Message.IPeerDataOperationRequestResponseMessage|null|undefined} peerDataOperationRequestResponseMessage + * @memberof proto.Message.ProtocolMessage + * @instance + */ + ProtocolMessage.prototype.peerDataOperationRequestResponseMessage = null; + + /** + * Creates a new ProtocolMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ProtocolMessage + * @static + * @param {proto.Message.IProtocolMessage=} [properties] Properties to set + * @returns {proto.Message.ProtocolMessage} ProtocolMessage instance + */ + ProtocolMessage.create = function create(properties) { + return new ProtocolMessage(properties); + }; + + /** + * Encodes the specified ProtocolMessage message. Does not implicitly {@link proto.Message.ProtocolMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ProtocolMessage + * @static + * @param {proto.Message.IProtocolMessage} message ProtocolMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProtocolMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.type != null && Object.hasOwnProperty.call(message, "type")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.type); + if (message.ephemeralExpiration != null && Object.hasOwnProperty.call(message, "ephemeralExpiration")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.ephemeralExpiration); + if (message.ephemeralSettingTimestamp != null && Object.hasOwnProperty.call(message, "ephemeralSettingTimestamp")) + writer.uint32(/* id 5, wireType 0 =*/40).int64(message.ephemeralSettingTimestamp); + if (message.historySyncNotification != null && Object.hasOwnProperty.call(message, "historySyncNotification")) + $root.proto.Message.HistorySyncNotification.encode(message.historySyncNotification, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.appStateSyncKeyShare != null && Object.hasOwnProperty.call(message, "appStateSyncKeyShare")) + $root.proto.Message.AppStateSyncKeyShare.encode(message.appStateSyncKeyShare, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.appStateSyncKeyRequest != null && Object.hasOwnProperty.call(message, "appStateSyncKeyRequest")) + $root.proto.Message.AppStateSyncKeyRequest.encode(message.appStateSyncKeyRequest, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.initialSecurityNotificationSettingSync != null && Object.hasOwnProperty.call(message, "initialSecurityNotificationSettingSync")) + $root.proto.Message.InitialSecurityNotificationSettingSync.encode(message.initialSecurityNotificationSettingSync, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); + if (message.appStateFatalExceptionNotification != null && Object.hasOwnProperty.call(message, "appStateFatalExceptionNotification")) + $root.proto.Message.AppStateFatalExceptionNotification.encode(message.appStateFatalExceptionNotification, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim(); + if (message.disappearingMode != null && Object.hasOwnProperty.call(message, "disappearingMode")) + $root.proto.DisappearingMode.encode(message.disappearingMode, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); + if (message.editedMessage != null && Object.hasOwnProperty.call(message, "editedMessage")) + $root.proto.Message.encode(message.editedMessage, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); + if (message.timestampMs != null && Object.hasOwnProperty.call(message, "timestampMs")) + writer.uint32(/* id 15, wireType 0 =*/120).int64(message.timestampMs); + if (message.peerDataOperationRequestMessage != null && Object.hasOwnProperty.call(message, "peerDataOperationRequestMessage")) + $root.proto.Message.PeerDataOperationRequestMessage.encode(message.peerDataOperationRequestMessage, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); + if (message.peerDataOperationRequestResponseMessage != null && Object.hasOwnProperty.call(message, "peerDataOperationRequestResponseMessage")) + $root.proto.Message.PeerDataOperationRequestResponseMessage.encode(message.peerDataOperationRequestResponseMessage, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ProtocolMessage message, length delimited. Does not implicitly {@link proto.Message.ProtocolMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ProtocolMessage + * @static + * @param {proto.Message.IProtocolMessage} message ProtocolMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ProtocolMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ProtocolMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ProtocolMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ProtocolMessage} ProtocolMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProtocolMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ProtocolMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.type = reader.int32(); + break; + case 4: + message.ephemeralExpiration = reader.uint32(); + break; + case 5: + message.ephemeralSettingTimestamp = reader.int64(); + break; + case 6: + message.historySyncNotification = $root.proto.Message.HistorySyncNotification.decode(reader, reader.uint32()); + break; + case 7: + message.appStateSyncKeyShare = $root.proto.Message.AppStateSyncKeyShare.decode(reader, reader.uint32()); + break; + case 8: + message.appStateSyncKeyRequest = $root.proto.Message.AppStateSyncKeyRequest.decode(reader, reader.uint32()); + break; + case 9: + message.initialSecurityNotificationSettingSync = $root.proto.Message.InitialSecurityNotificationSettingSync.decode(reader, reader.uint32()); + break; + case 10: + message.appStateFatalExceptionNotification = $root.proto.Message.AppStateFatalExceptionNotification.decode(reader, reader.uint32()); + break; + case 11: + message.disappearingMode = $root.proto.DisappearingMode.decode(reader, reader.uint32()); + break; + case 14: + message.editedMessage = $root.proto.Message.decode(reader, reader.uint32()); + break; + case 15: + message.timestampMs = reader.int64(); + break; + case 16: + message.peerDataOperationRequestMessage = $root.proto.Message.PeerDataOperationRequestMessage.decode(reader, reader.uint32()); + break; + case 17: + message.peerDataOperationRequestResponseMessage = $root.proto.Message.PeerDataOperationRequestResponseMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ProtocolMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ProtocolMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ProtocolMessage} ProtocolMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ProtocolMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ProtocolMessage message. + * @function verify + * @memberof proto.Message.ProtocolMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ProtocolMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.type != null && message.hasOwnProperty("type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 14: + case 16: + case 17: + break; + } + if (message.ephemeralExpiration != null && message.hasOwnProperty("ephemeralExpiration")) + if (!$util.isInteger(message.ephemeralExpiration)) + return "ephemeralExpiration: integer expected"; + if (message.ephemeralSettingTimestamp != null && message.hasOwnProperty("ephemeralSettingTimestamp")) + if (!$util.isInteger(message.ephemeralSettingTimestamp) && !(message.ephemeralSettingTimestamp && $util.isInteger(message.ephemeralSettingTimestamp.low) && $util.isInteger(message.ephemeralSettingTimestamp.high))) + return "ephemeralSettingTimestamp: integer|Long expected"; + if (message.historySyncNotification != null && message.hasOwnProperty("historySyncNotification")) { + var error = $root.proto.Message.HistorySyncNotification.verify(message.historySyncNotification); + if (error) + return "historySyncNotification." + error; + } + if (message.appStateSyncKeyShare != null && message.hasOwnProperty("appStateSyncKeyShare")) { + var error = $root.proto.Message.AppStateSyncKeyShare.verify(message.appStateSyncKeyShare); + if (error) + return "appStateSyncKeyShare." + error; + } + if (message.appStateSyncKeyRequest != null && message.hasOwnProperty("appStateSyncKeyRequest")) { + var error = $root.proto.Message.AppStateSyncKeyRequest.verify(message.appStateSyncKeyRequest); + if (error) + return "appStateSyncKeyRequest." + error; + } + if (message.initialSecurityNotificationSettingSync != null && message.hasOwnProperty("initialSecurityNotificationSettingSync")) { + var error = $root.proto.Message.InitialSecurityNotificationSettingSync.verify(message.initialSecurityNotificationSettingSync); + if (error) + return "initialSecurityNotificationSettingSync." + error; + } + if (message.appStateFatalExceptionNotification != null && message.hasOwnProperty("appStateFatalExceptionNotification")) { + var error = $root.proto.Message.AppStateFatalExceptionNotification.verify(message.appStateFatalExceptionNotification); + if (error) + return "appStateFatalExceptionNotification." + error; + } + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) { + var error = $root.proto.DisappearingMode.verify(message.disappearingMode); + if (error) + return "disappearingMode." + error; + } + if (message.editedMessage != null && message.hasOwnProperty("editedMessage")) { + var error = $root.proto.Message.verify(message.editedMessage); + if (error) + return "editedMessage." + error; + } + if (message.timestampMs != null && message.hasOwnProperty("timestampMs")) + if (!$util.isInteger(message.timestampMs) && !(message.timestampMs && $util.isInteger(message.timestampMs.low) && $util.isInteger(message.timestampMs.high))) + return "timestampMs: integer|Long expected"; + if (message.peerDataOperationRequestMessage != null && message.hasOwnProperty("peerDataOperationRequestMessage")) { + var error = $root.proto.Message.PeerDataOperationRequestMessage.verify(message.peerDataOperationRequestMessage); + if (error) + return "peerDataOperationRequestMessage." + error; + } + if (message.peerDataOperationRequestResponseMessage != null && message.hasOwnProperty("peerDataOperationRequestResponseMessage")) { + var error = $root.proto.Message.PeerDataOperationRequestResponseMessage.verify(message.peerDataOperationRequestResponseMessage); + if (error) + return "peerDataOperationRequestResponseMessage." + error; + } + return null; + }; + + /** + * Creates a ProtocolMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ProtocolMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ProtocolMessage} ProtocolMessage + */ + ProtocolMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ProtocolMessage) + return object; + var message = new $root.proto.Message.ProtocolMessage(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.Message.ProtocolMessage.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + switch (object.type) { + case "REVOKE": + case 0: + message.type = 0; + break; + case "EPHEMERAL_SETTING": + case 3: + message.type = 3; + break; + case "EPHEMERAL_SYNC_RESPONSE": + case 4: + message.type = 4; + break; + case "HISTORY_SYNC_NOTIFICATION": + case 5: + message.type = 5; + break; + case "APP_STATE_SYNC_KEY_SHARE": + case 6: + message.type = 6; + break; + case "APP_STATE_SYNC_KEY_REQUEST": + case 7: + message.type = 7; + break; + case "MSG_FANOUT_BACKFILL_REQUEST": + case 8: + message.type = 8; + break; + case "INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC": + case 9: + message.type = 9; + break; + case "APP_STATE_FATAL_EXCEPTION_NOTIFICATION": + case 10: + message.type = 10; + break; + case "SHARE_PHONE_NUMBER": + case 11: + message.type = 11; + break; + case "MESSAGE_EDIT": + case 14: + message.type = 14; + break; + case "PEER_DATA_OPERATION_REQUEST_MESSAGE": + case 16: + message.type = 16; + break; + case "PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE": + case 17: + message.type = 17; + break; + } + if (object.ephemeralExpiration != null) + message.ephemeralExpiration = object.ephemeralExpiration >>> 0; + if (object.ephemeralSettingTimestamp != null) + if ($util.Long) + (message.ephemeralSettingTimestamp = $util.Long.fromValue(object.ephemeralSettingTimestamp)).unsigned = false; + else if (typeof object.ephemeralSettingTimestamp === "string") + message.ephemeralSettingTimestamp = parseInt(object.ephemeralSettingTimestamp, 10); + else if (typeof object.ephemeralSettingTimestamp === "number") + message.ephemeralSettingTimestamp = object.ephemeralSettingTimestamp; + else if (typeof object.ephemeralSettingTimestamp === "object") + message.ephemeralSettingTimestamp = new $util.LongBits(object.ephemeralSettingTimestamp.low >>> 0, object.ephemeralSettingTimestamp.high >>> 0).toNumber(); + if (object.historySyncNotification != null) { + if (typeof object.historySyncNotification !== "object") + throw TypeError(".proto.Message.ProtocolMessage.historySyncNotification: object expected"); + message.historySyncNotification = $root.proto.Message.HistorySyncNotification.fromObject(object.historySyncNotification); + } + if (object.appStateSyncKeyShare != null) { + if (typeof object.appStateSyncKeyShare !== "object") + throw TypeError(".proto.Message.ProtocolMessage.appStateSyncKeyShare: object expected"); + message.appStateSyncKeyShare = $root.proto.Message.AppStateSyncKeyShare.fromObject(object.appStateSyncKeyShare); + } + if (object.appStateSyncKeyRequest != null) { + if (typeof object.appStateSyncKeyRequest !== "object") + throw TypeError(".proto.Message.ProtocolMessage.appStateSyncKeyRequest: object expected"); + message.appStateSyncKeyRequest = $root.proto.Message.AppStateSyncKeyRequest.fromObject(object.appStateSyncKeyRequest); + } + if (object.initialSecurityNotificationSettingSync != null) { + if (typeof object.initialSecurityNotificationSettingSync !== "object") + throw TypeError(".proto.Message.ProtocolMessage.initialSecurityNotificationSettingSync: object expected"); + message.initialSecurityNotificationSettingSync = $root.proto.Message.InitialSecurityNotificationSettingSync.fromObject(object.initialSecurityNotificationSettingSync); + } + if (object.appStateFatalExceptionNotification != null) { + if (typeof object.appStateFatalExceptionNotification !== "object") + throw TypeError(".proto.Message.ProtocolMessage.appStateFatalExceptionNotification: object expected"); + message.appStateFatalExceptionNotification = $root.proto.Message.AppStateFatalExceptionNotification.fromObject(object.appStateFatalExceptionNotification); + } + if (object.disappearingMode != null) { + if (typeof object.disappearingMode !== "object") + throw TypeError(".proto.Message.ProtocolMessage.disappearingMode: object expected"); + message.disappearingMode = $root.proto.DisappearingMode.fromObject(object.disappearingMode); + } + if (object.editedMessage != null) { + if (typeof object.editedMessage !== "object") + throw TypeError(".proto.Message.ProtocolMessage.editedMessage: object expected"); + message.editedMessage = $root.proto.Message.fromObject(object.editedMessage); + } + if (object.timestampMs != null) + if ($util.Long) + (message.timestampMs = $util.Long.fromValue(object.timestampMs)).unsigned = false; + else if (typeof object.timestampMs === "string") + message.timestampMs = parseInt(object.timestampMs, 10); + else if (typeof object.timestampMs === "number") + message.timestampMs = object.timestampMs; + else if (typeof object.timestampMs === "object") + message.timestampMs = new $util.LongBits(object.timestampMs.low >>> 0, object.timestampMs.high >>> 0).toNumber(); + if (object.peerDataOperationRequestMessage != null) { + if (typeof object.peerDataOperationRequestMessage !== "object") + throw TypeError(".proto.Message.ProtocolMessage.peerDataOperationRequestMessage: object expected"); + message.peerDataOperationRequestMessage = $root.proto.Message.PeerDataOperationRequestMessage.fromObject(object.peerDataOperationRequestMessage); + } + if (object.peerDataOperationRequestResponseMessage != null) { + if (typeof object.peerDataOperationRequestResponseMessage !== "object") + throw TypeError(".proto.Message.ProtocolMessage.peerDataOperationRequestResponseMessage: object expected"); + message.peerDataOperationRequestResponseMessage = $root.proto.Message.PeerDataOperationRequestResponseMessage.fromObject(object.peerDataOperationRequestResponseMessage); + } + return message; + }; + + /** + * Creates a plain object from a ProtocolMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ProtocolMessage + * @static + * @param {proto.Message.ProtocolMessage} message ProtocolMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ProtocolMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.key = null; + object.type = options.enums === String ? "REVOKE" : 0; + object.ephemeralExpiration = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.ephemeralSettingTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.ephemeralSettingTimestamp = options.longs === String ? "0" : 0; + object.historySyncNotification = null; + object.appStateSyncKeyShare = null; + object.appStateSyncKeyRequest = null; + object.initialSecurityNotificationSettingSync = null; + object.appStateFatalExceptionNotification = null; + object.disappearingMode = null; + object.editedMessage = null; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestampMs = options.longs === String ? "0" : 0; + object.peerDataOperationRequestMessage = null; + object.peerDataOperationRequestResponseMessage = null; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.type != null && message.hasOwnProperty("type")) + object.type = options.enums === String ? $root.proto.Message.ProtocolMessage.Type[message.type] : message.type; + if (message.ephemeralExpiration != null && message.hasOwnProperty("ephemeralExpiration")) + object.ephemeralExpiration = message.ephemeralExpiration; + if (message.ephemeralSettingTimestamp != null && message.hasOwnProperty("ephemeralSettingTimestamp")) + if (typeof message.ephemeralSettingTimestamp === "number") + object.ephemeralSettingTimestamp = options.longs === String ? String(message.ephemeralSettingTimestamp) : message.ephemeralSettingTimestamp; + else + object.ephemeralSettingTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.ephemeralSettingTimestamp) : options.longs === Number ? new $util.LongBits(message.ephemeralSettingTimestamp.low >>> 0, message.ephemeralSettingTimestamp.high >>> 0).toNumber() : message.ephemeralSettingTimestamp; + if (message.historySyncNotification != null && message.hasOwnProperty("historySyncNotification")) + object.historySyncNotification = $root.proto.Message.HistorySyncNotification.toObject(message.historySyncNotification, options); + if (message.appStateSyncKeyShare != null && message.hasOwnProperty("appStateSyncKeyShare")) + object.appStateSyncKeyShare = $root.proto.Message.AppStateSyncKeyShare.toObject(message.appStateSyncKeyShare, options); + if (message.appStateSyncKeyRequest != null && message.hasOwnProperty("appStateSyncKeyRequest")) + object.appStateSyncKeyRequest = $root.proto.Message.AppStateSyncKeyRequest.toObject(message.appStateSyncKeyRequest, options); + if (message.initialSecurityNotificationSettingSync != null && message.hasOwnProperty("initialSecurityNotificationSettingSync")) + object.initialSecurityNotificationSettingSync = $root.proto.Message.InitialSecurityNotificationSettingSync.toObject(message.initialSecurityNotificationSettingSync, options); + if (message.appStateFatalExceptionNotification != null && message.hasOwnProperty("appStateFatalExceptionNotification")) + object.appStateFatalExceptionNotification = $root.proto.Message.AppStateFatalExceptionNotification.toObject(message.appStateFatalExceptionNotification, options); + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) + object.disappearingMode = $root.proto.DisappearingMode.toObject(message.disappearingMode, options); + if (message.editedMessage != null && message.hasOwnProperty("editedMessage")) + object.editedMessage = $root.proto.Message.toObject(message.editedMessage, options); + if (message.timestampMs != null && message.hasOwnProperty("timestampMs")) + if (typeof message.timestampMs === "number") + object.timestampMs = options.longs === String ? String(message.timestampMs) : message.timestampMs; + else + object.timestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.timestampMs) : options.longs === Number ? new $util.LongBits(message.timestampMs.low >>> 0, message.timestampMs.high >>> 0).toNumber() : message.timestampMs; + if (message.peerDataOperationRequestMessage != null && message.hasOwnProperty("peerDataOperationRequestMessage")) + object.peerDataOperationRequestMessage = $root.proto.Message.PeerDataOperationRequestMessage.toObject(message.peerDataOperationRequestMessage, options); + if (message.peerDataOperationRequestResponseMessage != null && message.hasOwnProperty("peerDataOperationRequestResponseMessage")) + object.peerDataOperationRequestResponseMessage = $root.proto.Message.PeerDataOperationRequestResponseMessage.toObject(message.peerDataOperationRequestResponseMessage, options); + return object; + }; + + /** + * Converts this ProtocolMessage to JSON. + * @function toJSON + * @memberof proto.Message.ProtocolMessage + * @instance + * @returns {Object.} JSON object + */ + ProtocolMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Type enum. + * @name proto.Message.ProtocolMessage.Type + * @enum {number} + * @property {number} REVOKE=0 REVOKE value + * @property {number} EPHEMERAL_SETTING=3 EPHEMERAL_SETTING value + * @property {number} EPHEMERAL_SYNC_RESPONSE=4 EPHEMERAL_SYNC_RESPONSE value + * @property {number} HISTORY_SYNC_NOTIFICATION=5 HISTORY_SYNC_NOTIFICATION value + * @property {number} APP_STATE_SYNC_KEY_SHARE=6 APP_STATE_SYNC_KEY_SHARE value + * @property {number} APP_STATE_SYNC_KEY_REQUEST=7 APP_STATE_SYNC_KEY_REQUEST value + * @property {number} MSG_FANOUT_BACKFILL_REQUEST=8 MSG_FANOUT_BACKFILL_REQUEST value + * @property {number} INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC=9 INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC value + * @property {number} APP_STATE_FATAL_EXCEPTION_NOTIFICATION=10 APP_STATE_FATAL_EXCEPTION_NOTIFICATION value + * @property {number} SHARE_PHONE_NUMBER=11 SHARE_PHONE_NUMBER value + * @property {number} MESSAGE_EDIT=14 MESSAGE_EDIT value + * @property {number} PEER_DATA_OPERATION_REQUEST_MESSAGE=16 PEER_DATA_OPERATION_REQUEST_MESSAGE value + * @property {number} PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE=17 PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE value + */ + ProtocolMessage.Type = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "REVOKE"] = 0; + values[valuesById[3] = "EPHEMERAL_SETTING"] = 3; + values[valuesById[4] = "EPHEMERAL_SYNC_RESPONSE"] = 4; + values[valuesById[5] = "HISTORY_SYNC_NOTIFICATION"] = 5; + values[valuesById[6] = "APP_STATE_SYNC_KEY_SHARE"] = 6; + values[valuesById[7] = "APP_STATE_SYNC_KEY_REQUEST"] = 7; + values[valuesById[8] = "MSG_FANOUT_BACKFILL_REQUEST"] = 8; + values[valuesById[9] = "INITIAL_SECURITY_NOTIFICATION_SETTING_SYNC"] = 9; + values[valuesById[10] = "APP_STATE_FATAL_EXCEPTION_NOTIFICATION"] = 10; + values[valuesById[11] = "SHARE_PHONE_NUMBER"] = 11; + values[valuesById[14] = "MESSAGE_EDIT"] = 14; + values[valuesById[16] = "PEER_DATA_OPERATION_REQUEST_MESSAGE"] = 16; + values[valuesById[17] = "PEER_DATA_OPERATION_REQUEST_RESPONSE_MESSAGE"] = 17; + return values; + })(); + + return ProtocolMessage; + })(); + + Message.ReactionMessage = (function() { + + /** + * Properties of a ReactionMessage. + * @memberof proto.Message + * @interface IReactionMessage + * @property {proto.IMessageKey|null} [key] ReactionMessage key + * @property {string|null} [text] ReactionMessage text + * @property {string|null} [groupingKey] ReactionMessage groupingKey + * @property {number|Long|null} [senderTimestampMs] ReactionMessage senderTimestampMs + */ + + /** + * Constructs a new ReactionMessage. + * @memberof proto.Message + * @classdesc Represents a ReactionMessage. + * @implements IReactionMessage + * @constructor + * @param {proto.Message.IReactionMessage=} [properties] Properties to set + */ + function ReactionMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ReactionMessage key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.Message.ReactionMessage + * @instance + */ + ReactionMessage.prototype.key = null; + + /** + * ReactionMessage text. + * @member {string} text + * @memberof proto.Message.ReactionMessage + * @instance + */ + ReactionMessage.prototype.text = ""; + + /** + * ReactionMessage groupingKey. + * @member {string} groupingKey + * @memberof proto.Message.ReactionMessage + * @instance + */ + ReactionMessage.prototype.groupingKey = ""; + + /** + * ReactionMessage senderTimestampMs. + * @member {number|Long} senderTimestampMs + * @memberof proto.Message.ReactionMessage + * @instance + */ + ReactionMessage.prototype.senderTimestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new ReactionMessage instance using the specified properties. + * @function create + * @memberof proto.Message.ReactionMessage + * @static + * @param {proto.Message.IReactionMessage=} [properties] Properties to set + * @returns {proto.Message.ReactionMessage} ReactionMessage instance + */ + ReactionMessage.create = function create(properties) { + return new ReactionMessage(properties); + }; + + /** + * Encodes the specified ReactionMessage message. Does not implicitly {@link proto.Message.ReactionMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.ReactionMessage + * @static + * @param {proto.Message.IReactionMessage} message ReactionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReactionMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.text); + if (message.groupingKey != null && Object.hasOwnProperty.call(message, "groupingKey")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.groupingKey); + if (message.senderTimestampMs != null && Object.hasOwnProperty.call(message, "senderTimestampMs")) + writer.uint32(/* id 4, wireType 0 =*/32).int64(message.senderTimestampMs); + return writer; + }; + + /** + * Encodes the specified ReactionMessage message, length delimited. Does not implicitly {@link proto.Message.ReactionMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.ReactionMessage + * @static + * @param {proto.Message.IReactionMessage} message ReactionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ReactionMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ReactionMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.ReactionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.ReactionMessage} ReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReactionMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.ReactionMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.text = reader.string(); + break; + case 3: + message.groupingKey = reader.string(); + break; + case 4: + message.senderTimestampMs = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ReactionMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.ReactionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.ReactionMessage} ReactionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ReactionMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ReactionMessage message. + * @function verify + * @memberof proto.Message.ReactionMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ReactionMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + if (message.groupingKey != null && message.hasOwnProperty("groupingKey")) + if (!$util.isString(message.groupingKey)) + return "groupingKey: string expected"; + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (!$util.isInteger(message.senderTimestampMs) && !(message.senderTimestampMs && $util.isInteger(message.senderTimestampMs.low) && $util.isInteger(message.senderTimestampMs.high))) + return "senderTimestampMs: integer|Long expected"; + return null; + }; + + /** + * Creates a ReactionMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.ReactionMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.ReactionMessage} ReactionMessage + */ + ReactionMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.ReactionMessage) + return object; + var message = new $root.proto.Message.ReactionMessage(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.Message.ReactionMessage.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + if (object.text != null) + message.text = String(object.text); + if (object.groupingKey != null) + message.groupingKey = String(object.groupingKey); + if (object.senderTimestampMs != null) + if ($util.Long) + (message.senderTimestampMs = $util.Long.fromValue(object.senderTimestampMs)).unsigned = false; + else if (typeof object.senderTimestampMs === "string") + message.senderTimestampMs = parseInt(object.senderTimestampMs, 10); + else if (typeof object.senderTimestampMs === "number") + message.senderTimestampMs = object.senderTimestampMs; + else if (typeof object.senderTimestampMs === "object") + message.senderTimestampMs = new $util.LongBits(object.senderTimestampMs.low >>> 0, object.senderTimestampMs.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a ReactionMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.ReactionMessage + * @static + * @param {proto.Message.ReactionMessage} message ReactionMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ReactionMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.key = null; + object.text = ""; + object.groupingKey = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.senderTimestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.senderTimestampMs = options.longs === String ? "0" : 0; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + if (message.groupingKey != null && message.hasOwnProperty("groupingKey")) + object.groupingKey = message.groupingKey; + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (typeof message.senderTimestampMs === "number") + object.senderTimestampMs = options.longs === String ? String(message.senderTimestampMs) : message.senderTimestampMs; + else + object.senderTimestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.senderTimestampMs) : options.longs === Number ? new $util.LongBits(message.senderTimestampMs.low >>> 0, message.senderTimestampMs.high >>> 0).toNumber() : message.senderTimestampMs; + return object; + }; + + /** + * Converts this ReactionMessage to JSON. + * @function toJSON + * @memberof proto.Message.ReactionMessage + * @instance + * @returns {Object.} JSON object + */ + ReactionMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ReactionMessage; + })(); + + Message.RequestPaymentMessage = (function() { + + /** + * Properties of a RequestPaymentMessage. + * @memberof proto.Message + * @interface IRequestPaymentMessage + * @property {proto.IMessage|null} [noteMessage] RequestPaymentMessage noteMessage + * @property {string|null} [currencyCodeIso4217] RequestPaymentMessage currencyCodeIso4217 + * @property {number|Long|null} [amount1000] RequestPaymentMessage amount1000 + * @property {string|null} [requestFrom] RequestPaymentMessage requestFrom + * @property {number|Long|null} [expiryTimestamp] RequestPaymentMessage expiryTimestamp + * @property {proto.IMoney|null} [amount] RequestPaymentMessage amount + * @property {proto.IPaymentBackground|null} [background] RequestPaymentMessage background + */ + + /** + * Constructs a new RequestPaymentMessage. + * @memberof proto.Message + * @classdesc Represents a RequestPaymentMessage. + * @implements IRequestPaymentMessage + * @constructor + * @param {proto.Message.IRequestPaymentMessage=} [properties] Properties to set + */ + function RequestPaymentMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RequestPaymentMessage noteMessage. + * @member {proto.IMessage|null|undefined} noteMessage + * @memberof proto.Message.RequestPaymentMessage + * @instance + */ + RequestPaymentMessage.prototype.noteMessage = null; + + /** + * RequestPaymentMessage currencyCodeIso4217. + * @member {string} currencyCodeIso4217 + * @memberof proto.Message.RequestPaymentMessage + * @instance + */ + RequestPaymentMessage.prototype.currencyCodeIso4217 = ""; + + /** + * RequestPaymentMessage amount1000. + * @member {number|Long} amount1000 + * @memberof proto.Message.RequestPaymentMessage + * @instance + */ + RequestPaymentMessage.prototype.amount1000 = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * RequestPaymentMessage requestFrom. + * @member {string} requestFrom + * @memberof proto.Message.RequestPaymentMessage + * @instance + */ + RequestPaymentMessage.prototype.requestFrom = ""; + + /** + * RequestPaymentMessage expiryTimestamp. + * @member {number|Long} expiryTimestamp + * @memberof proto.Message.RequestPaymentMessage + * @instance + */ + RequestPaymentMessage.prototype.expiryTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * RequestPaymentMessage amount. + * @member {proto.IMoney|null|undefined} amount + * @memberof proto.Message.RequestPaymentMessage + * @instance + */ + RequestPaymentMessage.prototype.amount = null; + + /** + * RequestPaymentMessage background. + * @member {proto.IPaymentBackground|null|undefined} background + * @memberof proto.Message.RequestPaymentMessage + * @instance + */ + RequestPaymentMessage.prototype.background = null; + + /** + * Creates a new RequestPaymentMessage instance using the specified properties. + * @function create + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {proto.Message.IRequestPaymentMessage=} [properties] Properties to set + * @returns {proto.Message.RequestPaymentMessage} RequestPaymentMessage instance + */ + RequestPaymentMessage.create = function create(properties) { + return new RequestPaymentMessage(properties); + }; + + /** + * Encodes the specified RequestPaymentMessage message. Does not implicitly {@link proto.Message.RequestPaymentMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {proto.Message.IRequestPaymentMessage} message RequestPaymentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestPaymentMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.currencyCodeIso4217 != null && Object.hasOwnProperty.call(message, "currencyCodeIso4217")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.currencyCodeIso4217); + if (message.amount1000 != null && Object.hasOwnProperty.call(message, "amount1000")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.amount1000); + if (message.requestFrom != null && Object.hasOwnProperty.call(message, "requestFrom")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.requestFrom); + if (message.noteMessage != null && Object.hasOwnProperty.call(message, "noteMessage")) + $root.proto.Message.encode(message.noteMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.expiryTimestamp != null && Object.hasOwnProperty.call(message, "expiryTimestamp")) + writer.uint32(/* id 5, wireType 0 =*/40).int64(message.expiryTimestamp); + if (message.amount != null && Object.hasOwnProperty.call(message, "amount")) + $root.proto.Money.encode(message.amount, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.background != null && Object.hasOwnProperty.call(message, "background")) + $root.proto.PaymentBackground.encode(message.background, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified RequestPaymentMessage message, length delimited. Does not implicitly {@link proto.Message.RequestPaymentMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {proto.Message.IRequestPaymentMessage} message RequestPaymentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestPaymentMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RequestPaymentMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.RequestPaymentMessage} RequestPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestPaymentMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.RequestPaymentMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 4: + message.noteMessage = $root.proto.Message.decode(reader, reader.uint32()); + break; + case 1: + message.currencyCodeIso4217 = reader.string(); + break; + case 2: + message.amount1000 = reader.uint64(); + break; + case 3: + message.requestFrom = reader.string(); + break; + case 5: + message.expiryTimestamp = reader.int64(); + break; + case 6: + message.amount = $root.proto.Money.decode(reader, reader.uint32()); + break; + case 7: + message.background = $root.proto.PaymentBackground.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RequestPaymentMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.RequestPaymentMessage} RequestPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestPaymentMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RequestPaymentMessage message. + * @function verify + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RequestPaymentMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.noteMessage != null && message.hasOwnProperty("noteMessage")) { + var error = $root.proto.Message.verify(message.noteMessage); + if (error) + return "noteMessage." + error; + } + if (message.currencyCodeIso4217 != null && message.hasOwnProperty("currencyCodeIso4217")) + if (!$util.isString(message.currencyCodeIso4217)) + return "currencyCodeIso4217: string expected"; + if (message.amount1000 != null && message.hasOwnProperty("amount1000")) + if (!$util.isInteger(message.amount1000) && !(message.amount1000 && $util.isInteger(message.amount1000.low) && $util.isInteger(message.amount1000.high))) + return "amount1000: integer|Long expected"; + if (message.requestFrom != null && message.hasOwnProperty("requestFrom")) + if (!$util.isString(message.requestFrom)) + return "requestFrom: string expected"; + if (message.expiryTimestamp != null && message.hasOwnProperty("expiryTimestamp")) + if (!$util.isInteger(message.expiryTimestamp) && !(message.expiryTimestamp && $util.isInteger(message.expiryTimestamp.low) && $util.isInteger(message.expiryTimestamp.high))) + return "expiryTimestamp: integer|Long expected"; + if (message.amount != null && message.hasOwnProperty("amount")) { + var error = $root.proto.Money.verify(message.amount); + if (error) + return "amount." + error; + } + if (message.background != null && message.hasOwnProperty("background")) { + var error = $root.proto.PaymentBackground.verify(message.background); + if (error) + return "background." + error; + } + return null; + }; + + /** + * Creates a RequestPaymentMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.RequestPaymentMessage} RequestPaymentMessage + */ + RequestPaymentMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.RequestPaymentMessage) + return object; + var message = new $root.proto.Message.RequestPaymentMessage(); + if (object.noteMessage != null) { + if (typeof object.noteMessage !== "object") + throw TypeError(".proto.Message.RequestPaymentMessage.noteMessage: object expected"); + message.noteMessage = $root.proto.Message.fromObject(object.noteMessage); + } + if (object.currencyCodeIso4217 != null) + message.currencyCodeIso4217 = String(object.currencyCodeIso4217); + if (object.amount1000 != null) + if ($util.Long) + (message.amount1000 = $util.Long.fromValue(object.amount1000)).unsigned = true; + else if (typeof object.amount1000 === "string") + message.amount1000 = parseInt(object.amount1000, 10); + else if (typeof object.amount1000 === "number") + message.amount1000 = object.amount1000; + else if (typeof object.amount1000 === "object") + message.amount1000 = new $util.LongBits(object.amount1000.low >>> 0, object.amount1000.high >>> 0).toNumber(true); + if (object.requestFrom != null) + message.requestFrom = String(object.requestFrom); + if (object.expiryTimestamp != null) + if ($util.Long) + (message.expiryTimestamp = $util.Long.fromValue(object.expiryTimestamp)).unsigned = false; + else if (typeof object.expiryTimestamp === "string") + message.expiryTimestamp = parseInt(object.expiryTimestamp, 10); + else if (typeof object.expiryTimestamp === "number") + message.expiryTimestamp = object.expiryTimestamp; + else if (typeof object.expiryTimestamp === "object") + message.expiryTimestamp = new $util.LongBits(object.expiryTimestamp.low >>> 0, object.expiryTimestamp.high >>> 0).toNumber(); + if (object.amount != null) { + if (typeof object.amount !== "object") + throw TypeError(".proto.Message.RequestPaymentMessage.amount: object expected"); + message.amount = $root.proto.Money.fromObject(object.amount); + } + if (object.background != null) { + if (typeof object.background !== "object") + throw TypeError(".proto.Message.RequestPaymentMessage.background: object expected"); + message.background = $root.proto.PaymentBackground.fromObject(object.background); + } + return message; + }; + + /** + * Creates a plain object from a RequestPaymentMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.RequestPaymentMessage + * @static + * @param {proto.Message.RequestPaymentMessage} message RequestPaymentMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RequestPaymentMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.currencyCodeIso4217 = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.amount1000 = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount1000 = options.longs === String ? "0" : 0; + object.requestFrom = ""; + object.noteMessage = null; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.expiryTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.expiryTimestamp = options.longs === String ? "0" : 0; + object.amount = null; + object.background = null; + } + if (message.currencyCodeIso4217 != null && message.hasOwnProperty("currencyCodeIso4217")) + object.currencyCodeIso4217 = message.currencyCodeIso4217; + if (message.amount1000 != null && message.hasOwnProperty("amount1000")) + if (typeof message.amount1000 === "number") + object.amount1000 = options.longs === String ? String(message.amount1000) : message.amount1000; + else + object.amount1000 = options.longs === String ? $util.Long.prototype.toString.call(message.amount1000) : options.longs === Number ? new $util.LongBits(message.amount1000.low >>> 0, message.amount1000.high >>> 0).toNumber(true) : message.amount1000; + if (message.requestFrom != null && message.hasOwnProperty("requestFrom")) + object.requestFrom = message.requestFrom; + if (message.noteMessage != null && message.hasOwnProperty("noteMessage")) + object.noteMessage = $root.proto.Message.toObject(message.noteMessage, options); + if (message.expiryTimestamp != null && message.hasOwnProperty("expiryTimestamp")) + if (typeof message.expiryTimestamp === "number") + object.expiryTimestamp = options.longs === String ? String(message.expiryTimestamp) : message.expiryTimestamp; + else + object.expiryTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.expiryTimestamp) : options.longs === Number ? new $util.LongBits(message.expiryTimestamp.low >>> 0, message.expiryTimestamp.high >>> 0).toNumber() : message.expiryTimestamp; + if (message.amount != null && message.hasOwnProperty("amount")) + object.amount = $root.proto.Money.toObject(message.amount, options); + if (message.background != null && message.hasOwnProperty("background")) + object.background = $root.proto.PaymentBackground.toObject(message.background, options); + return object; + }; + + /** + * Converts this RequestPaymentMessage to JSON. + * @function toJSON + * @memberof proto.Message.RequestPaymentMessage + * @instance + * @returns {Object.} JSON object + */ + RequestPaymentMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RequestPaymentMessage; + })(); + + Message.RequestPhoneNumberMessage = (function() { + + /** + * Properties of a RequestPhoneNumberMessage. + * @memberof proto.Message + * @interface IRequestPhoneNumberMessage + * @property {proto.IContextInfo|null} [contextInfo] RequestPhoneNumberMessage contextInfo + */ + + /** + * Constructs a new RequestPhoneNumberMessage. + * @memberof proto.Message + * @classdesc Represents a RequestPhoneNumberMessage. + * @implements IRequestPhoneNumberMessage + * @constructor + * @param {proto.Message.IRequestPhoneNumberMessage=} [properties] Properties to set + */ + function RequestPhoneNumberMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RequestPhoneNumberMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.RequestPhoneNumberMessage + * @instance + */ + RequestPhoneNumberMessage.prototype.contextInfo = null; + + /** + * Creates a new RequestPhoneNumberMessage instance using the specified properties. + * @function create + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {proto.Message.IRequestPhoneNumberMessage=} [properties] Properties to set + * @returns {proto.Message.RequestPhoneNumberMessage} RequestPhoneNumberMessage instance + */ + RequestPhoneNumberMessage.create = function create(properties) { + return new RequestPhoneNumberMessage(properties); + }; + + /** + * Encodes the specified RequestPhoneNumberMessage message. Does not implicitly {@link proto.Message.RequestPhoneNumberMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {proto.Message.IRequestPhoneNumberMessage} message RequestPhoneNumberMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestPhoneNumberMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified RequestPhoneNumberMessage message, length delimited. Does not implicitly {@link proto.Message.RequestPhoneNumberMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {proto.Message.IRequestPhoneNumberMessage} message RequestPhoneNumberMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RequestPhoneNumberMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RequestPhoneNumberMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.RequestPhoneNumberMessage} RequestPhoneNumberMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestPhoneNumberMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.RequestPhoneNumberMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RequestPhoneNumberMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.RequestPhoneNumberMessage} RequestPhoneNumberMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RequestPhoneNumberMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RequestPhoneNumberMessage message. + * @function verify + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RequestPhoneNumberMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + return null; + }; + + /** + * Creates a RequestPhoneNumberMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.RequestPhoneNumberMessage} RequestPhoneNumberMessage + */ + RequestPhoneNumberMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.RequestPhoneNumberMessage) + return object; + var message = new $root.proto.Message.RequestPhoneNumberMessage(); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.RequestPhoneNumberMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + return message; + }; + + /** + * Creates a plain object from a RequestPhoneNumberMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.RequestPhoneNumberMessage + * @static + * @param {proto.Message.RequestPhoneNumberMessage} message RequestPhoneNumberMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RequestPhoneNumberMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.contextInfo = null; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + return object; + }; + + /** + * Converts this RequestPhoneNumberMessage to JSON. + * @function toJSON + * @memberof proto.Message.RequestPhoneNumberMessage + * @instance + * @returns {Object.} JSON object + */ + RequestPhoneNumberMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RequestPhoneNumberMessage; + })(); + + Message.SendPaymentMessage = (function() { + + /** + * Properties of a SendPaymentMessage. + * @memberof proto.Message + * @interface ISendPaymentMessage + * @property {proto.IMessage|null} [noteMessage] SendPaymentMessage noteMessage + * @property {proto.IMessageKey|null} [requestMessageKey] SendPaymentMessage requestMessageKey + * @property {proto.IPaymentBackground|null} [background] SendPaymentMessage background + */ + + /** + * Constructs a new SendPaymentMessage. + * @memberof proto.Message + * @classdesc Represents a SendPaymentMessage. + * @implements ISendPaymentMessage + * @constructor + * @param {proto.Message.ISendPaymentMessage=} [properties] Properties to set + */ + function SendPaymentMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SendPaymentMessage noteMessage. + * @member {proto.IMessage|null|undefined} noteMessage + * @memberof proto.Message.SendPaymentMessage + * @instance + */ + SendPaymentMessage.prototype.noteMessage = null; + + /** + * SendPaymentMessage requestMessageKey. + * @member {proto.IMessageKey|null|undefined} requestMessageKey + * @memberof proto.Message.SendPaymentMessage + * @instance + */ + SendPaymentMessage.prototype.requestMessageKey = null; + + /** + * SendPaymentMessage background. + * @member {proto.IPaymentBackground|null|undefined} background + * @memberof proto.Message.SendPaymentMessage + * @instance + */ + SendPaymentMessage.prototype.background = null; + + /** + * Creates a new SendPaymentMessage instance using the specified properties. + * @function create + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {proto.Message.ISendPaymentMessage=} [properties] Properties to set + * @returns {proto.Message.SendPaymentMessage} SendPaymentMessage instance + */ + SendPaymentMessage.create = function create(properties) { + return new SendPaymentMessage(properties); + }; + + /** + * Encodes the specified SendPaymentMessage message. Does not implicitly {@link proto.Message.SendPaymentMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {proto.Message.ISendPaymentMessage} message SendPaymentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SendPaymentMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.noteMessage != null && Object.hasOwnProperty.call(message, "noteMessage")) + $root.proto.Message.encode(message.noteMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.requestMessageKey != null && Object.hasOwnProperty.call(message, "requestMessageKey")) + $root.proto.MessageKey.encode(message.requestMessageKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.background != null && Object.hasOwnProperty.call(message, "background")) + $root.proto.PaymentBackground.encode(message.background, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SendPaymentMessage message, length delimited. Does not implicitly {@link proto.Message.SendPaymentMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {proto.Message.ISendPaymentMessage} message SendPaymentMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SendPaymentMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SendPaymentMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.SendPaymentMessage} SendPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SendPaymentMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.SendPaymentMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 2: + message.noteMessage = $root.proto.Message.decode(reader, reader.uint32()); + break; + case 3: + message.requestMessageKey = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 4: + message.background = $root.proto.PaymentBackground.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SendPaymentMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.SendPaymentMessage} SendPaymentMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SendPaymentMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SendPaymentMessage message. + * @function verify + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SendPaymentMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.noteMessage != null && message.hasOwnProperty("noteMessage")) { + var error = $root.proto.Message.verify(message.noteMessage); + if (error) + return "noteMessage." + error; + } + if (message.requestMessageKey != null && message.hasOwnProperty("requestMessageKey")) { + var error = $root.proto.MessageKey.verify(message.requestMessageKey); + if (error) + return "requestMessageKey." + error; + } + if (message.background != null && message.hasOwnProperty("background")) { + var error = $root.proto.PaymentBackground.verify(message.background); + if (error) + return "background." + error; + } + return null; + }; + + /** + * Creates a SendPaymentMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.SendPaymentMessage} SendPaymentMessage + */ + SendPaymentMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.SendPaymentMessage) + return object; + var message = new $root.proto.Message.SendPaymentMessage(); + if (object.noteMessage != null) { + if (typeof object.noteMessage !== "object") + throw TypeError(".proto.Message.SendPaymentMessage.noteMessage: object expected"); + message.noteMessage = $root.proto.Message.fromObject(object.noteMessage); + } + if (object.requestMessageKey != null) { + if (typeof object.requestMessageKey !== "object") + throw TypeError(".proto.Message.SendPaymentMessage.requestMessageKey: object expected"); + message.requestMessageKey = $root.proto.MessageKey.fromObject(object.requestMessageKey); + } + if (object.background != null) { + if (typeof object.background !== "object") + throw TypeError(".proto.Message.SendPaymentMessage.background: object expected"); + message.background = $root.proto.PaymentBackground.fromObject(object.background); + } + return message; + }; + + /** + * Creates a plain object from a SendPaymentMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.SendPaymentMessage + * @static + * @param {proto.Message.SendPaymentMessage} message SendPaymentMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SendPaymentMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.noteMessage = null; + object.requestMessageKey = null; + object.background = null; + } + if (message.noteMessage != null && message.hasOwnProperty("noteMessage")) + object.noteMessage = $root.proto.Message.toObject(message.noteMessage, options); + if (message.requestMessageKey != null && message.hasOwnProperty("requestMessageKey")) + object.requestMessageKey = $root.proto.MessageKey.toObject(message.requestMessageKey, options); + if (message.background != null && message.hasOwnProperty("background")) + object.background = $root.proto.PaymentBackground.toObject(message.background, options); + return object; + }; + + /** + * Converts this SendPaymentMessage to JSON. + * @function toJSON + * @memberof proto.Message.SendPaymentMessage + * @instance + * @returns {Object.} JSON object + */ + SendPaymentMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SendPaymentMessage; + })(); + + Message.SenderKeyDistributionMessage = (function() { + + /** + * Properties of a SenderKeyDistributionMessage. + * @memberof proto.Message + * @interface ISenderKeyDistributionMessage + * @property {string|null} [groupId] SenderKeyDistributionMessage groupId + * @property {Uint8Array|null} [axolotlSenderKeyDistributionMessage] SenderKeyDistributionMessage axolotlSenderKeyDistributionMessage + */ + + /** + * Constructs a new SenderKeyDistributionMessage. + * @memberof proto.Message + * @classdesc Represents a SenderKeyDistributionMessage. + * @implements ISenderKeyDistributionMessage + * @constructor + * @param {proto.Message.ISenderKeyDistributionMessage=} [properties] Properties to set + */ + function SenderKeyDistributionMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderKeyDistributionMessage groupId. + * @member {string} groupId + * @memberof proto.Message.SenderKeyDistributionMessage + * @instance + */ + SenderKeyDistributionMessage.prototype.groupId = ""; + + /** + * SenderKeyDistributionMessage axolotlSenderKeyDistributionMessage. + * @member {Uint8Array} axolotlSenderKeyDistributionMessage + * @memberof proto.Message.SenderKeyDistributionMessage + * @instance + */ + SenderKeyDistributionMessage.prototype.axolotlSenderKeyDistributionMessage = $util.newBuffer([]); + + /** + * Creates a new SenderKeyDistributionMessage instance using the specified properties. + * @function create + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {proto.Message.ISenderKeyDistributionMessage=} [properties] Properties to set + * @returns {proto.Message.SenderKeyDistributionMessage} SenderKeyDistributionMessage instance + */ + SenderKeyDistributionMessage.create = function create(properties) { + return new SenderKeyDistributionMessage(properties); + }; + + /** + * Encodes the specified SenderKeyDistributionMessage message. Does not implicitly {@link proto.Message.SenderKeyDistributionMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {proto.Message.ISenderKeyDistributionMessage} message SenderKeyDistributionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyDistributionMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupId != null && Object.hasOwnProperty.call(message, "groupId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.groupId); + if (message.axolotlSenderKeyDistributionMessage != null && Object.hasOwnProperty.call(message, "axolotlSenderKeyDistributionMessage")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.axolotlSenderKeyDistributionMessage); + return writer; + }; + + /** + * Encodes the specified SenderKeyDistributionMessage message, length delimited. Does not implicitly {@link proto.Message.SenderKeyDistributionMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {proto.Message.ISenderKeyDistributionMessage} message SenderKeyDistributionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyDistributionMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderKeyDistributionMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.SenderKeyDistributionMessage} SenderKeyDistributionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyDistributionMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.SenderKeyDistributionMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupId = reader.string(); + break; + case 2: + message.axolotlSenderKeyDistributionMessage = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderKeyDistributionMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.SenderKeyDistributionMessage} SenderKeyDistributionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyDistributionMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderKeyDistributionMessage message. + * @function verify + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderKeyDistributionMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.groupId != null && message.hasOwnProperty("groupId")) + if (!$util.isString(message.groupId)) + return "groupId: string expected"; + if (message.axolotlSenderKeyDistributionMessage != null && message.hasOwnProperty("axolotlSenderKeyDistributionMessage")) + if (!(message.axolotlSenderKeyDistributionMessage && typeof message.axolotlSenderKeyDistributionMessage.length === "number" || $util.isString(message.axolotlSenderKeyDistributionMessage))) + return "axolotlSenderKeyDistributionMessage: buffer expected"; + return null; + }; + + /** + * Creates a SenderKeyDistributionMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.SenderKeyDistributionMessage} SenderKeyDistributionMessage + */ + SenderKeyDistributionMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.SenderKeyDistributionMessage) + return object; + var message = new $root.proto.Message.SenderKeyDistributionMessage(); + if (object.groupId != null) + message.groupId = String(object.groupId); + if (object.axolotlSenderKeyDistributionMessage != null) + if (typeof object.axolotlSenderKeyDistributionMessage === "string") + $util.base64.decode(object.axolotlSenderKeyDistributionMessage, message.axolotlSenderKeyDistributionMessage = $util.newBuffer($util.base64.length(object.axolotlSenderKeyDistributionMessage)), 0); + else if (object.axolotlSenderKeyDistributionMessage.length) + message.axolotlSenderKeyDistributionMessage = object.axolotlSenderKeyDistributionMessage; + return message; + }; + + /** + * Creates a plain object from a SenderKeyDistributionMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.SenderKeyDistributionMessage + * @static + * @param {proto.Message.SenderKeyDistributionMessage} message SenderKeyDistributionMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderKeyDistributionMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.groupId = ""; + if (options.bytes === String) + object.axolotlSenderKeyDistributionMessage = ""; + else { + object.axolotlSenderKeyDistributionMessage = []; + if (options.bytes !== Array) + object.axolotlSenderKeyDistributionMessage = $util.newBuffer(object.axolotlSenderKeyDistributionMessage); + } + } + if (message.groupId != null && message.hasOwnProperty("groupId")) + object.groupId = message.groupId; + if (message.axolotlSenderKeyDistributionMessage != null && message.hasOwnProperty("axolotlSenderKeyDistributionMessage")) + object.axolotlSenderKeyDistributionMessage = options.bytes === String ? $util.base64.encode(message.axolotlSenderKeyDistributionMessage, 0, message.axolotlSenderKeyDistributionMessage.length) : options.bytes === Array ? Array.prototype.slice.call(message.axolotlSenderKeyDistributionMessage) : message.axolotlSenderKeyDistributionMessage; + return object; + }; + + /** + * Converts this SenderKeyDistributionMessage to JSON. + * @function toJSON + * @memberof proto.Message.SenderKeyDistributionMessage + * @instance + * @returns {Object.} JSON object + */ + SenderKeyDistributionMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderKeyDistributionMessage; + })(); + + Message.StickerMessage = (function() { + + /** + * Properties of a StickerMessage. + * @memberof proto.Message + * @interface IStickerMessage + * @property {string|null} [url] StickerMessage url + * @property {Uint8Array|null} [fileSha256] StickerMessage fileSha256 + * @property {Uint8Array|null} [fileEncSha256] StickerMessage fileEncSha256 + * @property {Uint8Array|null} [mediaKey] StickerMessage mediaKey + * @property {string|null} [mimetype] StickerMessage mimetype + * @property {number|null} [height] StickerMessage height + * @property {number|null} [width] StickerMessage width + * @property {string|null} [directPath] StickerMessage directPath + * @property {number|Long|null} [fileLength] StickerMessage fileLength + * @property {number|Long|null} [mediaKeyTimestamp] StickerMessage mediaKeyTimestamp + * @property {number|null} [firstFrameLength] StickerMessage firstFrameLength + * @property {Uint8Array|null} [firstFrameSidecar] StickerMessage firstFrameSidecar + * @property {boolean|null} [isAnimated] StickerMessage isAnimated + * @property {Uint8Array|null} [pngThumbnail] StickerMessage pngThumbnail + * @property {proto.IContextInfo|null} [contextInfo] StickerMessage contextInfo + * @property {number|Long|null} [stickerSentTs] StickerMessage stickerSentTs + * @property {boolean|null} [isAvatar] StickerMessage isAvatar + */ + + /** + * Constructs a new StickerMessage. + * @memberof proto.Message + * @classdesc Represents a StickerMessage. + * @implements IStickerMessage + * @constructor + * @param {proto.Message.IStickerMessage=} [properties] Properties to set + */ + function StickerMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StickerMessage url. + * @member {string} url + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.url = ""; + + /** + * StickerMessage fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.fileSha256 = $util.newBuffer([]); + + /** + * StickerMessage fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * StickerMessage mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.mediaKey = $util.newBuffer([]); + + /** + * StickerMessage mimetype. + * @member {string} mimetype + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.mimetype = ""; + + /** + * StickerMessage height. + * @member {number} height + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.height = 0; + + /** + * StickerMessage width. + * @member {number} width + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.width = 0; + + /** + * StickerMessage directPath. + * @member {string} directPath + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.directPath = ""; + + /** + * StickerMessage fileLength. + * @member {number|Long} fileLength + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * StickerMessage mediaKeyTimestamp. + * @member {number|Long} mediaKeyTimestamp + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.mediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * StickerMessage firstFrameLength. + * @member {number} firstFrameLength + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.firstFrameLength = 0; + + /** + * StickerMessage firstFrameSidecar. + * @member {Uint8Array} firstFrameSidecar + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.firstFrameSidecar = $util.newBuffer([]); + + /** + * StickerMessage isAnimated. + * @member {boolean} isAnimated + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.isAnimated = false; + + /** + * StickerMessage pngThumbnail. + * @member {Uint8Array} pngThumbnail + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.pngThumbnail = $util.newBuffer([]); + + /** + * StickerMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.contextInfo = null; + + /** + * StickerMessage stickerSentTs. + * @member {number|Long} stickerSentTs + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.stickerSentTs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * StickerMessage isAvatar. + * @member {boolean} isAvatar + * @memberof proto.Message.StickerMessage + * @instance + */ + StickerMessage.prototype.isAvatar = false; + + /** + * Creates a new StickerMessage instance using the specified properties. + * @function create + * @memberof proto.Message.StickerMessage + * @static + * @param {proto.Message.IStickerMessage=} [properties] Properties to set + * @returns {proto.Message.StickerMessage} StickerMessage instance + */ + StickerMessage.create = function create(properties) { + return new StickerMessage(properties); + }; + + /** + * Encodes the specified StickerMessage message. Does not implicitly {@link proto.Message.StickerMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.StickerMessage + * @static + * @param {proto.Message.IStickerMessage} message StickerMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.fileSha256); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.fileEncSha256); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.mediaKey); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.mimetype); + if (message.height != null && Object.hasOwnProperty.call(message, "height")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.height); + if (message.width != null && Object.hasOwnProperty.call(message, "width")) + writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.width); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.directPath); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 9, wireType 0 =*/72).uint64(message.fileLength); + if (message.mediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "mediaKeyTimestamp")) + writer.uint32(/* id 10, wireType 0 =*/80).int64(message.mediaKeyTimestamp); + if (message.firstFrameLength != null && Object.hasOwnProperty.call(message, "firstFrameLength")) + writer.uint32(/* id 11, wireType 0 =*/88).uint32(message.firstFrameLength); + if (message.firstFrameSidecar != null && Object.hasOwnProperty.call(message, "firstFrameSidecar")) + writer.uint32(/* id 12, wireType 2 =*/98).bytes(message.firstFrameSidecar); + if (message.isAnimated != null && Object.hasOwnProperty.call(message, "isAnimated")) + writer.uint32(/* id 13, wireType 0 =*/104).bool(message.isAnimated); + if (message.pngThumbnail != null && Object.hasOwnProperty.call(message, "pngThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.pngThumbnail); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.stickerSentTs != null && Object.hasOwnProperty.call(message, "stickerSentTs")) + writer.uint32(/* id 18, wireType 0 =*/144).int64(message.stickerSentTs); + if (message.isAvatar != null && Object.hasOwnProperty.call(message, "isAvatar")) + writer.uint32(/* id 19, wireType 0 =*/152).bool(message.isAvatar); + return writer; + }; + + /** + * Encodes the specified StickerMessage message, length delimited. Does not implicitly {@link proto.Message.StickerMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.StickerMessage + * @static + * @param {proto.Message.IStickerMessage} message StickerMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StickerMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.StickerMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.StickerMessage} StickerMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.StickerMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.fileSha256 = reader.bytes(); + break; + case 3: + message.fileEncSha256 = reader.bytes(); + break; + case 4: + message.mediaKey = reader.bytes(); + break; + case 5: + message.mimetype = reader.string(); + break; + case 6: + message.height = reader.uint32(); + break; + case 7: + message.width = reader.uint32(); + break; + case 8: + message.directPath = reader.string(); + break; + case 9: + message.fileLength = reader.uint64(); + break; + case 10: + message.mediaKeyTimestamp = reader.int64(); + break; + case 11: + message.firstFrameLength = reader.uint32(); + break; + case 12: + message.firstFrameSidecar = reader.bytes(); + break; + case 13: + message.isAnimated = reader.bool(); + break; + case 16: + message.pngThumbnail = reader.bytes(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 18: + message.stickerSentTs = reader.int64(); + break; + case 19: + message.isAvatar = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StickerMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.StickerMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.StickerMessage} StickerMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StickerMessage message. + * @function verify + * @memberof proto.Message.StickerMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StickerMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + if (message.width != null && message.hasOwnProperty("width")) + if (!$util.isInteger(message.width)) + return "width: integer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (!$util.isInteger(message.mediaKeyTimestamp) && !(message.mediaKeyTimestamp && $util.isInteger(message.mediaKeyTimestamp.low) && $util.isInteger(message.mediaKeyTimestamp.high))) + return "mediaKeyTimestamp: integer|Long expected"; + if (message.firstFrameLength != null && message.hasOwnProperty("firstFrameLength")) + if (!$util.isInteger(message.firstFrameLength)) + return "firstFrameLength: integer expected"; + if (message.firstFrameSidecar != null && message.hasOwnProperty("firstFrameSidecar")) + if (!(message.firstFrameSidecar && typeof message.firstFrameSidecar.length === "number" || $util.isString(message.firstFrameSidecar))) + return "firstFrameSidecar: buffer expected"; + if (message.isAnimated != null && message.hasOwnProperty("isAnimated")) + if (typeof message.isAnimated !== "boolean") + return "isAnimated: boolean expected"; + if (message.pngThumbnail != null && message.hasOwnProperty("pngThumbnail")) + if (!(message.pngThumbnail && typeof message.pngThumbnail.length === "number" || $util.isString(message.pngThumbnail))) + return "pngThumbnail: buffer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.stickerSentTs != null && message.hasOwnProperty("stickerSentTs")) + if (!$util.isInteger(message.stickerSentTs) && !(message.stickerSentTs && $util.isInteger(message.stickerSentTs.low) && $util.isInteger(message.stickerSentTs.high))) + return "stickerSentTs: integer|Long expected"; + if (message.isAvatar != null && message.hasOwnProperty("isAvatar")) + if (typeof message.isAvatar !== "boolean") + return "isAvatar: boolean expected"; + return null; + }; + + /** + * Creates a StickerMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.StickerMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.StickerMessage} StickerMessage + */ + StickerMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.StickerMessage) + return object; + var message = new $root.proto.Message.StickerMessage(); + if (object.url != null) + message.url = String(object.url); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.height != null) + message.height = object.height >>> 0; + if (object.width != null) + message.width = object.width >>> 0; + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.mediaKeyTimestamp != null) + if ($util.Long) + (message.mediaKeyTimestamp = $util.Long.fromValue(object.mediaKeyTimestamp)).unsigned = false; + else if (typeof object.mediaKeyTimestamp === "string") + message.mediaKeyTimestamp = parseInt(object.mediaKeyTimestamp, 10); + else if (typeof object.mediaKeyTimestamp === "number") + message.mediaKeyTimestamp = object.mediaKeyTimestamp; + else if (typeof object.mediaKeyTimestamp === "object") + message.mediaKeyTimestamp = new $util.LongBits(object.mediaKeyTimestamp.low >>> 0, object.mediaKeyTimestamp.high >>> 0).toNumber(); + if (object.firstFrameLength != null) + message.firstFrameLength = object.firstFrameLength >>> 0; + if (object.firstFrameSidecar != null) + if (typeof object.firstFrameSidecar === "string") + $util.base64.decode(object.firstFrameSidecar, message.firstFrameSidecar = $util.newBuffer($util.base64.length(object.firstFrameSidecar)), 0); + else if (object.firstFrameSidecar.length) + message.firstFrameSidecar = object.firstFrameSidecar; + if (object.isAnimated != null) + message.isAnimated = Boolean(object.isAnimated); + if (object.pngThumbnail != null) + if (typeof object.pngThumbnail === "string") + $util.base64.decode(object.pngThumbnail, message.pngThumbnail = $util.newBuffer($util.base64.length(object.pngThumbnail)), 0); + else if (object.pngThumbnail.length) + message.pngThumbnail = object.pngThumbnail; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.StickerMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.stickerSentTs != null) + if ($util.Long) + (message.stickerSentTs = $util.Long.fromValue(object.stickerSentTs)).unsigned = false; + else if (typeof object.stickerSentTs === "string") + message.stickerSentTs = parseInt(object.stickerSentTs, 10); + else if (typeof object.stickerSentTs === "number") + message.stickerSentTs = object.stickerSentTs; + else if (typeof object.stickerSentTs === "object") + message.stickerSentTs = new $util.LongBits(object.stickerSentTs.low >>> 0, object.stickerSentTs.high >>> 0).toNumber(); + if (object.isAvatar != null) + message.isAvatar = Boolean(object.isAvatar); + return message; + }; + + /** + * Creates a plain object from a StickerMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.StickerMessage + * @static + * @param {proto.Message.StickerMessage} message StickerMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StickerMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = ""; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + object.mimetype = ""; + object.height = 0; + object.width = 0; + object.directPath = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.mediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.mediaKeyTimestamp = options.longs === String ? "0" : 0; + object.firstFrameLength = 0; + if (options.bytes === String) + object.firstFrameSidecar = ""; + else { + object.firstFrameSidecar = []; + if (options.bytes !== Array) + object.firstFrameSidecar = $util.newBuffer(object.firstFrameSidecar); + } + object.isAnimated = false; + if (options.bytes === String) + object.pngThumbnail = ""; + else { + object.pngThumbnail = []; + if (options.bytes !== Array) + object.pngThumbnail = $util.newBuffer(object.pngThumbnail); + } + object.contextInfo = null; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.stickerSentTs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.stickerSentTs = options.longs === String ? "0" : 0; + object.isAvatar = false; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + if (message.width != null && message.hasOwnProperty("width")) + object.width = message.width; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (typeof message.mediaKeyTimestamp === "number") + object.mediaKeyTimestamp = options.longs === String ? String(message.mediaKeyTimestamp) : message.mediaKeyTimestamp; + else + object.mediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.mediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.mediaKeyTimestamp.low >>> 0, message.mediaKeyTimestamp.high >>> 0).toNumber() : message.mediaKeyTimestamp; + if (message.firstFrameLength != null && message.hasOwnProperty("firstFrameLength")) + object.firstFrameLength = message.firstFrameLength; + if (message.firstFrameSidecar != null && message.hasOwnProperty("firstFrameSidecar")) + object.firstFrameSidecar = options.bytes === String ? $util.base64.encode(message.firstFrameSidecar, 0, message.firstFrameSidecar.length) : options.bytes === Array ? Array.prototype.slice.call(message.firstFrameSidecar) : message.firstFrameSidecar; + if (message.isAnimated != null && message.hasOwnProperty("isAnimated")) + object.isAnimated = message.isAnimated; + if (message.pngThumbnail != null && message.hasOwnProperty("pngThumbnail")) + object.pngThumbnail = options.bytes === String ? $util.base64.encode(message.pngThumbnail, 0, message.pngThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.pngThumbnail) : message.pngThumbnail; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.stickerSentTs != null && message.hasOwnProperty("stickerSentTs")) + if (typeof message.stickerSentTs === "number") + object.stickerSentTs = options.longs === String ? String(message.stickerSentTs) : message.stickerSentTs; + else + object.stickerSentTs = options.longs === String ? $util.Long.prototype.toString.call(message.stickerSentTs) : options.longs === Number ? new $util.LongBits(message.stickerSentTs.low >>> 0, message.stickerSentTs.high >>> 0).toNumber() : message.stickerSentTs; + if (message.isAvatar != null && message.hasOwnProperty("isAvatar")) + object.isAvatar = message.isAvatar; + return object; + }; + + /** + * Converts this StickerMessage to JSON. + * @function toJSON + * @memberof proto.Message.StickerMessage + * @instance + * @returns {Object.} JSON object + */ + StickerMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StickerMessage; + })(); + + Message.StickerSyncRMRMessage = (function() { + + /** + * Properties of a StickerSyncRMRMessage. + * @memberof proto.Message + * @interface IStickerSyncRMRMessage + * @property {Array.|null} [filehash] StickerSyncRMRMessage filehash + * @property {string|null} [rmrSource] StickerSyncRMRMessage rmrSource + * @property {number|Long|null} [requestTimestamp] StickerSyncRMRMessage requestTimestamp + */ + + /** + * Constructs a new StickerSyncRMRMessage. + * @memberof proto.Message + * @classdesc Represents a StickerSyncRMRMessage. + * @implements IStickerSyncRMRMessage + * @constructor + * @param {proto.Message.IStickerSyncRMRMessage=} [properties] Properties to set + */ + function StickerSyncRMRMessage(properties) { + this.filehash = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StickerSyncRMRMessage filehash. + * @member {Array.} filehash + * @memberof proto.Message.StickerSyncRMRMessage + * @instance + */ + StickerSyncRMRMessage.prototype.filehash = $util.emptyArray; + + /** + * StickerSyncRMRMessage rmrSource. + * @member {string} rmrSource + * @memberof proto.Message.StickerSyncRMRMessage + * @instance + */ + StickerSyncRMRMessage.prototype.rmrSource = ""; + + /** + * StickerSyncRMRMessage requestTimestamp. + * @member {number|Long} requestTimestamp + * @memberof proto.Message.StickerSyncRMRMessage + * @instance + */ + StickerSyncRMRMessage.prototype.requestTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new StickerSyncRMRMessage instance using the specified properties. + * @function create + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {proto.Message.IStickerSyncRMRMessage=} [properties] Properties to set + * @returns {proto.Message.StickerSyncRMRMessage} StickerSyncRMRMessage instance + */ + StickerSyncRMRMessage.create = function create(properties) { + return new StickerSyncRMRMessage(properties); + }; + + /** + * Encodes the specified StickerSyncRMRMessage message. Does not implicitly {@link proto.Message.StickerSyncRMRMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {proto.Message.IStickerSyncRMRMessage} message StickerSyncRMRMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerSyncRMRMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.filehash != null && message.filehash.length) + for (var i = 0; i < message.filehash.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.filehash[i]); + if (message.rmrSource != null && Object.hasOwnProperty.call(message, "rmrSource")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.rmrSource); + if (message.requestTimestamp != null && Object.hasOwnProperty.call(message, "requestTimestamp")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.requestTimestamp); + return writer; + }; + + /** + * Encodes the specified StickerSyncRMRMessage message, length delimited. Does not implicitly {@link proto.Message.StickerSyncRMRMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {proto.Message.IStickerSyncRMRMessage} message StickerSyncRMRMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerSyncRMRMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StickerSyncRMRMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.StickerSyncRMRMessage} StickerSyncRMRMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerSyncRMRMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.StickerSyncRMRMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.filehash && message.filehash.length)) + message.filehash = []; + message.filehash.push(reader.string()); + break; + case 2: + message.rmrSource = reader.string(); + break; + case 3: + message.requestTimestamp = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StickerSyncRMRMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.StickerSyncRMRMessage} StickerSyncRMRMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerSyncRMRMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StickerSyncRMRMessage message. + * @function verify + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StickerSyncRMRMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.filehash != null && message.hasOwnProperty("filehash")) { + if (!Array.isArray(message.filehash)) + return "filehash: array expected"; + for (var i = 0; i < message.filehash.length; ++i) + if (!$util.isString(message.filehash[i])) + return "filehash: string[] expected"; + } + if (message.rmrSource != null && message.hasOwnProperty("rmrSource")) + if (!$util.isString(message.rmrSource)) + return "rmrSource: string expected"; + if (message.requestTimestamp != null && message.hasOwnProperty("requestTimestamp")) + if (!$util.isInteger(message.requestTimestamp) && !(message.requestTimestamp && $util.isInteger(message.requestTimestamp.low) && $util.isInteger(message.requestTimestamp.high))) + return "requestTimestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a StickerSyncRMRMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.StickerSyncRMRMessage} StickerSyncRMRMessage + */ + StickerSyncRMRMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.StickerSyncRMRMessage) + return object; + var message = new $root.proto.Message.StickerSyncRMRMessage(); + if (object.filehash) { + if (!Array.isArray(object.filehash)) + throw TypeError(".proto.Message.StickerSyncRMRMessage.filehash: array expected"); + message.filehash = []; + for (var i = 0; i < object.filehash.length; ++i) + message.filehash[i] = String(object.filehash[i]); + } + if (object.rmrSource != null) + message.rmrSource = String(object.rmrSource); + if (object.requestTimestamp != null) + if ($util.Long) + (message.requestTimestamp = $util.Long.fromValue(object.requestTimestamp)).unsigned = false; + else if (typeof object.requestTimestamp === "string") + message.requestTimestamp = parseInt(object.requestTimestamp, 10); + else if (typeof object.requestTimestamp === "number") + message.requestTimestamp = object.requestTimestamp; + else if (typeof object.requestTimestamp === "object") + message.requestTimestamp = new $util.LongBits(object.requestTimestamp.low >>> 0, object.requestTimestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a StickerSyncRMRMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.StickerSyncRMRMessage + * @static + * @param {proto.Message.StickerSyncRMRMessage} message StickerSyncRMRMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StickerSyncRMRMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.filehash = []; + if (options.defaults) { + object.rmrSource = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.requestTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.requestTimestamp = options.longs === String ? "0" : 0; + } + if (message.filehash && message.filehash.length) { + object.filehash = []; + for (var j = 0; j < message.filehash.length; ++j) + object.filehash[j] = message.filehash[j]; + } + if (message.rmrSource != null && message.hasOwnProperty("rmrSource")) + object.rmrSource = message.rmrSource; + if (message.requestTimestamp != null && message.hasOwnProperty("requestTimestamp")) + if (typeof message.requestTimestamp === "number") + object.requestTimestamp = options.longs === String ? String(message.requestTimestamp) : message.requestTimestamp; + else + object.requestTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.requestTimestamp) : options.longs === Number ? new $util.LongBits(message.requestTimestamp.low >>> 0, message.requestTimestamp.high >>> 0).toNumber() : message.requestTimestamp; + return object; + }; + + /** + * Converts this StickerSyncRMRMessage to JSON. + * @function toJSON + * @memberof proto.Message.StickerSyncRMRMessage + * @instance + * @returns {Object.} JSON object + */ + StickerSyncRMRMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StickerSyncRMRMessage; + })(); + + Message.TemplateButtonReplyMessage = (function() { + + /** + * Properties of a TemplateButtonReplyMessage. + * @memberof proto.Message + * @interface ITemplateButtonReplyMessage + * @property {string|null} [selectedId] TemplateButtonReplyMessage selectedId + * @property {string|null} [selectedDisplayText] TemplateButtonReplyMessage selectedDisplayText + * @property {proto.IContextInfo|null} [contextInfo] TemplateButtonReplyMessage contextInfo + * @property {number|null} [selectedIndex] TemplateButtonReplyMessage selectedIndex + */ + + /** + * Constructs a new TemplateButtonReplyMessage. + * @memberof proto.Message + * @classdesc Represents a TemplateButtonReplyMessage. + * @implements ITemplateButtonReplyMessage + * @constructor + * @param {proto.Message.ITemplateButtonReplyMessage=} [properties] Properties to set + */ + function TemplateButtonReplyMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TemplateButtonReplyMessage selectedId. + * @member {string} selectedId + * @memberof proto.Message.TemplateButtonReplyMessage + * @instance + */ + TemplateButtonReplyMessage.prototype.selectedId = ""; + + /** + * TemplateButtonReplyMessage selectedDisplayText. + * @member {string} selectedDisplayText + * @memberof proto.Message.TemplateButtonReplyMessage + * @instance + */ + TemplateButtonReplyMessage.prototype.selectedDisplayText = ""; + + /** + * TemplateButtonReplyMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.TemplateButtonReplyMessage + * @instance + */ + TemplateButtonReplyMessage.prototype.contextInfo = null; + + /** + * TemplateButtonReplyMessage selectedIndex. + * @member {number} selectedIndex + * @memberof proto.Message.TemplateButtonReplyMessage + * @instance + */ + TemplateButtonReplyMessage.prototype.selectedIndex = 0; + + /** + * Creates a new TemplateButtonReplyMessage instance using the specified properties. + * @function create + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {proto.Message.ITemplateButtonReplyMessage=} [properties] Properties to set + * @returns {proto.Message.TemplateButtonReplyMessage} TemplateButtonReplyMessage instance + */ + TemplateButtonReplyMessage.create = function create(properties) { + return new TemplateButtonReplyMessage(properties); + }; + + /** + * Encodes the specified TemplateButtonReplyMessage message. Does not implicitly {@link proto.Message.TemplateButtonReplyMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {proto.Message.ITemplateButtonReplyMessage} message TemplateButtonReplyMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TemplateButtonReplyMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.selectedId != null && Object.hasOwnProperty.call(message, "selectedId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.selectedId); + if (message.selectedDisplayText != null && Object.hasOwnProperty.call(message, "selectedDisplayText")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.selectedDisplayText); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.selectedIndex != null && Object.hasOwnProperty.call(message, "selectedIndex")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.selectedIndex); + return writer; + }; + + /** + * Encodes the specified TemplateButtonReplyMessage message, length delimited. Does not implicitly {@link proto.Message.TemplateButtonReplyMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {proto.Message.ITemplateButtonReplyMessage} message TemplateButtonReplyMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TemplateButtonReplyMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TemplateButtonReplyMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.TemplateButtonReplyMessage} TemplateButtonReplyMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TemplateButtonReplyMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.TemplateButtonReplyMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.selectedId = reader.string(); + break; + case 2: + message.selectedDisplayText = reader.string(); + break; + case 3: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 4: + message.selectedIndex = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TemplateButtonReplyMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.TemplateButtonReplyMessage} TemplateButtonReplyMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TemplateButtonReplyMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TemplateButtonReplyMessage message. + * @function verify + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TemplateButtonReplyMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.selectedId != null && message.hasOwnProperty("selectedId")) + if (!$util.isString(message.selectedId)) + return "selectedId: string expected"; + if (message.selectedDisplayText != null && message.hasOwnProperty("selectedDisplayText")) + if (!$util.isString(message.selectedDisplayText)) + return "selectedDisplayText: string expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.selectedIndex != null && message.hasOwnProperty("selectedIndex")) + if (!$util.isInteger(message.selectedIndex)) + return "selectedIndex: integer expected"; + return null; + }; + + /** + * Creates a TemplateButtonReplyMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.TemplateButtonReplyMessage} TemplateButtonReplyMessage + */ + TemplateButtonReplyMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.TemplateButtonReplyMessage) + return object; + var message = new $root.proto.Message.TemplateButtonReplyMessage(); + if (object.selectedId != null) + message.selectedId = String(object.selectedId); + if (object.selectedDisplayText != null) + message.selectedDisplayText = String(object.selectedDisplayText); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.TemplateButtonReplyMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.selectedIndex != null) + message.selectedIndex = object.selectedIndex >>> 0; + return message; + }; + + /** + * Creates a plain object from a TemplateButtonReplyMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.TemplateButtonReplyMessage + * @static + * @param {proto.Message.TemplateButtonReplyMessage} message TemplateButtonReplyMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + TemplateButtonReplyMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.selectedId = ""; + object.selectedDisplayText = ""; + object.contextInfo = null; + object.selectedIndex = 0; + } + if (message.selectedId != null && message.hasOwnProperty("selectedId")) + object.selectedId = message.selectedId; + if (message.selectedDisplayText != null && message.hasOwnProperty("selectedDisplayText")) + object.selectedDisplayText = message.selectedDisplayText; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.selectedIndex != null && message.hasOwnProperty("selectedIndex")) + object.selectedIndex = message.selectedIndex; + return object; + }; + + /** + * Converts this TemplateButtonReplyMessage to JSON. + * @function toJSON + * @memberof proto.Message.TemplateButtonReplyMessage + * @instance + * @returns {Object.} JSON object + */ + TemplateButtonReplyMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TemplateButtonReplyMessage; + })(); + + Message.TemplateMessage = (function() { + + /** + * Properties of a TemplateMessage. + * @memberof proto.Message + * @interface ITemplateMessage + * @property {proto.IContextInfo|null} [contextInfo] TemplateMessage contextInfo + * @property {proto.Message.TemplateMessage.IHydratedFourRowTemplate|null} [hydratedTemplate] TemplateMessage hydratedTemplate + * @property {string|null} [templateId] TemplateMessage templateId + * @property {proto.Message.TemplateMessage.IFourRowTemplate|null} [fourRowTemplate] TemplateMessage fourRowTemplate + * @property {proto.Message.TemplateMessage.IHydratedFourRowTemplate|null} [hydratedFourRowTemplate] TemplateMessage hydratedFourRowTemplate + * @property {proto.Message.IInteractiveMessage|null} [interactiveMessageTemplate] TemplateMessage interactiveMessageTemplate + */ + + /** + * Constructs a new TemplateMessage. + * @memberof proto.Message + * @classdesc Represents a TemplateMessage. + * @implements ITemplateMessage + * @constructor + * @param {proto.Message.ITemplateMessage=} [properties] Properties to set + */ + function TemplateMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TemplateMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.TemplateMessage + * @instance + */ + TemplateMessage.prototype.contextInfo = null; + + /** + * TemplateMessage hydratedTemplate. + * @member {proto.Message.TemplateMessage.IHydratedFourRowTemplate|null|undefined} hydratedTemplate + * @memberof proto.Message.TemplateMessage + * @instance + */ + TemplateMessage.prototype.hydratedTemplate = null; + + /** + * TemplateMessage templateId. + * @member {string} templateId + * @memberof proto.Message.TemplateMessage + * @instance + */ + TemplateMessage.prototype.templateId = ""; + + /** + * TemplateMessage fourRowTemplate. + * @member {proto.Message.TemplateMessage.IFourRowTemplate|null|undefined} fourRowTemplate + * @memberof proto.Message.TemplateMessage + * @instance + */ + TemplateMessage.prototype.fourRowTemplate = null; + + /** + * TemplateMessage hydratedFourRowTemplate. + * @member {proto.Message.TemplateMessage.IHydratedFourRowTemplate|null|undefined} hydratedFourRowTemplate + * @memberof proto.Message.TemplateMessage + * @instance + */ + TemplateMessage.prototype.hydratedFourRowTemplate = null; + + /** + * TemplateMessage interactiveMessageTemplate. + * @member {proto.Message.IInteractiveMessage|null|undefined} interactiveMessageTemplate + * @memberof proto.Message.TemplateMessage + * @instance + */ + TemplateMessage.prototype.interactiveMessageTemplate = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * TemplateMessage format. + * @member {"fourRowTemplate"|"hydratedFourRowTemplate"|"interactiveMessageTemplate"|undefined} format + * @memberof proto.Message.TemplateMessage + * @instance + */ + Object.defineProperty(TemplateMessage.prototype, "format", { + get: $util.oneOfGetter($oneOfFields = ["fourRowTemplate", "hydratedFourRowTemplate", "interactiveMessageTemplate"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new TemplateMessage instance using the specified properties. + * @function create + * @memberof proto.Message.TemplateMessage + * @static + * @param {proto.Message.ITemplateMessage=} [properties] Properties to set + * @returns {proto.Message.TemplateMessage} TemplateMessage instance + */ + TemplateMessage.create = function create(properties) { + return new TemplateMessage(properties); + }; + + /** + * Encodes the specified TemplateMessage message. Does not implicitly {@link proto.Message.TemplateMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.TemplateMessage + * @static + * @param {proto.Message.ITemplateMessage} message TemplateMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TemplateMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.fourRowTemplate != null && Object.hasOwnProperty.call(message, "fourRowTemplate")) + $root.proto.Message.TemplateMessage.FourRowTemplate.encode(message.fourRowTemplate, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.hydratedFourRowTemplate != null && Object.hasOwnProperty.call(message, "hydratedFourRowTemplate")) + $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.encode(message.hydratedFourRowTemplate, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.hydratedTemplate != null && Object.hasOwnProperty.call(message, "hydratedTemplate")) + $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.encode(message.hydratedTemplate, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.interactiveMessageTemplate != null && Object.hasOwnProperty.call(message, "interactiveMessageTemplate")) + $root.proto.Message.InteractiveMessage.encode(message.interactiveMessageTemplate, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.templateId != null && Object.hasOwnProperty.call(message, "templateId")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.templateId); + return writer; + }; + + /** + * Encodes the specified TemplateMessage message, length delimited. Does not implicitly {@link proto.Message.TemplateMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.TemplateMessage + * @static + * @param {proto.Message.ITemplateMessage} message TemplateMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TemplateMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TemplateMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.TemplateMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.TemplateMessage} TemplateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TemplateMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.TemplateMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 3: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 4: + message.hydratedTemplate = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.decode(reader, reader.uint32()); + break; + case 9: + message.templateId = reader.string(); + break; + case 1: + message.fourRowTemplate = $root.proto.Message.TemplateMessage.FourRowTemplate.decode(reader, reader.uint32()); + break; + case 2: + message.hydratedFourRowTemplate = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.decode(reader, reader.uint32()); + break; + case 5: + message.interactiveMessageTemplate = $root.proto.Message.InteractiveMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TemplateMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.TemplateMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.TemplateMessage} TemplateMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TemplateMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TemplateMessage message. + * @function verify + * @memberof proto.Message.TemplateMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TemplateMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.hydratedTemplate != null && message.hasOwnProperty("hydratedTemplate")) { + var error = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.verify(message.hydratedTemplate); + if (error) + return "hydratedTemplate." + error; + } + if (message.templateId != null && message.hasOwnProperty("templateId")) + if (!$util.isString(message.templateId)) + return "templateId: string expected"; + if (message.fourRowTemplate != null && message.hasOwnProperty("fourRowTemplate")) { + properties.format = 1; + { + var error = $root.proto.Message.TemplateMessage.FourRowTemplate.verify(message.fourRowTemplate); + if (error) + return "fourRowTemplate." + error; + } + } + if (message.hydratedFourRowTemplate != null && message.hasOwnProperty("hydratedFourRowTemplate")) { + if (properties.format === 1) + return "format: multiple values"; + properties.format = 1; + { + var error = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.verify(message.hydratedFourRowTemplate); + if (error) + return "hydratedFourRowTemplate." + error; + } + } + if (message.interactiveMessageTemplate != null && message.hasOwnProperty("interactiveMessageTemplate")) { + if (properties.format === 1) + return "format: multiple values"; + properties.format = 1; + { + var error = $root.proto.Message.InteractiveMessage.verify(message.interactiveMessageTemplate); + if (error) + return "interactiveMessageTemplate." + error; + } + } + return null; + }; + + /** + * Creates a TemplateMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.TemplateMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.TemplateMessage} TemplateMessage + */ + TemplateMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.TemplateMessage) + return object; + var message = new $root.proto.Message.TemplateMessage(); + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.TemplateMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.hydratedTemplate != null) { + if (typeof object.hydratedTemplate !== "object") + throw TypeError(".proto.Message.TemplateMessage.hydratedTemplate: object expected"); + message.hydratedTemplate = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.fromObject(object.hydratedTemplate); + } + if (object.templateId != null) + message.templateId = String(object.templateId); + if (object.fourRowTemplate != null) { + if (typeof object.fourRowTemplate !== "object") + throw TypeError(".proto.Message.TemplateMessage.fourRowTemplate: object expected"); + message.fourRowTemplate = $root.proto.Message.TemplateMessage.FourRowTemplate.fromObject(object.fourRowTemplate); + } + if (object.hydratedFourRowTemplate != null) { + if (typeof object.hydratedFourRowTemplate !== "object") + throw TypeError(".proto.Message.TemplateMessage.hydratedFourRowTemplate: object expected"); + message.hydratedFourRowTemplate = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.fromObject(object.hydratedFourRowTemplate); + } + if (object.interactiveMessageTemplate != null) { + if (typeof object.interactiveMessageTemplate !== "object") + throw TypeError(".proto.Message.TemplateMessage.interactiveMessageTemplate: object expected"); + message.interactiveMessageTemplate = $root.proto.Message.InteractiveMessage.fromObject(object.interactiveMessageTemplate); + } + return message; + }; + + /** + * Creates a plain object from a TemplateMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.TemplateMessage + * @static + * @param {proto.Message.TemplateMessage} message TemplateMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + TemplateMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.contextInfo = null; + object.hydratedTemplate = null; + object.templateId = ""; + } + if (message.fourRowTemplate != null && message.hasOwnProperty("fourRowTemplate")) { + object.fourRowTemplate = $root.proto.Message.TemplateMessage.FourRowTemplate.toObject(message.fourRowTemplate, options); + if (options.oneofs) + object.format = "fourRowTemplate"; + } + if (message.hydratedFourRowTemplate != null && message.hasOwnProperty("hydratedFourRowTemplate")) { + object.hydratedFourRowTemplate = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.toObject(message.hydratedFourRowTemplate, options); + if (options.oneofs) + object.format = "hydratedFourRowTemplate"; + } + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.hydratedTemplate != null && message.hasOwnProperty("hydratedTemplate")) + object.hydratedTemplate = $root.proto.Message.TemplateMessage.HydratedFourRowTemplate.toObject(message.hydratedTemplate, options); + if (message.interactiveMessageTemplate != null && message.hasOwnProperty("interactiveMessageTemplate")) { + object.interactiveMessageTemplate = $root.proto.Message.InteractiveMessage.toObject(message.interactiveMessageTemplate, options); + if (options.oneofs) + object.format = "interactiveMessageTemplate"; + } + if (message.templateId != null && message.hasOwnProperty("templateId")) + object.templateId = message.templateId; + return object; + }; + + /** + * Converts this TemplateMessage to JSON. + * @function toJSON + * @memberof proto.Message.TemplateMessage + * @instance + * @returns {Object.} JSON object + */ + TemplateMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + TemplateMessage.FourRowTemplate = (function() { + + /** + * Properties of a FourRowTemplate. + * @memberof proto.Message.TemplateMessage + * @interface IFourRowTemplate + * @property {proto.Message.IHighlyStructuredMessage|null} [content] FourRowTemplate content + * @property {proto.Message.IHighlyStructuredMessage|null} [footer] FourRowTemplate footer + * @property {Array.|null} [buttons] FourRowTemplate buttons + * @property {proto.Message.IDocumentMessage|null} [documentMessage] FourRowTemplate documentMessage + * @property {proto.Message.IHighlyStructuredMessage|null} [highlyStructuredMessage] FourRowTemplate highlyStructuredMessage + * @property {proto.Message.IImageMessage|null} [imageMessage] FourRowTemplate imageMessage + * @property {proto.Message.IVideoMessage|null} [videoMessage] FourRowTemplate videoMessage + * @property {proto.Message.ILocationMessage|null} [locationMessage] FourRowTemplate locationMessage + */ + + /** + * Constructs a new FourRowTemplate. + * @memberof proto.Message.TemplateMessage + * @classdesc Represents a FourRowTemplate. + * @implements IFourRowTemplate + * @constructor + * @param {proto.Message.TemplateMessage.IFourRowTemplate=} [properties] Properties to set + */ + function FourRowTemplate(properties) { + this.buttons = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * FourRowTemplate content. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} content + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.content = null; + + /** + * FourRowTemplate footer. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} footer + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.footer = null; + + /** + * FourRowTemplate buttons. + * @member {Array.} buttons + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.buttons = $util.emptyArray; + + /** + * FourRowTemplate documentMessage. + * @member {proto.Message.IDocumentMessage|null|undefined} documentMessage + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.documentMessage = null; + + /** + * FourRowTemplate highlyStructuredMessage. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} highlyStructuredMessage + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.highlyStructuredMessage = null; + + /** + * FourRowTemplate imageMessage. + * @member {proto.Message.IImageMessage|null|undefined} imageMessage + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.imageMessage = null; + + /** + * FourRowTemplate videoMessage. + * @member {proto.Message.IVideoMessage|null|undefined} videoMessage + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.videoMessage = null; + + /** + * FourRowTemplate locationMessage. + * @member {proto.Message.ILocationMessage|null|undefined} locationMessage + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + FourRowTemplate.prototype.locationMessage = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * FourRowTemplate title. + * @member {"documentMessage"|"highlyStructuredMessage"|"imageMessage"|"videoMessage"|"locationMessage"|undefined} title + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + */ + Object.defineProperty(FourRowTemplate.prototype, "title", { + get: $util.oneOfGetter($oneOfFields = ["documentMessage", "highlyStructuredMessage", "imageMessage", "videoMessage", "locationMessage"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new FourRowTemplate instance using the specified properties. + * @function create + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.IFourRowTemplate=} [properties] Properties to set + * @returns {proto.Message.TemplateMessage.FourRowTemplate} FourRowTemplate instance + */ + FourRowTemplate.create = function create(properties) { + return new FourRowTemplate(properties); + }; + + /** + * Encodes the specified FourRowTemplate message. Does not implicitly {@link proto.Message.TemplateMessage.FourRowTemplate.verify|verify} messages. + * @function encode + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.IFourRowTemplate} message FourRowTemplate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FourRowTemplate.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.documentMessage != null && Object.hasOwnProperty.call(message, "documentMessage")) + $root.proto.Message.DocumentMessage.encode(message.documentMessage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.highlyStructuredMessage != null && Object.hasOwnProperty.call(message, "highlyStructuredMessage")) + $root.proto.Message.HighlyStructuredMessage.encode(message.highlyStructuredMessage, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.imageMessage != null && Object.hasOwnProperty.call(message, "imageMessage")) + $root.proto.Message.ImageMessage.encode(message.imageMessage, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.videoMessage != null && Object.hasOwnProperty.call(message, "videoMessage")) + $root.proto.Message.VideoMessage.encode(message.videoMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.locationMessage != null && Object.hasOwnProperty.call(message, "locationMessage")) + $root.proto.Message.LocationMessage.encode(message.locationMessage, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.content != null && Object.hasOwnProperty.call(message, "content")) + $root.proto.Message.HighlyStructuredMessage.encode(message.content, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.footer != null && Object.hasOwnProperty.call(message, "footer")) + $root.proto.Message.HighlyStructuredMessage.encode(message.footer, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.buttons != null && message.buttons.length) + for (var i = 0; i < message.buttons.length; ++i) + $root.proto.TemplateButton.encode(message.buttons[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified FourRowTemplate message, length delimited. Does not implicitly {@link proto.Message.TemplateMessage.FourRowTemplate.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.IFourRowTemplate} message FourRowTemplate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FourRowTemplate.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a FourRowTemplate message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.TemplateMessage.FourRowTemplate} FourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FourRowTemplate.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.TemplateMessage.FourRowTemplate(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 6: + message.content = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + case 7: + message.footer = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + case 8: + if (!(message.buttons && message.buttons.length)) + message.buttons = []; + message.buttons.push($root.proto.TemplateButton.decode(reader, reader.uint32())); + break; + case 1: + message.documentMessage = $root.proto.Message.DocumentMessage.decode(reader, reader.uint32()); + break; + case 2: + message.highlyStructuredMessage = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + case 3: + message.imageMessage = $root.proto.Message.ImageMessage.decode(reader, reader.uint32()); + break; + case 4: + message.videoMessage = $root.proto.Message.VideoMessage.decode(reader, reader.uint32()); + break; + case 5: + message.locationMessage = $root.proto.Message.LocationMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a FourRowTemplate message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.TemplateMessage.FourRowTemplate} FourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FourRowTemplate.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a FourRowTemplate message. + * @function verify + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + FourRowTemplate.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.content != null && message.hasOwnProperty("content")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.content); + if (error) + return "content." + error; + } + if (message.footer != null && message.hasOwnProperty("footer")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.footer); + if (error) + return "footer." + error; + } + if (message.buttons != null && message.hasOwnProperty("buttons")) { + if (!Array.isArray(message.buttons)) + return "buttons: array expected"; + for (var i = 0; i < message.buttons.length; ++i) { + var error = $root.proto.TemplateButton.verify(message.buttons[i]); + if (error) + return "buttons." + error; + } + } + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + properties.title = 1; + { + var error = $root.proto.Message.DocumentMessage.verify(message.documentMessage); + if (error) + return "documentMessage." + error; + } + } + if (message.highlyStructuredMessage != null && message.hasOwnProperty("highlyStructuredMessage")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.highlyStructuredMessage); + if (error) + return "highlyStructuredMessage." + error; + } + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + { + var error = $root.proto.Message.ImageMessage.verify(message.imageMessage); + if (error) + return "imageMessage." + error; + } + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + { + var error = $root.proto.Message.VideoMessage.verify(message.videoMessage); + if (error) + return "videoMessage." + error; + } + } + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + { + var error = $root.proto.Message.LocationMessage.verify(message.locationMessage); + if (error) + return "locationMessage." + error; + } + } + return null; + }; + + /** + * Creates a FourRowTemplate message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.TemplateMessage.FourRowTemplate} FourRowTemplate + */ + FourRowTemplate.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.TemplateMessage.FourRowTemplate) + return object; + var message = new $root.proto.Message.TemplateMessage.FourRowTemplate(); + if (object.content != null) { + if (typeof object.content !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.content: object expected"); + message.content = $root.proto.Message.HighlyStructuredMessage.fromObject(object.content); + } + if (object.footer != null) { + if (typeof object.footer !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.footer: object expected"); + message.footer = $root.proto.Message.HighlyStructuredMessage.fromObject(object.footer); + } + if (object.buttons) { + if (!Array.isArray(object.buttons)) + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.buttons: array expected"); + message.buttons = []; + for (var i = 0; i < object.buttons.length; ++i) { + if (typeof object.buttons[i] !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.buttons: object expected"); + message.buttons[i] = $root.proto.TemplateButton.fromObject(object.buttons[i]); + } + } + if (object.documentMessage != null) { + if (typeof object.documentMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.documentMessage: object expected"); + message.documentMessage = $root.proto.Message.DocumentMessage.fromObject(object.documentMessage); + } + if (object.highlyStructuredMessage != null) { + if (typeof object.highlyStructuredMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.highlyStructuredMessage: object expected"); + message.highlyStructuredMessage = $root.proto.Message.HighlyStructuredMessage.fromObject(object.highlyStructuredMessage); + } + if (object.imageMessage != null) { + if (typeof object.imageMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.imageMessage: object expected"); + message.imageMessage = $root.proto.Message.ImageMessage.fromObject(object.imageMessage); + } + if (object.videoMessage != null) { + if (typeof object.videoMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.videoMessage: object expected"); + message.videoMessage = $root.proto.Message.VideoMessage.fromObject(object.videoMessage); + } + if (object.locationMessage != null) { + if (typeof object.locationMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.FourRowTemplate.locationMessage: object expected"); + message.locationMessage = $root.proto.Message.LocationMessage.fromObject(object.locationMessage); + } + return message; + }; + + /** + * Creates a plain object from a FourRowTemplate message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.FourRowTemplate} message FourRowTemplate + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + FourRowTemplate.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.buttons = []; + if (options.defaults) { + object.content = null; + object.footer = null; + } + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + object.documentMessage = $root.proto.Message.DocumentMessage.toObject(message.documentMessage, options); + if (options.oneofs) + object.title = "documentMessage"; + } + if (message.highlyStructuredMessage != null && message.hasOwnProperty("highlyStructuredMessage")) { + object.highlyStructuredMessage = $root.proto.Message.HighlyStructuredMessage.toObject(message.highlyStructuredMessage, options); + if (options.oneofs) + object.title = "highlyStructuredMessage"; + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + object.imageMessage = $root.proto.Message.ImageMessage.toObject(message.imageMessage, options); + if (options.oneofs) + object.title = "imageMessage"; + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + object.videoMessage = $root.proto.Message.VideoMessage.toObject(message.videoMessage, options); + if (options.oneofs) + object.title = "videoMessage"; + } + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) { + object.locationMessage = $root.proto.Message.LocationMessage.toObject(message.locationMessage, options); + if (options.oneofs) + object.title = "locationMessage"; + } + if (message.content != null && message.hasOwnProperty("content")) + object.content = $root.proto.Message.HighlyStructuredMessage.toObject(message.content, options); + if (message.footer != null && message.hasOwnProperty("footer")) + object.footer = $root.proto.Message.HighlyStructuredMessage.toObject(message.footer, options); + if (message.buttons && message.buttons.length) { + object.buttons = []; + for (var j = 0; j < message.buttons.length; ++j) + object.buttons[j] = $root.proto.TemplateButton.toObject(message.buttons[j], options); + } + return object; + }; + + /** + * Converts this FourRowTemplate to JSON. + * @function toJSON + * @memberof proto.Message.TemplateMessage.FourRowTemplate + * @instance + * @returns {Object.} JSON object + */ + FourRowTemplate.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return FourRowTemplate; + })(); + + TemplateMessage.HydratedFourRowTemplate = (function() { + + /** + * Properties of a HydratedFourRowTemplate. + * @memberof proto.Message.TemplateMessage + * @interface IHydratedFourRowTemplate + * @property {string|null} [hydratedContentText] HydratedFourRowTemplate hydratedContentText + * @property {string|null} [hydratedFooterText] HydratedFourRowTemplate hydratedFooterText + * @property {Array.|null} [hydratedButtons] HydratedFourRowTemplate hydratedButtons + * @property {string|null} [templateId] HydratedFourRowTemplate templateId + * @property {proto.Message.IDocumentMessage|null} [documentMessage] HydratedFourRowTemplate documentMessage + * @property {string|null} [hydratedTitleText] HydratedFourRowTemplate hydratedTitleText + * @property {proto.Message.IImageMessage|null} [imageMessage] HydratedFourRowTemplate imageMessage + * @property {proto.Message.IVideoMessage|null} [videoMessage] HydratedFourRowTemplate videoMessage + * @property {proto.Message.ILocationMessage|null} [locationMessage] HydratedFourRowTemplate locationMessage + */ + + /** + * Constructs a new HydratedFourRowTemplate. + * @memberof proto.Message.TemplateMessage + * @classdesc Represents a HydratedFourRowTemplate. + * @implements IHydratedFourRowTemplate + * @constructor + * @param {proto.Message.TemplateMessage.IHydratedFourRowTemplate=} [properties] Properties to set + */ + function HydratedFourRowTemplate(properties) { + this.hydratedButtons = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * HydratedFourRowTemplate hydratedContentText. + * @member {string} hydratedContentText + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.hydratedContentText = ""; + + /** + * HydratedFourRowTemplate hydratedFooterText. + * @member {string} hydratedFooterText + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.hydratedFooterText = ""; + + /** + * HydratedFourRowTemplate hydratedButtons. + * @member {Array.} hydratedButtons + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.hydratedButtons = $util.emptyArray; + + /** + * HydratedFourRowTemplate templateId. + * @member {string} templateId + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.templateId = ""; + + /** + * HydratedFourRowTemplate documentMessage. + * @member {proto.Message.IDocumentMessage|null|undefined} documentMessage + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.documentMessage = null; + + /** + * HydratedFourRowTemplate hydratedTitleText. + * @member {string|null|undefined} hydratedTitleText + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.hydratedTitleText = null; + + /** + * HydratedFourRowTemplate imageMessage. + * @member {proto.Message.IImageMessage|null|undefined} imageMessage + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.imageMessage = null; + + /** + * HydratedFourRowTemplate videoMessage. + * @member {proto.Message.IVideoMessage|null|undefined} videoMessage + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.videoMessage = null; + + /** + * HydratedFourRowTemplate locationMessage. + * @member {proto.Message.ILocationMessage|null|undefined} locationMessage + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + HydratedFourRowTemplate.prototype.locationMessage = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * HydratedFourRowTemplate title. + * @member {"documentMessage"|"hydratedTitleText"|"imageMessage"|"videoMessage"|"locationMessage"|undefined} title + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + */ + Object.defineProperty(HydratedFourRowTemplate.prototype, "title", { + get: $util.oneOfGetter($oneOfFields = ["documentMessage", "hydratedTitleText", "imageMessage", "videoMessage", "locationMessage"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new HydratedFourRowTemplate instance using the specified properties. + * @function create + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.IHydratedFourRowTemplate=} [properties] Properties to set + * @returns {proto.Message.TemplateMessage.HydratedFourRowTemplate} HydratedFourRowTemplate instance + */ + HydratedFourRowTemplate.create = function create(properties) { + return new HydratedFourRowTemplate(properties); + }; + + /** + * Encodes the specified HydratedFourRowTemplate message. Does not implicitly {@link proto.Message.TemplateMessage.HydratedFourRowTemplate.verify|verify} messages. + * @function encode + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.IHydratedFourRowTemplate} message HydratedFourRowTemplate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedFourRowTemplate.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.documentMessage != null && Object.hasOwnProperty.call(message, "documentMessage")) + $root.proto.Message.DocumentMessage.encode(message.documentMessage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.hydratedTitleText != null && Object.hasOwnProperty.call(message, "hydratedTitleText")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.hydratedTitleText); + if (message.imageMessage != null && Object.hasOwnProperty.call(message, "imageMessage")) + $root.proto.Message.ImageMessage.encode(message.imageMessage, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.videoMessage != null && Object.hasOwnProperty.call(message, "videoMessage")) + $root.proto.Message.VideoMessage.encode(message.videoMessage, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.locationMessage != null && Object.hasOwnProperty.call(message, "locationMessage")) + $root.proto.Message.LocationMessage.encode(message.locationMessage, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.hydratedContentText != null && Object.hasOwnProperty.call(message, "hydratedContentText")) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.hydratedContentText); + if (message.hydratedFooterText != null && Object.hasOwnProperty.call(message, "hydratedFooterText")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.hydratedFooterText); + if (message.hydratedButtons != null && message.hydratedButtons.length) + for (var i = 0; i < message.hydratedButtons.length; ++i) + $root.proto.HydratedTemplateButton.encode(message.hydratedButtons[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.templateId != null && Object.hasOwnProperty.call(message, "templateId")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.templateId); + return writer; + }; + + /** + * Encodes the specified HydratedFourRowTemplate message, length delimited. Does not implicitly {@link proto.Message.TemplateMessage.HydratedFourRowTemplate.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.IHydratedFourRowTemplate} message HydratedFourRowTemplate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + HydratedFourRowTemplate.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a HydratedFourRowTemplate message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.TemplateMessage.HydratedFourRowTemplate} HydratedFourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedFourRowTemplate.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.TemplateMessage.HydratedFourRowTemplate(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 6: + message.hydratedContentText = reader.string(); + break; + case 7: + message.hydratedFooterText = reader.string(); + break; + case 8: + if (!(message.hydratedButtons && message.hydratedButtons.length)) + message.hydratedButtons = []; + message.hydratedButtons.push($root.proto.HydratedTemplateButton.decode(reader, reader.uint32())); + break; + case 9: + message.templateId = reader.string(); + break; + case 1: + message.documentMessage = $root.proto.Message.DocumentMessage.decode(reader, reader.uint32()); + break; + case 2: + message.hydratedTitleText = reader.string(); + break; + case 3: + message.imageMessage = $root.proto.Message.ImageMessage.decode(reader, reader.uint32()); + break; + case 4: + message.videoMessage = $root.proto.Message.VideoMessage.decode(reader, reader.uint32()); + break; + case 5: + message.locationMessage = $root.proto.Message.LocationMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a HydratedFourRowTemplate message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.TemplateMessage.HydratedFourRowTemplate} HydratedFourRowTemplate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + HydratedFourRowTemplate.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a HydratedFourRowTemplate message. + * @function verify + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + HydratedFourRowTemplate.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.hydratedContentText != null && message.hasOwnProperty("hydratedContentText")) + if (!$util.isString(message.hydratedContentText)) + return "hydratedContentText: string expected"; + if (message.hydratedFooterText != null && message.hasOwnProperty("hydratedFooterText")) + if (!$util.isString(message.hydratedFooterText)) + return "hydratedFooterText: string expected"; + if (message.hydratedButtons != null && message.hasOwnProperty("hydratedButtons")) { + if (!Array.isArray(message.hydratedButtons)) + return "hydratedButtons: array expected"; + for (var i = 0; i < message.hydratedButtons.length; ++i) { + var error = $root.proto.HydratedTemplateButton.verify(message.hydratedButtons[i]); + if (error) + return "hydratedButtons." + error; + } + } + if (message.templateId != null && message.hasOwnProperty("templateId")) + if (!$util.isString(message.templateId)) + return "templateId: string expected"; + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + properties.title = 1; + { + var error = $root.proto.Message.DocumentMessage.verify(message.documentMessage); + if (error) + return "documentMessage." + error; + } + } + if (message.hydratedTitleText != null && message.hasOwnProperty("hydratedTitleText")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + if (!$util.isString(message.hydratedTitleText)) + return "hydratedTitleText: string expected"; + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + { + var error = $root.proto.Message.ImageMessage.verify(message.imageMessage); + if (error) + return "imageMessage." + error; + } + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + { + var error = $root.proto.Message.VideoMessage.verify(message.videoMessage); + if (error) + return "videoMessage." + error; + } + } + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) { + if (properties.title === 1) + return "title: multiple values"; + properties.title = 1; + { + var error = $root.proto.Message.LocationMessage.verify(message.locationMessage); + if (error) + return "locationMessage." + error; + } + } + return null; + }; + + /** + * Creates a HydratedFourRowTemplate message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.TemplateMessage.HydratedFourRowTemplate} HydratedFourRowTemplate + */ + HydratedFourRowTemplate.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.TemplateMessage.HydratedFourRowTemplate) + return object; + var message = new $root.proto.Message.TemplateMessage.HydratedFourRowTemplate(); + if (object.hydratedContentText != null) + message.hydratedContentText = String(object.hydratedContentText); + if (object.hydratedFooterText != null) + message.hydratedFooterText = String(object.hydratedFooterText); + if (object.hydratedButtons) { + if (!Array.isArray(object.hydratedButtons)) + throw TypeError(".proto.Message.TemplateMessage.HydratedFourRowTemplate.hydratedButtons: array expected"); + message.hydratedButtons = []; + for (var i = 0; i < object.hydratedButtons.length; ++i) { + if (typeof object.hydratedButtons[i] !== "object") + throw TypeError(".proto.Message.TemplateMessage.HydratedFourRowTemplate.hydratedButtons: object expected"); + message.hydratedButtons[i] = $root.proto.HydratedTemplateButton.fromObject(object.hydratedButtons[i]); + } + } + if (object.templateId != null) + message.templateId = String(object.templateId); + if (object.documentMessage != null) { + if (typeof object.documentMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.HydratedFourRowTemplate.documentMessage: object expected"); + message.documentMessage = $root.proto.Message.DocumentMessage.fromObject(object.documentMessage); + } + if (object.hydratedTitleText != null) + message.hydratedTitleText = String(object.hydratedTitleText); + if (object.imageMessage != null) { + if (typeof object.imageMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.HydratedFourRowTemplate.imageMessage: object expected"); + message.imageMessage = $root.proto.Message.ImageMessage.fromObject(object.imageMessage); + } + if (object.videoMessage != null) { + if (typeof object.videoMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.HydratedFourRowTemplate.videoMessage: object expected"); + message.videoMessage = $root.proto.Message.VideoMessage.fromObject(object.videoMessage); + } + if (object.locationMessage != null) { + if (typeof object.locationMessage !== "object") + throw TypeError(".proto.Message.TemplateMessage.HydratedFourRowTemplate.locationMessage: object expected"); + message.locationMessage = $root.proto.Message.LocationMessage.fromObject(object.locationMessage); + } + return message; + }; + + /** + * Creates a plain object from a HydratedFourRowTemplate message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @static + * @param {proto.Message.TemplateMessage.HydratedFourRowTemplate} message HydratedFourRowTemplate + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + HydratedFourRowTemplate.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.hydratedButtons = []; + if (options.defaults) { + object.hydratedContentText = ""; + object.hydratedFooterText = ""; + object.templateId = ""; + } + if (message.documentMessage != null && message.hasOwnProperty("documentMessage")) { + object.documentMessage = $root.proto.Message.DocumentMessage.toObject(message.documentMessage, options); + if (options.oneofs) + object.title = "documentMessage"; + } + if (message.hydratedTitleText != null && message.hasOwnProperty("hydratedTitleText")) { + object.hydratedTitleText = message.hydratedTitleText; + if (options.oneofs) + object.title = "hydratedTitleText"; + } + if (message.imageMessage != null && message.hasOwnProperty("imageMessage")) { + object.imageMessage = $root.proto.Message.ImageMessage.toObject(message.imageMessage, options); + if (options.oneofs) + object.title = "imageMessage"; + } + if (message.videoMessage != null && message.hasOwnProperty("videoMessage")) { + object.videoMessage = $root.proto.Message.VideoMessage.toObject(message.videoMessage, options); + if (options.oneofs) + object.title = "videoMessage"; + } + if (message.locationMessage != null && message.hasOwnProperty("locationMessage")) { + object.locationMessage = $root.proto.Message.LocationMessage.toObject(message.locationMessage, options); + if (options.oneofs) + object.title = "locationMessage"; + } + if (message.hydratedContentText != null && message.hasOwnProperty("hydratedContentText")) + object.hydratedContentText = message.hydratedContentText; + if (message.hydratedFooterText != null && message.hasOwnProperty("hydratedFooterText")) + object.hydratedFooterText = message.hydratedFooterText; + if (message.hydratedButtons && message.hydratedButtons.length) { + object.hydratedButtons = []; + for (var j = 0; j < message.hydratedButtons.length; ++j) + object.hydratedButtons[j] = $root.proto.HydratedTemplateButton.toObject(message.hydratedButtons[j], options); + } + if (message.templateId != null && message.hasOwnProperty("templateId")) + object.templateId = message.templateId; + return object; + }; + + /** + * Converts this HydratedFourRowTemplate to JSON. + * @function toJSON + * @memberof proto.Message.TemplateMessage.HydratedFourRowTemplate + * @instance + * @returns {Object.} JSON object + */ + HydratedFourRowTemplate.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return HydratedFourRowTemplate; + })(); + + return TemplateMessage; + })(); + + Message.VideoMessage = (function() { + + /** + * Properties of a VideoMessage. + * @memberof proto.Message + * @interface IVideoMessage + * @property {string|null} [url] VideoMessage url + * @property {string|null} [mimetype] VideoMessage mimetype + * @property {Uint8Array|null} [fileSha256] VideoMessage fileSha256 + * @property {number|Long|null} [fileLength] VideoMessage fileLength + * @property {number|null} [seconds] VideoMessage seconds + * @property {Uint8Array|null} [mediaKey] VideoMessage mediaKey + * @property {string|null} [caption] VideoMessage caption + * @property {boolean|null} [gifPlayback] VideoMessage gifPlayback + * @property {number|null} [height] VideoMessage height + * @property {number|null} [width] VideoMessage width + * @property {Uint8Array|null} [fileEncSha256] VideoMessage fileEncSha256 + * @property {Array.|null} [interactiveAnnotations] VideoMessage interactiveAnnotations + * @property {string|null} [directPath] VideoMessage directPath + * @property {number|Long|null} [mediaKeyTimestamp] VideoMessage mediaKeyTimestamp + * @property {Uint8Array|null} [jpegThumbnail] VideoMessage jpegThumbnail + * @property {proto.IContextInfo|null} [contextInfo] VideoMessage contextInfo + * @property {Uint8Array|null} [streamingSidecar] VideoMessage streamingSidecar + * @property {proto.Message.VideoMessage.Attribution|null} [gifAttribution] VideoMessage gifAttribution + * @property {boolean|null} [viewOnce] VideoMessage viewOnce + * @property {string|null} [thumbnailDirectPath] VideoMessage thumbnailDirectPath + * @property {Uint8Array|null} [thumbnailSha256] VideoMessage thumbnailSha256 + * @property {Uint8Array|null} [thumbnailEncSha256] VideoMessage thumbnailEncSha256 + * @property {string|null} [staticUrl] VideoMessage staticUrl + */ + + /** + * Constructs a new VideoMessage. + * @memberof proto.Message + * @classdesc Represents a VideoMessage. + * @implements IVideoMessage + * @constructor + * @param {proto.Message.IVideoMessage=} [properties] Properties to set + */ + function VideoMessage(properties) { + this.interactiveAnnotations = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * VideoMessage url. + * @member {string} url + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.url = ""; + + /** + * VideoMessage mimetype. + * @member {string} mimetype + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.mimetype = ""; + + /** + * VideoMessage fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.fileSha256 = $util.newBuffer([]); + + /** + * VideoMessage fileLength. + * @member {number|Long} fileLength + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * VideoMessage seconds. + * @member {number} seconds + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.seconds = 0; + + /** + * VideoMessage mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.mediaKey = $util.newBuffer([]); + + /** + * VideoMessage caption. + * @member {string} caption + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.caption = ""; + + /** + * VideoMessage gifPlayback. + * @member {boolean} gifPlayback + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.gifPlayback = false; + + /** + * VideoMessage height. + * @member {number} height + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.height = 0; + + /** + * VideoMessage width. + * @member {number} width + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.width = 0; + + /** + * VideoMessage fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * VideoMessage interactiveAnnotations. + * @member {Array.} interactiveAnnotations + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.interactiveAnnotations = $util.emptyArray; + + /** + * VideoMessage directPath. + * @member {string} directPath + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.directPath = ""; + + /** + * VideoMessage mediaKeyTimestamp. + * @member {number|Long} mediaKeyTimestamp + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.mediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * VideoMessage jpegThumbnail. + * @member {Uint8Array} jpegThumbnail + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.jpegThumbnail = $util.newBuffer([]); + + /** + * VideoMessage contextInfo. + * @member {proto.IContextInfo|null|undefined} contextInfo + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.contextInfo = null; + + /** + * VideoMessage streamingSidecar. + * @member {Uint8Array} streamingSidecar + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.streamingSidecar = $util.newBuffer([]); + + /** + * VideoMessage gifAttribution. + * @member {proto.Message.VideoMessage.Attribution} gifAttribution + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.gifAttribution = 0; + + /** + * VideoMessage viewOnce. + * @member {boolean} viewOnce + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.viewOnce = false; + + /** + * VideoMessage thumbnailDirectPath. + * @member {string} thumbnailDirectPath + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.thumbnailDirectPath = ""; + + /** + * VideoMessage thumbnailSha256. + * @member {Uint8Array} thumbnailSha256 + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.thumbnailSha256 = $util.newBuffer([]); + + /** + * VideoMessage thumbnailEncSha256. + * @member {Uint8Array} thumbnailEncSha256 + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.thumbnailEncSha256 = $util.newBuffer([]); + + /** + * VideoMessage staticUrl. + * @member {string} staticUrl + * @memberof proto.Message.VideoMessage + * @instance + */ + VideoMessage.prototype.staticUrl = ""; + + /** + * Creates a new VideoMessage instance using the specified properties. + * @function create + * @memberof proto.Message.VideoMessage + * @static + * @param {proto.Message.IVideoMessage=} [properties] Properties to set + * @returns {proto.Message.VideoMessage} VideoMessage instance + */ + VideoMessage.create = function create(properties) { + return new VideoMessage(properties); + }; + + /** + * Encodes the specified VideoMessage message. Does not implicitly {@link proto.Message.VideoMessage.verify|verify} messages. + * @function encode + * @memberof proto.Message.VideoMessage + * @static + * @param {proto.Message.IVideoMessage} message VideoMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VideoMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.mimetype); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.fileSha256); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 4, wireType 0 =*/32).uint64(message.fileLength); + if (message.seconds != null && Object.hasOwnProperty.call(message, "seconds")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.seconds); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.mediaKey); + if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.caption); + if (message.gifPlayback != null && Object.hasOwnProperty.call(message, "gifPlayback")) + writer.uint32(/* id 8, wireType 0 =*/64).bool(message.gifPlayback); + if (message.height != null && Object.hasOwnProperty.call(message, "height")) + writer.uint32(/* id 9, wireType 0 =*/72).uint32(message.height); + if (message.width != null && Object.hasOwnProperty.call(message, "width")) + writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.width); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 11, wireType 2 =*/90).bytes(message.fileEncSha256); + if (message.interactiveAnnotations != null && message.interactiveAnnotations.length) + for (var i = 0; i < message.interactiveAnnotations.length; ++i) + $root.proto.InteractiveAnnotation.encode(message.interactiveAnnotations[i], writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 13, wireType 2 =*/106).string(message.directPath); + if (message.mediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "mediaKeyTimestamp")) + writer.uint32(/* id 14, wireType 0 =*/112).int64(message.mediaKeyTimestamp); + if (message.jpegThumbnail != null && Object.hasOwnProperty.call(message, "jpegThumbnail")) + writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.jpegThumbnail); + if (message.contextInfo != null && Object.hasOwnProperty.call(message, "contextInfo")) + $root.proto.ContextInfo.encode(message.contextInfo, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.streamingSidecar != null && Object.hasOwnProperty.call(message, "streamingSidecar")) + writer.uint32(/* id 18, wireType 2 =*/146).bytes(message.streamingSidecar); + if (message.gifAttribution != null && Object.hasOwnProperty.call(message, "gifAttribution")) + writer.uint32(/* id 19, wireType 0 =*/152).int32(message.gifAttribution); + if (message.viewOnce != null && Object.hasOwnProperty.call(message, "viewOnce")) + writer.uint32(/* id 20, wireType 0 =*/160).bool(message.viewOnce); + if (message.thumbnailDirectPath != null && Object.hasOwnProperty.call(message, "thumbnailDirectPath")) + writer.uint32(/* id 21, wireType 2 =*/170).string(message.thumbnailDirectPath); + if (message.thumbnailSha256 != null && Object.hasOwnProperty.call(message, "thumbnailSha256")) + writer.uint32(/* id 22, wireType 2 =*/178).bytes(message.thumbnailSha256); + if (message.thumbnailEncSha256 != null && Object.hasOwnProperty.call(message, "thumbnailEncSha256")) + writer.uint32(/* id 23, wireType 2 =*/186).bytes(message.thumbnailEncSha256); + if (message.staticUrl != null && Object.hasOwnProperty.call(message, "staticUrl")) + writer.uint32(/* id 24, wireType 2 =*/194).string(message.staticUrl); + return writer; + }; + + /** + * Encodes the specified VideoMessage message, length delimited. Does not implicitly {@link proto.Message.VideoMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Message.VideoMessage + * @static + * @param {proto.Message.IVideoMessage} message VideoMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VideoMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a VideoMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.Message.VideoMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Message.VideoMessage} VideoMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VideoMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Message.VideoMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.mimetype = reader.string(); + break; + case 3: + message.fileSha256 = reader.bytes(); + break; + case 4: + message.fileLength = reader.uint64(); + break; + case 5: + message.seconds = reader.uint32(); + break; + case 6: + message.mediaKey = reader.bytes(); + break; + case 7: + message.caption = reader.string(); + break; + case 8: + message.gifPlayback = reader.bool(); + break; + case 9: + message.height = reader.uint32(); + break; + case 10: + message.width = reader.uint32(); + break; + case 11: + message.fileEncSha256 = reader.bytes(); + break; + case 12: + if (!(message.interactiveAnnotations && message.interactiveAnnotations.length)) + message.interactiveAnnotations = []; + message.interactiveAnnotations.push($root.proto.InteractiveAnnotation.decode(reader, reader.uint32())); + break; + case 13: + message.directPath = reader.string(); + break; + case 14: + message.mediaKeyTimestamp = reader.int64(); + break; + case 16: + message.jpegThumbnail = reader.bytes(); + break; + case 17: + message.contextInfo = $root.proto.ContextInfo.decode(reader, reader.uint32()); + break; + case 18: + message.streamingSidecar = reader.bytes(); + break; + case 19: + message.gifAttribution = reader.int32(); + break; + case 20: + message.viewOnce = reader.bool(); + break; + case 21: + message.thumbnailDirectPath = reader.string(); + break; + case 22: + message.thumbnailSha256 = reader.bytes(); + break; + case 23: + message.thumbnailEncSha256 = reader.bytes(); + break; + case 24: + message.staticUrl = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a VideoMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Message.VideoMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Message.VideoMessage} VideoMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VideoMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a VideoMessage message. + * @function verify + * @memberof proto.Message.VideoMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + VideoMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.seconds != null && message.hasOwnProperty("seconds")) + if (!$util.isInteger(message.seconds)) + return "seconds: integer expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.caption != null && message.hasOwnProperty("caption")) + if (!$util.isString(message.caption)) + return "caption: string expected"; + if (message.gifPlayback != null && message.hasOwnProperty("gifPlayback")) + if (typeof message.gifPlayback !== "boolean") + return "gifPlayback: boolean expected"; + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + if (message.width != null && message.hasOwnProperty("width")) + if (!$util.isInteger(message.width)) + return "width: integer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.interactiveAnnotations != null && message.hasOwnProperty("interactiveAnnotations")) { + if (!Array.isArray(message.interactiveAnnotations)) + return "interactiveAnnotations: array expected"; + for (var i = 0; i < message.interactiveAnnotations.length; ++i) { + var error = $root.proto.InteractiveAnnotation.verify(message.interactiveAnnotations[i]); + if (error) + return "interactiveAnnotations." + error; + } + } + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (!$util.isInteger(message.mediaKeyTimestamp) && !(message.mediaKeyTimestamp && $util.isInteger(message.mediaKeyTimestamp.low) && $util.isInteger(message.mediaKeyTimestamp.high))) + return "mediaKeyTimestamp: integer|Long expected"; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + if (!(message.jpegThumbnail && typeof message.jpegThumbnail.length === "number" || $util.isString(message.jpegThumbnail))) + return "jpegThumbnail: buffer expected"; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) { + var error = $root.proto.ContextInfo.verify(message.contextInfo); + if (error) + return "contextInfo." + error; + } + if (message.streamingSidecar != null && message.hasOwnProperty("streamingSidecar")) + if (!(message.streamingSidecar && typeof message.streamingSidecar.length === "number" || $util.isString(message.streamingSidecar))) + return "streamingSidecar: buffer expected"; + if (message.gifAttribution != null && message.hasOwnProperty("gifAttribution")) + switch (message.gifAttribution) { + default: + return "gifAttribution: enum value expected"; + case 0: + case 1: + case 2: + break; + } + if (message.viewOnce != null && message.hasOwnProperty("viewOnce")) + if (typeof message.viewOnce !== "boolean") + return "viewOnce: boolean expected"; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + if (!$util.isString(message.thumbnailDirectPath)) + return "thumbnailDirectPath: string expected"; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + if (!(message.thumbnailSha256 && typeof message.thumbnailSha256.length === "number" || $util.isString(message.thumbnailSha256))) + return "thumbnailSha256: buffer expected"; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + if (!(message.thumbnailEncSha256 && typeof message.thumbnailEncSha256.length === "number" || $util.isString(message.thumbnailEncSha256))) + return "thumbnailEncSha256: buffer expected"; + if (message.staticUrl != null && message.hasOwnProperty("staticUrl")) + if (!$util.isString(message.staticUrl)) + return "staticUrl: string expected"; + return null; + }; + + /** + * Creates a VideoMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Message.VideoMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.Message.VideoMessage} VideoMessage + */ + VideoMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Message.VideoMessage) + return object; + var message = new $root.proto.Message.VideoMessage(); + if (object.url != null) + message.url = String(object.url); + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.seconds != null) + message.seconds = object.seconds >>> 0; + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.caption != null) + message.caption = String(object.caption); + if (object.gifPlayback != null) + message.gifPlayback = Boolean(object.gifPlayback); + if (object.height != null) + message.height = object.height >>> 0; + if (object.width != null) + message.width = object.width >>> 0; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.interactiveAnnotations) { + if (!Array.isArray(object.interactiveAnnotations)) + throw TypeError(".proto.Message.VideoMessage.interactiveAnnotations: array expected"); + message.interactiveAnnotations = []; + for (var i = 0; i < object.interactiveAnnotations.length; ++i) { + if (typeof object.interactiveAnnotations[i] !== "object") + throw TypeError(".proto.Message.VideoMessage.interactiveAnnotations: object expected"); + message.interactiveAnnotations[i] = $root.proto.InteractiveAnnotation.fromObject(object.interactiveAnnotations[i]); + } + } + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.mediaKeyTimestamp != null) + if ($util.Long) + (message.mediaKeyTimestamp = $util.Long.fromValue(object.mediaKeyTimestamp)).unsigned = false; + else if (typeof object.mediaKeyTimestamp === "string") + message.mediaKeyTimestamp = parseInt(object.mediaKeyTimestamp, 10); + else if (typeof object.mediaKeyTimestamp === "number") + message.mediaKeyTimestamp = object.mediaKeyTimestamp; + else if (typeof object.mediaKeyTimestamp === "object") + message.mediaKeyTimestamp = new $util.LongBits(object.mediaKeyTimestamp.low >>> 0, object.mediaKeyTimestamp.high >>> 0).toNumber(); + if (object.jpegThumbnail != null) + if (typeof object.jpegThumbnail === "string") + $util.base64.decode(object.jpegThumbnail, message.jpegThumbnail = $util.newBuffer($util.base64.length(object.jpegThumbnail)), 0); + else if (object.jpegThumbnail.length) + message.jpegThumbnail = object.jpegThumbnail; + if (object.contextInfo != null) { + if (typeof object.contextInfo !== "object") + throw TypeError(".proto.Message.VideoMessage.contextInfo: object expected"); + message.contextInfo = $root.proto.ContextInfo.fromObject(object.contextInfo); + } + if (object.streamingSidecar != null) + if (typeof object.streamingSidecar === "string") + $util.base64.decode(object.streamingSidecar, message.streamingSidecar = $util.newBuffer($util.base64.length(object.streamingSidecar)), 0); + else if (object.streamingSidecar.length) + message.streamingSidecar = object.streamingSidecar; + switch (object.gifAttribution) { + case "NONE": + case 0: + message.gifAttribution = 0; + break; + case "GIPHY": + case 1: + message.gifAttribution = 1; + break; + case "TENOR": + case 2: + message.gifAttribution = 2; + break; + } + if (object.viewOnce != null) + message.viewOnce = Boolean(object.viewOnce); + if (object.thumbnailDirectPath != null) + message.thumbnailDirectPath = String(object.thumbnailDirectPath); + if (object.thumbnailSha256 != null) + if (typeof object.thumbnailSha256 === "string") + $util.base64.decode(object.thumbnailSha256, message.thumbnailSha256 = $util.newBuffer($util.base64.length(object.thumbnailSha256)), 0); + else if (object.thumbnailSha256.length) + message.thumbnailSha256 = object.thumbnailSha256; + if (object.thumbnailEncSha256 != null) + if (typeof object.thumbnailEncSha256 === "string") + $util.base64.decode(object.thumbnailEncSha256, message.thumbnailEncSha256 = $util.newBuffer($util.base64.length(object.thumbnailEncSha256)), 0); + else if (object.thumbnailEncSha256.length) + message.thumbnailEncSha256 = object.thumbnailEncSha256; + if (object.staticUrl != null) + message.staticUrl = String(object.staticUrl); + return message; + }; + + /** + * Creates a plain object from a VideoMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Message.VideoMessage + * @static + * @param {proto.Message.VideoMessage} message VideoMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + VideoMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.interactiveAnnotations = []; + if (options.defaults) { + object.url = ""; + object.mimetype = ""; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + object.seconds = 0; + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + object.caption = ""; + object.gifPlayback = false; + object.height = 0; + object.width = 0; + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + object.directPath = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.mediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.mediaKeyTimestamp = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.jpegThumbnail = ""; + else { + object.jpegThumbnail = []; + if (options.bytes !== Array) + object.jpegThumbnail = $util.newBuffer(object.jpegThumbnail); + } + object.contextInfo = null; + if (options.bytes === String) + object.streamingSidecar = ""; + else { + object.streamingSidecar = []; + if (options.bytes !== Array) + object.streamingSidecar = $util.newBuffer(object.streamingSidecar); + } + object.gifAttribution = options.enums === String ? "NONE" : 0; + object.viewOnce = false; + object.thumbnailDirectPath = ""; + if (options.bytes === String) + object.thumbnailSha256 = ""; + else { + object.thumbnailSha256 = []; + if (options.bytes !== Array) + object.thumbnailSha256 = $util.newBuffer(object.thumbnailSha256); + } + if (options.bytes === String) + object.thumbnailEncSha256 = ""; + else { + object.thumbnailEncSha256 = []; + if (options.bytes !== Array) + object.thumbnailEncSha256 = $util.newBuffer(object.thumbnailEncSha256); + } + object.staticUrl = ""; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.seconds != null && message.hasOwnProperty("seconds")) + object.seconds = message.seconds; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.caption != null && message.hasOwnProperty("caption")) + object.caption = message.caption; + if (message.gifPlayback != null && message.hasOwnProperty("gifPlayback")) + object.gifPlayback = message.gifPlayback; + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + if (message.width != null && message.hasOwnProperty("width")) + object.width = message.width; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.interactiveAnnotations && message.interactiveAnnotations.length) { + object.interactiveAnnotations = []; + for (var j = 0; j < message.interactiveAnnotations.length; ++j) + object.interactiveAnnotations[j] = $root.proto.InteractiveAnnotation.toObject(message.interactiveAnnotations[j], options); + } + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (typeof message.mediaKeyTimestamp === "number") + object.mediaKeyTimestamp = options.longs === String ? String(message.mediaKeyTimestamp) : message.mediaKeyTimestamp; + else + object.mediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.mediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.mediaKeyTimestamp.low >>> 0, message.mediaKeyTimestamp.high >>> 0).toNumber() : message.mediaKeyTimestamp; + if (message.jpegThumbnail != null && message.hasOwnProperty("jpegThumbnail")) + object.jpegThumbnail = options.bytes === String ? $util.base64.encode(message.jpegThumbnail, 0, message.jpegThumbnail.length) : options.bytes === Array ? Array.prototype.slice.call(message.jpegThumbnail) : message.jpegThumbnail; + if (message.contextInfo != null && message.hasOwnProperty("contextInfo")) + object.contextInfo = $root.proto.ContextInfo.toObject(message.contextInfo, options); + if (message.streamingSidecar != null && message.hasOwnProperty("streamingSidecar")) + object.streamingSidecar = options.bytes === String ? $util.base64.encode(message.streamingSidecar, 0, message.streamingSidecar.length) : options.bytes === Array ? Array.prototype.slice.call(message.streamingSidecar) : message.streamingSidecar; + if (message.gifAttribution != null && message.hasOwnProperty("gifAttribution")) + object.gifAttribution = options.enums === String ? $root.proto.Message.VideoMessage.Attribution[message.gifAttribution] : message.gifAttribution; + if (message.viewOnce != null && message.hasOwnProperty("viewOnce")) + object.viewOnce = message.viewOnce; + if (message.thumbnailDirectPath != null && message.hasOwnProperty("thumbnailDirectPath")) + object.thumbnailDirectPath = message.thumbnailDirectPath; + if (message.thumbnailSha256 != null && message.hasOwnProperty("thumbnailSha256")) + object.thumbnailSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailSha256, 0, message.thumbnailSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailSha256) : message.thumbnailSha256; + if (message.thumbnailEncSha256 != null && message.hasOwnProperty("thumbnailEncSha256")) + object.thumbnailEncSha256 = options.bytes === String ? $util.base64.encode(message.thumbnailEncSha256, 0, message.thumbnailEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.thumbnailEncSha256) : message.thumbnailEncSha256; + if (message.staticUrl != null && message.hasOwnProperty("staticUrl")) + object.staticUrl = message.staticUrl; + return object; + }; + + /** + * Converts this VideoMessage to JSON. + * @function toJSON + * @memberof proto.Message.VideoMessage + * @instance + * @returns {Object.} JSON object + */ + VideoMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Attribution enum. + * @name proto.Message.VideoMessage.Attribution + * @enum {number} + * @property {number} NONE=0 NONE value + * @property {number} GIPHY=1 GIPHY value + * @property {number} TENOR=2 TENOR value + */ + VideoMessage.Attribution = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "NONE"] = 0; + values[valuesById[1] = "GIPHY"] = 1; + values[valuesById[2] = "TENOR"] = 2; + return values; + })(); + + return VideoMessage; + })(); + + return Message; + })(); + + proto.MessageContextInfo = (function() { + + /** + * Properties of a MessageContextInfo. + * @memberof proto + * @interface IMessageContextInfo + * @property {proto.IDeviceListMetadata|null} [deviceListMetadata] MessageContextInfo deviceListMetadata + * @property {number|null} [deviceListMetadataVersion] MessageContextInfo deviceListMetadataVersion + * @property {Uint8Array|null} [messageSecret] MessageContextInfo messageSecret + * @property {Uint8Array|null} [paddingBytes] MessageContextInfo paddingBytes + */ + + /** + * Constructs a new MessageContextInfo. + * @memberof proto + * @classdesc Represents a MessageContextInfo. + * @implements IMessageContextInfo + * @constructor + * @param {proto.IMessageContextInfo=} [properties] Properties to set + */ + function MessageContextInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MessageContextInfo deviceListMetadata. + * @member {proto.IDeviceListMetadata|null|undefined} deviceListMetadata + * @memberof proto.MessageContextInfo + * @instance + */ + MessageContextInfo.prototype.deviceListMetadata = null; + + /** + * MessageContextInfo deviceListMetadataVersion. + * @member {number} deviceListMetadataVersion + * @memberof proto.MessageContextInfo + * @instance + */ + MessageContextInfo.prototype.deviceListMetadataVersion = 0; + + /** + * MessageContextInfo messageSecret. + * @member {Uint8Array} messageSecret + * @memberof proto.MessageContextInfo + * @instance + */ + MessageContextInfo.prototype.messageSecret = $util.newBuffer([]); + + /** + * MessageContextInfo paddingBytes. + * @member {Uint8Array} paddingBytes + * @memberof proto.MessageContextInfo + * @instance + */ + MessageContextInfo.prototype.paddingBytes = $util.newBuffer([]); + + /** + * Creates a new MessageContextInfo instance using the specified properties. + * @function create + * @memberof proto.MessageContextInfo + * @static + * @param {proto.IMessageContextInfo=} [properties] Properties to set + * @returns {proto.MessageContextInfo} MessageContextInfo instance + */ + MessageContextInfo.create = function create(properties) { + return new MessageContextInfo(properties); + }; + + /** + * Encodes the specified MessageContextInfo message. Does not implicitly {@link proto.MessageContextInfo.verify|verify} messages. + * @function encode + * @memberof proto.MessageContextInfo + * @static + * @param {proto.IMessageContextInfo} message MessageContextInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MessageContextInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.deviceListMetadata != null && Object.hasOwnProperty.call(message, "deviceListMetadata")) + $root.proto.DeviceListMetadata.encode(message.deviceListMetadata, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.deviceListMetadataVersion != null && Object.hasOwnProperty.call(message, "deviceListMetadataVersion")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.deviceListMetadataVersion); + if (message.messageSecret != null && Object.hasOwnProperty.call(message, "messageSecret")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.messageSecret); + if (message.paddingBytes != null && Object.hasOwnProperty.call(message, "paddingBytes")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.paddingBytes); + return writer; + }; + + /** + * Encodes the specified MessageContextInfo message, length delimited. Does not implicitly {@link proto.MessageContextInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.MessageContextInfo + * @static + * @param {proto.IMessageContextInfo} message MessageContextInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MessageContextInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MessageContextInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.MessageContextInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.MessageContextInfo} MessageContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MessageContextInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.MessageContextInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.deviceListMetadata = $root.proto.DeviceListMetadata.decode(reader, reader.uint32()); + break; + case 2: + message.deviceListMetadataVersion = reader.int32(); + break; + case 3: + message.messageSecret = reader.bytes(); + break; + case 4: + message.paddingBytes = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MessageContextInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.MessageContextInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.MessageContextInfo} MessageContextInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MessageContextInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MessageContextInfo message. + * @function verify + * @memberof proto.MessageContextInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MessageContextInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.deviceListMetadata != null && message.hasOwnProperty("deviceListMetadata")) { + var error = $root.proto.DeviceListMetadata.verify(message.deviceListMetadata); + if (error) + return "deviceListMetadata." + error; + } + if (message.deviceListMetadataVersion != null && message.hasOwnProperty("deviceListMetadataVersion")) + if (!$util.isInteger(message.deviceListMetadataVersion)) + return "deviceListMetadataVersion: integer expected"; + if (message.messageSecret != null && message.hasOwnProperty("messageSecret")) + if (!(message.messageSecret && typeof message.messageSecret.length === "number" || $util.isString(message.messageSecret))) + return "messageSecret: buffer expected"; + if (message.paddingBytes != null && message.hasOwnProperty("paddingBytes")) + if (!(message.paddingBytes && typeof message.paddingBytes.length === "number" || $util.isString(message.paddingBytes))) + return "paddingBytes: buffer expected"; + return null; + }; + + /** + * Creates a MessageContextInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.MessageContextInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.MessageContextInfo} MessageContextInfo + */ + MessageContextInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.MessageContextInfo) + return object; + var message = new $root.proto.MessageContextInfo(); + if (object.deviceListMetadata != null) { + if (typeof object.deviceListMetadata !== "object") + throw TypeError(".proto.MessageContextInfo.deviceListMetadata: object expected"); + message.deviceListMetadata = $root.proto.DeviceListMetadata.fromObject(object.deviceListMetadata); + } + if (object.deviceListMetadataVersion != null) + message.deviceListMetadataVersion = object.deviceListMetadataVersion | 0; + if (object.messageSecret != null) + if (typeof object.messageSecret === "string") + $util.base64.decode(object.messageSecret, message.messageSecret = $util.newBuffer($util.base64.length(object.messageSecret)), 0); + else if (object.messageSecret.length) + message.messageSecret = object.messageSecret; + if (object.paddingBytes != null) + if (typeof object.paddingBytes === "string") + $util.base64.decode(object.paddingBytes, message.paddingBytes = $util.newBuffer($util.base64.length(object.paddingBytes)), 0); + else if (object.paddingBytes.length) + message.paddingBytes = object.paddingBytes; + return message; + }; + + /** + * Creates a plain object from a MessageContextInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.MessageContextInfo + * @static + * @param {proto.MessageContextInfo} message MessageContextInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MessageContextInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.deviceListMetadata = null; + object.deviceListMetadataVersion = 0; + if (options.bytes === String) + object.messageSecret = ""; + else { + object.messageSecret = []; + if (options.bytes !== Array) + object.messageSecret = $util.newBuffer(object.messageSecret); + } + if (options.bytes === String) + object.paddingBytes = ""; + else { + object.paddingBytes = []; + if (options.bytes !== Array) + object.paddingBytes = $util.newBuffer(object.paddingBytes); + } + } + if (message.deviceListMetadata != null && message.hasOwnProperty("deviceListMetadata")) + object.deviceListMetadata = $root.proto.DeviceListMetadata.toObject(message.deviceListMetadata, options); + if (message.deviceListMetadataVersion != null && message.hasOwnProperty("deviceListMetadataVersion")) + object.deviceListMetadataVersion = message.deviceListMetadataVersion; + if (message.messageSecret != null && message.hasOwnProperty("messageSecret")) + object.messageSecret = options.bytes === String ? $util.base64.encode(message.messageSecret, 0, message.messageSecret.length) : options.bytes === Array ? Array.prototype.slice.call(message.messageSecret) : message.messageSecret; + if (message.paddingBytes != null && message.hasOwnProperty("paddingBytes")) + object.paddingBytes = options.bytes === String ? $util.base64.encode(message.paddingBytes, 0, message.paddingBytes.length) : options.bytes === Array ? Array.prototype.slice.call(message.paddingBytes) : message.paddingBytes; + return object; + }; + + /** + * Converts this MessageContextInfo to JSON. + * @function toJSON + * @memberof proto.MessageContextInfo + * @instance + * @returns {Object.} JSON object + */ + MessageContextInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MessageContextInfo; + })(); + + proto.MessageKey = (function() { + + /** + * Properties of a MessageKey. + * @memberof proto + * @interface IMessageKey + * @property {string|null} [remoteJid] MessageKey remoteJid + * @property {boolean|null} [fromMe] MessageKey fromMe + * @property {string|null} [id] MessageKey id + * @property {string|null} [participant] MessageKey participant + */ + + /** + * Constructs a new MessageKey. + * @memberof proto + * @classdesc Represents a MessageKey. + * @implements IMessageKey + * @constructor + * @param {proto.IMessageKey=} [properties] Properties to set + */ + function MessageKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MessageKey remoteJid. + * @member {string} remoteJid + * @memberof proto.MessageKey + * @instance + */ + MessageKey.prototype.remoteJid = ""; + + /** + * MessageKey fromMe. + * @member {boolean} fromMe + * @memberof proto.MessageKey + * @instance + */ + MessageKey.prototype.fromMe = false; + + /** + * MessageKey id. + * @member {string} id + * @memberof proto.MessageKey + * @instance + */ + MessageKey.prototype.id = ""; + + /** + * MessageKey participant. + * @member {string} participant + * @memberof proto.MessageKey + * @instance + */ + MessageKey.prototype.participant = ""; + + /** + * Creates a new MessageKey instance using the specified properties. + * @function create + * @memberof proto.MessageKey + * @static + * @param {proto.IMessageKey=} [properties] Properties to set + * @returns {proto.MessageKey} MessageKey instance + */ + MessageKey.create = function create(properties) { + return new MessageKey(properties); + }; + + /** + * Encodes the specified MessageKey message. Does not implicitly {@link proto.MessageKey.verify|verify} messages. + * @function encode + * @memberof proto.MessageKey + * @static + * @param {proto.IMessageKey} message MessageKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MessageKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.remoteJid != null && Object.hasOwnProperty.call(message, "remoteJid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.remoteJid); + if (message.fromMe != null && Object.hasOwnProperty.call(message, "fromMe")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.fromMe); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.id); + if (message.participant != null && Object.hasOwnProperty.call(message, "participant")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.participant); + return writer; + }; + + /** + * Encodes the specified MessageKey message, length delimited. Does not implicitly {@link proto.MessageKey.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.MessageKey + * @static + * @param {proto.IMessageKey} message MessageKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MessageKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MessageKey message from the specified reader or buffer. + * @function decode + * @memberof proto.MessageKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.MessageKey} MessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MessageKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.MessageKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.remoteJid = reader.string(); + break; + case 2: + message.fromMe = reader.bool(); + break; + case 3: + message.id = reader.string(); + break; + case 4: + message.participant = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MessageKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.MessageKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.MessageKey} MessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MessageKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MessageKey message. + * @function verify + * @memberof proto.MessageKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MessageKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.remoteJid != null && message.hasOwnProperty("remoteJid")) + if (!$util.isString(message.remoteJid)) + return "remoteJid: string expected"; + if (message.fromMe != null && message.hasOwnProperty("fromMe")) + if (typeof message.fromMe !== "boolean") + return "fromMe: boolean expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + if (message.participant != null && message.hasOwnProperty("participant")) + if (!$util.isString(message.participant)) + return "participant: string expected"; + return null; + }; + + /** + * Creates a MessageKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.MessageKey + * @static + * @param {Object.} object Plain object + * @returns {proto.MessageKey} MessageKey + */ + MessageKey.fromObject = function fromObject(object) { + if (object instanceof $root.proto.MessageKey) + return object; + var message = new $root.proto.MessageKey(); + if (object.remoteJid != null) + message.remoteJid = String(object.remoteJid); + if (object.fromMe != null) + message.fromMe = Boolean(object.fromMe); + if (object.id != null) + message.id = String(object.id); + if (object.participant != null) + message.participant = String(object.participant); + return message; + }; + + /** + * Creates a plain object from a MessageKey message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.MessageKey + * @static + * @param {proto.MessageKey} message MessageKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MessageKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.remoteJid = ""; + object.fromMe = false; + object.id = ""; + object.participant = ""; + } + if (message.remoteJid != null && message.hasOwnProperty("remoteJid")) + object.remoteJid = message.remoteJid; + if (message.fromMe != null && message.hasOwnProperty("fromMe")) + object.fromMe = message.fromMe; + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.participant != null && message.hasOwnProperty("participant")) + object.participant = message.participant; + return object; + }; + + /** + * Converts this MessageKey to JSON. + * @function toJSON + * @memberof proto.MessageKey + * @instance + * @returns {Object.} JSON object + */ + MessageKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MessageKey; + })(); + + proto.Money = (function() { + + /** + * Properties of a Money. + * @memberof proto + * @interface IMoney + * @property {number|Long|null} [value] Money value + * @property {number|null} [offset] Money offset + * @property {string|null} [currencyCode] Money currencyCode + */ + + /** + * Constructs a new Money. + * @memberof proto + * @classdesc Represents a Money. + * @implements IMoney + * @constructor + * @param {proto.IMoney=} [properties] Properties to set + */ + function Money(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Money value. + * @member {number|Long} value + * @memberof proto.Money + * @instance + */ + Money.prototype.value = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Money offset. + * @member {number} offset + * @memberof proto.Money + * @instance + */ + Money.prototype.offset = 0; + + /** + * Money currencyCode. + * @member {string} currencyCode + * @memberof proto.Money + * @instance + */ + Money.prototype.currencyCode = ""; + + /** + * Creates a new Money instance using the specified properties. + * @function create + * @memberof proto.Money + * @static + * @param {proto.IMoney=} [properties] Properties to set + * @returns {proto.Money} Money instance + */ + Money.create = function create(properties) { + return new Money(properties); + }; + + /** + * Encodes the specified Money message. Does not implicitly {@link proto.Money.verify|verify} messages. + * @function encode + * @memberof proto.Money + * @static + * @param {proto.IMoney} message Money message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Money.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.value); + if (message.offset != null && Object.hasOwnProperty.call(message, "offset")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.offset); + if (message.currencyCode != null && Object.hasOwnProperty.call(message, "currencyCode")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.currencyCode); + return writer; + }; + + /** + * Encodes the specified Money message, length delimited. Does not implicitly {@link proto.Money.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Money + * @static + * @param {proto.IMoney} message Money message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Money.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Money message from the specified reader or buffer. + * @function decode + * @memberof proto.Money + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Money} Money + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Money.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Money(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.value = reader.int64(); + break; + case 2: + message.offset = reader.uint32(); + break; + case 3: + message.currencyCode = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Money message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Money + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Money} Money + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Money.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Money message. + * @function verify + * @memberof proto.Money + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Money.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.value != null && message.hasOwnProperty("value")) + if (!$util.isInteger(message.value) && !(message.value && $util.isInteger(message.value.low) && $util.isInteger(message.value.high))) + return "value: integer|Long expected"; + if (message.offset != null && message.hasOwnProperty("offset")) + if (!$util.isInteger(message.offset)) + return "offset: integer expected"; + if (message.currencyCode != null && message.hasOwnProperty("currencyCode")) + if (!$util.isString(message.currencyCode)) + return "currencyCode: string expected"; + return null; + }; + + /** + * Creates a Money message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Money + * @static + * @param {Object.} object Plain object + * @returns {proto.Money} Money + */ + Money.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Money) + return object; + var message = new $root.proto.Money(); + if (object.value != null) + if ($util.Long) + (message.value = $util.Long.fromValue(object.value)).unsigned = false; + else if (typeof object.value === "string") + message.value = parseInt(object.value, 10); + else if (typeof object.value === "number") + message.value = object.value; + else if (typeof object.value === "object") + message.value = new $util.LongBits(object.value.low >>> 0, object.value.high >>> 0).toNumber(); + if (object.offset != null) + message.offset = object.offset >>> 0; + if (object.currencyCode != null) + message.currencyCode = String(object.currencyCode); + return message; + }; + + /** + * Creates a plain object from a Money message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Money + * @static + * @param {proto.Money} message Money + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Money.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.value = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.value = options.longs === String ? "0" : 0; + object.offset = 0; + object.currencyCode = ""; + } + if (message.value != null && message.hasOwnProperty("value")) + if (typeof message.value === "number") + object.value = options.longs === String ? String(message.value) : message.value; + else + object.value = options.longs === String ? $util.Long.prototype.toString.call(message.value) : options.longs === Number ? new $util.LongBits(message.value.low >>> 0, message.value.high >>> 0).toNumber() : message.value; + if (message.offset != null && message.hasOwnProperty("offset")) + object.offset = message.offset; + if (message.currencyCode != null && message.hasOwnProperty("currencyCode")) + object.currencyCode = message.currencyCode; + return object; + }; + + /** + * Converts this Money to JSON. + * @function toJSON + * @memberof proto.Money + * @instance + * @returns {Object.} JSON object + */ + Money.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Money; + })(); + + proto.MsgOpaqueData = (function() { + + /** + * Properties of a MsgOpaqueData. + * @memberof proto + * @interface IMsgOpaqueData + * @property {string|null} [body] MsgOpaqueData body + * @property {string|null} [caption] MsgOpaqueData caption + * @property {number|null} [lng] MsgOpaqueData lng + * @property {boolean|null} [isLive] MsgOpaqueData isLive + * @property {number|null} [lat] MsgOpaqueData lat + * @property {number|null} [paymentAmount1000] MsgOpaqueData paymentAmount1000 + * @property {string|null} [paymentNoteMsgBody] MsgOpaqueData paymentNoteMsgBody + * @property {string|null} [canonicalUrl] MsgOpaqueData canonicalUrl + * @property {string|null} [matchedText] MsgOpaqueData matchedText + * @property {string|null} [title] MsgOpaqueData title + * @property {string|null} [description] MsgOpaqueData description + * @property {Uint8Array|null} [futureproofBuffer] MsgOpaqueData futureproofBuffer + * @property {string|null} [clientUrl] MsgOpaqueData clientUrl + * @property {string|null} [loc] MsgOpaqueData loc + * @property {string|null} [pollName] MsgOpaqueData pollName + * @property {Array.|null} [pollOptions] MsgOpaqueData pollOptions + * @property {number|null} [pollSelectableOptionsCount] MsgOpaqueData pollSelectableOptionsCount + * @property {Uint8Array|null} [messageSecret] MsgOpaqueData messageSecret + * @property {string|null} [originalSelfAuthor] MsgOpaqueData originalSelfAuthor + * @property {number|Long|null} [senderTimestampMs] MsgOpaqueData senderTimestampMs + * @property {string|null} [pollUpdateParentKey] MsgOpaqueData pollUpdateParentKey + * @property {proto.IPollEncValue|null} [encPollVote] MsgOpaqueData encPollVote + */ + + /** + * Constructs a new MsgOpaqueData. + * @memberof proto + * @classdesc Represents a MsgOpaqueData. + * @implements IMsgOpaqueData + * @constructor + * @param {proto.IMsgOpaqueData=} [properties] Properties to set + */ + function MsgOpaqueData(properties) { + this.pollOptions = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MsgOpaqueData body. + * @member {string} body + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.body = ""; + + /** + * MsgOpaqueData caption. + * @member {string} caption + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.caption = ""; + + /** + * MsgOpaqueData lng. + * @member {number} lng + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.lng = 0; + + /** + * MsgOpaqueData isLive. + * @member {boolean} isLive + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.isLive = false; + + /** + * MsgOpaqueData lat. + * @member {number} lat + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.lat = 0; + + /** + * MsgOpaqueData paymentAmount1000. + * @member {number} paymentAmount1000 + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.paymentAmount1000 = 0; + + /** + * MsgOpaqueData paymentNoteMsgBody. + * @member {string} paymentNoteMsgBody + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.paymentNoteMsgBody = ""; + + /** + * MsgOpaqueData canonicalUrl. + * @member {string} canonicalUrl + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.canonicalUrl = ""; + + /** + * MsgOpaqueData matchedText. + * @member {string} matchedText + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.matchedText = ""; + + /** + * MsgOpaqueData title. + * @member {string} title + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.title = ""; + + /** + * MsgOpaqueData description. + * @member {string} description + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.description = ""; + + /** + * MsgOpaqueData futureproofBuffer. + * @member {Uint8Array} futureproofBuffer + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.futureproofBuffer = $util.newBuffer([]); + + /** + * MsgOpaqueData clientUrl. + * @member {string} clientUrl + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.clientUrl = ""; + + /** + * MsgOpaqueData loc. + * @member {string} loc + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.loc = ""; + + /** + * MsgOpaqueData pollName. + * @member {string} pollName + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.pollName = ""; + + /** + * MsgOpaqueData pollOptions. + * @member {Array.} pollOptions + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.pollOptions = $util.emptyArray; + + /** + * MsgOpaqueData pollSelectableOptionsCount. + * @member {number} pollSelectableOptionsCount + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.pollSelectableOptionsCount = 0; + + /** + * MsgOpaqueData messageSecret. + * @member {Uint8Array} messageSecret + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.messageSecret = $util.newBuffer([]); + + /** + * MsgOpaqueData originalSelfAuthor. + * @member {string} originalSelfAuthor + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.originalSelfAuthor = ""; + + /** + * MsgOpaqueData senderTimestampMs. + * @member {number|Long} senderTimestampMs + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.senderTimestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * MsgOpaqueData pollUpdateParentKey. + * @member {string} pollUpdateParentKey + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.pollUpdateParentKey = ""; + + /** + * MsgOpaqueData encPollVote. + * @member {proto.IPollEncValue|null|undefined} encPollVote + * @memberof proto.MsgOpaqueData + * @instance + */ + MsgOpaqueData.prototype.encPollVote = null; + + /** + * Creates a new MsgOpaqueData instance using the specified properties. + * @function create + * @memberof proto.MsgOpaqueData + * @static + * @param {proto.IMsgOpaqueData=} [properties] Properties to set + * @returns {proto.MsgOpaqueData} MsgOpaqueData instance + */ + MsgOpaqueData.create = function create(properties) { + return new MsgOpaqueData(properties); + }; + + /** + * Encodes the specified MsgOpaqueData message. Does not implicitly {@link proto.MsgOpaqueData.verify|verify} messages. + * @function encode + * @memberof proto.MsgOpaqueData + * @static + * @param {proto.IMsgOpaqueData} message MsgOpaqueData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MsgOpaqueData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.body != null && Object.hasOwnProperty.call(message, "body")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.body); + if (message.caption != null && Object.hasOwnProperty.call(message, "caption")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.caption); + if (message.lng != null && Object.hasOwnProperty.call(message, "lng")) + writer.uint32(/* id 5, wireType 1 =*/41).double(message.lng); + if (message.isLive != null && Object.hasOwnProperty.call(message, "isLive")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.isLive); + if (message.lat != null && Object.hasOwnProperty.call(message, "lat")) + writer.uint32(/* id 7, wireType 1 =*/57).double(message.lat); + if (message.paymentAmount1000 != null && Object.hasOwnProperty.call(message, "paymentAmount1000")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.paymentAmount1000); + if (message.paymentNoteMsgBody != null && Object.hasOwnProperty.call(message, "paymentNoteMsgBody")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.paymentNoteMsgBody); + if (message.canonicalUrl != null && Object.hasOwnProperty.call(message, "canonicalUrl")) + writer.uint32(/* id 10, wireType 2 =*/82).string(message.canonicalUrl); + if (message.matchedText != null && Object.hasOwnProperty.call(message, "matchedText")) + writer.uint32(/* id 11, wireType 2 =*/90).string(message.matchedText); + if (message.title != null && Object.hasOwnProperty.call(message, "title")) + writer.uint32(/* id 12, wireType 2 =*/98).string(message.title); + if (message.description != null && Object.hasOwnProperty.call(message, "description")) + writer.uint32(/* id 13, wireType 2 =*/106).string(message.description); + if (message.futureproofBuffer != null && Object.hasOwnProperty.call(message, "futureproofBuffer")) + writer.uint32(/* id 14, wireType 2 =*/114).bytes(message.futureproofBuffer); + if (message.clientUrl != null && Object.hasOwnProperty.call(message, "clientUrl")) + writer.uint32(/* id 15, wireType 2 =*/122).string(message.clientUrl); + if (message.loc != null && Object.hasOwnProperty.call(message, "loc")) + writer.uint32(/* id 16, wireType 2 =*/130).string(message.loc); + if (message.pollName != null && Object.hasOwnProperty.call(message, "pollName")) + writer.uint32(/* id 17, wireType 2 =*/138).string(message.pollName); + if (message.pollOptions != null && message.pollOptions.length) + for (var i = 0; i < message.pollOptions.length; ++i) + $root.proto.MsgOpaqueData.PollOption.encode(message.pollOptions[i], writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); + if (message.pollSelectableOptionsCount != null && Object.hasOwnProperty.call(message, "pollSelectableOptionsCount")) + writer.uint32(/* id 20, wireType 0 =*/160).uint32(message.pollSelectableOptionsCount); + if (message.messageSecret != null && Object.hasOwnProperty.call(message, "messageSecret")) + writer.uint32(/* id 21, wireType 2 =*/170).bytes(message.messageSecret); + if (message.senderTimestampMs != null && Object.hasOwnProperty.call(message, "senderTimestampMs")) + writer.uint32(/* id 22, wireType 0 =*/176).int64(message.senderTimestampMs); + if (message.pollUpdateParentKey != null && Object.hasOwnProperty.call(message, "pollUpdateParentKey")) + writer.uint32(/* id 23, wireType 2 =*/186).string(message.pollUpdateParentKey); + if (message.encPollVote != null && Object.hasOwnProperty.call(message, "encPollVote")) + $root.proto.PollEncValue.encode(message.encPollVote, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); + if (message.originalSelfAuthor != null && Object.hasOwnProperty.call(message, "originalSelfAuthor")) + writer.uint32(/* id 51, wireType 2 =*/410).string(message.originalSelfAuthor); + return writer; + }; + + /** + * Encodes the specified MsgOpaqueData message, length delimited. Does not implicitly {@link proto.MsgOpaqueData.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.MsgOpaqueData + * @static + * @param {proto.IMsgOpaqueData} message MsgOpaqueData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MsgOpaqueData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MsgOpaqueData message from the specified reader or buffer. + * @function decode + * @memberof proto.MsgOpaqueData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.MsgOpaqueData} MsgOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MsgOpaqueData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.MsgOpaqueData(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.body = reader.string(); + break; + case 3: + message.caption = reader.string(); + break; + case 5: + message.lng = reader.double(); + break; + case 6: + message.isLive = reader.bool(); + break; + case 7: + message.lat = reader.double(); + break; + case 8: + message.paymentAmount1000 = reader.int32(); + break; + case 9: + message.paymentNoteMsgBody = reader.string(); + break; + case 10: + message.canonicalUrl = reader.string(); + break; + case 11: + message.matchedText = reader.string(); + break; + case 12: + message.title = reader.string(); + break; + case 13: + message.description = reader.string(); + break; + case 14: + message.futureproofBuffer = reader.bytes(); + break; + case 15: + message.clientUrl = reader.string(); + break; + case 16: + message.loc = reader.string(); + break; + case 17: + message.pollName = reader.string(); + break; + case 18: + if (!(message.pollOptions && message.pollOptions.length)) + message.pollOptions = []; + message.pollOptions.push($root.proto.MsgOpaqueData.PollOption.decode(reader, reader.uint32())); + break; + case 20: + message.pollSelectableOptionsCount = reader.uint32(); + break; + case 21: + message.messageSecret = reader.bytes(); + break; + case 51: + message.originalSelfAuthor = reader.string(); + break; + case 22: + message.senderTimestampMs = reader.int64(); + break; + case 23: + message.pollUpdateParentKey = reader.string(); + break; + case 24: + message.encPollVote = $root.proto.PollEncValue.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MsgOpaqueData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.MsgOpaqueData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.MsgOpaqueData} MsgOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MsgOpaqueData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MsgOpaqueData message. + * @function verify + * @memberof proto.MsgOpaqueData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MsgOpaqueData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.body != null && message.hasOwnProperty("body")) + if (!$util.isString(message.body)) + return "body: string expected"; + if (message.caption != null && message.hasOwnProperty("caption")) + if (!$util.isString(message.caption)) + return "caption: string expected"; + if (message.lng != null && message.hasOwnProperty("lng")) + if (typeof message.lng !== "number") + return "lng: number expected"; + if (message.isLive != null && message.hasOwnProperty("isLive")) + if (typeof message.isLive !== "boolean") + return "isLive: boolean expected"; + if (message.lat != null && message.hasOwnProperty("lat")) + if (typeof message.lat !== "number") + return "lat: number expected"; + if (message.paymentAmount1000 != null && message.hasOwnProperty("paymentAmount1000")) + if (!$util.isInteger(message.paymentAmount1000)) + return "paymentAmount1000: integer expected"; + if (message.paymentNoteMsgBody != null && message.hasOwnProperty("paymentNoteMsgBody")) + if (!$util.isString(message.paymentNoteMsgBody)) + return "paymentNoteMsgBody: string expected"; + if (message.canonicalUrl != null && message.hasOwnProperty("canonicalUrl")) + if (!$util.isString(message.canonicalUrl)) + return "canonicalUrl: string expected"; + if (message.matchedText != null && message.hasOwnProperty("matchedText")) + if (!$util.isString(message.matchedText)) + return "matchedText: string expected"; + if (message.title != null && message.hasOwnProperty("title")) + if (!$util.isString(message.title)) + return "title: string expected"; + if (message.description != null && message.hasOwnProperty("description")) + if (!$util.isString(message.description)) + return "description: string expected"; + if (message.futureproofBuffer != null && message.hasOwnProperty("futureproofBuffer")) + if (!(message.futureproofBuffer && typeof message.futureproofBuffer.length === "number" || $util.isString(message.futureproofBuffer))) + return "futureproofBuffer: buffer expected"; + if (message.clientUrl != null && message.hasOwnProperty("clientUrl")) + if (!$util.isString(message.clientUrl)) + return "clientUrl: string expected"; + if (message.loc != null && message.hasOwnProperty("loc")) + if (!$util.isString(message.loc)) + return "loc: string expected"; + if (message.pollName != null && message.hasOwnProperty("pollName")) + if (!$util.isString(message.pollName)) + return "pollName: string expected"; + if (message.pollOptions != null && message.hasOwnProperty("pollOptions")) { + if (!Array.isArray(message.pollOptions)) + return "pollOptions: array expected"; + for (var i = 0; i < message.pollOptions.length; ++i) { + var error = $root.proto.MsgOpaqueData.PollOption.verify(message.pollOptions[i]); + if (error) + return "pollOptions." + error; + } + } + if (message.pollSelectableOptionsCount != null && message.hasOwnProperty("pollSelectableOptionsCount")) + if (!$util.isInteger(message.pollSelectableOptionsCount)) + return "pollSelectableOptionsCount: integer expected"; + if (message.messageSecret != null && message.hasOwnProperty("messageSecret")) + if (!(message.messageSecret && typeof message.messageSecret.length === "number" || $util.isString(message.messageSecret))) + return "messageSecret: buffer expected"; + if (message.originalSelfAuthor != null && message.hasOwnProperty("originalSelfAuthor")) + if (!$util.isString(message.originalSelfAuthor)) + return "originalSelfAuthor: string expected"; + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (!$util.isInteger(message.senderTimestampMs) && !(message.senderTimestampMs && $util.isInteger(message.senderTimestampMs.low) && $util.isInteger(message.senderTimestampMs.high))) + return "senderTimestampMs: integer|Long expected"; + if (message.pollUpdateParentKey != null && message.hasOwnProperty("pollUpdateParentKey")) + if (!$util.isString(message.pollUpdateParentKey)) + return "pollUpdateParentKey: string expected"; + if (message.encPollVote != null && message.hasOwnProperty("encPollVote")) { + var error = $root.proto.PollEncValue.verify(message.encPollVote); + if (error) + return "encPollVote." + error; + } + return null; + }; + + /** + * Creates a MsgOpaqueData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.MsgOpaqueData + * @static + * @param {Object.} object Plain object + * @returns {proto.MsgOpaqueData} MsgOpaqueData + */ + MsgOpaqueData.fromObject = function fromObject(object) { + if (object instanceof $root.proto.MsgOpaqueData) + return object; + var message = new $root.proto.MsgOpaqueData(); + if (object.body != null) + message.body = String(object.body); + if (object.caption != null) + message.caption = String(object.caption); + if (object.lng != null) + message.lng = Number(object.lng); + if (object.isLive != null) + message.isLive = Boolean(object.isLive); + if (object.lat != null) + message.lat = Number(object.lat); + if (object.paymentAmount1000 != null) + message.paymentAmount1000 = object.paymentAmount1000 | 0; + if (object.paymentNoteMsgBody != null) + message.paymentNoteMsgBody = String(object.paymentNoteMsgBody); + if (object.canonicalUrl != null) + message.canonicalUrl = String(object.canonicalUrl); + if (object.matchedText != null) + message.matchedText = String(object.matchedText); + if (object.title != null) + message.title = String(object.title); + if (object.description != null) + message.description = String(object.description); + if (object.futureproofBuffer != null) + if (typeof object.futureproofBuffer === "string") + $util.base64.decode(object.futureproofBuffer, message.futureproofBuffer = $util.newBuffer($util.base64.length(object.futureproofBuffer)), 0); + else if (object.futureproofBuffer.length) + message.futureproofBuffer = object.futureproofBuffer; + if (object.clientUrl != null) + message.clientUrl = String(object.clientUrl); + if (object.loc != null) + message.loc = String(object.loc); + if (object.pollName != null) + message.pollName = String(object.pollName); + if (object.pollOptions) { + if (!Array.isArray(object.pollOptions)) + throw TypeError(".proto.MsgOpaqueData.pollOptions: array expected"); + message.pollOptions = []; + for (var i = 0; i < object.pollOptions.length; ++i) { + if (typeof object.pollOptions[i] !== "object") + throw TypeError(".proto.MsgOpaqueData.pollOptions: object expected"); + message.pollOptions[i] = $root.proto.MsgOpaqueData.PollOption.fromObject(object.pollOptions[i]); + } + } + if (object.pollSelectableOptionsCount != null) + message.pollSelectableOptionsCount = object.pollSelectableOptionsCount >>> 0; + if (object.messageSecret != null) + if (typeof object.messageSecret === "string") + $util.base64.decode(object.messageSecret, message.messageSecret = $util.newBuffer($util.base64.length(object.messageSecret)), 0); + else if (object.messageSecret.length) + message.messageSecret = object.messageSecret; + if (object.originalSelfAuthor != null) + message.originalSelfAuthor = String(object.originalSelfAuthor); + if (object.senderTimestampMs != null) + if ($util.Long) + (message.senderTimestampMs = $util.Long.fromValue(object.senderTimestampMs)).unsigned = false; + else if (typeof object.senderTimestampMs === "string") + message.senderTimestampMs = parseInt(object.senderTimestampMs, 10); + else if (typeof object.senderTimestampMs === "number") + message.senderTimestampMs = object.senderTimestampMs; + else if (typeof object.senderTimestampMs === "object") + message.senderTimestampMs = new $util.LongBits(object.senderTimestampMs.low >>> 0, object.senderTimestampMs.high >>> 0).toNumber(); + if (object.pollUpdateParentKey != null) + message.pollUpdateParentKey = String(object.pollUpdateParentKey); + if (object.encPollVote != null) { + if (typeof object.encPollVote !== "object") + throw TypeError(".proto.MsgOpaqueData.encPollVote: object expected"); + message.encPollVote = $root.proto.PollEncValue.fromObject(object.encPollVote); + } + return message; + }; + + /** + * Creates a plain object from a MsgOpaqueData message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.MsgOpaqueData + * @static + * @param {proto.MsgOpaqueData} message MsgOpaqueData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MsgOpaqueData.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.pollOptions = []; + if (options.defaults) { + object.body = ""; + object.caption = ""; + object.lng = 0; + object.isLive = false; + object.lat = 0; + object.paymentAmount1000 = 0; + object.paymentNoteMsgBody = ""; + object.canonicalUrl = ""; + object.matchedText = ""; + object.title = ""; + object.description = ""; + if (options.bytes === String) + object.futureproofBuffer = ""; + else { + object.futureproofBuffer = []; + if (options.bytes !== Array) + object.futureproofBuffer = $util.newBuffer(object.futureproofBuffer); + } + object.clientUrl = ""; + object.loc = ""; + object.pollName = ""; + object.pollSelectableOptionsCount = 0; + if (options.bytes === String) + object.messageSecret = ""; + else { + object.messageSecret = []; + if (options.bytes !== Array) + object.messageSecret = $util.newBuffer(object.messageSecret); + } + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.senderTimestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.senderTimestampMs = options.longs === String ? "0" : 0; + object.pollUpdateParentKey = ""; + object.encPollVote = null; + object.originalSelfAuthor = ""; + } + if (message.body != null && message.hasOwnProperty("body")) + object.body = message.body; + if (message.caption != null && message.hasOwnProperty("caption")) + object.caption = message.caption; + if (message.lng != null && message.hasOwnProperty("lng")) + object.lng = options.json && !isFinite(message.lng) ? String(message.lng) : message.lng; + if (message.isLive != null && message.hasOwnProperty("isLive")) + object.isLive = message.isLive; + if (message.lat != null && message.hasOwnProperty("lat")) + object.lat = options.json && !isFinite(message.lat) ? String(message.lat) : message.lat; + if (message.paymentAmount1000 != null && message.hasOwnProperty("paymentAmount1000")) + object.paymentAmount1000 = message.paymentAmount1000; + if (message.paymentNoteMsgBody != null && message.hasOwnProperty("paymentNoteMsgBody")) + object.paymentNoteMsgBody = message.paymentNoteMsgBody; + if (message.canonicalUrl != null && message.hasOwnProperty("canonicalUrl")) + object.canonicalUrl = message.canonicalUrl; + if (message.matchedText != null && message.hasOwnProperty("matchedText")) + object.matchedText = message.matchedText; + if (message.title != null && message.hasOwnProperty("title")) + object.title = message.title; + if (message.description != null && message.hasOwnProperty("description")) + object.description = message.description; + if (message.futureproofBuffer != null && message.hasOwnProperty("futureproofBuffer")) + object.futureproofBuffer = options.bytes === String ? $util.base64.encode(message.futureproofBuffer, 0, message.futureproofBuffer.length) : options.bytes === Array ? Array.prototype.slice.call(message.futureproofBuffer) : message.futureproofBuffer; + if (message.clientUrl != null && message.hasOwnProperty("clientUrl")) + object.clientUrl = message.clientUrl; + if (message.loc != null && message.hasOwnProperty("loc")) + object.loc = message.loc; + if (message.pollName != null && message.hasOwnProperty("pollName")) + object.pollName = message.pollName; + if (message.pollOptions && message.pollOptions.length) { + object.pollOptions = []; + for (var j = 0; j < message.pollOptions.length; ++j) + object.pollOptions[j] = $root.proto.MsgOpaqueData.PollOption.toObject(message.pollOptions[j], options); + } + if (message.pollSelectableOptionsCount != null && message.hasOwnProperty("pollSelectableOptionsCount")) + object.pollSelectableOptionsCount = message.pollSelectableOptionsCount; + if (message.messageSecret != null && message.hasOwnProperty("messageSecret")) + object.messageSecret = options.bytes === String ? $util.base64.encode(message.messageSecret, 0, message.messageSecret.length) : options.bytes === Array ? Array.prototype.slice.call(message.messageSecret) : message.messageSecret; + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (typeof message.senderTimestampMs === "number") + object.senderTimestampMs = options.longs === String ? String(message.senderTimestampMs) : message.senderTimestampMs; + else + object.senderTimestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.senderTimestampMs) : options.longs === Number ? new $util.LongBits(message.senderTimestampMs.low >>> 0, message.senderTimestampMs.high >>> 0).toNumber() : message.senderTimestampMs; + if (message.pollUpdateParentKey != null && message.hasOwnProperty("pollUpdateParentKey")) + object.pollUpdateParentKey = message.pollUpdateParentKey; + if (message.encPollVote != null && message.hasOwnProperty("encPollVote")) + object.encPollVote = $root.proto.PollEncValue.toObject(message.encPollVote, options); + if (message.originalSelfAuthor != null && message.hasOwnProperty("originalSelfAuthor")) + object.originalSelfAuthor = message.originalSelfAuthor; + return object; + }; + + /** + * Converts this MsgOpaqueData to JSON. + * @function toJSON + * @memberof proto.MsgOpaqueData + * @instance + * @returns {Object.} JSON object + */ + MsgOpaqueData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + MsgOpaqueData.PollOption = (function() { + + /** + * Properties of a PollOption. + * @memberof proto.MsgOpaqueData + * @interface IPollOption + * @property {string|null} [name] PollOption name + */ + + /** + * Constructs a new PollOption. + * @memberof proto.MsgOpaqueData + * @classdesc Represents a PollOption. + * @implements IPollOption + * @constructor + * @param {proto.MsgOpaqueData.IPollOption=} [properties] Properties to set + */ + function PollOption(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollOption name. + * @member {string} name + * @memberof proto.MsgOpaqueData.PollOption + * @instance + */ + PollOption.prototype.name = ""; + + /** + * Creates a new PollOption instance using the specified properties. + * @function create + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {proto.MsgOpaqueData.IPollOption=} [properties] Properties to set + * @returns {proto.MsgOpaqueData.PollOption} PollOption instance + */ + PollOption.create = function create(properties) { + return new PollOption(properties); + }; + + /** + * Encodes the specified PollOption message. Does not implicitly {@link proto.MsgOpaqueData.PollOption.verify|verify} messages. + * @function encode + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {proto.MsgOpaqueData.IPollOption} message PollOption message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollOption.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + return writer; + }; + + /** + * Encodes the specified PollOption message, length delimited. Does not implicitly {@link proto.MsgOpaqueData.PollOption.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {proto.MsgOpaqueData.IPollOption} message PollOption message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollOption.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollOption message from the specified reader or buffer. + * @function decode + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.MsgOpaqueData.PollOption} PollOption + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollOption.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.MsgOpaqueData.PollOption(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollOption message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.MsgOpaqueData.PollOption} PollOption + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollOption.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollOption message. + * @function verify + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollOption.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + return null; + }; + + /** + * Creates a PollOption message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {Object.} object Plain object + * @returns {proto.MsgOpaqueData.PollOption} PollOption + */ + PollOption.fromObject = function fromObject(object) { + if (object instanceof $root.proto.MsgOpaqueData.PollOption) + return object; + var message = new $root.proto.MsgOpaqueData.PollOption(); + if (object.name != null) + message.name = String(object.name); + return message; + }; + + /** + * Creates a plain object from a PollOption message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.MsgOpaqueData.PollOption + * @static + * @param {proto.MsgOpaqueData.PollOption} message PollOption + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollOption.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.name = ""; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + return object; + }; + + /** + * Converts this PollOption to JSON. + * @function toJSON + * @memberof proto.MsgOpaqueData.PollOption + * @instance + * @returns {Object.} JSON object + */ + PollOption.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollOption; + })(); + + return MsgOpaqueData; + })(); + + proto.MsgRowOpaqueData = (function() { + + /** + * Properties of a MsgRowOpaqueData. + * @memberof proto + * @interface IMsgRowOpaqueData + * @property {proto.IMsgOpaqueData|null} [currentMsg] MsgRowOpaqueData currentMsg + * @property {proto.IMsgOpaqueData|null} [quotedMsg] MsgRowOpaqueData quotedMsg + */ + + /** + * Constructs a new MsgRowOpaqueData. + * @memberof proto + * @classdesc Represents a MsgRowOpaqueData. + * @implements IMsgRowOpaqueData + * @constructor + * @param {proto.IMsgRowOpaqueData=} [properties] Properties to set + */ + function MsgRowOpaqueData(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MsgRowOpaqueData currentMsg. + * @member {proto.IMsgOpaqueData|null|undefined} currentMsg + * @memberof proto.MsgRowOpaqueData + * @instance + */ + MsgRowOpaqueData.prototype.currentMsg = null; + + /** + * MsgRowOpaqueData quotedMsg. + * @member {proto.IMsgOpaqueData|null|undefined} quotedMsg + * @memberof proto.MsgRowOpaqueData + * @instance + */ + MsgRowOpaqueData.prototype.quotedMsg = null; + + /** + * Creates a new MsgRowOpaqueData instance using the specified properties. + * @function create + * @memberof proto.MsgRowOpaqueData + * @static + * @param {proto.IMsgRowOpaqueData=} [properties] Properties to set + * @returns {proto.MsgRowOpaqueData} MsgRowOpaqueData instance + */ + MsgRowOpaqueData.create = function create(properties) { + return new MsgRowOpaqueData(properties); + }; + + /** + * Encodes the specified MsgRowOpaqueData message. Does not implicitly {@link proto.MsgRowOpaqueData.verify|verify} messages. + * @function encode + * @memberof proto.MsgRowOpaqueData + * @static + * @param {proto.IMsgRowOpaqueData} message MsgRowOpaqueData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MsgRowOpaqueData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.currentMsg != null && Object.hasOwnProperty.call(message, "currentMsg")) + $root.proto.MsgOpaqueData.encode(message.currentMsg, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.quotedMsg != null && Object.hasOwnProperty.call(message, "quotedMsg")) + $root.proto.MsgOpaqueData.encode(message.quotedMsg, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified MsgRowOpaqueData message, length delimited. Does not implicitly {@link proto.MsgRowOpaqueData.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.MsgRowOpaqueData + * @static + * @param {proto.IMsgRowOpaqueData} message MsgRowOpaqueData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MsgRowOpaqueData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MsgRowOpaqueData message from the specified reader or buffer. + * @function decode + * @memberof proto.MsgRowOpaqueData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.MsgRowOpaqueData} MsgRowOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MsgRowOpaqueData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.MsgRowOpaqueData(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.currentMsg = $root.proto.MsgOpaqueData.decode(reader, reader.uint32()); + break; + case 2: + message.quotedMsg = $root.proto.MsgOpaqueData.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MsgRowOpaqueData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.MsgRowOpaqueData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.MsgRowOpaqueData} MsgRowOpaqueData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MsgRowOpaqueData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MsgRowOpaqueData message. + * @function verify + * @memberof proto.MsgRowOpaqueData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MsgRowOpaqueData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.currentMsg != null && message.hasOwnProperty("currentMsg")) { + var error = $root.proto.MsgOpaqueData.verify(message.currentMsg); + if (error) + return "currentMsg." + error; + } + if (message.quotedMsg != null && message.hasOwnProperty("quotedMsg")) { + var error = $root.proto.MsgOpaqueData.verify(message.quotedMsg); + if (error) + return "quotedMsg." + error; + } + return null; + }; + + /** + * Creates a MsgRowOpaqueData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.MsgRowOpaqueData + * @static + * @param {Object.} object Plain object + * @returns {proto.MsgRowOpaqueData} MsgRowOpaqueData + */ + MsgRowOpaqueData.fromObject = function fromObject(object) { + if (object instanceof $root.proto.MsgRowOpaqueData) + return object; + var message = new $root.proto.MsgRowOpaqueData(); + if (object.currentMsg != null) { + if (typeof object.currentMsg !== "object") + throw TypeError(".proto.MsgRowOpaqueData.currentMsg: object expected"); + message.currentMsg = $root.proto.MsgOpaqueData.fromObject(object.currentMsg); + } + if (object.quotedMsg != null) { + if (typeof object.quotedMsg !== "object") + throw TypeError(".proto.MsgRowOpaqueData.quotedMsg: object expected"); + message.quotedMsg = $root.proto.MsgOpaqueData.fromObject(object.quotedMsg); + } + return message; + }; + + /** + * Creates a plain object from a MsgRowOpaqueData message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.MsgRowOpaqueData + * @static + * @param {proto.MsgRowOpaqueData} message MsgRowOpaqueData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MsgRowOpaqueData.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.currentMsg = null; + object.quotedMsg = null; + } + if (message.currentMsg != null && message.hasOwnProperty("currentMsg")) + object.currentMsg = $root.proto.MsgOpaqueData.toObject(message.currentMsg, options); + if (message.quotedMsg != null && message.hasOwnProperty("quotedMsg")) + object.quotedMsg = $root.proto.MsgOpaqueData.toObject(message.quotedMsg, options); + return object; + }; + + /** + * Converts this MsgRowOpaqueData to JSON. + * @function toJSON + * @memberof proto.MsgRowOpaqueData + * @instance + * @returns {Object.} JSON object + */ + MsgRowOpaqueData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MsgRowOpaqueData; + })(); + + proto.NoiseCertificate = (function() { + + /** + * Properties of a NoiseCertificate. + * @memberof proto + * @interface INoiseCertificate + * @property {Uint8Array|null} [details] NoiseCertificate details + * @property {Uint8Array|null} [signature] NoiseCertificate signature + */ + + /** + * Constructs a new NoiseCertificate. + * @memberof proto + * @classdesc Represents a NoiseCertificate. + * @implements INoiseCertificate + * @constructor + * @param {proto.INoiseCertificate=} [properties] Properties to set + */ + function NoiseCertificate(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NoiseCertificate details. + * @member {Uint8Array} details + * @memberof proto.NoiseCertificate + * @instance + */ + NoiseCertificate.prototype.details = $util.newBuffer([]); + + /** + * NoiseCertificate signature. + * @member {Uint8Array} signature + * @memberof proto.NoiseCertificate + * @instance + */ + NoiseCertificate.prototype.signature = $util.newBuffer([]); + + /** + * Creates a new NoiseCertificate instance using the specified properties. + * @function create + * @memberof proto.NoiseCertificate + * @static + * @param {proto.INoiseCertificate=} [properties] Properties to set + * @returns {proto.NoiseCertificate} NoiseCertificate instance + */ + NoiseCertificate.create = function create(properties) { + return new NoiseCertificate(properties); + }; + + /** + * Encodes the specified NoiseCertificate message. Does not implicitly {@link proto.NoiseCertificate.verify|verify} messages. + * @function encode + * @memberof proto.NoiseCertificate + * @static + * @param {proto.INoiseCertificate} message NoiseCertificate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NoiseCertificate.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.details != null && Object.hasOwnProperty.call(message, "details")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.details); + if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.signature); + return writer; + }; + + /** + * Encodes the specified NoiseCertificate message, length delimited. Does not implicitly {@link proto.NoiseCertificate.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.NoiseCertificate + * @static + * @param {proto.INoiseCertificate} message NoiseCertificate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NoiseCertificate.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer. + * @function decode + * @memberof proto.NoiseCertificate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.NoiseCertificate} NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NoiseCertificate.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.NoiseCertificate(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.details = reader.bytes(); + break; + case 2: + message.signature = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NoiseCertificate message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.NoiseCertificate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.NoiseCertificate} NoiseCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NoiseCertificate.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NoiseCertificate message. + * @function verify + * @memberof proto.NoiseCertificate + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NoiseCertificate.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.details != null && message.hasOwnProperty("details")) + if (!(message.details && typeof message.details.length === "number" || $util.isString(message.details))) + return "details: buffer expected"; + if (message.signature != null && message.hasOwnProperty("signature")) + if (!(message.signature && typeof message.signature.length === "number" || $util.isString(message.signature))) + return "signature: buffer expected"; + return null; + }; + + /** + * Creates a NoiseCertificate message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.NoiseCertificate + * @static + * @param {Object.} object Plain object + * @returns {proto.NoiseCertificate} NoiseCertificate + */ + NoiseCertificate.fromObject = function fromObject(object) { + if (object instanceof $root.proto.NoiseCertificate) + return object; + var message = new $root.proto.NoiseCertificate(); + if (object.details != null) + if (typeof object.details === "string") + $util.base64.decode(object.details, message.details = $util.newBuffer($util.base64.length(object.details)), 0); + else if (object.details.length) + message.details = object.details; + if (object.signature != null) + if (typeof object.signature === "string") + $util.base64.decode(object.signature, message.signature = $util.newBuffer($util.base64.length(object.signature)), 0); + else if (object.signature.length) + message.signature = object.signature; + return message; + }; + + /** + * Creates a plain object from a NoiseCertificate message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.NoiseCertificate + * @static + * @param {proto.NoiseCertificate} message NoiseCertificate + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NoiseCertificate.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.details = ""; + else { + object.details = []; + if (options.bytes !== Array) + object.details = $util.newBuffer(object.details); + } + if (options.bytes === String) + object.signature = ""; + else { + object.signature = []; + if (options.bytes !== Array) + object.signature = $util.newBuffer(object.signature); + } + } + if (message.details != null && message.hasOwnProperty("details")) + object.details = options.bytes === String ? $util.base64.encode(message.details, 0, message.details.length) : options.bytes === Array ? Array.prototype.slice.call(message.details) : message.details; + if (message.signature != null && message.hasOwnProperty("signature")) + object.signature = options.bytes === String ? $util.base64.encode(message.signature, 0, message.signature.length) : options.bytes === Array ? Array.prototype.slice.call(message.signature) : message.signature; + return object; + }; + + /** + * Converts this NoiseCertificate to JSON. + * @function toJSON + * @memberof proto.NoiseCertificate + * @instance + * @returns {Object.} JSON object + */ + NoiseCertificate.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + NoiseCertificate.Details = (function() { + + /** + * Properties of a Details. + * @memberof proto.NoiseCertificate + * @interface IDetails + * @property {number|null} [serial] Details serial + * @property {string|null} [issuer] Details issuer + * @property {number|Long|null} [expires] Details expires + * @property {string|null} [subject] Details subject + * @property {Uint8Array|null} [key] Details key + */ + + /** + * Constructs a new Details. + * @memberof proto.NoiseCertificate + * @classdesc Represents a Details. + * @implements IDetails + * @constructor + * @param {proto.NoiseCertificate.IDetails=} [properties] Properties to set + */ + function Details(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Details serial. + * @member {number} serial + * @memberof proto.NoiseCertificate.Details + * @instance + */ + Details.prototype.serial = 0; + + /** + * Details issuer. + * @member {string} issuer + * @memberof proto.NoiseCertificate.Details + * @instance + */ + Details.prototype.issuer = ""; + + /** + * Details expires. + * @member {number|Long} expires + * @memberof proto.NoiseCertificate.Details + * @instance + */ + Details.prototype.expires = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Details subject. + * @member {string} subject + * @memberof proto.NoiseCertificate.Details + * @instance + */ + Details.prototype.subject = ""; + + /** + * Details key. + * @member {Uint8Array} key + * @memberof proto.NoiseCertificate.Details + * @instance + */ + Details.prototype.key = $util.newBuffer([]); + + /** + * Creates a new Details instance using the specified properties. + * @function create + * @memberof proto.NoiseCertificate.Details + * @static + * @param {proto.NoiseCertificate.IDetails=} [properties] Properties to set + * @returns {proto.NoiseCertificate.Details} Details instance + */ + Details.create = function create(properties) { + return new Details(properties); + }; + + /** + * Encodes the specified Details message. Does not implicitly {@link proto.NoiseCertificate.Details.verify|verify} messages. + * @function encode + * @memberof proto.NoiseCertificate.Details + * @static + * @param {proto.NoiseCertificate.IDetails} message Details message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Details.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.serial != null && Object.hasOwnProperty.call(message, "serial")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.serial); + if (message.issuer != null && Object.hasOwnProperty.call(message, "issuer")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.issuer); + if (message.expires != null && Object.hasOwnProperty.call(message, "expires")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.expires); + if (message.subject != null && Object.hasOwnProperty.call(message, "subject")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.subject); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.key); + return writer; + }; + + /** + * Encodes the specified Details message, length delimited. Does not implicitly {@link proto.NoiseCertificate.Details.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.NoiseCertificate.Details + * @static + * @param {proto.NoiseCertificate.IDetails} message Details message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Details.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Details message from the specified reader or buffer. + * @function decode + * @memberof proto.NoiseCertificate.Details + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.NoiseCertificate.Details} Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Details.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.NoiseCertificate.Details(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.serial = reader.uint32(); + break; + case 2: + message.issuer = reader.string(); + break; + case 3: + message.expires = reader.uint64(); + break; + case 4: + message.subject = reader.string(); + break; + case 5: + message.key = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Details message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.NoiseCertificate.Details + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.NoiseCertificate.Details} Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Details.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Details message. + * @function verify + * @memberof proto.NoiseCertificate.Details + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Details.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.serial != null && message.hasOwnProperty("serial")) + if (!$util.isInteger(message.serial)) + return "serial: integer expected"; + if (message.issuer != null && message.hasOwnProperty("issuer")) + if (!$util.isString(message.issuer)) + return "issuer: string expected"; + if (message.expires != null && message.hasOwnProperty("expires")) + if (!$util.isInteger(message.expires) && !(message.expires && $util.isInteger(message.expires.low) && $util.isInteger(message.expires.high))) + return "expires: integer|Long expected"; + if (message.subject != null && message.hasOwnProperty("subject")) + if (!$util.isString(message.subject)) + return "subject: string expected"; + if (message.key != null && message.hasOwnProperty("key")) + if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key))) + return "key: buffer expected"; + return null; + }; + + /** + * Creates a Details message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.NoiseCertificate.Details + * @static + * @param {Object.} object Plain object + * @returns {proto.NoiseCertificate.Details} Details + */ + Details.fromObject = function fromObject(object) { + if (object instanceof $root.proto.NoiseCertificate.Details) + return object; + var message = new $root.proto.NoiseCertificate.Details(); + if (object.serial != null) + message.serial = object.serial >>> 0; + if (object.issuer != null) + message.issuer = String(object.issuer); + if (object.expires != null) + if ($util.Long) + (message.expires = $util.Long.fromValue(object.expires)).unsigned = true; + else if (typeof object.expires === "string") + message.expires = parseInt(object.expires, 10); + else if (typeof object.expires === "number") + message.expires = object.expires; + else if (typeof object.expires === "object") + message.expires = new $util.LongBits(object.expires.low >>> 0, object.expires.high >>> 0).toNumber(true); + if (object.subject != null) + message.subject = String(object.subject); + if (object.key != null) + if (typeof object.key === "string") + $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0); + else if (object.key.length) + message.key = object.key; + return message; + }; + + /** + * Creates a plain object from a Details message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.NoiseCertificate.Details + * @static + * @param {proto.NoiseCertificate.Details} message Details + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Details.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.serial = 0; + object.issuer = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.expires = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.expires = options.longs === String ? "0" : 0; + object.subject = ""; + if (options.bytes === String) + object.key = ""; + else { + object.key = []; + if (options.bytes !== Array) + object.key = $util.newBuffer(object.key); + } + } + if (message.serial != null && message.hasOwnProperty("serial")) + object.serial = message.serial; + if (message.issuer != null && message.hasOwnProperty("issuer")) + object.issuer = message.issuer; + if (message.expires != null && message.hasOwnProperty("expires")) + if (typeof message.expires === "number") + object.expires = options.longs === String ? String(message.expires) : message.expires; + else + object.expires = options.longs === String ? $util.Long.prototype.toString.call(message.expires) : options.longs === Number ? new $util.LongBits(message.expires.low >>> 0, message.expires.high >>> 0).toNumber(true) : message.expires; + if (message.subject != null && message.hasOwnProperty("subject")) + object.subject = message.subject; + if (message.key != null && message.hasOwnProperty("key")) + object.key = options.bytes === String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === Array ? Array.prototype.slice.call(message.key) : message.key; + return object; + }; + + /** + * Converts this Details to JSON. + * @function toJSON + * @memberof proto.NoiseCertificate.Details + * @instance + * @returns {Object.} JSON object + */ + Details.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Details; + })(); + + return NoiseCertificate; + })(); + + proto.NotificationMessageInfo = (function() { + + /** + * Properties of a NotificationMessageInfo. + * @memberof proto + * @interface INotificationMessageInfo + * @property {proto.IMessageKey|null} [key] NotificationMessageInfo key + * @property {proto.IMessage|null} [message] NotificationMessageInfo message + * @property {number|Long|null} [messageTimestamp] NotificationMessageInfo messageTimestamp + * @property {string|null} [participant] NotificationMessageInfo participant + */ + + /** + * Constructs a new NotificationMessageInfo. + * @memberof proto + * @classdesc Represents a NotificationMessageInfo. + * @implements INotificationMessageInfo + * @constructor + * @param {proto.INotificationMessageInfo=} [properties] Properties to set + */ + function NotificationMessageInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NotificationMessageInfo key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.NotificationMessageInfo + * @instance + */ + NotificationMessageInfo.prototype.key = null; + + /** + * NotificationMessageInfo message. + * @member {proto.IMessage|null|undefined} message + * @memberof proto.NotificationMessageInfo + * @instance + */ + NotificationMessageInfo.prototype.message = null; + + /** + * NotificationMessageInfo messageTimestamp. + * @member {number|Long} messageTimestamp + * @memberof proto.NotificationMessageInfo + * @instance + */ + NotificationMessageInfo.prototype.messageTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * NotificationMessageInfo participant. + * @member {string} participant + * @memberof proto.NotificationMessageInfo + * @instance + */ + NotificationMessageInfo.prototype.participant = ""; + + /** + * Creates a new NotificationMessageInfo instance using the specified properties. + * @function create + * @memberof proto.NotificationMessageInfo + * @static + * @param {proto.INotificationMessageInfo=} [properties] Properties to set + * @returns {proto.NotificationMessageInfo} NotificationMessageInfo instance + */ + NotificationMessageInfo.create = function create(properties) { + return new NotificationMessageInfo(properties); + }; + + /** + * Encodes the specified NotificationMessageInfo message. Does not implicitly {@link proto.NotificationMessageInfo.verify|verify} messages. + * @function encode + * @memberof proto.NotificationMessageInfo + * @static + * @param {proto.INotificationMessageInfo} message NotificationMessageInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NotificationMessageInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + $root.proto.Message.encode(message.message, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.messageTimestamp != null && Object.hasOwnProperty.call(message, "messageTimestamp")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.messageTimestamp); + if (message.participant != null && Object.hasOwnProperty.call(message, "participant")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.participant); + return writer; + }; + + /** + * Encodes the specified NotificationMessageInfo message, length delimited. Does not implicitly {@link proto.NotificationMessageInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.NotificationMessageInfo + * @static + * @param {proto.INotificationMessageInfo} message NotificationMessageInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NotificationMessageInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NotificationMessageInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.NotificationMessageInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.NotificationMessageInfo} NotificationMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NotificationMessageInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.NotificationMessageInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.message = $root.proto.Message.decode(reader, reader.uint32()); + break; + case 3: + message.messageTimestamp = reader.uint64(); + break; + case 4: + message.participant = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NotificationMessageInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.NotificationMessageInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.NotificationMessageInfo} NotificationMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NotificationMessageInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NotificationMessageInfo message. + * @function verify + * @memberof proto.NotificationMessageInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NotificationMessageInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.message != null && message.hasOwnProperty("message")) { + var error = $root.proto.Message.verify(message.message); + if (error) + return "message." + error; + } + if (message.messageTimestamp != null && message.hasOwnProperty("messageTimestamp")) + if (!$util.isInteger(message.messageTimestamp) && !(message.messageTimestamp && $util.isInteger(message.messageTimestamp.low) && $util.isInteger(message.messageTimestamp.high))) + return "messageTimestamp: integer|Long expected"; + if (message.participant != null && message.hasOwnProperty("participant")) + if (!$util.isString(message.participant)) + return "participant: string expected"; + return null; + }; + + /** + * Creates a NotificationMessageInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.NotificationMessageInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.NotificationMessageInfo} NotificationMessageInfo + */ + NotificationMessageInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.NotificationMessageInfo) + return object; + var message = new $root.proto.NotificationMessageInfo(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.NotificationMessageInfo.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + if (object.message != null) { + if (typeof object.message !== "object") + throw TypeError(".proto.NotificationMessageInfo.message: object expected"); + message.message = $root.proto.Message.fromObject(object.message); + } + if (object.messageTimestamp != null) + if ($util.Long) + (message.messageTimestamp = $util.Long.fromValue(object.messageTimestamp)).unsigned = true; + else if (typeof object.messageTimestamp === "string") + message.messageTimestamp = parseInt(object.messageTimestamp, 10); + else if (typeof object.messageTimestamp === "number") + message.messageTimestamp = object.messageTimestamp; + else if (typeof object.messageTimestamp === "object") + message.messageTimestamp = new $util.LongBits(object.messageTimestamp.low >>> 0, object.messageTimestamp.high >>> 0).toNumber(true); + if (object.participant != null) + message.participant = String(object.participant); + return message; + }; + + /** + * Creates a plain object from a NotificationMessageInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.NotificationMessageInfo + * @static + * @param {proto.NotificationMessageInfo} message NotificationMessageInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NotificationMessageInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.key = null; + object.message = null; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.messageTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.messageTimestamp = options.longs === String ? "0" : 0; + object.participant = ""; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.message != null && message.hasOwnProperty("message")) + object.message = $root.proto.Message.toObject(message.message, options); + if (message.messageTimestamp != null && message.hasOwnProperty("messageTimestamp")) + if (typeof message.messageTimestamp === "number") + object.messageTimestamp = options.longs === String ? String(message.messageTimestamp) : message.messageTimestamp; + else + object.messageTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.messageTimestamp) : options.longs === Number ? new $util.LongBits(message.messageTimestamp.low >>> 0, message.messageTimestamp.high >>> 0).toNumber(true) : message.messageTimestamp; + if (message.participant != null && message.hasOwnProperty("participant")) + object.participant = message.participant; + return object; + }; + + /** + * Converts this NotificationMessageInfo to JSON. + * @function toJSON + * @memberof proto.NotificationMessageInfo + * @instance + * @returns {Object.} JSON object + */ + NotificationMessageInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return NotificationMessageInfo; + })(); + + proto.PastParticipant = (function() { + + /** + * Properties of a PastParticipant. + * @memberof proto + * @interface IPastParticipant + * @property {string|null} [userJid] PastParticipant userJid + * @property {proto.PastParticipant.LeaveReason|null} [leaveReason] PastParticipant leaveReason + * @property {number|Long|null} [leaveTs] PastParticipant leaveTs + */ + + /** + * Constructs a new PastParticipant. + * @memberof proto + * @classdesc Represents a PastParticipant. + * @implements IPastParticipant + * @constructor + * @param {proto.IPastParticipant=} [properties] Properties to set + */ + function PastParticipant(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PastParticipant userJid. + * @member {string} userJid + * @memberof proto.PastParticipant + * @instance + */ + PastParticipant.prototype.userJid = ""; + + /** + * PastParticipant leaveReason. + * @member {proto.PastParticipant.LeaveReason} leaveReason + * @memberof proto.PastParticipant + * @instance + */ + PastParticipant.prototype.leaveReason = 0; + + /** + * PastParticipant leaveTs. + * @member {number|Long} leaveTs + * @memberof proto.PastParticipant + * @instance + */ + PastParticipant.prototype.leaveTs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new PastParticipant instance using the specified properties. + * @function create + * @memberof proto.PastParticipant + * @static + * @param {proto.IPastParticipant=} [properties] Properties to set + * @returns {proto.PastParticipant} PastParticipant instance + */ + PastParticipant.create = function create(properties) { + return new PastParticipant(properties); + }; + + /** + * Encodes the specified PastParticipant message. Does not implicitly {@link proto.PastParticipant.verify|verify} messages. + * @function encode + * @memberof proto.PastParticipant + * @static + * @param {proto.IPastParticipant} message PastParticipant message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PastParticipant.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.userJid != null && Object.hasOwnProperty.call(message, "userJid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.userJid); + if (message.leaveReason != null && Object.hasOwnProperty.call(message, "leaveReason")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.leaveReason); + if (message.leaveTs != null && Object.hasOwnProperty.call(message, "leaveTs")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.leaveTs); + return writer; + }; + + /** + * Encodes the specified PastParticipant message, length delimited. Does not implicitly {@link proto.PastParticipant.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PastParticipant + * @static + * @param {proto.IPastParticipant} message PastParticipant message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PastParticipant.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PastParticipant message from the specified reader or buffer. + * @function decode + * @memberof proto.PastParticipant + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PastParticipant} PastParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PastParticipant.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PastParticipant(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.userJid = reader.string(); + break; + case 2: + message.leaveReason = reader.int32(); + break; + case 3: + message.leaveTs = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PastParticipant message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PastParticipant + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PastParticipant} PastParticipant + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PastParticipant.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PastParticipant message. + * @function verify + * @memberof proto.PastParticipant + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PastParticipant.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.userJid != null && message.hasOwnProperty("userJid")) + if (!$util.isString(message.userJid)) + return "userJid: string expected"; + if (message.leaveReason != null && message.hasOwnProperty("leaveReason")) + switch (message.leaveReason) { + default: + return "leaveReason: enum value expected"; + case 0: + case 1: + break; + } + if (message.leaveTs != null && message.hasOwnProperty("leaveTs")) + if (!$util.isInteger(message.leaveTs) && !(message.leaveTs && $util.isInteger(message.leaveTs.low) && $util.isInteger(message.leaveTs.high))) + return "leaveTs: integer|Long expected"; + return null; + }; + + /** + * Creates a PastParticipant message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PastParticipant + * @static + * @param {Object.} object Plain object + * @returns {proto.PastParticipant} PastParticipant + */ + PastParticipant.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PastParticipant) + return object; + var message = new $root.proto.PastParticipant(); + if (object.userJid != null) + message.userJid = String(object.userJid); + switch (object.leaveReason) { + case "LEFT": + case 0: + message.leaveReason = 0; + break; + case "REMOVED": + case 1: + message.leaveReason = 1; + break; + } + if (object.leaveTs != null) + if ($util.Long) + (message.leaveTs = $util.Long.fromValue(object.leaveTs)).unsigned = true; + else if (typeof object.leaveTs === "string") + message.leaveTs = parseInt(object.leaveTs, 10); + else if (typeof object.leaveTs === "number") + message.leaveTs = object.leaveTs; + else if (typeof object.leaveTs === "object") + message.leaveTs = new $util.LongBits(object.leaveTs.low >>> 0, object.leaveTs.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a PastParticipant message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PastParticipant + * @static + * @param {proto.PastParticipant} message PastParticipant + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PastParticipant.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.userJid = ""; + object.leaveReason = options.enums === String ? "LEFT" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.leaveTs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.leaveTs = options.longs === String ? "0" : 0; + } + if (message.userJid != null && message.hasOwnProperty("userJid")) + object.userJid = message.userJid; + if (message.leaveReason != null && message.hasOwnProperty("leaveReason")) + object.leaveReason = options.enums === String ? $root.proto.PastParticipant.LeaveReason[message.leaveReason] : message.leaveReason; + if (message.leaveTs != null && message.hasOwnProperty("leaveTs")) + if (typeof message.leaveTs === "number") + object.leaveTs = options.longs === String ? String(message.leaveTs) : message.leaveTs; + else + object.leaveTs = options.longs === String ? $util.Long.prototype.toString.call(message.leaveTs) : options.longs === Number ? new $util.LongBits(message.leaveTs.low >>> 0, message.leaveTs.high >>> 0).toNumber(true) : message.leaveTs; + return object; + }; + + /** + * Converts this PastParticipant to JSON. + * @function toJSON + * @memberof proto.PastParticipant + * @instance + * @returns {Object.} JSON object + */ + PastParticipant.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * LeaveReason enum. + * @name proto.PastParticipant.LeaveReason + * @enum {number} + * @property {number} LEFT=0 LEFT value + * @property {number} REMOVED=1 REMOVED value + */ + PastParticipant.LeaveReason = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "LEFT"] = 0; + values[valuesById[1] = "REMOVED"] = 1; + return values; + })(); + + return PastParticipant; + })(); + + proto.PastParticipants = (function() { + + /** + * Properties of a PastParticipants. + * @memberof proto + * @interface IPastParticipants + * @property {string|null} [groupJid] PastParticipants groupJid + * @property {Array.|null} [pastParticipants] PastParticipants pastParticipants + */ + + /** + * Constructs a new PastParticipants. + * @memberof proto + * @classdesc Represents a PastParticipants. + * @implements IPastParticipants + * @constructor + * @param {proto.IPastParticipants=} [properties] Properties to set + */ + function PastParticipants(properties) { + this.pastParticipants = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PastParticipants groupJid. + * @member {string} groupJid + * @memberof proto.PastParticipants + * @instance + */ + PastParticipants.prototype.groupJid = ""; + + /** + * PastParticipants pastParticipants. + * @member {Array.} pastParticipants + * @memberof proto.PastParticipants + * @instance + */ + PastParticipants.prototype.pastParticipants = $util.emptyArray; + + /** + * Creates a new PastParticipants instance using the specified properties. + * @function create + * @memberof proto.PastParticipants + * @static + * @param {proto.IPastParticipants=} [properties] Properties to set + * @returns {proto.PastParticipants} PastParticipants instance + */ + PastParticipants.create = function create(properties) { + return new PastParticipants(properties); + }; + + /** + * Encodes the specified PastParticipants message. Does not implicitly {@link proto.PastParticipants.verify|verify} messages. + * @function encode + * @memberof proto.PastParticipants + * @static + * @param {proto.IPastParticipants} message PastParticipants message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PastParticipants.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupJid != null && Object.hasOwnProperty.call(message, "groupJid")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.groupJid); + if (message.pastParticipants != null && message.pastParticipants.length) + for (var i = 0; i < message.pastParticipants.length; ++i) + $root.proto.PastParticipant.encode(message.pastParticipants[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PastParticipants message, length delimited. Does not implicitly {@link proto.PastParticipants.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PastParticipants + * @static + * @param {proto.IPastParticipants} message PastParticipants message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PastParticipants.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PastParticipants message from the specified reader or buffer. + * @function decode + * @memberof proto.PastParticipants + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PastParticipants} PastParticipants + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PastParticipants.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PastParticipants(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupJid = reader.string(); + break; + case 2: + if (!(message.pastParticipants && message.pastParticipants.length)) + message.pastParticipants = []; + message.pastParticipants.push($root.proto.PastParticipant.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PastParticipants message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PastParticipants + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PastParticipants} PastParticipants + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PastParticipants.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PastParticipants message. + * @function verify + * @memberof proto.PastParticipants + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PastParticipants.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.groupJid != null && message.hasOwnProperty("groupJid")) + if (!$util.isString(message.groupJid)) + return "groupJid: string expected"; + if (message.pastParticipants != null && message.hasOwnProperty("pastParticipants")) { + if (!Array.isArray(message.pastParticipants)) + return "pastParticipants: array expected"; + for (var i = 0; i < message.pastParticipants.length; ++i) { + var error = $root.proto.PastParticipant.verify(message.pastParticipants[i]); + if (error) + return "pastParticipants." + error; + } + } + return null; + }; + + /** + * Creates a PastParticipants message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PastParticipants + * @static + * @param {Object.} object Plain object + * @returns {proto.PastParticipants} PastParticipants + */ + PastParticipants.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PastParticipants) + return object; + var message = new $root.proto.PastParticipants(); + if (object.groupJid != null) + message.groupJid = String(object.groupJid); + if (object.pastParticipants) { + if (!Array.isArray(object.pastParticipants)) + throw TypeError(".proto.PastParticipants.pastParticipants: array expected"); + message.pastParticipants = []; + for (var i = 0; i < object.pastParticipants.length; ++i) { + if (typeof object.pastParticipants[i] !== "object") + throw TypeError(".proto.PastParticipants.pastParticipants: object expected"); + message.pastParticipants[i] = $root.proto.PastParticipant.fromObject(object.pastParticipants[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a PastParticipants message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PastParticipants + * @static + * @param {proto.PastParticipants} message PastParticipants + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PastParticipants.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.pastParticipants = []; + if (options.defaults) + object.groupJid = ""; + if (message.groupJid != null && message.hasOwnProperty("groupJid")) + object.groupJid = message.groupJid; + if (message.pastParticipants && message.pastParticipants.length) { + object.pastParticipants = []; + for (var j = 0; j < message.pastParticipants.length; ++j) + object.pastParticipants[j] = $root.proto.PastParticipant.toObject(message.pastParticipants[j], options); + } + return object; + }; + + /** + * Converts this PastParticipants to JSON. + * @function toJSON + * @memberof proto.PastParticipants + * @instance + * @returns {Object.} JSON object + */ + PastParticipants.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PastParticipants; + })(); + + proto.PaymentBackground = (function() { + + /** + * Properties of a PaymentBackground. + * @memberof proto + * @interface IPaymentBackground + * @property {string|null} [id] PaymentBackground id + * @property {number|Long|null} [fileLength] PaymentBackground fileLength + * @property {number|null} [width] PaymentBackground width + * @property {number|null} [height] PaymentBackground height + * @property {string|null} [mimetype] PaymentBackground mimetype + * @property {number|null} [placeholderArgb] PaymentBackground placeholderArgb + * @property {number|null} [textArgb] PaymentBackground textArgb + * @property {number|null} [subtextArgb] PaymentBackground subtextArgb + * @property {proto.PaymentBackground.IMediaData|null} [mediaData] PaymentBackground mediaData + * @property {proto.PaymentBackground.Type|null} [type] PaymentBackground type + */ + + /** + * Constructs a new PaymentBackground. + * @memberof proto + * @classdesc Represents a PaymentBackground. + * @implements IPaymentBackground + * @constructor + * @param {proto.IPaymentBackground=} [properties] Properties to set + */ + function PaymentBackground(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PaymentBackground id. + * @member {string} id + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.id = ""; + + /** + * PaymentBackground fileLength. + * @member {number|Long} fileLength + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * PaymentBackground width. + * @member {number} width + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.width = 0; + + /** + * PaymentBackground height. + * @member {number} height + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.height = 0; + + /** + * PaymentBackground mimetype. + * @member {string} mimetype + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.mimetype = ""; + + /** + * PaymentBackground placeholderArgb. + * @member {number} placeholderArgb + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.placeholderArgb = 0; + + /** + * PaymentBackground textArgb. + * @member {number} textArgb + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.textArgb = 0; + + /** + * PaymentBackground subtextArgb. + * @member {number} subtextArgb + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.subtextArgb = 0; + + /** + * PaymentBackground mediaData. + * @member {proto.PaymentBackground.IMediaData|null|undefined} mediaData + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.mediaData = null; + + /** + * PaymentBackground type. + * @member {proto.PaymentBackground.Type} type + * @memberof proto.PaymentBackground + * @instance + */ + PaymentBackground.prototype.type = 0; + + /** + * Creates a new PaymentBackground instance using the specified properties. + * @function create + * @memberof proto.PaymentBackground + * @static + * @param {proto.IPaymentBackground=} [properties] Properties to set + * @returns {proto.PaymentBackground} PaymentBackground instance + */ + PaymentBackground.create = function create(properties) { + return new PaymentBackground(properties); + }; + + /** + * Encodes the specified PaymentBackground message. Does not implicitly {@link proto.PaymentBackground.verify|verify} messages. + * @function encode + * @memberof proto.PaymentBackground + * @static + * @param {proto.IPaymentBackground} message PaymentBackground message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PaymentBackground.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.id); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.fileLength); + if (message.width != null && Object.hasOwnProperty.call(message, "width")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.width); + if (message.height != null && Object.hasOwnProperty.call(message, "height")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.height); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.mimetype); + if (message.placeholderArgb != null && Object.hasOwnProperty.call(message, "placeholderArgb")) + writer.uint32(/* id 6, wireType 5 =*/53).fixed32(message.placeholderArgb); + if (message.textArgb != null && Object.hasOwnProperty.call(message, "textArgb")) + writer.uint32(/* id 7, wireType 5 =*/61).fixed32(message.textArgb); + if (message.subtextArgb != null && Object.hasOwnProperty.call(message, "subtextArgb")) + writer.uint32(/* id 8, wireType 5 =*/69).fixed32(message.subtextArgb); + if (message.mediaData != null && Object.hasOwnProperty.call(message, "mediaData")) + $root.proto.PaymentBackground.MediaData.encode(message.mediaData, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); + if (message.type != null && Object.hasOwnProperty.call(message, "type")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.type); + return writer; + }; + + /** + * Encodes the specified PaymentBackground message, length delimited. Does not implicitly {@link proto.PaymentBackground.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PaymentBackground + * @static + * @param {proto.IPaymentBackground} message PaymentBackground message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PaymentBackground.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PaymentBackground message from the specified reader or buffer. + * @function decode + * @memberof proto.PaymentBackground + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PaymentBackground} PaymentBackground + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PaymentBackground.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PaymentBackground(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.string(); + break; + case 2: + message.fileLength = reader.uint64(); + break; + case 3: + message.width = reader.uint32(); + break; + case 4: + message.height = reader.uint32(); + break; + case 5: + message.mimetype = reader.string(); + break; + case 6: + message.placeholderArgb = reader.fixed32(); + break; + case 7: + message.textArgb = reader.fixed32(); + break; + case 8: + message.subtextArgb = reader.fixed32(); + break; + case 9: + message.mediaData = $root.proto.PaymentBackground.MediaData.decode(reader, reader.uint32()); + break; + case 10: + message.type = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PaymentBackground message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PaymentBackground + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PaymentBackground} PaymentBackground + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PaymentBackground.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PaymentBackground message. + * @function verify + * @memberof proto.PaymentBackground + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PaymentBackground.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.width != null && message.hasOwnProperty("width")) + if (!$util.isInteger(message.width)) + return "width: integer expected"; + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.placeholderArgb != null && message.hasOwnProperty("placeholderArgb")) + if (!$util.isInteger(message.placeholderArgb)) + return "placeholderArgb: integer expected"; + if (message.textArgb != null && message.hasOwnProperty("textArgb")) + if (!$util.isInteger(message.textArgb)) + return "textArgb: integer expected"; + if (message.subtextArgb != null && message.hasOwnProperty("subtextArgb")) + if (!$util.isInteger(message.subtextArgb)) + return "subtextArgb: integer expected"; + if (message.mediaData != null && message.hasOwnProperty("mediaData")) { + var error = $root.proto.PaymentBackground.MediaData.verify(message.mediaData); + if (error) + return "mediaData." + error; + } + if (message.type != null && message.hasOwnProperty("type")) + switch (message.type) { + default: + return "type: enum value expected"; + case 0: + case 1: + break; + } + return null; + }; + + /** + * Creates a PaymentBackground message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PaymentBackground + * @static + * @param {Object.} object Plain object + * @returns {proto.PaymentBackground} PaymentBackground + */ + PaymentBackground.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PaymentBackground) + return object; + var message = new $root.proto.PaymentBackground(); + if (object.id != null) + message.id = String(object.id); + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.width != null) + message.width = object.width >>> 0; + if (object.height != null) + message.height = object.height >>> 0; + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.placeholderArgb != null) + message.placeholderArgb = object.placeholderArgb >>> 0; + if (object.textArgb != null) + message.textArgb = object.textArgb >>> 0; + if (object.subtextArgb != null) + message.subtextArgb = object.subtextArgb >>> 0; + if (object.mediaData != null) { + if (typeof object.mediaData !== "object") + throw TypeError(".proto.PaymentBackground.mediaData: object expected"); + message.mediaData = $root.proto.PaymentBackground.MediaData.fromObject(object.mediaData); + } + switch (object.type) { + case "UNKNOWN": + case 0: + message.type = 0; + break; + case "DEFAULT": + case 1: + message.type = 1; + break; + } + return message; + }; + + /** + * Creates a plain object from a PaymentBackground message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PaymentBackground + * @static + * @param {proto.PaymentBackground} message PaymentBackground + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PaymentBackground.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.id = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + object.width = 0; + object.height = 0; + object.mimetype = ""; + object.placeholderArgb = 0; + object.textArgb = 0; + object.subtextArgb = 0; + object.mediaData = null; + object.type = options.enums === String ? "UNKNOWN" : 0; + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.width != null && message.hasOwnProperty("width")) + object.width = message.width; + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.placeholderArgb != null && message.hasOwnProperty("placeholderArgb")) + object.placeholderArgb = message.placeholderArgb; + if (message.textArgb != null && message.hasOwnProperty("textArgb")) + object.textArgb = message.textArgb; + if (message.subtextArgb != null && message.hasOwnProperty("subtextArgb")) + object.subtextArgb = message.subtextArgb; + if (message.mediaData != null && message.hasOwnProperty("mediaData")) + object.mediaData = $root.proto.PaymentBackground.MediaData.toObject(message.mediaData, options); + if (message.type != null && message.hasOwnProperty("type")) + object.type = options.enums === String ? $root.proto.PaymentBackground.Type[message.type] : message.type; + return object; + }; + + /** + * Converts this PaymentBackground to JSON. + * @function toJSON + * @memberof proto.PaymentBackground + * @instance + * @returns {Object.} JSON object + */ + PaymentBackground.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + PaymentBackground.MediaData = (function() { + + /** + * Properties of a MediaData. + * @memberof proto.PaymentBackground + * @interface IMediaData + * @property {Uint8Array|null} [mediaKey] MediaData mediaKey + * @property {number|Long|null} [mediaKeyTimestamp] MediaData mediaKeyTimestamp + * @property {Uint8Array|null} [fileSha256] MediaData fileSha256 + * @property {Uint8Array|null} [fileEncSha256] MediaData fileEncSha256 + * @property {string|null} [directPath] MediaData directPath + */ + + /** + * Constructs a new MediaData. + * @memberof proto.PaymentBackground + * @classdesc Represents a MediaData. + * @implements IMediaData + * @constructor + * @param {proto.PaymentBackground.IMediaData=} [properties] Properties to set + */ + function MediaData(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MediaData mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.PaymentBackground.MediaData + * @instance + */ + MediaData.prototype.mediaKey = $util.newBuffer([]); + + /** + * MediaData mediaKeyTimestamp. + * @member {number|Long} mediaKeyTimestamp + * @memberof proto.PaymentBackground.MediaData + * @instance + */ + MediaData.prototype.mediaKeyTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * MediaData fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.PaymentBackground.MediaData + * @instance + */ + MediaData.prototype.fileSha256 = $util.newBuffer([]); + + /** + * MediaData fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.PaymentBackground.MediaData + * @instance + */ + MediaData.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * MediaData directPath. + * @member {string} directPath + * @memberof proto.PaymentBackground.MediaData + * @instance + */ + MediaData.prototype.directPath = ""; + + /** + * Creates a new MediaData instance using the specified properties. + * @function create + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {proto.PaymentBackground.IMediaData=} [properties] Properties to set + * @returns {proto.PaymentBackground.MediaData} MediaData instance + */ + MediaData.create = function create(properties) { + return new MediaData(properties); + }; + + /** + * Encodes the specified MediaData message. Does not implicitly {@link proto.PaymentBackground.MediaData.verify|verify} messages. + * @function encode + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {proto.PaymentBackground.IMediaData} message MediaData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MediaData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.mediaKey); + if (message.mediaKeyTimestamp != null && Object.hasOwnProperty.call(message, "mediaKeyTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.mediaKeyTimestamp); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.fileSha256); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.fileEncSha256); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.directPath); + return writer; + }; + + /** + * Encodes the specified MediaData message, length delimited. Does not implicitly {@link proto.PaymentBackground.MediaData.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {proto.PaymentBackground.IMediaData} message MediaData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MediaData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MediaData message from the specified reader or buffer. + * @function decode + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PaymentBackground.MediaData} MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MediaData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PaymentBackground.MediaData(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.mediaKey = reader.bytes(); + break; + case 2: + message.mediaKeyTimestamp = reader.int64(); + break; + case 3: + message.fileSha256 = reader.bytes(); + break; + case 4: + message.fileEncSha256 = reader.bytes(); + break; + case 5: + message.directPath = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MediaData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PaymentBackground.MediaData} MediaData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MediaData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MediaData message. + * @function verify + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MediaData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (!$util.isInteger(message.mediaKeyTimestamp) && !(message.mediaKeyTimestamp && $util.isInteger(message.mediaKeyTimestamp.low) && $util.isInteger(message.mediaKeyTimestamp.high))) + return "mediaKeyTimestamp: integer|Long expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + return null; + }; + + /** + * Creates a MediaData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {Object.} object Plain object + * @returns {proto.PaymentBackground.MediaData} MediaData + */ + MediaData.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PaymentBackground.MediaData) + return object; + var message = new $root.proto.PaymentBackground.MediaData(); + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.mediaKeyTimestamp != null) + if ($util.Long) + (message.mediaKeyTimestamp = $util.Long.fromValue(object.mediaKeyTimestamp)).unsigned = false; + else if (typeof object.mediaKeyTimestamp === "string") + message.mediaKeyTimestamp = parseInt(object.mediaKeyTimestamp, 10); + else if (typeof object.mediaKeyTimestamp === "number") + message.mediaKeyTimestamp = object.mediaKeyTimestamp; + else if (typeof object.mediaKeyTimestamp === "object") + message.mediaKeyTimestamp = new $util.LongBits(object.mediaKeyTimestamp.low >>> 0, object.mediaKeyTimestamp.high >>> 0).toNumber(); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.directPath != null) + message.directPath = String(object.directPath); + return message; + }; + + /** + * Creates a plain object from a MediaData message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PaymentBackground.MediaData + * @static + * @param {proto.PaymentBackground.MediaData} message MediaData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MediaData.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.mediaKeyTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.mediaKeyTimestamp = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + object.directPath = ""; + } + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.mediaKeyTimestamp != null && message.hasOwnProperty("mediaKeyTimestamp")) + if (typeof message.mediaKeyTimestamp === "number") + object.mediaKeyTimestamp = options.longs === String ? String(message.mediaKeyTimestamp) : message.mediaKeyTimestamp; + else + object.mediaKeyTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.mediaKeyTimestamp) : options.longs === Number ? new $util.LongBits(message.mediaKeyTimestamp.low >>> 0, message.mediaKeyTimestamp.high >>> 0).toNumber() : message.mediaKeyTimestamp; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + return object; + }; + + /** + * Converts this MediaData to JSON. + * @function toJSON + * @memberof proto.PaymentBackground.MediaData + * @instance + * @returns {Object.} JSON object + */ + MediaData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MediaData; + })(); + + /** + * Type enum. + * @name proto.PaymentBackground.Type + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} DEFAULT=1 DEFAULT value + */ + PaymentBackground.Type = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "DEFAULT"] = 1; + return values; + })(); + + return PaymentBackground; + })(); + + proto.PaymentInfo = (function() { + + /** + * Properties of a PaymentInfo. + * @memberof proto + * @interface IPaymentInfo + * @property {proto.PaymentInfo.Currency|null} [currencyDeprecated] PaymentInfo currencyDeprecated + * @property {number|Long|null} [amount1000] PaymentInfo amount1000 + * @property {string|null} [receiverJid] PaymentInfo receiverJid + * @property {proto.PaymentInfo.Status|null} [status] PaymentInfo status + * @property {number|Long|null} [transactionTimestamp] PaymentInfo transactionTimestamp + * @property {proto.IMessageKey|null} [requestMessageKey] PaymentInfo requestMessageKey + * @property {number|Long|null} [expiryTimestamp] PaymentInfo expiryTimestamp + * @property {boolean|null} [futureproofed] PaymentInfo futureproofed + * @property {string|null} [currency] PaymentInfo currency + * @property {proto.PaymentInfo.TxnStatus|null} [txnStatus] PaymentInfo txnStatus + * @property {boolean|null} [useNoviFiatFormat] PaymentInfo useNoviFiatFormat + * @property {proto.IMoney|null} [primaryAmount] PaymentInfo primaryAmount + * @property {proto.IMoney|null} [exchangeAmount] PaymentInfo exchangeAmount + */ + + /** + * Constructs a new PaymentInfo. + * @memberof proto + * @classdesc Represents a PaymentInfo. + * @implements IPaymentInfo + * @constructor + * @param {proto.IPaymentInfo=} [properties] Properties to set + */ + function PaymentInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PaymentInfo currencyDeprecated. + * @member {proto.PaymentInfo.Currency} currencyDeprecated + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.currencyDeprecated = 0; + + /** + * PaymentInfo amount1000. + * @member {number|Long} amount1000 + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.amount1000 = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * PaymentInfo receiverJid. + * @member {string} receiverJid + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.receiverJid = ""; + + /** + * PaymentInfo status. + * @member {proto.PaymentInfo.Status} status + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.status = 0; + + /** + * PaymentInfo transactionTimestamp. + * @member {number|Long} transactionTimestamp + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.transactionTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * PaymentInfo requestMessageKey. + * @member {proto.IMessageKey|null|undefined} requestMessageKey + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.requestMessageKey = null; + + /** + * PaymentInfo expiryTimestamp. + * @member {number|Long} expiryTimestamp + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.expiryTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * PaymentInfo futureproofed. + * @member {boolean} futureproofed + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.futureproofed = false; + + /** + * PaymentInfo currency. + * @member {string} currency + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.currency = ""; + + /** + * PaymentInfo txnStatus. + * @member {proto.PaymentInfo.TxnStatus} txnStatus + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.txnStatus = 0; + + /** + * PaymentInfo useNoviFiatFormat. + * @member {boolean} useNoviFiatFormat + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.useNoviFiatFormat = false; + + /** + * PaymentInfo primaryAmount. + * @member {proto.IMoney|null|undefined} primaryAmount + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.primaryAmount = null; + + /** + * PaymentInfo exchangeAmount. + * @member {proto.IMoney|null|undefined} exchangeAmount + * @memberof proto.PaymentInfo + * @instance + */ + PaymentInfo.prototype.exchangeAmount = null; + + /** + * Creates a new PaymentInfo instance using the specified properties. + * @function create + * @memberof proto.PaymentInfo + * @static + * @param {proto.IPaymentInfo=} [properties] Properties to set + * @returns {proto.PaymentInfo} PaymentInfo instance + */ + PaymentInfo.create = function create(properties) { + return new PaymentInfo(properties); + }; + + /** + * Encodes the specified PaymentInfo message. Does not implicitly {@link proto.PaymentInfo.verify|verify} messages. + * @function encode + * @memberof proto.PaymentInfo + * @static + * @param {proto.IPaymentInfo} message PaymentInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PaymentInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.currencyDeprecated != null && Object.hasOwnProperty.call(message, "currencyDeprecated")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.currencyDeprecated); + if (message.amount1000 != null && Object.hasOwnProperty.call(message, "amount1000")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.amount1000); + if (message.receiverJid != null && Object.hasOwnProperty.call(message, "receiverJid")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.receiverJid); + if (message.status != null && Object.hasOwnProperty.call(message, "status")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.status); + if (message.transactionTimestamp != null && Object.hasOwnProperty.call(message, "transactionTimestamp")) + writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.transactionTimestamp); + if (message.requestMessageKey != null && Object.hasOwnProperty.call(message, "requestMessageKey")) + $root.proto.MessageKey.encode(message.requestMessageKey, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.expiryTimestamp != null && Object.hasOwnProperty.call(message, "expiryTimestamp")) + writer.uint32(/* id 7, wireType 0 =*/56).uint64(message.expiryTimestamp); + if (message.futureproofed != null && Object.hasOwnProperty.call(message, "futureproofed")) + writer.uint32(/* id 8, wireType 0 =*/64).bool(message.futureproofed); + if (message.currency != null && Object.hasOwnProperty.call(message, "currency")) + writer.uint32(/* id 9, wireType 2 =*/74).string(message.currency); + if (message.txnStatus != null && Object.hasOwnProperty.call(message, "txnStatus")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.txnStatus); + if (message.useNoviFiatFormat != null && Object.hasOwnProperty.call(message, "useNoviFiatFormat")) + writer.uint32(/* id 11, wireType 0 =*/88).bool(message.useNoviFiatFormat); + if (message.primaryAmount != null && Object.hasOwnProperty.call(message, "primaryAmount")) + $root.proto.Money.encode(message.primaryAmount, writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim(); + if (message.exchangeAmount != null && Object.hasOwnProperty.call(message, "exchangeAmount")) + $root.proto.Money.encode(message.exchangeAmount, writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified PaymentInfo message, length delimited. Does not implicitly {@link proto.PaymentInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PaymentInfo + * @static + * @param {proto.IPaymentInfo} message PaymentInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PaymentInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PaymentInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.PaymentInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PaymentInfo} PaymentInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PaymentInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PaymentInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.currencyDeprecated = reader.int32(); + break; + case 2: + message.amount1000 = reader.uint64(); + break; + case 3: + message.receiverJid = reader.string(); + break; + case 4: + message.status = reader.int32(); + break; + case 5: + message.transactionTimestamp = reader.uint64(); + break; + case 6: + message.requestMessageKey = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 7: + message.expiryTimestamp = reader.uint64(); + break; + case 8: + message.futureproofed = reader.bool(); + break; + case 9: + message.currency = reader.string(); + break; + case 10: + message.txnStatus = reader.int32(); + break; + case 11: + message.useNoviFiatFormat = reader.bool(); + break; + case 12: + message.primaryAmount = $root.proto.Money.decode(reader, reader.uint32()); + break; + case 13: + message.exchangeAmount = $root.proto.Money.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PaymentInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PaymentInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PaymentInfo} PaymentInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PaymentInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PaymentInfo message. + * @function verify + * @memberof proto.PaymentInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PaymentInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.currencyDeprecated != null && message.hasOwnProperty("currencyDeprecated")) + switch (message.currencyDeprecated) { + default: + return "currencyDeprecated: enum value expected"; + case 0: + case 1: + break; + } + if (message.amount1000 != null && message.hasOwnProperty("amount1000")) + if (!$util.isInteger(message.amount1000) && !(message.amount1000 && $util.isInteger(message.amount1000.low) && $util.isInteger(message.amount1000.high))) + return "amount1000: integer|Long expected"; + if (message.receiverJid != null && message.hasOwnProperty("receiverJid")) + if (!$util.isString(message.receiverJid)) + return "receiverJid: string expected"; + if (message.status != null && message.hasOwnProperty("status")) + switch (message.status) { + default: + return "status: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + break; + } + if (message.transactionTimestamp != null && message.hasOwnProperty("transactionTimestamp")) + if (!$util.isInteger(message.transactionTimestamp) && !(message.transactionTimestamp && $util.isInteger(message.transactionTimestamp.low) && $util.isInteger(message.transactionTimestamp.high))) + return "transactionTimestamp: integer|Long expected"; + if (message.requestMessageKey != null && message.hasOwnProperty("requestMessageKey")) { + var error = $root.proto.MessageKey.verify(message.requestMessageKey); + if (error) + return "requestMessageKey." + error; + } + if (message.expiryTimestamp != null && message.hasOwnProperty("expiryTimestamp")) + if (!$util.isInteger(message.expiryTimestamp) && !(message.expiryTimestamp && $util.isInteger(message.expiryTimestamp.low) && $util.isInteger(message.expiryTimestamp.high))) + return "expiryTimestamp: integer|Long expected"; + if (message.futureproofed != null && message.hasOwnProperty("futureproofed")) + if (typeof message.futureproofed !== "boolean") + return "futureproofed: boolean expected"; + if (message.currency != null && message.hasOwnProperty("currency")) + if (!$util.isString(message.currency)) + return "currency: string expected"; + if (message.txnStatus != null && message.hasOwnProperty("txnStatus")) + switch (message.txnStatus) { + default: + return "txnStatus: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + break; + } + if (message.useNoviFiatFormat != null && message.hasOwnProperty("useNoviFiatFormat")) + if (typeof message.useNoviFiatFormat !== "boolean") + return "useNoviFiatFormat: boolean expected"; + if (message.primaryAmount != null && message.hasOwnProperty("primaryAmount")) { + var error = $root.proto.Money.verify(message.primaryAmount); + if (error) + return "primaryAmount." + error; + } + if (message.exchangeAmount != null && message.hasOwnProperty("exchangeAmount")) { + var error = $root.proto.Money.verify(message.exchangeAmount); + if (error) + return "exchangeAmount." + error; + } + return null; + }; + + /** + * Creates a PaymentInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PaymentInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.PaymentInfo} PaymentInfo + */ + PaymentInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PaymentInfo) + return object; + var message = new $root.proto.PaymentInfo(); + switch (object.currencyDeprecated) { + case "UNKNOWN_CURRENCY": + case 0: + message.currencyDeprecated = 0; + break; + case "INR": + case 1: + message.currencyDeprecated = 1; + break; + } + if (object.amount1000 != null) + if ($util.Long) + (message.amount1000 = $util.Long.fromValue(object.amount1000)).unsigned = true; + else if (typeof object.amount1000 === "string") + message.amount1000 = parseInt(object.amount1000, 10); + else if (typeof object.amount1000 === "number") + message.amount1000 = object.amount1000; + else if (typeof object.amount1000 === "object") + message.amount1000 = new $util.LongBits(object.amount1000.low >>> 0, object.amount1000.high >>> 0).toNumber(true); + if (object.receiverJid != null) + message.receiverJid = String(object.receiverJid); + switch (object.status) { + case "UNKNOWN_STATUS": + case 0: + message.status = 0; + break; + case "PROCESSING": + case 1: + message.status = 1; + break; + case "SENT": + case 2: + message.status = 2; + break; + case "NEED_TO_ACCEPT": + case 3: + message.status = 3; + break; + case "COMPLETE": + case 4: + message.status = 4; + break; + case "COULD_NOT_COMPLETE": + case 5: + message.status = 5; + break; + case "REFUNDED": + case 6: + message.status = 6; + break; + case "EXPIRED": + case 7: + message.status = 7; + break; + case "REJECTED": + case 8: + message.status = 8; + break; + case "CANCELLED": + case 9: + message.status = 9; + break; + case "WAITING_FOR_PAYER": + case 10: + message.status = 10; + break; + case "WAITING": + case 11: + message.status = 11; + break; + } + if (object.transactionTimestamp != null) + if ($util.Long) + (message.transactionTimestamp = $util.Long.fromValue(object.transactionTimestamp)).unsigned = true; + else if (typeof object.transactionTimestamp === "string") + message.transactionTimestamp = parseInt(object.transactionTimestamp, 10); + else if (typeof object.transactionTimestamp === "number") + message.transactionTimestamp = object.transactionTimestamp; + else if (typeof object.transactionTimestamp === "object") + message.transactionTimestamp = new $util.LongBits(object.transactionTimestamp.low >>> 0, object.transactionTimestamp.high >>> 0).toNumber(true); + if (object.requestMessageKey != null) { + if (typeof object.requestMessageKey !== "object") + throw TypeError(".proto.PaymentInfo.requestMessageKey: object expected"); + message.requestMessageKey = $root.proto.MessageKey.fromObject(object.requestMessageKey); + } + if (object.expiryTimestamp != null) + if ($util.Long) + (message.expiryTimestamp = $util.Long.fromValue(object.expiryTimestamp)).unsigned = true; + else if (typeof object.expiryTimestamp === "string") + message.expiryTimestamp = parseInt(object.expiryTimestamp, 10); + else if (typeof object.expiryTimestamp === "number") + message.expiryTimestamp = object.expiryTimestamp; + else if (typeof object.expiryTimestamp === "object") + message.expiryTimestamp = new $util.LongBits(object.expiryTimestamp.low >>> 0, object.expiryTimestamp.high >>> 0).toNumber(true); + if (object.futureproofed != null) + message.futureproofed = Boolean(object.futureproofed); + if (object.currency != null) + message.currency = String(object.currency); + switch (object.txnStatus) { + case "UNKNOWN": + case 0: + message.txnStatus = 0; + break; + case "PENDING_SETUP": + case 1: + message.txnStatus = 1; + break; + case "PENDING_RECEIVER_SETUP": + case 2: + message.txnStatus = 2; + break; + case "INIT": + case 3: + message.txnStatus = 3; + break; + case "SUCCESS": + case 4: + message.txnStatus = 4; + break; + case "COMPLETED": + case 5: + message.txnStatus = 5; + break; + case "FAILED": + case 6: + message.txnStatus = 6; + break; + case "FAILED_RISK": + case 7: + message.txnStatus = 7; + break; + case "FAILED_PROCESSING": + case 8: + message.txnStatus = 8; + break; + case "FAILED_RECEIVER_PROCESSING": + case 9: + message.txnStatus = 9; + break; + case "FAILED_DA": + case 10: + message.txnStatus = 10; + break; + case "FAILED_DA_FINAL": + case 11: + message.txnStatus = 11; + break; + case "REFUNDED_TXN": + case 12: + message.txnStatus = 12; + break; + case "REFUND_FAILED": + case 13: + message.txnStatus = 13; + break; + case "REFUND_FAILED_PROCESSING": + case 14: + message.txnStatus = 14; + break; + case "REFUND_FAILED_DA": + case 15: + message.txnStatus = 15; + break; + case "EXPIRED_TXN": + case 16: + message.txnStatus = 16; + break; + case "AUTH_CANCELED": + case 17: + message.txnStatus = 17; + break; + case "AUTH_CANCEL_FAILED_PROCESSING": + case 18: + message.txnStatus = 18; + break; + case "AUTH_CANCEL_FAILED": + case 19: + message.txnStatus = 19; + break; + case "COLLECT_INIT": + case 20: + message.txnStatus = 20; + break; + case "COLLECT_SUCCESS": + case 21: + message.txnStatus = 21; + break; + case "COLLECT_FAILED": + case 22: + message.txnStatus = 22; + break; + case "COLLECT_FAILED_RISK": + case 23: + message.txnStatus = 23; + break; + case "COLLECT_REJECTED": + case 24: + message.txnStatus = 24; + break; + case "COLLECT_EXPIRED": + case 25: + message.txnStatus = 25; + break; + case "COLLECT_CANCELED": + case 26: + message.txnStatus = 26; + break; + case "COLLECT_CANCELLING": + case 27: + message.txnStatus = 27; + break; + case "IN_REVIEW": + case 28: + message.txnStatus = 28; + break; + case "REVERSAL_SUCCESS": + case 29: + message.txnStatus = 29; + break; + case "REVERSAL_PENDING": + case 30: + message.txnStatus = 30; + break; + case "REFUND_PENDING": + case 31: + message.txnStatus = 31; + break; + } + if (object.useNoviFiatFormat != null) + message.useNoviFiatFormat = Boolean(object.useNoviFiatFormat); + if (object.primaryAmount != null) { + if (typeof object.primaryAmount !== "object") + throw TypeError(".proto.PaymentInfo.primaryAmount: object expected"); + message.primaryAmount = $root.proto.Money.fromObject(object.primaryAmount); + } + if (object.exchangeAmount != null) { + if (typeof object.exchangeAmount !== "object") + throw TypeError(".proto.PaymentInfo.exchangeAmount: object expected"); + message.exchangeAmount = $root.proto.Money.fromObject(object.exchangeAmount); + } + return message; + }; + + /** + * Creates a plain object from a PaymentInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PaymentInfo + * @static + * @param {proto.PaymentInfo} message PaymentInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PaymentInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.currencyDeprecated = options.enums === String ? "UNKNOWN_CURRENCY" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.amount1000 = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount1000 = options.longs === String ? "0" : 0; + object.receiverJid = ""; + object.status = options.enums === String ? "UNKNOWN_STATUS" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.transactionTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.transactionTimestamp = options.longs === String ? "0" : 0; + object.requestMessageKey = null; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.expiryTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.expiryTimestamp = options.longs === String ? "0" : 0; + object.futureproofed = false; + object.currency = ""; + object.txnStatus = options.enums === String ? "UNKNOWN" : 0; + object.useNoviFiatFormat = false; + object.primaryAmount = null; + object.exchangeAmount = null; + } + if (message.currencyDeprecated != null && message.hasOwnProperty("currencyDeprecated")) + object.currencyDeprecated = options.enums === String ? $root.proto.PaymentInfo.Currency[message.currencyDeprecated] : message.currencyDeprecated; + if (message.amount1000 != null && message.hasOwnProperty("amount1000")) + if (typeof message.amount1000 === "number") + object.amount1000 = options.longs === String ? String(message.amount1000) : message.amount1000; + else + object.amount1000 = options.longs === String ? $util.Long.prototype.toString.call(message.amount1000) : options.longs === Number ? new $util.LongBits(message.amount1000.low >>> 0, message.amount1000.high >>> 0).toNumber(true) : message.amount1000; + if (message.receiverJid != null && message.hasOwnProperty("receiverJid")) + object.receiverJid = message.receiverJid; + if (message.status != null && message.hasOwnProperty("status")) + object.status = options.enums === String ? $root.proto.PaymentInfo.Status[message.status] : message.status; + if (message.transactionTimestamp != null && message.hasOwnProperty("transactionTimestamp")) + if (typeof message.transactionTimestamp === "number") + object.transactionTimestamp = options.longs === String ? String(message.transactionTimestamp) : message.transactionTimestamp; + else + object.transactionTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.transactionTimestamp) : options.longs === Number ? new $util.LongBits(message.transactionTimestamp.low >>> 0, message.transactionTimestamp.high >>> 0).toNumber(true) : message.transactionTimestamp; + if (message.requestMessageKey != null && message.hasOwnProperty("requestMessageKey")) + object.requestMessageKey = $root.proto.MessageKey.toObject(message.requestMessageKey, options); + if (message.expiryTimestamp != null && message.hasOwnProperty("expiryTimestamp")) + if (typeof message.expiryTimestamp === "number") + object.expiryTimestamp = options.longs === String ? String(message.expiryTimestamp) : message.expiryTimestamp; + else + object.expiryTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.expiryTimestamp) : options.longs === Number ? new $util.LongBits(message.expiryTimestamp.low >>> 0, message.expiryTimestamp.high >>> 0).toNumber(true) : message.expiryTimestamp; + if (message.futureproofed != null && message.hasOwnProperty("futureproofed")) + object.futureproofed = message.futureproofed; + if (message.currency != null && message.hasOwnProperty("currency")) + object.currency = message.currency; + if (message.txnStatus != null && message.hasOwnProperty("txnStatus")) + object.txnStatus = options.enums === String ? $root.proto.PaymentInfo.TxnStatus[message.txnStatus] : message.txnStatus; + if (message.useNoviFiatFormat != null && message.hasOwnProperty("useNoviFiatFormat")) + object.useNoviFiatFormat = message.useNoviFiatFormat; + if (message.primaryAmount != null && message.hasOwnProperty("primaryAmount")) + object.primaryAmount = $root.proto.Money.toObject(message.primaryAmount, options); + if (message.exchangeAmount != null && message.hasOwnProperty("exchangeAmount")) + object.exchangeAmount = $root.proto.Money.toObject(message.exchangeAmount, options); + return object; + }; + + /** + * Converts this PaymentInfo to JSON. + * @function toJSON + * @memberof proto.PaymentInfo + * @instance + * @returns {Object.} JSON object + */ + PaymentInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Currency enum. + * @name proto.PaymentInfo.Currency + * @enum {number} + * @property {number} UNKNOWN_CURRENCY=0 UNKNOWN_CURRENCY value + * @property {number} INR=1 INR value + */ + PaymentInfo.Currency = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN_CURRENCY"] = 0; + values[valuesById[1] = "INR"] = 1; + return values; + })(); + + /** + * Status enum. + * @name proto.PaymentInfo.Status + * @enum {number} + * @property {number} UNKNOWN_STATUS=0 UNKNOWN_STATUS value + * @property {number} PROCESSING=1 PROCESSING value + * @property {number} SENT=2 SENT value + * @property {number} NEED_TO_ACCEPT=3 NEED_TO_ACCEPT value + * @property {number} COMPLETE=4 COMPLETE value + * @property {number} COULD_NOT_COMPLETE=5 COULD_NOT_COMPLETE value + * @property {number} REFUNDED=6 REFUNDED value + * @property {number} EXPIRED=7 EXPIRED value + * @property {number} REJECTED=8 REJECTED value + * @property {number} CANCELLED=9 CANCELLED value + * @property {number} WAITING_FOR_PAYER=10 WAITING_FOR_PAYER value + * @property {number} WAITING=11 WAITING value + */ + PaymentInfo.Status = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN_STATUS"] = 0; + values[valuesById[1] = "PROCESSING"] = 1; + values[valuesById[2] = "SENT"] = 2; + values[valuesById[3] = "NEED_TO_ACCEPT"] = 3; + values[valuesById[4] = "COMPLETE"] = 4; + values[valuesById[5] = "COULD_NOT_COMPLETE"] = 5; + values[valuesById[6] = "REFUNDED"] = 6; + values[valuesById[7] = "EXPIRED"] = 7; + values[valuesById[8] = "REJECTED"] = 8; + values[valuesById[9] = "CANCELLED"] = 9; + values[valuesById[10] = "WAITING_FOR_PAYER"] = 10; + values[valuesById[11] = "WAITING"] = 11; + return values; + })(); + + /** + * TxnStatus enum. + * @name proto.PaymentInfo.TxnStatus + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} PENDING_SETUP=1 PENDING_SETUP value + * @property {number} PENDING_RECEIVER_SETUP=2 PENDING_RECEIVER_SETUP value + * @property {number} INIT=3 INIT value + * @property {number} SUCCESS=4 SUCCESS value + * @property {number} COMPLETED=5 COMPLETED value + * @property {number} FAILED=6 FAILED value + * @property {number} FAILED_RISK=7 FAILED_RISK value + * @property {number} FAILED_PROCESSING=8 FAILED_PROCESSING value + * @property {number} FAILED_RECEIVER_PROCESSING=9 FAILED_RECEIVER_PROCESSING value + * @property {number} FAILED_DA=10 FAILED_DA value + * @property {number} FAILED_DA_FINAL=11 FAILED_DA_FINAL value + * @property {number} REFUNDED_TXN=12 REFUNDED_TXN value + * @property {number} REFUND_FAILED=13 REFUND_FAILED value + * @property {number} REFUND_FAILED_PROCESSING=14 REFUND_FAILED_PROCESSING value + * @property {number} REFUND_FAILED_DA=15 REFUND_FAILED_DA value + * @property {number} EXPIRED_TXN=16 EXPIRED_TXN value + * @property {number} AUTH_CANCELED=17 AUTH_CANCELED value + * @property {number} AUTH_CANCEL_FAILED_PROCESSING=18 AUTH_CANCEL_FAILED_PROCESSING value + * @property {number} AUTH_CANCEL_FAILED=19 AUTH_CANCEL_FAILED value + * @property {number} COLLECT_INIT=20 COLLECT_INIT value + * @property {number} COLLECT_SUCCESS=21 COLLECT_SUCCESS value + * @property {number} COLLECT_FAILED=22 COLLECT_FAILED value + * @property {number} COLLECT_FAILED_RISK=23 COLLECT_FAILED_RISK value + * @property {number} COLLECT_REJECTED=24 COLLECT_REJECTED value + * @property {number} COLLECT_EXPIRED=25 COLLECT_EXPIRED value + * @property {number} COLLECT_CANCELED=26 COLLECT_CANCELED value + * @property {number} COLLECT_CANCELLING=27 COLLECT_CANCELLING value + * @property {number} IN_REVIEW=28 IN_REVIEW value + * @property {number} REVERSAL_SUCCESS=29 REVERSAL_SUCCESS value + * @property {number} REVERSAL_PENDING=30 REVERSAL_PENDING value + * @property {number} REFUND_PENDING=31 REFUND_PENDING value + */ + PaymentInfo.TxnStatus = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "PENDING_SETUP"] = 1; + values[valuesById[2] = "PENDING_RECEIVER_SETUP"] = 2; + values[valuesById[3] = "INIT"] = 3; + values[valuesById[4] = "SUCCESS"] = 4; + values[valuesById[5] = "COMPLETED"] = 5; + values[valuesById[6] = "FAILED"] = 6; + values[valuesById[7] = "FAILED_RISK"] = 7; + values[valuesById[8] = "FAILED_PROCESSING"] = 8; + values[valuesById[9] = "FAILED_RECEIVER_PROCESSING"] = 9; + values[valuesById[10] = "FAILED_DA"] = 10; + values[valuesById[11] = "FAILED_DA_FINAL"] = 11; + values[valuesById[12] = "REFUNDED_TXN"] = 12; + values[valuesById[13] = "REFUND_FAILED"] = 13; + values[valuesById[14] = "REFUND_FAILED_PROCESSING"] = 14; + values[valuesById[15] = "REFUND_FAILED_DA"] = 15; + values[valuesById[16] = "EXPIRED_TXN"] = 16; + values[valuesById[17] = "AUTH_CANCELED"] = 17; + values[valuesById[18] = "AUTH_CANCEL_FAILED_PROCESSING"] = 18; + values[valuesById[19] = "AUTH_CANCEL_FAILED"] = 19; + values[valuesById[20] = "COLLECT_INIT"] = 20; + values[valuesById[21] = "COLLECT_SUCCESS"] = 21; + values[valuesById[22] = "COLLECT_FAILED"] = 22; + values[valuesById[23] = "COLLECT_FAILED_RISK"] = 23; + values[valuesById[24] = "COLLECT_REJECTED"] = 24; + values[valuesById[25] = "COLLECT_EXPIRED"] = 25; + values[valuesById[26] = "COLLECT_CANCELED"] = 26; + values[valuesById[27] = "COLLECT_CANCELLING"] = 27; + values[valuesById[28] = "IN_REVIEW"] = 28; + values[valuesById[29] = "REVERSAL_SUCCESS"] = 29; + values[valuesById[30] = "REVERSAL_PENDING"] = 30; + values[valuesById[31] = "REFUND_PENDING"] = 31; + return values; + })(); + + return PaymentInfo; + })(); + + proto.PendingKeyExchange = (function() { + + /** + * Properties of a PendingKeyExchange. + * @memberof proto + * @interface IPendingKeyExchange + * @property {number|null} [sequence] PendingKeyExchange sequence + * @property {Uint8Array|null} [localBaseKey] PendingKeyExchange localBaseKey + * @property {Uint8Array|null} [localBaseKeyPrivate] PendingKeyExchange localBaseKeyPrivate + * @property {Uint8Array|null} [localRatchetKey] PendingKeyExchange localRatchetKey + * @property {Uint8Array|null} [localRatchetKeyPrivate] PendingKeyExchange localRatchetKeyPrivate + * @property {Uint8Array|null} [localIdentityKey] PendingKeyExchange localIdentityKey + * @property {Uint8Array|null} [localIdentityKeyPrivate] PendingKeyExchange localIdentityKeyPrivate + */ + + /** + * Constructs a new PendingKeyExchange. + * @memberof proto + * @classdesc Represents a PendingKeyExchange. + * @implements IPendingKeyExchange + * @constructor + * @param {proto.IPendingKeyExchange=} [properties] Properties to set + */ + function PendingKeyExchange(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PendingKeyExchange sequence. + * @member {number} sequence + * @memberof proto.PendingKeyExchange + * @instance + */ + PendingKeyExchange.prototype.sequence = 0; + + /** + * PendingKeyExchange localBaseKey. + * @member {Uint8Array} localBaseKey + * @memberof proto.PendingKeyExchange + * @instance + */ + PendingKeyExchange.prototype.localBaseKey = $util.newBuffer([]); + + /** + * PendingKeyExchange localBaseKeyPrivate. + * @member {Uint8Array} localBaseKeyPrivate + * @memberof proto.PendingKeyExchange + * @instance + */ + PendingKeyExchange.prototype.localBaseKeyPrivate = $util.newBuffer([]); + + /** + * PendingKeyExchange localRatchetKey. + * @member {Uint8Array} localRatchetKey + * @memberof proto.PendingKeyExchange + * @instance + */ + PendingKeyExchange.prototype.localRatchetKey = $util.newBuffer([]); + + /** + * PendingKeyExchange localRatchetKeyPrivate. + * @member {Uint8Array} localRatchetKeyPrivate + * @memberof proto.PendingKeyExchange + * @instance + */ + PendingKeyExchange.prototype.localRatchetKeyPrivate = $util.newBuffer([]); + + /** + * PendingKeyExchange localIdentityKey. + * @member {Uint8Array} localIdentityKey + * @memberof proto.PendingKeyExchange + * @instance + */ + PendingKeyExchange.prototype.localIdentityKey = $util.newBuffer([]); + + /** + * PendingKeyExchange localIdentityKeyPrivate. + * @member {Uint8Array} localIdentityKeyPrivate + * @memberof proto.PendingKeyExchange + * @instance + */ + PendingKeyExchange.prototype.localIdentityKeyPrivate = $util.newBuffer([]); + + /** + * Creates a new PendingKeyExchange instance using the specified properties. + * @function create + * @memberof proto.PendingKeyExchange + * @static + * @param {proto.IPendingKeyExchange=} [properties] Properties to set + * @returns {proto.PendingKeyExchange} PendingKeyExchange instance + */ + PendingKeyExchange.create = function create(properties) { + return new PendingKeyExchange(properties); + }; + + /** + * Encodes the specified PendingKeyExchange message. Does not implicitly {@link proto.PendingKeyExchange.verify|verify} messages. + * @function encode + * @memberof proto.PendingKeyExchange + * @static + * @param {proto.IPendingKeyExchange} message PendingKeyExchange message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PendingKeyExchange.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.sequence != null && Object.hasOwnProperty.call(message, "sequence")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.sequence); + if (message.localBaseKey != null && Object.hasOwnProperty.call(message, "localBaseKey")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.localBaseKey); + if (message.localBaseKeyPrivate != null && Object.hasOwnProperty.call(message, "localBaseKeyPrivate")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.localBaseKeyPrivate); + if (message.localRatchetKey != null && Object.hasOwnProperty.call(message, "localRatchetKey")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.localRatchetKey); + if (message.localRatchetKeyPrivate != null && Object.hasOwnProperty.call(message, "localRatchetKeyPrivate")) + writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.localRatchetKeyPrivate); + if (message.localIdentityKey != null && Object.hasOwnProperty.call(message, "localIdentityKey")) + writer.uint32(/* id 7, wireType 2 =*/58).bytes(message.localIdentityKey); + if (message.localIdentityKeyPrivate != null && Object.hasOwnProperty.call(message, "localIdentityKeyPrivate")) + writer.uint32(/* id 8, wireType 2 =*/66).bytes(message.localIdentityKeyPrivate); + return writer; + }; + + /** + * Encodes the specified PendingKeyExchange message, length delimited. Does not implicitly {@link proto.PendingKeyExchange.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PendingKeyExchange + * @static + * @param {proto.IPendingKeyExchange} message PendingKeyExchange message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PendingKeyExchange.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PendingKeyExchange message from the specified reader or buffer. + * @function decode + * @memberof proto.PendingKeyExchange + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PendingKeyExchange} PendingKeyExchange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PendingKeyExchange.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PendingKeyExchange(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.sequence = reader.uint32(); + break; + case 2: + message.localBaseKey = reader.bytes(); + break; + case 3: + message.localBaseKeyPrivate = reader.bytes(); + break; + case 4: + message.localRatchetKey = reader.bytes(); + break; + case 5: + message.localRatchetKeyPrivate = reader.bytes(); + break; + case 7: + message.localIdentityKey = reader.bytes(); + break; + case 8: + message.localIdentityKeyPrivate = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PendingKeyExchange message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PendingKeyExchange + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PendingKeyExchange} PendingKeyExchange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PendingKeyExchange.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PendingKeyExchange message. + * @function verify + * @memberof proto.PendingKeyExchange + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PendingKeyExchange.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.sequence != null && message.hasOwnProperty("sequence")) + if (!$util.isInteger(message.sequence)) + return "sequence: integer expected"; + if (message.localBaseKey != null && message.hasOwnProperty("localBaseKey")) + if (!(message.localBaseKey && typeof message.localBaseKey.length === "number" || $util.isString(message.localBaseKey))) + return "localBaseKey: buffer expected"; + if (message.localBaseKeyPrivate != null && message.hasOwnProperty("localBaseKeyPrivate")) + if (!(message.localBaseKeyPrivate && typeof message.localBaseKeyPrivate.length === "number" || $util.isString(message.localBaseKeyPrivate))) + return "localBaseKeyPrivate: buffer expected"; + if (message.localRatchetKey != null && message.hasOwnProperty("localRatchetKey")) + if (!(message.localRatchetKey && typeof message.localRatchetKey.length === "number" || $util.isString(message.localRatchetKey))) + return "localRatchetKey: buffer expected"; + if (message.localRatchetKeyPrivate != null && message.hasOwnProperty("localRatchetKeyPrivate")) + if (!(message.localRatchetKeyPrivate && typeof message.localRatchetKeyPrivate.length === "number" || $util.isString(message.localRatchetKeyPrivate))) + return "localRatchetKeyPrivate: buffer expected"; + if (message.localIdentityKey != null && message.hasOwnProperty("localIdentityKey")) + if (!(message.localIdentityKey && typeof message.localIdentityKey.length === "number" || $util.isString(message.localIdentityKey))) + return "localIdentityKey: buffer expected"; + if (message.localIdentityKeyPrivate != null && message.hasOwnProperty("localIdentityKeyPrivate")) + if (!(message.localIdentityKeyPrivate && typeof message.localIdentityKeyPrivate.length === "number" || $util.isString(message.localIdentityKeyPrivate))) + return "localIdentityKeyPrivate: buffer expected"; + return null; + }; + + /** + * Creates a PendingKeyExchange message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PendingKeyExchange + * @static + * @param {Object.} object Plain object + * @returns {proto.PendingKeyExchange} PendingKeyExchange + */ + PendingKeyExchange.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PendingKeyExchange) + return object; + var message = new $root.proto.PendingKeyExchange(); + if (object.sequence != null) + message.sequence = object.sequence >>> 0; + if (object.localBaseKey != null) + if (typeof object.localBaseKey === "string") + $util.base64.decode(object.localBaseKey, message.localBaseKey = $util.newBuffer($util.base64.length(object.localBaseKey)), 0); + else if (object.localBaseKey.length) + message.localBaseKey = object.localBaseKey; + if (object.localBaseKeyPrivate != null) + if (typeof object.localBaseKeyPrivate === "string") + $util.base64.decode(object.localBaseKeyPrivate, message.localBaseKeyPrivate = $util.newBuffer($util.base64.length(object.localBaseKeyPrivate)), 0); + else if (object.localBaseKeyPrivate.length) + message.localBaseKeyPrivate = object.localBaseKeyPrivate; + if (object.localRatchetKey != null) + if (typeof object.localRatchetKey === "string") + $util.base64.decode(object.localRatchetKey, message.localRatchetKey = $util.newBuffer($util.base64.length(object.localRatchetKey)), 0); + else if (object.localRatchetKey.length) + message.localRatchetKey = object.localRatchetKey; + if (object.localRatchetKeyPrivate != null) + if (typeof object.localRatchetKeyPrivate === "string") + $util.base64.decode(object.localRatchetKeyPrivate, message.localRatchetKeyPrivate = $util.newBuffer($util.base64.length(object.localRatchetKeyPrivate)), 0); + else if (object.localRatchetKeyPrivate.length) + message.localRatchetKeyPrivate = object.localRatchetKeyPrivate; + if (object.localIdentityKey != null) + if (typeof object.localIdentityKey === "string") + $util.base64.decode(object.localIdentityKey, message.localIdentityKey = $util.newBuffer($util.base64.length(object.localIdentityKey)), 0); + else if (object.localIdentityKey.length) + message.localIdentityKey = object.localIdentityKey; + if (object.localIdentityKeyPrivate != null) + if (typeof object.localIdentityKeyPrivate === "string") + $util.base64.decode(object.localIdentityKeyPrivate, message.localIdentityKeyPrivate = $util.newBuffer($util.base64.length(object.localIdentityKeyPrivate)), 0); + else if (object.localIdentityKeyPrivate.length) + message.localIdentityKeyPrivate = object.localIdentityKeyPrivate; + return message; + }; + + /** + * Creates a plain object from a PendingKeyExchange message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PendingKeyExchange + * @static + * @param {proto.PendingKeyExchange} message PendingKeyExchange + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PendingKeyExchange.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.sequence = 0; + if (options.bytes === String) + object.localBaseKey = ""; + else { + object.localBaseKey = []; + if (options.bytes !== Array) + object.localBaseKey = $util.newBuffer(object.localBaseKey); + } + if (options.bytes === String) + object.localBaseKeyPrivate = ""; + else { + object.localBaseKeyPrivate = []; + if (options.bytes !== Array) + object.localBaseKeyPrivate = $util.newBuffer(object.localBaseKeyPrivate); + } + if (options.bytes === String) + object.localRatchetKey = ""; + else { + object.localRatchetKey = []; + if (options.bytes !== Array) + object.localRatchetKey = $util.newBuffer(object.localRatchetKey); + } + if (options.bytes === String) + object.localRatchetKeyPrivate = ""; + else { + object.localRatchetKeyPrivate = []; + if (options.bytes !== Array) + object.localRatchetKeyPrivate = $util.newBuffer(object.localRatchetKeyPrivate); + } + if (options.bytes === String) + object.localIdentityKey = ""; + else { + object.localIdentityKey = []; + if (options.bytes !== Array) + object.localIdentityKey = $util.newBuffer(object.localIdentityKey); + } + if (options.bytes === String) + object.localIdentityKeyPrivate = ""; + else { + object.localIdentityKeyPrivate = []; + if (options.bytes !== Array) + object.localIdentityKeyPrivate = $util.newBuffer(object.localIdentityKeyPrivate); + } + } + if (message.sequence != null && message.hasOwnProperty("sequence")) + object.sequence = message.sequence; + if (message.localBaseKey != null && message.hasOwnProperty("localBaseKey")) + object.localBaseKey = options.bytes === String ? $util.base64.encode(message.localBaseKey, 0, message.localBaseKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.localBaseKey) : message.localBaseKey; + if (message.localBaseKeyPrivate != null && message.hasOwnProperty("localBaseKeyPrivate")) + object.localBaseKeyPrivate = options.bytes === String ? $util.base64.encode(message.localBaseKeyPrivate, 0, message.localBaseKeyPrivate.length) : options.bytes === Array ? Array.prototype.slice.call(message.localBaseKeyPrivate) : message.localBaseKeyPrivate; + if (message.localRatchetKey != null && message.hasOwnProperty("localRatchetKey")) + object.localRatchetKey = options.bytes === String ? $util.base64.encode(message.localRatchetKey, 0, message.localRatchetKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.localRatchetKey) : message.localRatchetKey; + if (message.localRatchetKeyPrivate != null && message.hasOwnProperty("localRatchetKeyPrivate")) + object.localRatchetKeyPrivate = options.bytes === String ? $util.base64.encode(message.localRatchetKeyPrivate, 0, message.localRatchetKeyPrivate.length) : options.bytes === Array ? Array.prototype.slice.call(message.localRatchetKeyPrivate) : message.localRatchetKeyPrivate; + if (message.localIdentityKey != null && message.hasOwnProperty("localIdentityKey")) + object.localIdentityKey = options.bytes === String ? $util.base64.encode(message.localIdentityKey, 0, message.localIdentityKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.localIdentityKey) : message.localIdentityKey; + if (message.localIdentityKeyPrivate != null && message.hasOwnProperty("localIdentityKeyPrivate")) + object.localIdentityKeyPrivate = options.bytes === String ? $util.base64.encode(message.localIdentityKeyPrivate, 0, message.localIdentityKeyPrivate.length) : options.bytes === Array ? Array.prototype.slice.call(message.localIdentityKeyPrivate) : message.localIdentityKeyPrivate; + return object; + }; + + /** + * Converts this PendingKeyExchange to JSON. + * @function toJSON + * @memberof proto.PendingKeyExchange + * @instance + * @returns {Object.} JSON object + */ + PendingKeyExchange.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PendingKeyExchange; + })(); + + proto.PendingPreKey = (function() { + + /** + * Properties of a PendingPreKey. + * @memberof proto + * @interface IPendingPreKey + * @property {number|null} [preKeyId] PendingPreKey preKeyId + * @property {number|null} [signedPreKeyId] PendingPreKey signedPreKeyId + * @property {Uint8Array|null} [baseKey] PendingPreKey baseKey + */ + + /** + * Constructs a new PendingPreKey. + * @memberof proto + * @classdesc Represents a PendingPreKey. + * @implements IPendingPreKey + * @constructor + * @param {proto.IPendingPreKey=} [properties] Properties to set + */ + function PendingPreKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PendingPreKey preKeyId. + * @member {number} preKeyId + * @memberof proto.PendingPreKey + * @instance + */ + PendingPreKey.prototype.preKeyId = 0; + + /** + * PendingPreKey signedPreKeyId. + * @member {number} signedPreKeyId + * @memberof proto.PendingPreKey + * @instance + */ + PendingPreKey.prototype.signedPreKeyId = 0; + + /** + * PendingPreKey baseKey. + * @member {Uint8Array} baseKey + * @memberof proto.PendingPreKey + * @instance + */ + PendingPreKey.prototype.baseKey = $util.newBuffer([]); + + /** + * Creates a new PendingPreKey instance using the specified properties. + * @function create + * @memberof proto.PendingPreKey + * @static + * @param {proto.IPendingPreKey=} [properties] Properties to set + * @returns {proto.PendingPreKey} PendingPreKey instance + */ + PendingPreKey.create = function create(properties) { + return new PendingPreKey(properties); + }; + + /** + * Encodes the specified PendingPreKey message. Does not implicitly {@link proto.PendingPreKey.verify|verify} messages. + * @function encode + * @memberof proto.PendingPreKey + * @static + * @param {proto.IPendingPreKey} message PendingPreKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PendingPreKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.preKeyId != null && Object.hasOwnProperty.call(message, "preKeyId")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.preKeyId); + if (message.baseKey != null && Object.hasOwnProperty.call(message, "baseKey")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.baseKey); + if (message.signedPreKeyId != null && Object.hasOwnProperty.call(message, "signedPreKeyId")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.signedPreKeyId); + return writer; + }; + + /** + * Encodes the specified PendingPreKey message, length delimited. Does not implicitly {@link proto.PendingPreKey.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PendingPreKey + * @static + * @param {proto.IPendingPreKey} message PendingPreKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PendingPreKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PendingPreKey message from the specified reader or buffer. + * @function decode + * @memberof proto.PendingPreKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PendingPreKey} PendingPreKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PendingPreKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PendingPreKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.preKeyId = reader.uint32(); + break; + case 3: + message.signedPreKeyId = reader.int32(); + break; + case 2: + message.baseKey = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PendingPreKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PendingPreKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PendingPreKey} PendingPreKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PendingPreKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PendingPreKey message. + * @function verify + * @memberof proto.PendingPreKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PendingPreKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.preKeyId != null && message.hasOwnProperty("preKeyId")) + if (!$util.isInteger(message.preKeyId)) + return "preKeyId: integer expected"; + if (message.signedPreKeyId != null && message.hasOwnProperty("signedPreKeyId")) + if (!$util.isInteger(message.signedPreKeyId)) + return "signedPreKeyId: integer expected"; + if (message.baseKey != null && message.hasOwnProperty("baseKey")) + if (!(message.baseKey && typeof message.baseKey.length === "number" || $util.isString(message.baseKey))) + return "baseKey: buffer expected"; + return null; + }; + + /** + * Creates a PendingPreKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PendingPreKey + * @static + * @param {Object.} object Plain object + * @returns {proto.PendingPreKey} PendingPreKey + */ + PendingPreKey.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PendingPreKey) + return object; + var message = new $root.proto.PendingPreKey(); + if (object.preKeyId != null) + message.preKeyId = object.preKeyId >>> 0; + if (object.signedPreKeyId != null) + message.signedPreKeyId = object.signedPreKeyId | 0; + if (object.baseKey != null) + if (typeof object.baseKey === "string") + $util.base64.decode(object.baseKey, message.baseKey = $util.newBuffer($util.base64.length(object.baseKey)), 0); + else if (object.baseKey.length) + message.baseKey = object.baseKey; + return message; + }; + + /** + * Creates a plain object from a PendingPreKey message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PendingPreKey + * @static + * @param {proto.PendingPreKey} message PendingPreKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PendingPreKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.preKeyId = 0; + if (options.bytes === String) + object.baseKey = ""; + else { + object.baseKey = []; + if (options.bytes !== Array) + object.baseKey = $util.newBuffer(object.baseKey); + } + object.signedPreKeyId = 0; + } + if (message.preKeyId != null && message.hasOwnProperty("preKeyId")) + object.preKeyId = message.preKeyId; + if (message.baseKey != null && message.hasOwnProperty("baseKey")) + object.baseKey = options.bytes === String ? $util.base64.encode(message.baseKey, 0, message.baseKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.baseKey) : message.baseKey; + if (message.signedPreKeyId != null && message.hasOwnProperty("signedPreKeyId")) + object.signedPreKeyId = message.signedPreKeyId; + return object; + }; + + /** + * Converts this PendingPreKey to JSON. + * @function toJSON + * @memberof proto.PendingPreKey + * @instance + * @returns {Object.} JSON object + */ + PendingPreKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PendingPreKey; + })(); + + proto.PhotoChange = (function() { + + /** + * Properties of a PhotoChange. + * @memberof proto + * @interface IPhotoChange + * @property {Uint8Array|null} [oldPhoto] PhotoChange oldPhoto + * @property {Uint8Array|null} [newPhoto] PhotoChange newPhoto + * @property {number|null} [newPhotoId] PhotoChange newPhotoId + */ + + /** + * Constructs a new PhotoChange. + * @memberof proto + * @classdesc Represents a PhotoChange. + * @implements IPhotoChange + * @constructor + * @param {proto.IPhotoChange=} [properties] Properties to set + */ + function PhotoChange(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PhotoChange oldPhoto. + * @member {Uint8Array} oldPhoto + * @memberof proto.PhotoChange + * @instance + */ + PhotoChange.prototype.oldPhoto = $util.newBuffer([]); + + /** + * PhotoChange newPhoto. + * @member {Uint8Array} newPhoto + * @memberof proto.PhotoChange + * @instance + */ + PhotoChange.prototype.newPhoto = $util.newBuffer([]); + + /** + * PhotoChange newPhotoId. + * @member {number} newPhotoId + * @memberof proto.PhotoChange + * @instance + */ + PhotoChange.prototype.newPhotoId = 0; + + /** + * Creates a new PhotoChange instance using the specified properties. + * @function create + * @memberof proto.PhotoChange + * @static + * @param {proto.IPhotoChange=} [properties] Properties to set + * @returns {proto.PhotoChange} PhotoChange instance + */ + PhotoChange.create = function create(properties) { + return new PhotoChange(properties); + }; + + /** + * Encodes the specified PhotoChange message. Does not implicitly {@link proto.PhotoChange.verify|verify} messages. + * @function encode + * @memberof proto.PhotoChange + * @static + * @param {proto.IPhotoChange} message PhotoChange message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PhotoChange.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.oldPhoto != null && Object.hasOwnProperty.call(message, "oldPhoto")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.oldPhoto); + if (message.newPhoto != null && Object.hasOwnProperty.call(message, "newPhoto")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.newPhoto); + if (message.newPhotoId != null && Object.hasOwnProperty.call(message, "newPhotoId")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.newPhotoId); + return writer; + }; + + /** + * Encodes the specified PhotoChange message, length delimited. Does not implicitly {@link proto.PhotoChange.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PhotoChange + * @static + * @param {proto.IPhotoChange} message PhotoChange message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PhotoChange.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PhotoChange message from the specified reader or buffer. + * @function decode + * @memberof proto.PhotoChange + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PhotoChange} PhotoChange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PhotoChange.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PhotoChange(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.oldPhoto = reader.bytes(); + break; + case 2: + message.newPhoto = reader.bytes(); + break; + case 3: + message.newPhotoId = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PhotoChange message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PhotoChange + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PhotoChange} PhotoChange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PhotoChange.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PhotoChange message. + * @function verify + * @memberof proto.PhotoChange + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PhotoChange.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.oldPhoto != null && message.hasOwnProperty("oldPhoto")) + if (!(message.oldPhoto && typeof message.oldPhoto.length === "number" || $util.isString(message.oldPhoto))) + return "oldPhoto: buffer expected"; + if (message.newPhoto != null && message.hasOwnProperty("newPhoto")) + if (!(message.newPhoto && typeof message.newPhoto.length === "number" || $util.isString(message.newPhoto))) + return "newPhoto: buffer expected"; + if (message.newPhotoId != null && message.hasOwnProperty("newPhotoId")) + if (!$util.isInteger(message.newPhotoId)) + return "newPhotoId: integer expected"; + return null; + }; + + /** + * Creates a PhotoChange message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PhotoChange + * @static + * @param {Object.} object Plain object + * @returns {proto.PhotoChange} PhotoChange + */ + PhotoChange.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PhotoChange) + return object; + var message = new $root.proto.PhotoChange(); + if (object.oldPhoto != null) + if (typeof object.oldPhoto === "string") + $util.base64.decode(object.oldPhoto, message.oldPhoto = $util.newBuffer($util.base64.length(object.oldPhoto)), 0); + else if (object.oldPhoto.length) + message.oldPhoto = object.oldPhoto; + if (object.newPhoto != null) + if (typeof object.newPhoto === "string") + $util.base64.decode(object.newPhoto, message.newPhoto = $util.newBuffer($util.base64.length(object.newPhoto)), 0); + else if (object.newPhoto.length) + message.newPhoto = object.newPhoto; + if (object.newPhotoId != null) + message.newPhotoId = object.newPhotoId >>> 0; + return message; + }; + + /** + * Creates a plain object from a PhotoChange message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PhotoChange + * @static + * @param {proto.PhotoChange} message PhotoChange + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PhotoChange.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.oldPhoto = ""; + else { + object.oldPhoto = []; + if (options.bytes !== Array) + object.oldPhoto = $util.newBuffer(object.oldPhoto); + } + if (options.bytes === String) + object.newPhoto = ""; + else { + object.newPhoto = []; + if (options.bytes !== Array) + object.newPhoto = $util.newBuffer(object.newPhoto); + } + object.newPhotoId = 0; + } + if (message.oldPhoto != null && message.hasOwnProperty("oldPhoto")) + object.oldPhoto = options.bytes === String ? $util.base64.encode(message.oldPhoto, 0, message.oldPhoto.length) : options.bytes === Array ? Array.prototype.slice.call(message.oldPhoto) : message.oldPhoto; + if (message.newPhoto != null && message.hasOwnProperty("newPhoto")) + object.newPhoto = options.bytes === String ? $util.base64.encode(message.newPhoto, 0, message.newPhoto.length) : options.bytes === Array ? Array.prototype.slice.call(message.newPhoto) : message.newPhoto; + if (message.newPhotoId != null && message.hasOwnProperty("newPhotoId")) + object.newPhotoId = message.newPhotoId; + return object; + }; + + /** + * Converts this PhotoChange to JSON. + * @function toJSON + * @memberof proto.PhotoChange + * @instance + * @returns {Object.} JSON object + */ + PhotoChange.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PhotoChange; + })(); + + proto.Point = (function() { + + /** + * Properties of a Point. + * @memberof proto + * @interface IPoint + * @property {number|null} [xDeprecated] Point xDeprecated + * @property {number|null} [yDeprecated] Point yDeprecated + * @property {number|null} [x] Point x + * @property {number|null} [y] Point y + */ + + /** + * Constructs a new Point. + * @memberof proto + * @classdesc Represents a Point. + * @implements IPoint + * @constructor + * @param {proto.IPoint=} [properties] Properties to set + */ + function Point(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Point xDeprecated. + * @member {number} xDeprecated + * @memberof proto.Point + * @instance + */ + Point.prototype.xDeprecated = 0; + + /** + * Point yDeprecated. + * @member {number} yDeprecated + * @memberof proto.Point + * @instance + */ + Point.prototype.yDeprecated = 0; + + /** + * Point x. + * @member {number} x + * @memberof proto.Point + * @instance + */ + Point.prototype.x = 0; + + /** + * Point y. + * @member {number} y + * @memberof proto.Point + * @instance + */ + Point.prototype.y = 0; + + /** + * Creates a new Point instance using the specified properties. + * @function create + * @memberof proto.Point + * @static + * @param {proto.IPoint=} [properties] Properties to set + * @returns {proto.Point} Point instance + */ + Point.create = function create(properties) { + return new Point(properties); + }; + + /** + * Encodes the specified Point message. Does not implicitly {@link proto.Point.verify|verify} messages. + * @function encode + * @memberof proto.Point + * @static + * @param {proto.IPoint} message Point message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Point.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.xDeprecated != null && Object.hasOwnProperty.call(message, "xDeprecated")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.xDeprecated); + if (message.yDeprecated != null && Object.hasOwnProperty.call(message, "yDeprecated")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.yDeprecated); + if (message.x != null && Object.hasOwnProperty.call(message, "x")) + writer.uint32(/* id 3, wireType 1 =*/25).double(message.x); + if (message.y != null && Object.hasOwnProperty.call(message, "y")) + writer.uint32(/* id 4, wireType 1 =*/33).double(message.y); + return writer; + }; + + /** + * Encodes the specified Point message, length delimited. Does not implicitly {@link proto.Point.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Point + * @static + * @param {proto.IPoint} message Point message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Point.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Point message from the specified reader or buffer. + * @function decode + * @memberof proto.Point + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Point} Point + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Point.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Point(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.xDeprecated = reader.int32(); + break; + case 2: + message.yDeprecated = reader.int32(); + break; + case 3: + message.x = reader.double(); + break; + case 4: + message.y = reader.double(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Point message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Point + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Point} Point + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Point.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Point message. + * @function verify + * @memberof proto.Point + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Point.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.xDeprecated != null && message.hasOwnProperty("xDeprecated")) + if (!$util.isInteger(message.xDeprecated)) + return "xDeprecated: integer expected"; + if (message.yDeprecated != null && message.hasOwnProperty("yDeprecated")) + if (!$util.isInteger(message.yDeprecated)) + return "yDeprecated: integer expected"; + if (message.x != null && message.hasOwnProperty("x")) + if (typeof message.x !== "number") + return "x: number expected"; + if (message.y != null && message.hasOwnProperty("y")) + if (typeof message.y !== "number") + return "y: number expected"; + return null; + }; + + /** + * Creates a Point message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Point + * @static + * @param {Object.} object Plain object + * @returns {proto.Point} Point + */ + Point.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Point) + return object; + var message = new $root.proto.Point(); + if (object.xDeprecated != null) + message.xDeprecated = object.xDeprecated | 0; + if (object.yDeprecated != null) + message.yDeprecated = object.yDeprecated | 0; + if (object.x != null) + message.x = Number(object.x); + if (object.y != null) + message.y = Number(object.y); + return message; + }; + + /** + * Creates a plain object from a Point message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Point + * @static + * @param {proto.Point} message Point + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Point.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.xDeprecated = 0; + object.yDeprecated = 0; + object.x = 0; + object.y = 0; + } + if (message.xDeprecated != null && message.hasOwnProperty("xDeprecated")) + object.xDeprecated = message.xDeprecated; + if (message.yDeprecated != null && message.hasOwnProperty("yDeprecated")) + object.yDeprecated = message.yDeprecated; + if (message.x != null && message.hasOwnProperty("x")) + object.x = options.json && !isFinite(message.x) ? String(message.x) : message.x; + if (message.y != null && message.hasOwnProperty("y")) + object.y = options.json && !isFinite(message.y) ? String(message.y) : message.y; + return object; + }; + + /** + * Converts this Point to JSON. + * @function toJSON + * @memberof proto.Point + * @instance + * @returns {Object.} JSON object + */ + Point.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Point; + })(); + + proto.PollAdditionalMetadata = (function() { + + /** + * Properties of a PollAdditionalMetadata. + * @memberof proto + * @interface IPollAdditionalMetadata + * @property {boolean|null} [pollInvalidated] PollAdditionalMetadata pollInvalidated + */ + + /** + * Constructs a new PollAdditionalMetadata. + * @memberof proto + * @classdesc Represents a PollAdditionalMetadata. + * @implements IPollAdditionalMetadata + * @constructor + * @param {proto.IPollAdditionalMetadata=} [properties] Properties to set + */ + function PollAdditionalMetadata(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollAdditionalMetadata pollInvalidated. + * @member {boolean} pollInvalidated + * @memberof proto.PollAdditionalMetadata + * @instance + */ + PollAdditionalMetadata.prototype.pollInvalidated = false; + + /** + * Creates a new PollAdditionalMetadata instance using the specified properties. + * @function create + * @memberof proto.PollAdditionalMetadata + * @static + * @param {proto.IPollAdditionalMetadata=} [properties] Properties to set + * @returns {proto.PollAdditionalMetadata} PollAdditionalMetadata instance + */ + PollAdditionalMetadata.create = function create(properties) { + return new PollAdditionalMetadata(properties); + }; + + /** + * Encodes the specified PollAdditionalMetadata message. Does not implicitly {@link proto.PollAdditionalMetadata.verify|verify} messages. + * @function encode + * @memberof proto.PollAdditionalMetadata + * @static + * @param {proto.IPollAdditionalMetadata} message PollAdditionalMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollAdditionalMetadata.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.pollInvalidated != null && Object.hasOwnProperty.call(message, "pollInvalidated")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.pollInvalidated); + return writer; + }; + + /** + * Encodes the specified PollAdditionalMetadata message, length delimited. Does not implicitly {@link proto.PollAdditionalMetadata.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PollAdditionalMetadata + * @static + * @param {proto.IPollAdditionalMetadata} message PollAdditionalMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollAdditionalMetadata.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollAdditionalMetadata message from the specified reader or buffer. + * @function decode + * @memberof proto.PollAdditionalMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PollAdditionalMetadata} PollAdditionalMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollAdditionalMetadata.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PollAdditionalMetadata(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.pollInvalidated = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollAdditionalMetadata message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PollAdditionalMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PollAdditionalMetadata} PollAdditionalMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollAdditionalMetadata.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollAdditionalMetadata message. + * @function verify + * @memberof proto.PollAdditionalMetadata + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollAdditionalMetadata.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.pollInvalidated != null && message.hasOwnProperty("pollInvalidated")) + if (typeof message.pollInvalidated !== "boolean") + return "pollInvalidated: boolean expected"; + return null; + }; + + /** + * Creates a PollAdditionalMetadata message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PollAdditionalMetadata + * @static + * @param {Object.} object Plain object + * @returns {proto.PollAdditionalMetadata} PollAdditionalMetadata + */ + PollAdditionalMetadata.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PollAdditionalMetadata) + return object; + var message = new $root.proto.PollAdditionalMetadata(); + if (object.pollInvalidated != null) + message.pollInvalidated = Boolean(object.pollInvalidated); + return message; + }; + + /** + * Creates a plain object from a PollAdditionalMetadata message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PollAdditionalMetadata + * @static + * @param {proto.PollAdditionalMetadata} message PollAdditionalMetadata + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollAdditionalMetadata.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.pollInvalidated = false; + if (message.pollInvalidated != null && message.hasOwnProperty("pollInvalidated")) + object.pollInvalidated = message.pollInvalidated; + return object; + }; + + /** + * Converts this PollAdditionalMetadata to JSON. + * @function toJSON + * @memberof proto.PollAdditionalMetadata + * @instance + * @returns {Object.} JSON object + */ + PollAdditionalMetadata.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollAdditionalMetadata; + })(); + + proto.PollEncValue = (function() { + + /** + * Properties of a PollEncValue. + * @memberof proto + * @interface IPollEncValue + * @property {Uint8Array|null} [encPayload] PollEncValue encPayload + * @property {Uint8Array|null} [encIv] PollEncValue encIv + */ + + /** + * Constructs a new PollEncValue. + * @memberof proto + * @classdesc Represents a PollEncValue. + * @implements IPollEncValue + * @constructor + * @param {proto.IPollEncValue=} [properties] Properties to set + */ + function PollEncValue(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollEncValue encPayload. + * @member {Uint8Array} encPayload + * @memberof proto.PollEncValue + * @instance + */ + PollEncValue.prototype.encPayload = $util.newBuffer([]); + + /** + * PollEncValue encIv. + * @member {Uint8Array} encIv + * @memberof proto.PollEncValue + * @instance + */ + PollEncValue.prototype.encIv = $util.newBuffer([]); + + /** + * Creates a new PollEncValue instance using the specified properties. + * @function create + * @memberof proto.PollEncValue + * @static + * @param {proto.IPollEncValue=} [properties] Properties to set + * @returns {proto.PollEncValue} PollEncValue instance + */ + PollEncValue.create = function create(properties) { + return new PollEncValue(properties); + }; + + /** + * Encodes the specified PollEncValue message. Does not implicitly {@link proto.PollEncValue.verify|verify} messages. + * @function encode + * @memberof proto.PollEncValue + * @static + * @param {proto.IPollEncValue} message PollEncValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollEncValue.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.encPayload != null && Object.hasOwnProperty.call(message, "encPayload")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.encPayload); + if (message.encIv != null && Object.hasOwnProperty.call(message, "encIv")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.encIv); + return writer; + }; + + /** + * Encodes the specified PollEncValue message, length delimited. Does not implicitly {@link proto.PollEncValue.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PollEncValue + * @static + * @param {proto.IPollEncValue} message PollEncValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollEncValue.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollEncValue message from the specified reader or buffer. + * @function decode + * @memberof proto.PollEncValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PollEncValue} PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollEncValue.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PollEncValue(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.encPayload = reader.bytes(); + break; + case 2: + message.encIv = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollEncValue message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PollEncValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PollEncValue} PollEncValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollEncValue.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollEncValue message. + * @function verify + * @memberof proto.PollEncValue + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollEncValue.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.encPayload != null && message.hasOwnProperty("encPayload")) + if (!(message.encPayload && typeof message.encPayload.length === "number" || $util.isString(message.encPayload))) + return "encPayload: buffer expected"; + if (message.encIv != null && message.hasOwnProperty("encIv")) + if (!(message.encIv && typeof message.encIv.length === "number" || $util.isString(message.encIv))) + return "encIv: buffer expected"; + return null; + }; + + /** + * Creates a PollEncValue message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PollEncValue + * @static + * @param {Object.} object Plain object + * @returns {proto.PollEncValue} PollEncValue + */ + PollEncValue.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PollEncValue) + return object; + var message = new $root.proto.PollEncValue(); + if (object.encPayload != null) + if (typeof object.encPayload === "string") + $util.base64.decode(object.encPayload, message.encPayload = $util.newBuffer($util.base64.length(object.encPayload)), 0); + else if (object.encPayload.length) + message.encPayload = object.encPayload; + if (object.encIv != null) + if (typeof object.encIv === "string") + $util.base64.decode(object.encIv, message.encIv = $util.newBuffer($util.base64.length(object.encIv)), 0); + else if (object.encIv.length) + message.encIv = object.encIv; + return message; + }; + + /** + * Creates a plain object from a PollEncValue message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PollEncValue + * @static + * @param {proto.PollEncValue} message PollEncValue + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollEncValue.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.encPayload = ""; + else { + object.encPayload = []; + if (options.bytes !== Array) + object.encPayload = $util.newBuffer(object.encPayload); + } + if (options.bytes === String) + object.encIv = ""; + else { + object.encIv = []; + if (options.bytes !== Array) + object.encIv = $util.newBuffer(object.encIv); + } + } + if (message.encPayload != null && message.hasOwnProperty("encPayload")) + object.encPayload = options.bytes === String ? $util.base64.encode(message.encPayload, 0, message.encPayload.length) : options.bytes === Array ? Array.prototype.slice.call(message.encPayload) : message.encPayload; + if (message.encIv != null && message.hasOwnProperty("encIv")) + object.encIv = options.bytes === String ? $util.base64.encode(message.encIv, 0, message.encIv.length) : options.bytes === Array ? Array.prototype.slice.call(message.encIv) : message.encIv; + return object; + }; + + /** + * Converts this PollEncValue to JSON. + * @function toJSON + * @memberof proto.PollEncValue + * @instance + * @returns {Object.} JSON object + */ + PollEncValue.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollEncValue; + })(); + + proto.PollUpdate = (function() { + + /** + * Properties of a PollUpdate. + * @memberof proto + * @interface IPollUpdate + * @property {proto.IMessageKey|null} [pollUpdateMessageKey] PollUpdate pollUpdateMessageKey + * @property {proto.Message.IPollVoteMessage|null} [vote] PollUpdate vote + * @property {number|Long|null} [senderTimestampMs] PollUpdate senderTimestampMs + */ + + /** + * Constructs a new PollUpdate. + * @memberof proto + * @classdesc Represents a PollUpdate. + * @implements IPollUpdate + * @constructor + * @param {proto.IPollUpdate=} [properties] Properties to set + */ + function PollUpdate(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PollUpdate pollUpdateMessageKey. + * @member {proto.IMessageKey|null|undefined} pollUpdateMessageKey + * @memberof proto.PollUpdate + * @instance + */ + PollUpdate.prototype.pollUpdateMessageKey = null; + + /** + * PollUpdate vote. + * @member {proto.Message.IPollVoteMessage|null|undefined} vote + * @memberof proto.PollUpdate + * @instance + */ + PollUpdate.prototype.vote = null; + + /** + * PollUpdate senderTimestampMs. + * @member {number|Long} senderTimestampMs + * @memberof proto.PollUpdate + * @instance + */ + PollUpdate.prototype.senderTimestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new PollUpdate instance using the specified properties. + * @function create + * @memberof proto.PollUpdate + * @static + * @param {proto.IPollUpdate=} [properties] Properties to set + * @returns {proto.PollUpdate} PollUpdate instance + */ + PollUpdate.create = function create(properties) { + return new PollUpdate(properties); + }; + + /** + * Encodes the specified PollUpdate message. Does not implicitly {@link proto.PollUpdate.verify|verify} messages. + * @function encode + * @memberof proto.PollUpdate + * @static + * @param {proto.IPollUpdate} message PollUpdate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollUpdate.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.pollUpdateMessageKey != null && Object.hasOwnProperty.call(message, "pollUpdateMessageKey")) + $root.proto.MessageKey.encode(message.pollUpdateMessageKey, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.vote != null && Object.hasOwnProperty.call(message, "vote")) + $root.proto.Message.PollVoteMessage.encode(message.vote, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.senderTimestampMs != null && Object.hasOwnProperty.call(message, "senderTimestampMs")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.senderTimestampMs); + return writer; + }; + + /** + * Encodes the specified PollUpdate message, length delimited. Does not implicitly {@link proto.PollUpdate.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PollUpdate + * @static + * @param {proto.IPollUpdate} message PollUpdate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PollUpdate.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PollUpdate message from the specified reader or buffer. + * @function decode + * @memberof proto.PollUpdate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PollUpdate} PollUpdate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollUpdate.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PollUpdate(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.pollUpdateMessageKey = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.vote = $root.proto.Message.PollVoteMessage.decode(reader, reader.uint32()); + break; + case 3: + message.senderTimestampMs = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PollUpdate message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PollUpdate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PollUpdate} PollUpdate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PollUpdate.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PollUpdate message. + * @function verify + * @memberof proto.PollUpdate + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PollUpdate.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.pollUpdateMessageKey != null && message.hasOwnProperty("pollUpdateMessageKey")) { + var error = $root.proto.MessageKey.verify(message.pollUpdateMessageKey); + if (error) + return "pollUpdateMessageKey." + error; + } + if (message.vote != null && message.hasOwnProperty("vote")) { + var error = $root.proto.Message.PollVoteMessage.verify(message.vote); + if (error) + return "vote." + error; + } + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (!$util.isInteger(message.senderTimestampMs) && !(message.senderTimestampMs && $util.isInteger(message.senderTimestampMs.low) && $util.isInteger(message.senderTimestampMs.high))) + return "senderTimestampMs: integer|Long expected"; + return null; + }; + + /** + * Creates a PollUpdate message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PollUpdate + * @static + * @param {Object.} object Plain object + * @returns {proto.PollUpdate} PollUpdate + */ + PollUpdate.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PollUpdate) + return object; + var message = new $root.proto.PollUpdate(); + if (object.pollUpdateMessageKey != null) { + if (typeof object.pollUpdateMessageKey !== "object") + throw TypeError(".proto.PollUpdate.pollUpdateMessageKey: object expected"); + message.pollUpdateMessageKey = $root.proto.MessageKey.fromObject(object.pollUpdateMessageKey); + } + if (object.vote != null) { + if (typeof object.vote !== "object") + throw TypeError(".proto.PollUpdate.vote: object expected"); + message.vote = $root.proto.Message.PollVoteMessage.fromObject(object.vote); + } + if (object.senderTimestampMs != null) + if ($util.Long) + (message.senderTimestampMs = $util.Long.fromValue(object.senderTimestampMs)).unsigned = false; + else if (typeof object.senderTimestampMs === "string") + message.senderTimestampMs = parseInt(object.senderTimestampMs, 10); + else if (typeof object.senderTimestampMs === "number") + message.senderTimestampMs = object.senderTimestampMs; + else if (typeof object.senderTimestampMs === "object") + message.senderTimestampMs = new $util.LongBits(object.senderTimestampMs.low >>> 0, object.senderTimestampMs.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a PollUpdate message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PollUpdate + * @static + * @param {proto.PollUpdate} message PollUpdate + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PollUpdate.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.pollUpdateMessageKey = null; + object.vote = null; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.senderTimestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.senderTimestampMs = options.longs === String ? "0" : 0; + } + if (message.pollUpdateMessageKey != null && message.hasOwnProperty("pollUpdateMessageKey")) + object.pollUpdateMessageKey = $root.proto.MessageKey.toObject(message.pollUpdateMessageKey, options); + if (message.vote != null && message.hasOwnProperty("vote")) + object.vote = $root.proto.Message.PollVoteMessage.toObject(message.vote, options); + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (typeof message.senderTimestampMs === "number") + object.senderTimestampMs = options.longs === String ? String(message.senderTimestampMs) : message.senderTimestampMs; + else + object.senderTimestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.senderTimestampMs) : options.longs === Number ? new $util.LongBits(message.senderTimestampMs.low >>> 0, message.senderTimestampMs.high >>> 0).toNumber() : message.senderTimestampMs; + return object; + }; + + /** + * Converts this PollUpdate to JSON. + * @function toJSON + * @memberof proto.PollUpdate + * @instance + * @returns {Object.} JSON object + */ + PollUpdate.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PollUpdate; + })(); + + proto.PreKeyRecordStructure = (function() { + + /** + * Properties of a PreKeyRecordStructure. + * @memberof proto + * @interface IPreKeyRecordStructure + * @property {number|null} [id] PreKeyRecordStructure id + * @property {Uint8Array|null} [publicKey] PreKeyRecordStructure publicKey + * @property {Uint8Array|null} [privateKey] PreKeyRecordStructure privateKey + */ + + /** + * Constructs a new PreKeyRecordStructure. + * @memberof proto + * @classdesc Represents a PreKeyRecordStructure. + * @implements IPreKeyRecordStructure + * @constructor + * @param {proto.IPreKeyRecordStructure=} [properties] Properties to set + */ + function PreKeyRecordStructure(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PreKeyRecordStructure id. + * @member {number} id + * @memberof proto.PreKeyRecordStructure + * @instance + */ + PreKeyRecordStructure.prototype.id = 0; + + /** + * PreKeyRecordStructure publicKey. + * @member {Uint8Array} publicKey + * @memberof proto.PreKeyRecordStructure + * @instance + */ + PreKeyRecordStructure.prototype.publicKey = $util.newBuffer([]); + + /** + * PreKeyRecordStructure privateKey. + * @member {Uint8Array} privateKey + * @memberof proto.PreKeyRecordStructure + * @instance + */ + PreKeyRecordStructure.prototype.privateKey = $util.newBuffer([]); + + /** + * Creates a new PreKeyRecordStructure instance using the specified properties. + * @function create + * @memberof proto.PreKeyRecordStructure + * @static + * @param {proto.IPreKeyRecordStructure=} [properties] Properties to set + * @returns {proto.PreKeyRecordStructure} PreKeyRecordStructure instance + */ + PreKeyRecordStructure.create = function create(properties) { + return new PreKeyRecordStructure(properties); + }; + + /** + * Encodes the specified PreKeyRecordStructure message. Does not implicitly {@link proto.PreKeyRecordStructure.verify|verify} messages. + * @function encode + * @memberof proto.PreKeyRecordStructure + * @static + * @param {proto.IPreKeyRecordStructure} message PreKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PreKeyRecordStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id); + if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.publicKey); + if (message.privateKey != null && Object.hasOwnProperty.call(message, "privateKey")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.privateKey); + return writer; + }; + + /** + * Encodes the specified PreKeyRecordStructure message, length delimited. Does not implicitly {@link proto.PreKeyRecordStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.PreKeyRecordStructure + * @static + * @param {proto.IPreKeyRecordStructure} message PreKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PreKeyRecordStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PreKeyRecordStructure message from the specified reader or buffer. + * @function decode + * @memberof proto.PreKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.PreKeyRecordStructure} PreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PreKeyRecordStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.PreKeyRecordStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.uint32(); + break; + case 2: + message.publicKey = reader.bytes(); + break; + case 3: + message.privateKey = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PreKeyRecordStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.PreKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.PreKeyRecordStructure} PreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PreKeyRecordStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PreKeyRecordStructure message. + * @function verify + * @memberof proto.PreKeyRecordStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PreKeyRecordStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isInteger(message.id)) + return "id: integer expected"; + if (message.publicKey != null && message.hasOwnProperty("publicKey")) + if (!(message.publicKey && typeof message.publicKey.length === "number" || $util.isString(message.publicKey))) + return "publicKey: buffer expected"; + if (message.privateKey != null && message.hasOwnProperty("privateKey")) + if (!(message.privateKey && typeof message.privateKey.length === "number" || $util.isString(message.privateKey))) + return "privateKey: buffer expected"; + return null; + }; + + /** + * Creates a PreKeyRecordStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.PreKeyRecordStructure + * @static + * @param {Object.} object Plain object + * @returns {proto.PreKeyRecordStructure} PreKeyRecordStructure + */ + PreKeyRecordStructure.fromObject = function fromObject(object) { + if (object instanceof $root.proto.PreKeyRecordStructure) + return object; + var message = new $root.proto.PreKeyRecordStructure(); + if (object.id != null) + message.id = object.id >>> 0; + if (object.publicKey != null) + if (typeof object.publicKey === "string") + $util.base64.decode(object.publicKey, message.publicKey = $util.newBuffer($util.base64.length(object.publicKey)), 0); + else if (object.publicKey.length) + message.publicKey = object.publicKey; + if (object.privateKey != null) + if (typeof object.privateKey === "string") + $util.base64.decode(object.privateKey, message.privateKey = $util.newBuffer($util.base64.length(object.privateKey)), 0); + else if (object.privateKey.length) + message.privateKey = object.privateKey; + return message; + }; + + /** + * Creates a plain object from a PreKeyRecordStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.PreKeyRecordStructure + * @static + * @param {proto.PreKeyRecordStructure} message PreKeyRecordStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PreKeyRecordStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.id = 0; + if (options.bytes === String) + object.publicKey = ""; + else { + object.publicKey = []; + if (options.bytes !== Array) + object.publicKey = $util.newBuffer(object.publicKey); + } + if (options.bytes === String) + object.privateKey = ""; + else { + object.privateKey = []; + if (options.bytes !== Array) + object.privateKey = $util.newBuffer(object.privateKey); + } + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.publicKey != null && message.hasOwnProperty("publicKey")) + object.publicKey = options.bytes === String ? $util.base64.encode(message.publicKey, 0, message.publicKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.publicKey) : message.publicKey; + if (message.privateKey != null && message.hasOwnProperty("privateKey")) + object.privateKey = options.bytes === String ? $util.base64.encode(message.privateKey, 0, message.privateKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.privateKey) : message.privateKey; + return object; + }; + + /** + * Converts this PreKeyRecordStructure to JSON. + * @function toJSON + * @memberof proto.PreKeyRecordStructure + * @instance + * @returns {Object.} JSON object + */ + PreKeyRecordStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PreKeyRecordStructure; + })(); + + proto.Pushname = (function() { + + /** + * Properties of a Pushname. + * @memberof proto + * @interface IPushname + * @property {string|null} [id] Pushname id + * @property {string|null} [pushname] Pushname pushname + */ + + /** + * Constructs a new Pushname. + * @memberof proto + * @classdesc Represents a Pushname. + * @implements IPushname + * @constructor + * @param {proto.IPushname=} [properties] Properties to set + */ + function Pushname(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Pushname id. + * @member {string} id + * @memberof proto.Pushname + * @instance + */ + Pushname.prototype.id = ""; + + /** + * Pushname pushname. + * @member {string} pushname + * @memberof proto.Pushname + * @instance + */ + Pushname.prototype.pushname = ""; + + /** + * Creates a new Pushname instance using the specified properties. + * @function create + * @memberof proto.Pushname + * @static + * @param {proto.IPushname=} [properties] Properties to set + * @returns {proto.Pushname} Pushname instance + */ + Pushname.create = function create(properties) { + return new Pushname(properties); + }; + + /** + * Encodes the specified Pushname message. Does not implicitly {@link proto.Pushname.verify|verify} messages. + * @function encode + * @memberof proto.Pushname + * @static + * @param {proto.IPushname} message Pushname message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Pushname.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.id); + if (message.pushname != null && Object.hasOwnProperty.call(message, "pushname")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.pushname); + return writer; + }; + + /** + * Encodes the specified Pushname message, length delimited. Does not implicitly {@link proto.Pushname.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Pushname + * @static + * @param {proto.IPushname} message Pushname message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Pushname.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Pushname message from the specified reader or buffer. + * @function decode + * @memberof proto.Pushname + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Pushname} Pushname + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Pushname.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Pushname(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.string(); + break; + case 2: + message.pushname = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Pushname message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Pushname + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Pushname} Pushname + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Pushname.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Pushname message. + * @function verify + * @memberof proto.Pushname + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Pushname.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + if (message.pushname != null && message.hasOwnProperty("pushname")) + if (!$util.isString(message.pushname)) + return "pushname: string expected"; + return null; + }; + + /** + * Creates a Pushname message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Pushname + * @static + * @param {Object.} object Plain object + * @returns {proto.Pushname} Pushname + */ + Pushname.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Pushname) + return object; + var message = new $root.proto.Pushname(); + if (object.id != null) + message.id = String(object.id); + if (object.pushname != null) + message.pushname = String(object.pushname); + return message; + }; + + /** + * Creates a plain object from a Pushname message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Pushname + * @static + * @param {proto.Pushname} message Pushname + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Pushname.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.id = ""; + object.pushname = ""; + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.pushname != null && message.hasOwnProperty("pushname")) + object.pushname = message.pushname; + return object; + }; + + /** + * Converts this Pushname to JSON. + * @function toJSON + * @memberof proto.Pushname + * @instance + * @returns {Object.} JSON object + */ + Pushname.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Pushname; + })(); + + proto.Reaction = (function() { + + /** + * Properties of a Reaction. + * @memberof proto + * @interface IReaction + * @property {proto.IMessageKey|null} [key] Reaction key + * @property {string|null} [text] Reaction text + * @property {string|null} [groupingKey] Reaction groupingKey + * @property {number|Long|null} [senderTimestampMs] Reaction senderTimestampMs + * @property {boolean|null} [unread] Reaction unread + */ + + /** + * Constructs a new Reaction. + * @memberof proto + * @classdesc Represents a Reaction. + * @implements IReaction + * @constructor + * @param {proto.IReaction=} [properties] Properties to set + */ + function Reaction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Reaction key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.Reaction + * @instance + */ + Reaction.prototype.key = null; + + /** + * Reaction text. + * @member {string} text + * @memberof proto.Reaction + * @instance + */ + Reaction.prototype.text = ""; + + /** + * Reaction groupingKey. + * @member {string} groupingKey + * @memberof proto.Reaction + * @instance + */ + Reaction.prototype.groupingKey = ""; + + /** + * Reaction senderTimestampMs. + * @member {number|Long} senderTimestampMs + * @memberof proto.Reaction + * @instance + */ + Reaction.prototype.senderTimestampMs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Reaction unread. + * @member {boolean} unread + * @memberof proto.Reaction + * @instance + */ + Reaction.prototype.unread = false; + + /** + * Creates a new Reaction instance using the specified properties. + * @function create + * @memberof proto.Reaction + * @static + * @param {proto.IReaction=} [properties] Properties to set + * @returns {proto.Reaction} Reaction instance + */ + Reaction.create = function create(properties) { + return new Reaction(properties); + }; + + /** + * Encodes the specified Reaction message. Does not implicitly {@link proto.Reaction.verify|verify} messages. + * @function encode + * @memberof proto.Reaction + * @static + * @param {proto.IReaction} message Reaction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Reaction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.text != null && Object.hasOwnProperty.call(message, "text")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.text); + if (message.groupingKey != null && Object.hasOwnProperty.call(message, "groupingKey")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.groupingKey); + if (message.senderTimestampMs != null && Object.hasOwnProperty.call(message, "senderTimestampMs")) + writer.uint32(/* id 4, wireType 0 =*/32).int64(message.senderTimestampMs); + if (message.unread != null && Object.hasOwnProperty.call(message, "unread")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.unread); + return writer; + }; + + /** + * Encodes the specified Reaction message, length delimited. Does not implicitly {@link proto.Reaction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.Reaction + * @static + * @param {proto.IReaction} message Reaction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Reaction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Reaction message from the specified reader or buffer. + * @function decode + * @memberof proto.Reaction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.Reaction} Reaction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Reaction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.Reaction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.text = reader.string(); + break; + case 3: + message.groupingKey = reader.string(); + break; + case 4: + message.senderTimestampMs = reader.int64(); + break; + case 5: + message.unread = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Reaction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.Reaction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.Reaction} Reaction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Reaction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Reaction message. + * @function verify + * @memberof proto.Reaction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Reaction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.text != null && message.hasOwnProperty("text")) + if (!$util.isString(message.text)) + return "text: string expected"; + if (message.groupingKey != null && message.hasOwnProperty("groupingKey")) + if (!$util.isString(message.groupingKey)) + return "groupingKey: string expected"; + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (!$util.isInteger(message.senderTimestampMs) && !(message.senderTimestampMs && $util.isInteger(message.senderTimestampMs.low) && $util.isInteger(message.senderTimestampMs.high))) + return "senderTimestampMs: integer|Long expected"; + if (message.unread != null && message.hasOwnProperty("unread")) + if (typeof message.unread !== "boolean") + return "unread: boolean expected"; + return null; + }; + + /** + * Creates a Reaction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.Reaction + * @static + * @param {Object.} object Plain object + * @returns {proto.Reaction} Reaction + */ + Reaction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.Reaction) + return object; + var message = new $root.proto.Reaction(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.Reaction.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + if (object.text != null) + message.text = String(object.text); + if (object.groupingKey != null) + message.groupingKey = String(object.groupingKey); + if (object.senderTimestampMs != null) + if ($util.Long) + (message.senderTimestampMs = $util.Long.fromValue(object.senderTimestampMs)).unsigned = false; + else if (typeof object.senderTimestampMs === "string") + message.senderTimestampMs = parseInt(object.senderTimestampMs, 10); + else if (typeof object.senderTimestampMs === "number") + message.senderTimestampMs = object.senderTimestampMs; + else if (typeof object.senderTimestampMs === "object") + message.senderTimestampMs = new $util.LongBits(object.senderTimestampMs.low >>> 0, object.senderTimestampMs.high >>> 0).toNumber(); + if (object.unread != null) + message.unread = Boolean(object.unread); + return message; + }; + + /** + * Creates a plain object from a Reaction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.Reaction + * @static + * @param {proto.Reaction} message Reaction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Reaction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.key = null; + object.text = ""; + object.groupingKey = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.senderTimestampMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.senderTimestampMs = options.longs === String ? "0" : 0; + object.unread = false; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.text != null && message.hasOwnProperty("text")) + object.text = message.text; + if (message.groupingKey != null && message.hasOwnProperty("groupingKey")) + object.groupingKey = message.groupingKey; + if (message.senderTimestampMs != null && message.hasOwnProperty("senderTimestampMs")) + if (typeof message.senderTimestampMs === "number") + object.senderTimestampMs = options.longs === String ? String(message.senderTimestampMs) : message.senderTimestampMs; + else + object.senderTimestampMs = options.longs === String ? $util.Long.prototype.toString.call(message.senderTimestampMs) : options.longs === Number ? new $util.LongBits(message.senderTimestampMs.low >>> 0, message.senderTimestampMs.high >>> 0).toNumber() : message.senderTimestampMs; + if (message.unread != null && message.hasOwnProperty("unread")) + object.unread = message.unread; + return object; + }; + + /** + * Converts this Reaction to JSON. + * @function toJSON + * @memberof proto.Reaction + * @instance + * @returns {Object.} JSON object + */ + Reaction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Reaction; + })(); + + proto.RecentEmojiWeight = (function() { + + /** + * Properties of a RecentEmojiWeight. + * @memberof proto + * @interface IRecentEmojiWeight + * @property {string|null} [emoji] RecentEmojiWeight emoji + * @property {number|null} [weight] RecentEmojiWeight weight + */ + + /** + * Constructs a new RecentEmojiWeight. + * @memberof proto + * @classdesc Represents a RecentEmojiWeight. + * @implements IRecentEmojiWeight + * @constructor + * @param {proto.IRecentEmojiWeight=} [properties] Properties to set + */ + function RecentEmojiWeight(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RecentEmojiWeight emoji. + * @member {string} emoji + * @memberof proto.RecentEmojiWeight + * @instance + */ + RecentEmojiWeight.prototype.emoji = ""; + + /** + * RecentEmojiWeight weight. + * @member {number} weight + * @memberof proto.RecentEmojiWeight + * @instance + */ + RecentEmojiWeight.prototype.weight = 0; + + /** + * Creates a new RecentEmojiWeight instance using the specified properties. + * @function create + * @memberof proto.RecentEmojiWeight + * @static + * @param {proto.IRecentEmojiWeight=} [properties] Properties to set + * @returns {proto.RecentEmojiWeight} RecentEmojiWeight instance + */ + RecentEmojiWeight.create = function create(properties) { + return new RecentEmojiWeight(properties); + }; + + /** + * Encodes the specified RecentEmojiWeight message. Does not implicitly {@link proto.RecentEmojiWeight.verify|verify} messages. + * @function encode + * @memberof proto.RecentEmojiWeight + * @static + * @param {proto.IRecentEmojiWeight} message RecentEmojiWeight message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RecentEmojiWeight.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.emoji != null && Object.hasOwnProperty.call(message, "emoji")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.emoji); + if (message.weight != null && Object.hasOwnProperty.call(message, "weight")) + writer.uint32(/* id 2, wireType 5 =*/21).float(message.weight); + return writer; + }; + + /** + * Encodes the specified RecentEmojiWeight message, length delimited. Does not implicitly {@link proto.RecentEmojiWeight.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.RecentEmojiWeight + * @static + * @param {proto.IRecentEmojiWeight} message RecentEmojiWeight message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RecentEmojiWeight.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RecentEmojiWeight message from the specified reader or buffer. + * @function decode + * @memberof proto.RecentEmojiWeight + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.RecentEmojiWeight} RecentEmojiWeight + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RecentEmojiWeight.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.RecentEmojiWeight(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.emoji = reader.string(); + break; + case 2: + message.weight = reader.float(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RecentEmojiWeight message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.RecentEmojiWeight + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.RecentEmojiWeight} RecentEmojiWeight + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RecentEmojiWeight.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RecentEmojiWeight message. + * @function verify + * @memberof proto.RecentEmojiWeight + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RecentEmojiWeight.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.emoji != null && message.hasOwnProperty("emoji")) + if (!$util.isString(message.emoji)) + return "emoji: string expected"; + if (message.weight != null && message.hasOwnProperty("weight")) + if (typeof message.weight !== "number") + return "weight: number expected"; + return null; + }; + + /** + * Creates a RecentEmojiWeight message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.RecentEmojiWeight + * @static + * @param {Object.} object Plain object + * @returns {proto.RecentEmojiWeight} RecentEmojiWeight + */ + RecentEmojiWeight.fromObject = function fromObject(object) { + if (object instanceof $root.proto.RecentEmojiWeight) + return object; + var message = new $root.proto.RecentEmojiWeight(); + if (object.emoji != null) + message.emoji = String(object.emoji); + if (object.weight != null) + message.weight = Number(object.weight); + return message; + }; + + /** + * Creates a plain object from a RecentEmojiWeight message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.RecentEmojiWeight + * @static + * @param {proto.RecentEmojiWeight} message RecentEmojiWeight + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RecentEmojiWeight.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.emoji = ""; + object.weight = 0; + } + if (message.emoji != null && message.hasOwnProperty("emoji")) + object.emoji = message.emoji; + if (message.weight != null && message.hasOwnProperty("weight")) + object.weight = options.json && !isFinite(message.weight) ? String(message.weight) : message.weight; + return object; + }; + + /** + * Converts this RecentEmojiWeight to JSON. + * @function toJSON + * @memberof proto.RecentEmojiWeight + * @instance + * @returns {Object.} JSON object + */ + RecentEmojiWeight.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RecentEmojiWeight; + })(); + + proto.RecordStructure = (function() { + + /** + * Properties of a RecordStructure. + * @memberof proto + * @interface IRecordStructure + * @property {proto.ISessionStructure|null} [currentSession] RecordStructure currentSession + * @property {Array.|null} [previousSessions] RecordStructure previousSessions + */ + + /** + * Constructs a new RecordStructure. + * @memberof proto + * @classdesc Represents a RecordStructure. + * @implements IRecordStructure + * @constructor + * @param {proto.IRecordStructure=} [properties] Properties to set + */ + function RecordStructure(properties) { + this.previousSessions = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RecordStructure currentSession. + * @member {proto.ISessionStructure|null|undefined} currentSession + * @memberof proto.RecordStructure + * @instance + */ + RecordStructure.prototype.currentSession = null; + + /** + * RecordStructure previousSessions. + * @member {Array.} previousSessions + * @memberof proto.RecordStructure + * @instance + */ + RecordStructure.prototype.previousSessions = $util.emptyArray; + + /** + * Creates a new RecordStructure instance using the specified properties. + * @function create + * @memberof proto.RecordStructure + * @static + * @param {proto.IRecordStructure=} [properties] Properties to set + * @returns {proto.RecordStructure} RecordStructure instance + */ + RecordStructure.create = function create(properties) { + return new RecordStructure(properties); + }; + + /** + * Encodes the specified RecordStructure message. Does not implicitly {@link proto.RecordStructure.verify|verify} messages. + * @function encode + * @memberof proto.RecordStructure + * @static + * @param {proto.IRecordStructure} message RecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RecordStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.currentSession != null && Object.hasOwnProperty.call(message, "currentSession")) + $root.proto.SessionStructure.encode(message.currentSession, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.previousSessions != null && message.previousSessions.length) + for (var i = 0; i < message.previousSessions.length; ++i) + $root.proto.SessionStructure.encode(message.previousSessions[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified RecordStructure message, length delimited. Does not implicitly {@link proto.RecordStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.RecordStructure + * @static + * @param {proto.IRecordStructure} message RecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RecordStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RecordStructure message from the specified reader or buffer. + * @function decode + * @memberof proto.RecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.RecordStructure} RecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RecordStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.RecordStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.currentSession = $root.proto.SessionStructure.decode(reader, reader.uint32()); + break; + case 2: + if (!(message.previousSessions && message.previousSessions.length)) + message.previousSessions = []; + message.previousSessions.push($root.proto.SessionStructure.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RecordStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.RecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.RecordStructure} RecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RecordStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RecordStructure message. + * @function verify + * @memberof proto.RecordStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RecordStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.currentSession != null && message.hasOwnProperty("currentSession")) { + var error = $root.proto.SessionStructure.verify(message.currentSession); + if (error) + return "currentSession." + error; + } + if (message.previousSessions != null && message.hasOwnProperty("previousSessions")) { + if (!Array.isArray(message.previousSessions)) + return "previousSessions: array expected"; + for (var i = 0; i < message.previousSessions.length; ++i) { + var error = $root.proto.SessionStructure.verify(message.previousSessions[i]); + if (error) + return "previousSessions." + error; + } + } + return null; + }; + + /** + * Creates a RecordStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.RecordStructure + * @static + * @param {Object.} object Plain object + * @returns {proto.RecordStructure} RecordStructure + */ + RecordStructure.fromObject = function fromObject(object) { + if (object instanceof $root.proto.RecordStructure) + return object; + var message = new $root.proto.RecordStructure(); + if (object.currentSession != null) { + if (typeof object.currentSession !== "object") + throw TypeError(".proto.RecordStructure.currentSession: object expected"); + message.currentSession = $root.proto.SessionStructure.fromObject(object.currentSession); + } + if (object.previousSessions) { + if (!Array.isArray(object.previousSessions)) + throw TypeError(".proto.RecordStructure.previousSessions: array expected"); + message.previousSessions = []; + for (var i = 0; i < object.previousSessions.length; ++i) { + if (typeof object.previousSessions[i] !== "object") + throw TypeError(".proto.RecordStructure.previousSessions: object expected"); + message.previousSessions[i] = $root.proto.SessionStructure.fromObject(object.previousSessions[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a RecordStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.RecordStructure + * @static + * @param {proto.RecordStructure} message RecordStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RecordStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.previousSessions = []; + if (options.defaults) + object.currentSession = null; + if (message.currentSession != null && message.hasOwnProperty("currentSession")) + object.currentSession = $root.proto.SessionStructure.toObject(message.currentSession, options); + if (message.previousSessions && message.previousSessions.length) { + object.previousSessions = []; + for (var j = 0; j < message.previousSessions.length; ++j) + object.previousSessions[j] = $root.proto.SessionStructure.toObject(message.previousSessions[j], options); + } + return object; + }; + + /** + * Converts this RecordStructure to JSON. + * @function toJSON + * @memberof proto.RecordStructure + * @instance + * @returns {Object.} JSON object + */ + RecordStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RecordStructure; + })(); + + proto.SenderChainKey = (function() { + + /** + * Properties of a SenderChainKey. + * @memberof proto + * @interface ISenderChainKey + * @property {number|null} [iteration] SenderChainKey iteration + * @property {Uint8Array|null} [seed] SenderChainKey seed + */ + + /** + * Constructs a new SenderChainKey. + * @memberof proto + * @classdesc Represents a SenderChainKey. + * @implements ISenderChainKey + * @constructor + * @param {proto.ISenderChainKey=} [properties] Properties to set + */ + function SenderChainKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderChainKey iteration. + * @member {number} iteration + * @memberof proto.SenderChainKey + * @instance + */ + SenderChainKey.prototype.iteration = 0; + + /** + * SenderChainKey seed. + * @member {Uint8Array} seed + * @memberof proto.SenderChainKey + * @instance + */ + SenderChainKey.prototype.seed = $util.newBuffer([]); + + /** + * Creates a new SenderChainKey instance using the specified properties. + * @function create + * @memberof proto.SenderChainKey + * @static + * @param {proto.ISenderChainKey=} [properties] Properties to set + * @returns {proto.SenderChainKey} SenderChainKey instance + */ + SenderChainKey.create = function create(properties) { + return new SenderChainKey(properties); + }; + + /** + * Encodes the specified SenderChainKey message. Does not implicitly {@link proto.SenderChainKey.verify|verify} messages. + * @function encode + * @memberof proto.SenderChainKey + * @static + * @param {proto.ISenderChainKey} message SenderChainKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderChainKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.iteration); + if (message.seed != null && Object.hasOwnProperty.call(message, "seed")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.seed); + return writer; + }; + + /** + * Encodes the specified SenderChainKey message, length delimited. Does not implicitly {@link proto.SenderChainKey.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SenderChainKey + * @static + * @param {proto.ISenderChainKey} message SenderChainKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderChainKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderChainKey message from the specified reader or buffer. + * @function decode + * @memberof proto.SenderChainKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SenderChainKey} SenderChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderChainKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SenderChainKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.iteration = reader.uint32(); + break; + case 2: + message.seed = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderChainKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SenderChainKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SenderChainKey} SenderChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderChainKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderChainKey message. + * @function verify + * @memberof proto.SenderChainKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderChainKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.iteration != null && message.hasOwnProperty("iteration")) + if (!$util.isInteger(message.iteration)) + return "iteration: integer expected"; + if (message.seed != null && message.hasOwnProperty("seed")) + if (!(message.seed && typeof message.seed.length === "number" || $util.isString(message.seed))) + return "seed: buffer expected"; + return null; + }; + + /** + * Creates a SenderChainKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SenderChainKey + * @static + * @param {Object.} object Plain object + * @returns {proto.SenderChainKey} SenderChainKey + */ + SenderChainKey.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SenderChainKey) + return object; + var message = new $root.proto.SenderChainKey(); + if (object.iteration != null) + message.iteration = object.iteration >>> 0; + if (object.seed != null) + if (typeof object.seed === "string") + $util.base64.decode(object.seed, message.seed = $util.newBuffer($util.base64.length(object.seed)), 0); + else if (object.seed.length) + message.seed = object.seed; + return message; + }; + + /** + * Creates a plain object from a SenderChainKey message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SenderChainKey + * @static + * @param {proto.SenderChainKey} message SenderChainKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderChainKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.iteration = 0; + if (options.bytes === String) + object.seed = ""; + else { + object.seed = []; + if (options.bytes !== Array) + object.seed = $util.newBuffer(object.seed); + } + } + if (message.iteration != null && message.hasOwnProperty("iteration")) + object.iteration = message.iteration; + if (message.seed != null && message.hasOwnProperty("seed")) + object.seed = options.bytes === String ? $util.base64.encode(message.seed, 0, message.seed.length) : options.bytes === Array ? Array.prototype.slice.call(message.seed) : message.seed; + return object; + }; + + /** + * Converts this SenderChainKey to JSON. + * @function toJSON + * @memberof proto.SenderChainKey + * @instance + * @returns {Object.} JSON object + */ + SenderChainKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderChainKey; + })(); + + proto.SenderKeyRecordStructure = (function() { + + /** + * Properties of a SenderKeyRecordStructure. + * @memberof proto + * @interface ISenderKeyRecordStructure + * @property {Array.|null} [senderKeyStates] SenderKeyRecordStructure senderKeyStates + */ + + /** + * Constructs a new SenderKeyRecordStructure. + * @memberof proto + * @classdesc Represents a SenderKeyRecordStructure. + * @implements ISenderKeyRecordStructure + * @constructor + * @param {proto.ISenderKeyRecordStructure=} [properties] Properties to set + */ + function SenderKeyRecordStructure(properties) { + this.senderKeyStates = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderKeyRecordStructure senderKeyStates. + * @member {Array.} senderKeyStates + * @memberof proto.SenderKeyRecordStructure + * @instance + */ + SenderKeyRecordStructure.prototype.senderKeyStates = $util.emptyArray; + + /** + * Creates a new SenderKeyRecordStructure instance using the specified properties. + * @function create + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {proto.ISenderKeyRecordStructure=} [properties] Properties to set + * @returns {proto.SenderKeyRecordStructure} SenderKeyRecordStructure instance + */ + SenderKeyRecordStructure.create = function create(properties) { + return new SenderKeyRecordStructure(properties); + }; + + /** + * Encodes the specified SenderKeyRecordStructure message. Does not implicitly {@link proto.SenderKeyRecordStructure.verify|verify} messages. + * @function encode + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {proto.ISenderKeyRecordStructure} message SenderKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyRecordStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.senderKeyStates != null && message.senderKeyStates.length) + for (var i = 0; i < message.senderKeyStates.length; ++i) + $root.proto.SenderKeyStateStructure.encode(message.senderKeyStates[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SenderKeyRecordStructure message, length delimited. Does not implicitly {@link proto.SenderKeyRecordStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {proto.ISenderKeyRecordStructure} message SenderKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyRecordStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderKeyRecordStructure message from the specified reader or buffer. + * @function decode + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SenderKeyRecordStructure} SenderKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyRecordStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SenderKeyRecordStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.senderKeyStates && message.senderKeyStates.length)) + message.senderKeyStates = []; + message.senderKeyStates.push($root.proto.SenderKeyStateStructure.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderKeyRecordStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SenderKeyRecordStructure} SenderKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyRecordStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderKeyRecordStructure message. + * @function verify + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderKeyRecordStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.senderKeyStates != null && message.hasOwnProperty("senderKeyStates")) { + if (!Array.isArray(message.senderKeyStates)) + return "senderKeyStates: array expected"; + for (var i = 0; i < message.senderKeyStates.length; ++i) { + var error = $root.proto.SenderKeyStateStructure.verify(message.senderKeyStates[i]); + if (error) + return "senderKeyStates." + error; + } + } + return null; + }; + + /** + * Creates a SenderKeyRecordStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {Object.} object Plain object + * @returns {proto.SenderKeyRecordStructure} SenderKeyRecordStructure + */ + SenderKeyRecordStructure.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SenderKeyRecordStructure) + return object; + var message = new $root.proto.SenderKeyRecordStructure(); + if (object.senderKeyStates) { + if (!Array.isArray(object.senderKeyStates)) + throw TypeError(".proto.SenderKeyRecordStructure.senderKeyStates: array expected"); + message.senderKeyStates = []; + for (var i = 0; i < object.senderKeyStates.length; ++i) { + if (typeof object.senderKeyStates[i] !== "object") + throw TypeError(".proto.SenderKeyRecordStructure.senderKeyStates: object expected"); + message.senderKeyStates[i] = $root.proto.SenderKeyStateStructure.fromObject(object.senderKeyStates[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a SenderKeyRecordStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SenderKeyRecordStructure + * @static + * @param {proto.SenderKeyRecordStructure} message SenderKeyRecordStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderKeyRecordStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.senderKeyStates = []; + if (message.senderKeyStates && message.senderKeyStates.length) { + object.senderKeyStates = []; + for (var j = 0; j < message.senderKeyStates.length; ++j) + object.senderKeyStates[j] = $root.proto.SenderKeyStateStructure.toObject(message.senderKeyStates[j], options); + } + return object; + }; + + /** + * Converts this SenderKeyRecordStructure to JSON. + * @function toJSON + * @memberof proto.SenderKeyRecordStructure + * @instance + * @returns {Object.} JSON object + */ + SenderKeyRecordStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderKeyRecordStructure; + })(); + + proto.SenderKeyStateStructure = (function() { + + /** + * Properties of a SenderKeyStateStructure. + * @memberof proto + * @interface ISenderKeyStateStructure + * @property {number|null} [senderKeyId] SenderKeyStateStructure senderKeyId + * @property {proto.ISenderChainKey|null} [senderChainKey] SenderKeyStateStructure senderChainKey + * @property {proto.ISenderSigningKey|null} [senderSigningKey] SenderKeyStateStructure senderSigningKey + * @property {Array.|null} [senderMessageKeys] SenderKeyStateStructure senderMessageKeys + */ + + /** + * Constructs a new SenderKeyStateStructure. + * @memberof proto + * @classdesc Represents a SenderKeyStateStructure. + * @implements ISenderKeyStateStructure + * @constructor + * @param {proto.ISenderKeyStateStructure=} [properties] Properties to set + */ + function SenderKeyStateStructure(properties) { + this.senderMessageKeys = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderKeyStateStructure senderKeyId. + * @member {number} senderKeyId + * @memberof proto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderKeyId = 0; + + /** + * SenderKeyStateStructure senderChainKey. + * @member {proto.ISenderChainKey|null|undefined} senderChainKey + * @memberof proto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderChainKey = null; + + /** + * SenderKeyStateStructure senderSigningKey. + * @member {proto.ISenderSigningKey|null|undefined} senderSigningKey + * @memberof proto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderSigningKey = null; + + /** + * SenderKeyStateStructure senderMessageKeys. + * @member {Array.} senderMessageKeys + * @memberof proto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderMessageKeys = $util.emptyArray; + + /** + * Creates a new SenderKeyStateStructure instance using the specified properties. + * @function create + * @memberof proto.SenderKeyStateStructure + * @static + * @param {proto.ISenderKeyStateStructure=} [properties] Properties to set + * @returns {proto.SenderKeyStateStructure} SenderKeyStateStructure instance + */ + SenderKeyStateStructure.create = function create(properties) { + return new SenderKeyStateStructure(properties); + }; + + /** + * Encodes the specified SenderKeyStateStructure message. Does not implicitly {@link proto.SenderKeyStateStructure.verify|verify} messages. + * @function encode + * @memberof proto.SenderKeyStateStructure + * @static + * @param {proto.ISenderKeyStateStructure} message SenderKeyStateStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyStateStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.senderKeyId != null && Object.hasOwnProperty.call(message, "senderKeyId")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.senderKeyId); + if (message.senderChainKey != null && Object.hasOwnProperty.call(message, "senderChainKey")) + $root.proto.SenderChainKey.encode(message.senderChainKey, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.senderSigningKey != null && Object.hasOwnProperty.call(message, "senderSigningKey")) + $root.proto.SenderSigningKey.encode(message.senderSigningKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.senderMessageKeys != null && message.senderMessageKeys.length) + for (var i = 0; i < message.senderMessageKeys.length; ++i) + $root.proto.SenderMessageKey.encode(message.senderMessageKeys[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SenderKeyStateStructure message, length delimited. Does not implicitly {@link proto.SenderKeyStateStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SenderKeyStateStructure + * @static + * @param {proto.ISenderKeyStateStructure} message SenderKeyStateStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyStateStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderKeyStateStructure message from the specified reader or buffer. + * @function decode + * @memberof proto.SenderKeyStateStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SenderKeyStateStructure} SenderKeyStateStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyStateStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SenderKeyStateStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.senderKeyId = reader.uint32(); + break; + case 2: + message.senderChainKey = $root.proto.SenderChainKey.decode(reader, reader.uint32()); + break; + case 3: + message.senderSigningKey = $root.proto.SenderSigningKey.decode(reader, reader.uint32()); + break; + case 4: + if (!(message.senderMessageKeys && message.senderMessageKeys.length)) + message.senderMessageKeys = []; + message.senderMessageKeys.push($root.proto.SenderMessageKey.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderKeyStateStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SenderKeyStateStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SenderKeyStateStructure} SenderKeyStateStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyStateStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderKeyStateStructure message. + * @function verify + * @memberof proto.SenderKeyStateStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderKeyStateStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.senderKeyId != null && message.hasOwnProperty("senderKeyId")) + if (!$util.isInteger(message.senderKeyId)) + return "senderKeyId: integer expected"; + if (message.senderChainKey != null && message.hasOwnProperty("senderChainKey")) { + var error = $root.proto.SenderChainKey.verify(message.senderChainKey); + if (error) + return "senderChainKey." + error; + } + if (message.senderSigningKey != null && message.hasOwnProperty("senderSigningKey")) { + var error = $root.proto.SenderSigningKey.verify(message.senderSigningKey); + if (error) + return "senderSigningKey." + error; + } + if (message.senderMessageKeys != null && message.hasOwnProperty("senderMessageKeys")) { + if (!Array.isArray(message.senderMessageKeys)) + return "senderMessageKeys: array expected"; + for (var i = 0; i < message.senderMessageKeys.length; ++i) { + var error = $root.proto.SenderMessageKey.verify(message.senderMessageKeys[i]); + if (error) + return "senderMessageKeys." + error; + } + } + return null; + }; + + /** + * Creates a SenderKeyStateStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SenderKeyStateStructure + * @static + * @param {Object.} object Plain object + * @returns {proto.SenderKeyStateStructure} SenderKeyStateStructure + */ + SenderKeyStateStructure.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SenderKeyStateStructure) + return object; + var message = new $root.proto.SenderKeyStateStructure(); + if (object.senderKeyId != null) + message.senderKeyId = object.senderKeyId >>> 0; + if (object.senderChainKey != null) { + if (typeof object.senderChainKey !== "object") + throw TypeError(".proto.SenderKeyStateStructure.senderChainKey: object expected"); + message.senderChainKey = $root.proto.SenderChainKey.fromObject(object.senderChainKey); + } + if (object.senderSigningKey != null) { + if (typeof object.senderSigningKey !== "object") + throw TypeError(".proto.SenderKeyStateStructure.senderSigningKey: object expected"); + message.senderSigningKey = $root.proto.SenderSigningKey.fromObject(object.senderSigningKey); + } + if (object.senderMessageKeys) { + if (!Array.isArray(object.senderMessageKeys)) + throw TypeError(".proto.SenderKeyStateStructure.senderMessageKeys: array expected"); + message.senderMessageKeys = []; + for (var i = 0; i < object.senderMessageKeys.length; ++i) { + if (typeof object.senderMessageKeys[i] !== "object") + throw TypeError(".proto.SenderKeyStateStructure.senderMessageKeys: object expected"); + message.senderMessageKeys[i] = $root.proto.SenderMessageKey.fromObject(object.senderMessageKeys[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a SenderKeyStateStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SenderKeyStateStructure + * @static + * @param {proto.SenderKeyStateStructure} message SenderKeyStateStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderKeyStateStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.senderMessageKeys = []; + if (options.defaults) { + object.senderKeyId = 0; + object.senderChainKey = null; + object.senderSigningKey = null; + } + if (message.senderKeyId != null && message.hasOwnProperty("senderKeyId")) + object.senderKeyId = message.senderKeyId; + if (message.senderChainKey != null && message.hasOwnProperty("senderChainKey")) + object.senderChainKey = $root.proto.SenderChainKey.toObject(message.senderChainKey, options); + if (message.senderSigningKey != null && message.hasOwnProperty("senderSigningKey")) + object.senderSigningKey = $root.proto.SenderSigningKey.toObject(message.senderSigningKey, options); + if (message.senderMessageKeys && message.senderMessageKeys.length) { + object.senderMessageKeys = []; + for (var j = 0; j < message.senderMessageKeys.length; ++j) + object.senderMessageKeys[j] = $root.proto.SenderMessageKey.toObject(message.senderMessageKeys[j], options); + } + return object; + }; + + /** + * Converts this SenderKeyStateStructure to JSON. + * @function toJSON + * @memberof proto.SenderKeyStateStructure + * @instance + * @returns {Object.} JSON object + */ + SenderKeyStateStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderKeyStateStructure; + })(); + + proto.SenderMessageKey = (function() { + + /** + * Properties of a SenderMessageKey. + * @memberof proto + * @interface ISenderMessageKey + * @property {number|null} [iteration] SenderMessageKey iteration + * @property {Uint8Array|null} [seed] SenderMessageKey seed + */ + + /** + * Constructs a new SenderMessageKey. + * @memberof proto + * @classdesc Represents a SenderMessageKey. + * @implements ISenderMessageKey + * @constructor + * @param {proto.ISenderMessageKey=} [properties] Properties to set + */ + function SenderMessageKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderMessageKey iteration. + * @member {number} iteration + * @memberof proto.SenderMessageKey + * @instance + */ + SenderMessageKey.prototype.iteration = 0; + + /** + * SenderMessageKey seed. + * @member {Uint8Array} seed + * @memberof proto.SenderMessageKey + * @instance + */ + SenderMessageKey.prototype.seed = $util.newBuffer([]); + + /** + * Creates a new SenderMessageKey instance using the specified properties. + * @function create + * @memberof proto.SenderMessageKey + * @static + * @param {proto.ISenderMessageKey=} [properties] Properties to set + * @returns {proto.SenderMessageKey} SenderMessageKey instance + */ + SenderMessageKey.create = function create(properties) { + return new SenderMessageKey(properties); + }; + + /** + * Encodes the specified SenderMessageKey message. Does not implicitly {@link proto.SenderMessageKey.verify|verify} messages. + * @function encode + * @memberof proto.SenderMessageKey + * @static + * @param {proto.ISenderMessageKey} message SenderMessageKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderMessageKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.iteration); + if (message.seed != null && Object.hasOwnProperty.call(message, "seed")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.seed); + return writer; + }; + + /** + * Encodes the specified SenderMessageKey message, length delimited. Does not implicitly {@link proto.SenderMessageKey.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SenderMessageKey + * @static + * @param {proto.ISenderMessageKey} message SenderMessageKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderMessageKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderMessageKey message from the specified reader or buffer. + * @function decode + * @memberof proto.SenderMessageKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SenderMessageKey} SenderMessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderMessageKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SenderMessageKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.iteration = reader.uint32(); + break; + case 2: + message.seed = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderMessageKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SenderMessageKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SenderMessageKey} SenderMessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderMessageKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderMessageKey message. + * @function verify + * @memberof proto.SenderMessageKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderMessageKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.iteration != null && message.hasOwnProperty("iteration")) + if (!$util.isInteger(message.iteration)) + return "iteration: integer expected"; + if (message.seed != null && message.hasOwnProperty("seed")) + if (!(message.seed && typeof message.seed.length === "number" || $util.isString(message.seed))) + return "seed: buffer expected"; + return null; + }; + + /** + * Creates a SenderMessageKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SenderMessageKey + * @static + * @param {Object.} object Plain object + * @returns {proto.SenderMessageKey} SenderMessageKey + */ + SenderMessageKey.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SenderMessageKey) + return object; + var message = new $root.proto.SenderMessageKey(); + if (object.iteration != null) + message.iteration = object.iteration >>> 0; + if (object.seed != null) + if (typeof object.seed === "string") + $util.base64.decode(object.seed, message.seed = $util.newBuffer($util.base64.length(object.seed)), 0); + else if (object.seed.length) + message.seed = object.seed; + return message; + }; + + /** + * Creates a plain object from a SenderMessageKey message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SenderMessageKey + * @static + * @param {proto.SenderMessageKey} message SenderMessageKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderMessageKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.iteration = 0; + if (options.bytes === String) + object.seed = ""; + else { + object.seed = []; + if (options.bytes !== Array) + object.seed = $util.newBuffer(object.seed); + } + } + if (message.iteration != null && message.hasOwnProperty("iteration")) + object.iteration = message.iteration; + if (message.seed != null && message.hasOwnProperty("seed")) + object.seed = options.bytes === String ? $util.base64.encode(message.seed, 0, message.seed.length) : options.bytes === Array ? Array.prototype.slice.call(message.seed) : message.seed; + return object; + }; + + /** + * Converts this SenderMessageKey to JSON. + * @function toJSON + * @memberof proto.SenderMessageKey + * @instance + * @returns {Object.} JSON object + */ + SenderMessageKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderMessageKey; + })(); + + proto.SenderSigningKey = (function() { + + /** + * Properties of a SenderSigningKey. + * @memberof proto + * @interface ISenderSigningKey + * @property {Uint8Array|null} ["public"] SenderSigningKey public + * @property {Uint8Array|null} ["private"] SenderSigningKey private + */ + + /** + * Constructs a new SenderSigningKey. + * @memberof proto + * @classdesc Represents a SenderSigningKey. + * @implements ISenderSigningKey + * @constructor + * @param {proto.ISenderSigningKey=} [properties] Properties to set + */ + function SenderSigningKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderSigningKey public. + * @member {Uint8Array} public + * @memberof proto.SenderSigningKey + * @instance + */ + SenderSigningKey.prototype["public"] = $util.newBuffer([]); + + /** + * SenderSigningKey private. + * @member {Uint8Array} private + * @memberof proto.SenderSigningKey + * @instance + */ + SenderSigningKey.prototype["private"] = $util.newBuffer([]); + + /** + * Creates a new SenderSigningKey instance using the specified properties. + * @function create + * @memberof proto.SenderSigningKey + * @static + * @param {proto.ISenderSigningKey=} [properties] Properties to set + * @returns {proto.SenderSigningKey} SenderSigningKey instance + */ + SenderSigningKey.create = function create(properties) { + return new SenderSigningKey(properties); + }; + + /** + * Encodes the specified SenderSigningKey message. Does not implicitly {@link proto.SenderSigningKey.verify|verify} messages. + * @function encode + * @memberof proto.SenderSigningKey + * @static + * @param {proto.ISenderSigningKey} message SenderSigningKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderSigningKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message["public"] != null && Object.hasOwnProperty.call(message, "public")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message["public"]); + if (message["private"] != null && Object.hasOwnProperty.call(message, "private")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message["private"]); + return writer; + }; + + /** + * Encodes the specified SenderSigningKey message, length delimited. Does not implicitly {@link proto.SenderSigningKey.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SenderSigningKey + * @static + * @param {proto.ISenderSigningKey} message SenderSigningKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderSigningKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderSigningKey message from the specified reader or buffer. + * @function decode + * @memberof proto.SenderSigningKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SenderSigningKey} SenderSigningKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderSigningKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SenderSigningKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message["public"] = reader.bytes(); + break; + case 2: + message["private"] = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderSigningKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SenderSigningKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SenderSigningKey} SenderSigningKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderSigningKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderSigningKey message. + * @function verify + * @memberof proto.SenderSigningKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderSigningKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message["public"] != null && message.hasOwnProperty("public")) + if (!(message["public"] && typeof message["public"].length === "number" || $util.isString(message["public"]))) + return "public: buffer expected"; + if (message["private"] != null && message.hasOwnProperty("private")) + if (!(message["private"] && typeof message["private"].length === "number" || $util.isString(message["private"]))) + return "private: buffer expected"; + return null; + }; + + /** + * Creates a SenderSigningKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SenderSigningKey + * @static + * @param {Object.} object Plain object + * @returns {proto.SenderSigningKey} SenderSigningKey + */ + SenderSigningKey.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SenderSigningKey) + return object; + var message = new $root.proto.SenderSigningKey(); + if (object["public"] != null) + if (typeof object["public"] === "string") + $util.base64.decode(object["public"], message["public"] = $util.newBuffer($util.base64.length(object["public"])), 0); + else if (object["public"].length) + message["public"] = object["public"]; + if (object["private"] != null) + if (typeof object["private"] === "string") + $util.base64.decode(object["private"], message["private"] = $util.newBuffer($util.base64.length(object["private"])), 0); + else if (object["private"].length) + message["private"] = object["private"]; + return message; + }; + + /** + * Creates a plain object from a SenderSigningKey message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SenderSigningKey + * @static + * @param {proto.SenderSigningKey} message SenderSigningKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderSigningKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object["public"] = ""; + else { + object["public"] = []; + if (options.bytes !== Array) + object["public"] = $util.newBuffer(object["public"]); + } + if (options.bytes === String) + object["private"] = ""; + else { + object["private"] = []; + if (options.bytes !== Array) + object["private"] = $util.newBuffer(object["private"]); + } + } + if (message["public"] != null && message.hasOwnProperty("public")) + object["public"] = options.bytes === String ? $util.base64.encode(message["public"], 0, message["public"].length) : options.bytes === Array ? Array.prototype.slice.call(message["public"]) : message["public"]; + if (message["private"] != null && message.hasOwnProperty("private")) + object["private"] = options.bytes === String ? $util.base64.encode(message["private"], 0, message["private"].length) : options.bytes === Array ? Array.prototype.slice.call(message["private"]) : message["private"]; + return object; + }; + + /** + * Converts this SenderSigningKey to JSON. + * @function toJSON + * @memberof proto.SenderSigningKey + * @instance + * @returns {Object.} JSON object + */ + SenderSigningKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderSigningKey; + })(); + + proto.ServerErrorReceipt = (function() { + + /** + * Properties of a ServerErrorReceipt. + * @memberof proto + * @interface IServerErrorReceipt + * @property {string|null} [stanzaId] ServerErrorReceipt stanzaId + */ + + /** + * Constructs a new ServerErrorReceipt. + * @memberof proto + * @classdesc Represents a ServerErrorReceipt. + * @implements IServerErrorReceipt + * @constructor + * @param {proto.IServerErrorReceipt=} [properties] Properties to set + */ + function ServerErrorReceipt(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ServerErrorReceipt stanzaId. + * @member {string} stanzaId + * @memberof proto.ServerErrorReceipt + * @instance + */ + ServerErrorReceipt.prototype.stanzaId = ""; + + /** + * Creates a new ServerErrorReceipt instance using the specified properties. + * @function create + * @memberof proto.ServerErrorReceipt + * @static + * @param {proto.IServerErrorReceipt=} [properties] Properties to set + * @returns {proto.ServerErrorReceipt} ServerErrorReceipt instance + */ + ServerErrorReceipt.create = function create(properties) { + return new ServerErrorReceipt(properties); + }; + + /** + * Encodes the specified ServerErrorReceipt message. Does not implicitly {@link proto.ServerErrorReceipt.verify|verify} messages. + * @function encode + * @memberof proto.ServerErrorReceipt + * @static + * @param {proto.IServerErrorReceipt} message ServerErrorReceipt message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ServerErrorReceipt.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.stanzaId != null && Object.hasOwnProperty.call(message, "stanzaId")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.stanzaId); + return writer; + }; + + /** + * Encodes the specified ServerErrorReceipt message, length delimited. Does not implicitly {@link proto.ServerErrorReceipt.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.ServerErrorReceipt + * @static + * @param {proto.IServerErrorReceipt} message ServerErrorReceipt message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ServerErrorReceipt.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ServerErrorReceipt message from the specified reader or buffer. + * @function decode + * @memberof proto.ServerErrorReceipt + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.ServerErrorReceipt} ServerErrorReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ServerErrorReceipt.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.ServerErrorReceipt(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.stanzaId = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ServerErrorReceipt message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.ServerErrorReceipt + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.ServerErrorReceipt} ServerErrorReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ServerErrorReceipt.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ServerErrorReceipt message. + * @function verify + * @memberof proto.ServerErrorReceipt + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ServerErrorReceipt.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + if (!$util.isString(message.stanzaId)) + return "stanzaId: string expected"; + return null; + }; + + /** + * Creates a ServerErrorReceipt message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.ServerErrorReceipt + * @static + * @param {Object.} object Plain object + * @returns {proto.ServerErrorReceipt} ServerErrorReceipt + */ + ServerErrorReceipt.fromObject = function fromObject(object) { + if (object instanceof $root.proto.ServerErrorReceipt) + return object; + var message = new $root.proto.ServerErrorReceipt(); + if (object.stanzaId != null) + message.stanzaId = String(object.stanzaId); + return message; + }; + + /** + * Creates a plain object from a ServerErrorReceipt message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.ServerErrorReceipt + * @static + * @param {proto.ServerErrorReceipt} message ServerErrorReceipt + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ServerErrorReceipt.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.stanzaId = ""; + if (message.stanzaId != null && message.hasOwnProperty("stanzaId")) + object.stanzaId = message.stanzaId; + return object; + }; + + /** + * Converts this ServerErrorReceipt to JSON. + * @function toJSON + * @memberof proto.ServerErrorReceipt + * @instance + * @returns {Object.} JSON object + */ + ServerErrorReceipt.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ServerErrorReceipt; + })(); + + proto.SessionStructure = (function() { + + /** + * Properties of a SessionStructure. + * @memberof proto + * @interface ISessionStructure + * @property {number|null} [sessionVersion] SessionStructure sessionVersion + * @property {Uint8Array|null} [localIdentityPublic] SessionStructure localIdentityPublic + * @property {Uint8Array|null} [remoteIdentityPublic] SessionStructure remoteIdentityPublic + * @property {Uint8Array|null} [rootKey] SessionStructure rootKey + * @property {number|null} [previousCounter] SessionStructure previousCounter + * @property {proto.IChain|null} [senderChain] SessionStructure senderChain + * @property {Array.|null} [receiverChains] SessionStructure receiverChains + * @property {proto.IPendingKeyExchange|null} [pendingKeyExchange] SessionStructure pendingKeyExchange + * @property {proto.IPendingPreKey|null} [pendingPreKey] SessionStructure pendingPreKey + * @property {number|null} [remoteRegistrationId] SessionStructure remoteRegistrationId + * @property {number|null} [localRegistrationId] SessionStructure localRegistrationId + * @property {boolean|null} [needsRefresh] SessionStructure needsRefresh + * @property {Uint8Array|null} [aliceBaseKey] SessionStructure aliceBaseKey + */ + + /** + * Constructs a new SessionStructure. + * @memberof proto + * @classdesc Represents a SessionStructure. + * @implements ISessionStructure + * @constructor + * @param {proto.ISessionStructure=} [properties] Properties to set + */ + function SessionStructure(properties) { + this.receiverChains = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SessionStructure sessionVersion. + * @member {number} sessionVersion + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.sessionVersion = 0; + + /** + * SessionStructure localIdentityPublic. + * @member {Uint8Array} localIdentityPublic + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.localIdentityPublic = $util.newBuffer([]); + + /** + * SessionStructure remoteIdentityPublic. + * @member {Uint8Array} remoteIdentityPublic + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.remoteIdentityPublic = $util.newBuffer([]); + + /** + * SessionStructure rootKey. + * @member {Uint8Array} rootKey + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.rootKey = $util.newBuffer([]); + + /** + * SessionStructure previousCounter. + * @member {number} previousCounter + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.previousCounter = 0; + + /** + * SessionStructure senderChain. + * @member {proto.IChain|null|undefined} senderChain + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.senderChain = null; + + /** + * SessionStructure receiverChains. + * @member {Array.} receiverChains + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.receiverChains = $util.emptyArray; + + /** + * SessionStructure pendingKeyExchange. + * @member {proto.IPendingKeyExchange|null|undefined} pendingKeyExchange + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.pendingKeyExchange = null; + + /** + * SessionStructure pendingPreKey. + * @member {proto.IPendingPreKey|null|undefined} pendingPreKey + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.pendingPreKey = null; + + /** + * SessionStructure remoteRegistrationId. + * @member {number} remoteRegistrationId + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.remoteRegistrationId = 0; + + /** + * SessionStructure localRegistrationId. + * @member {number} localRegistrationId + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.localRegistrationId = 0; + + /** + * SessionStructure needsRefresh. + * @member {boolean} needsRefresh + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.needsRefresh = false; + + /** + * SessionStructure aliceBaseKey. + * @member {Uint8Array} aliceBaseKey + * @memberof proto.SessionStructure + * @instance + */ + SessionStructure.prototype.aliceBaseKey = $util.newBuffer([]); + + /** + * Creates a new SessionStructure instance using the specified properties. + * @function create + * @memberof proto.SessionStructure + * @static + * @param {proto.ISessionStructure=} [properties] Properties to set + * @returns {proto.SessionStructure} SessionStructure instance + */ + SessionStructure.create = function create(properties) { + return new SessionStructure(properties); + }; + + /** + * Encodes the specified SessionStructure message. Does not implicitly {@link proto.SessionStructure.verify|verify} messages. + * @function encode + * @memberof proto.SessionStructure + * @static + * @param {proto.ISessionStructure} message SessionStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SessionStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.sessionVersion != null && Object.hasOwnProperty.call(message, "sessionVersion")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.sessionVersion); + if (message.localIdentityPublic != null && Object.hasOwnProperty.call(message, "localIdentityPublic")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.localIdentityPublic); + if (message.remoteIdentityPublic != null && Object.hasOwnProperty.call(message, "remoteIdentityPublic")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.remoteIdentityPublic); + if (message.rootKey != null && Object.hasOwnProperty.call(message, "rootKey")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.rootKey); + if (message.previousCounter != null && Object.hasOwnProperty.call(message, "previousCounter")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.previousCounter); + if (message.senderChain != null && Object.hasOwnProperty.call(message, "senderChain")) + $root.proto.Chain.encode(message.senderChain, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.receiverChains != null && message.receiverChains.length) + for (var i = 0; i < message.receiverChains.length; ++i) + $root.proto.Chain.encode(message.receiverChains[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.pendingKeyExchange != null && Object.hasOwnProperty.call(message, "pendingKeyExchange")) + $root.proto.PendingKeyExchange.encode(message.pendingKeyExchange, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.pendingPreKey != null && Object.hasOwnProperty.call(message, "pendingPreKey")) + $root.proto.PendingPreKey.encode(message.pendingPreKey, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim(); + if (message.remoteRegistrationId != null && Object.hasOwnProperty.call(message, "remoteRegistrationId")) + writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.remoteRegistrationId); + if (message.localRegistrationId != null && Object.hasOwnProperty.call(message, "localRegistrationId")) + writer.uint32(/* id 11, wireType 0 =*/88).uint32(message.localRegistrationId); + if (message.needsRefresh != null && Object.hasOwnProperty.call(message, "needsRefresh")) + writer.uint32(/* id 12, wireType 0 =*/96).bool(message.needsRefresh); + if (message.aliceBaseKey != null && Object.hasOwnProperty.call(message, "aliceBaseKey")) + writer.uint32(/* id 13, wireType 2 =*/106).bytes(message.aliceBaseKey); + return writer; + }; + + /** + * Encodes the specified SessionStructure message, length delimited. Does not implicitly {@link proto.SessionStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SessionStructure + * @static + * @param {proto.ISessionStructure} message SessionStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SessionStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SessionStructure message from the specified reader or buffer. + * @function decode + * @memberof proto.SessionStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SessionStructure} SessionStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SessionStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SessionStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.sessionVersion = reader.uint32(); + break; + case 2: + message.localIdentityPublic = reader.bytes(); + break; + case 3: + message.remoteIdentityPublic = reader.bytes(); + break; + case 4: + message.rootKey = reader.bytes(); + break; + case 5: + message.previousCounter = reader.uint32(); + break; + case 6: + message.senderChain = $root.proto.Chain.decode(reader, reader.uint32()); + break; + case 7: + if (!(message.receiverChains && message.receiverChains.length)) + message.receiverChains = []; + message.receiverChains.push($root.proto.Chain.decode(reader, reader.uint32())); + break; + case 8: + message.pendingKeyExchange = $root.proto.PendingKeyExchange.decode(reader, reader.uint32()); + break; + case 9: + message.pendingPreKey = $root.proto.PendingPreKey.decode(reader, reader.uint32()); + break; + case 10: + message.remoteRegistrationId = reader.uint32(); + break; + case 11: + message.localRegistrationId = reader.uint32(); + break; + case 12: + message.needsRefresh = reader.bool(); + break; + case 13: + message.aliceBaseKey = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SessionStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SessionStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SessionStructure} SessionStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SessionStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SessionStructure message. + * @function verify + * @memberof proto.SessionStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SessionStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.sessionVersion != null && message.hasOwnProperty("sessionVersion")) + if (!$util.isInteger(message.sessionVersion)) + return "sessionVersion: integer expected"; + if (message.localIdentityPublic != null && message.hasOwnProperty("localIdentityPublic")) + if (!(message.localIdentityPublic && typeof message.localIdentityPublic.length === "number" || $util.isString(message.localIdentityPublic))) + return "localIdentityPublic: buffer expected"; + if (message.remoteIdentityPublic != null && message.hasOwnProperty("remoteIdentityPublic")) + if (!(message.remoteIdentityPublic && typeof message.remoteIdentityPublic.length === "number" || $util.isString(message.remoteIdentityPublic))) + return "remoteIdentityPublic: buffer expected"; + if (message.rootKey != null && message.hasOwnProperty("rootKey")) + if (!(message.rootKey && typeof message.rootKey.length === "number" || $util.isString(message.rootKey))) + return "rootKey: buffer expected"; + if (message.previousCounter != null && message.hasOwnProperty("previousCounter")) + if (!$util.isInteger(message.previousCounter)) + return "previousCounter: integer expected"; + if (message.senderChain != null && message.hasOwnProperty("senderChain")) { + var error = $root.proto.Chain.verify(message.senderChain); + if (error) + return "senderChain." + error; + } + if (message.receiverChains != null && message.hasOwnProperty("receiverChains")) { + if (!Array.isArray(message.receiverChains)) + return "receiverChains: array expected"; + for (var i = 0; i < message.receiverChains.length; ++i) { + var error = $root.proto.Chain.verify(message.receiverChains[i]); + if (error) + return "receiverChains." + error; + } + } + if (message.pendingKeyExchange != null && message.hasOwnProperty("pendingKeyExchange")) { + var error = $root.proto.PendingKeyExchange.verify(message.pendingKeyExchange); + if (error) + return "pendingKeyExchange." + error; + } + if (message.pendingPreKey != null && message.hasOwnProperty("pendingPreKey")) { + var error = $root.proto.PendingPreKey.verify(message.pendingPreKey); + if (error) + return "pendingPreKey." + error; + } + if (message.remoteRegistrationId != null && message.hasOwnProperty("remoteRegistrationId")) + if (!$util.isInteger(message.remoteRegistrationId)) + return "remoteRegistrationId: integer expected"; + if (message.localRegistrationId != null && message.hasOwnProperty("localRegistrationId")) + if (!$util.isInteger(message.localRegistrationId)) + return "localRegistrationId: integer expected"; + if (message.needsRefresh != null && message.hasOwnProperty("needsRefresh")) + if (typeof message.needsRefresh !== "boolean") + return "needsRefresh: boolean expected"; + if (message.aliceBaseKey != null && message.hasOwnProperty("aliceBaseKey")) + if (!(message.aliceBaseKey && typeof message.aliceBaseKey.length === "number" || $util.isString(message.aliceBaseKey))) + return "aliceBaseKey: buffer expected"; + return null; + }; + + /** + * Creates a SessionStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SessionStructure + * @static + * @param {Object.} object Plain object + * @returns {proto.SessionStructure} SessionStructure + */ + SessionStructure.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SessionStructure) + return object; + var message = new $root.proto.SessionStructure(); + if (object.sessionVersion != null) + message.sessionVersion = object.sessionVersion >>> 0; + if (object.localIdentityPublic != null) + if (typeof object.localIdentityPublic === "string") + $util.base64.decode(object.localIdentityPublic, message.localIdentityPublic = $util.newBuffer($util.base64.length(object.localIdentityPublic)), 0); + else if (object.localIdentityPublic.length) + message.localIdentityPublic = object.localIdentityPublic; + if (object.remoteIdentityPublic != null) + if (typeof object.remoteIdentityPublic === "string") + $util.base64.decode(object.remoteIdentityPublic, message.remoteIdentityPublic = $util.newBuffer($util.base64.length(object.remoteIdentityPublic)), 0); + else if (object.remoteIdentityPublic.length) + message.remoteIdentityPublic = object.remoteIdentityPublic; + if (object.rootKey != null) + if (typeof object.rootKey === "string") + $util.base64.decode(object.rootKey, message.rootKey = $util.newBuffer($util.base64.length(object.rootKey)), 0); + else if (object.rootKey.length) + message.rootKey = object.rootKey; + if (object.previousCounter != null) + message.previousCounter = object.previousCounter >>> 0; + if (object.senderChain != null) { + if (typeof object.senderChain !== "object") + throw TypeError(".proto.SessionStructure.senderChain: object expected"); + message.senderChain = $root.proto.Chain.fromObject(object.senderChain); + } + if (object.receiverChains) { + if (!Array.isArray(object.receiverChains)) + throw TypeError(".proto.SessionStructure.receiverChains: array expected"); + message.receiverChains = []; + for (var i = 0; i < object.receiverChains.length; ++i) { + if (typeof object.receiverChains[i] !== "object") + throw TypeError(".proto.SessionStructure.receiverChains: object expected"); + message.receiverChains[i] = $root.proto.Chain.fromObject(object.receiverChains[i]); + } + } + if (object.pendingKeyExchange != null) { + if (typeof object.pendingKeyExchange !== "object") + throw TypeError(".proto.SessionStructure.pendingKeyExchange: object expected"); + message.pendingKeyExchange = $root.proto.PendingKeyExchange.fromObject(object.pendingKeyExchange); + } + if (object.pendingPreKey != null) { + if (typeof object.pendingPreKey !== "object") + throw TypeError(".proto.SessionStructure.pendingPreKey: object expected"); + message.pendingPreKey = $root.proto.PendingPreKey.fromObject(object.pendingPreKey); + } + if (object.remoteRegistrationId != null) + message.remoteRegistrationId = object.remoteRegistrationId >>> 0; + if (object.localRegistrationId != null) + message.localRegistrationId = object.localRegistrationId >>> 0; + if (object.needsRefresh != null) + message.needsRefresh = Boolean(object.needsRefresh); + if (object.aliceBaseKey != null) + if (typeof object.aliceBaseKey === "string") + $util.base64.decode(object.aliceBaseKey, message.aliceBaseKey = $util.newBuffer($util.base64.length(object.aliceBaseKey)), 0); + else if (object.aliceBaseKey.length) + message.aliceBaseKey = object.aliceBaseKey; + return message; + }; + + /** + * Creates a plain object from a SessionStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SessionStructure + * @static + * @param {proto.SessionStructure} message SessionStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SessionStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.receiverChains = []; + if (options.defaults) { + object.sessionVersion = 0; + if (options.bytes === String) + object.localIdentityPublic = ""; + else { + object.localIdentityPublic = []; + if (options.bytes !== Array) + object.localIdentityPublic = $util.newBuffer(object.localIdentityPublic); + } + if (options.bytes === String) + object.remoteIdentityPublic = ""; + else { + object.remoteIdentityPublic = []; + if (options.bytes !== Array) + object.remoteIdentityPublic = $util.newBuffer(object.remoteIdentityPublic); + } + if (options.bytes === String) + object.rootKey = ""; + else { + object.rootKey = []; + if (options.bytes !== Array) + object.rootKey = $util.newBuffer(object.rootKey); + } + object.previousCounter = 0; + object.senderChain = null; + object.pendingKeyExchange = null; + object.pendingPreKey = null; + object.remoteRegistrationId = 0; + object.localRegistrationId = 0; + object.needsRefresh = false; + if (options.bytes === String) + object.aliceBaseKey = ""; + else { + object.aliceBaseKey = []; + if (options.bytes !== Array) + object.aliceBaseKey = $util.newBuffer(object.aliceBaseKey); + } + } + if (message.sessionVersion != null && message.hasOwnProperty("sessionVersion")) + object.sessionVersion = message.sessionVersion; + if (message.localIdentityPublic != null && message.hasOwnProperty("localIdentityPublic")) + object.localIdentityPublic = options.bytes === String ? $util.base64.encode(message.localIdentityPublic, 0, message.localIdentityPublic.length) : options.bytes === Array ? Array.prototype.slice.call(message.localIdentityPublic) : message.localIdentityPublic; + if (message.remoteIdentityPublic != null && message.hasOwnProperty("remoteIdentityPublic")) + object.remoteIdentityPublic = options.bytes === String ? $util.base64.encode(message.remoteIdentityPublic, 0, message.remoteIdentityPublic.length) : options.bytes === Array ? Array.prototype.slice.call(message.remoteIdentityPublic) : message.remoteIdentityPublic; + if (message.rootKey != null && message.hasOwnProperty("rootKey")) + object.rootKey = options.bytes === String ? $util.base64.encode(message.rootKey, 0, message.rootKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.rootKey) : message.rootKey; + if (message.previousCounter != null && message.hasOwnProperty("previousCounter")) + object.previousCounter = message.previousCounter; + if (message.senderChain != null && message.hasOwnProperty("senderChain")) + object.senderChain = $root.proto.Chain.toObject(message.senderChain, options); + if (message.receiverChains && message.receiverChains.length) { + object.receiverChains = []; + for (var j = 0; j < message.receiverChains.length; ++j) + object.receiverChains[j] = $root.proto.Chain.toObject(message.receiverChains[j], options); + } + if (message.pendingKeyExchange != null && message.hasOwnProperty("pendingKeyExchange")) + object.pendingKeyExchange = $root.proto.PendingKeyExchange.toObject(message.pendingKeyExchange, options); + if (message.pendingPreKey != null && message.hasOwnProperty("pendingPreKey")) + object.pendingPreKey = $root.proto.PendingPreKey.toObject(message.pendingPreKey, options); + if (message.remoteRegistrationId != null && message.hasOwnProperty("remoteRegistrationId")) + object.remoteRegistrationId = message.remoteRegistrationId; + if (message.localRegistrationId != null && message.hasOwnProperty("localRegistrationId")) + object.localRegistrationId = message.localRegistrationId; + if (message.needsRefresh != null && message.hasOwnProperty("needsRefresh")) + object.needsRefresh = message.needsRefresh; + if (message.aliceBaseKey != null && message.hasOwnProperty("aliceBaseKey")) + object.aliceBaseKey = options.bytes === String ? $util.base64.encode(message.aliceBaseKey, 0, message.aliceBaseKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.aliceBaseKey) : message.aliceBaseKey; + return object; + }; + + /** + * Converts this SessionStructure to JSON. + * @function toJSON + * @memberof proto.SessionStructure + * @instance + * @returns {Object.} JSON object + */ + SessionStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SessionStructure; + })(); + + proto.SignedPreKeyRecordStructure = (function() { + + /** + * Properties of a SignedPreKeyRecordStructure. + * @memberof proto + * @interface ISignedPreKeyRecordStructure + * @property {number|null} [id] SignedPreKeyRecordStructure id + * @property {Uint8Array|null} [publicKey] SignedPreKeyRecordStructure publicKey + * @property {Uint8Array|null} [privateKey] SignedPreKeyRecordStructure privateKey + * @property {Uint8Array|null} [signature] SignedPreKeyRecordStructure signature + * @property {number|Long|null} [timestamp] SignedPreKeyRecordStructure timestamp + */ + + /** + * Constructs a new SignedPreKeyRecordStructure. + * @memberof proto + * @classdesc Represents a SignedPreKeyRecordStructure. + * @implements ISignedPreKeyRecordStructure + * @constructor + * @param {proto.ISignedPreKeyRecordStructure=} [properties] Properties to set + */ + function SignedPreKeyRecordStructure(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SignedPreKeyRecordStructure id. + * @member {number} id + * @memberof proto.SignedPreKeyRecordStructure + * @instance + */ + SignedPreKeyRecordStructure.prototype.id = 0; + + /** + * SignedPreKeyRecordStructure publicKey. + * @member {Uint8Array} publicKey + * @memberof proto.SignedPreKeyRecordStructure + * @instance + */ + SignedPreKeyRecordStructure.prototype.publicKey = $util.newBuffer([]); + + /** + * SignedPreKeyRecordStructure privateKey. + * @member {Uint8Array} privateKey + * @memberof proto.SignedPreKeyRecordStructure + * @instance + */ + SignedPreKeyRecordStructure.prototype.privateKey = $util.newBuffer([]); + + /** + * SignedPreKeyRecordStructure signature. + * @member {Uint8Array} signature + * @memberof proto.SignedPreKeyRecordStructure + * @instance + */ + SignedPreKeyRecordStructure.prototype.signature = $util.newBuffer([]); + + /** + * SignedPreKeyRecordStructure timestamp. + * @member {number|Long} timestamp + * @memberof proto.SignedPreKeyRecordStructure + * @instance + */ + SignedPreKeyRecordStructure.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new SignedPreKeyRecordStructure instance using the specified properties. + * @function create + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {proto.ISignedPreKeyRecordStructure=} [properties] Properties to set + * @returns {proto.SignedPreKeyRecordStructure} SignedPreKeyRecordStructure instance + */ + SignedPreKeyRecordStructure.create = function create(properties) { + return new SignedPreKeyRecordStructure(properties); + }; + + /** + * Encodes the specified SignedPreKeyRecordStructure message. Does not implicitly {@link proto.SignedPreKeyRecordStructure.verify|verify} messages. + * @function encode + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {proto.ISignedPreKeyRecordStructure} message SignedPreKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SignedPreKeyRecordStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id); + if (message.publicKey != null && Object.hasOwnProperty.call(message, "publicKey")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.publicKey); + if (message.privateKey != null && Object.hasOwnProperty.call(message, "privateKey")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.privateKey); + if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.signature); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 5, wireType 1 =*/41).fixed64(message.timestamp); + return writer; + }; + + /** + * Encodes the specified SignedPreKeyRecordStructure message, length delimited. Does not implicitly {@link proto.SignedPreKeyRecordStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {proto.ISignedPreKeyRecordStructure} message SignedPreKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SignedPreKeyRecordStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SignedPreKeyRecordStructure message from the specified reader or buffer. + * @function decode + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SignedPreKeyRecordStructure} SignedPreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SignedPreKeyRecordStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SignedPreKeyRecordStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.uint32(); + break; + case 2: + message.publicKey = reader.bytes(); + break; + case 3: + message.privateKey = reader.bytes(); + break; + case 4: + message.signature = reader.bytes(); + break; + case 5: + message.timestamp = reader.fixed64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SignedPreKeyRecordStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SignedPreKeyRecordStructure} SignedPreKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SignedPreKeyRecordStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SignedPreKeyRecordStructure message. + * @function verify + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SignedPreKeyRecordStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isInteger(message.id)) + return "id: integer expected"; + if (message.publicKey != null && message.hasOwnProperty("publicKey")) + if (!(message.publicKey && typeof message.publicKey.length === "number" || $util.isString(message.publicKey))) + return "publicKey: buffer expected"; + if (message.privateKey != null && message.hasOwnProperty("privateKey")) + if (!(message.privateKey && typeof message.privateKey.length === "number" || $util.isString(message.privateKey))) + return "privateKey: buffer expected"; + if (message.signature != null && message.hasOwnProperty("signature")) + if (!(message.signature && typeof message.signature.length === "number" || $util.isString(message.signature))) + return "signature: buffer expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a SignedPreKeyRecordStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {Object.} object Plain object + * @returns {proto.SignedPreKeyRecordStructure} SignedPreKeyRecordStructure + */ + SignedPreKeyRecordStructure.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SignedPreKeyRecordStructure) + return object; + var message = new $root.proto.SignedPreKeyRecordStructure(); + if (object.id != null) + message.id = object.id >>> 0; + if (object.publicKey != null) + if (typeof object.publicKey === "string") + $util.base64.decode(object.publicKey, message.publicKey = $util.newBuffer($util.base64.length(object.publicKey)), 0); + else if (object.publicKey.length) + message.publicKey = object.publicKey; + if (object.privateKey != null) + if (typeof object.privateKey === "string") + $util.base64.decode(object.privateKey, message.privateKey = $util.newBuffer($util.base64.length(object.privateKey)), 0); + else if (object.privateKey.length) + message.privateKey = object.privateKey; + if (object.signature != null) + if (typeof object.signature === "string") + $util.base64.decode(object.signature, message.signature = $util.newBuffer($util.base64.length(object.signature)), 0); + else if (object.signature.length) + message.signature = object.signature; + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a SignedPreKeyRecordStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SignedPreKeyRecordStructure + * @static + * @param {proto.SignedPreKeyRecordStructure} message SignedPreKeyRecordStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SignedPreKeyRecordStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.id = 0; + if (options.bytes === String) + object.publicKey = ""; + else { + object.publicKey = []; + if (options.bytes !== Array) + object.publicKey = $util.newBuffer(object.publicKey); + } + if (options.bytes === String) + object.privateKey = ""; + else { + object.privateKey = []; + if (options.bytes !== Array) + object.privateKey = $util.newBuffer(object.privateKey); + } + if (options.bytes === String) + object.signature = ""; + else { + object.signature = []; + if (options.bytes !== Array) + object.signature = $util.newBuffer(object.signature); + } + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.publicKey != null && message.hasOwnProperty("publicKey")) + object.publicKey = options.bytes === String ? $util.base64.encode(message.publicKey, 0, message.publicKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.publicKey) : message.publicKey; + if (message.privateKey != null && message.hasOwnProperty("privateKey")) + object.privateKey = options.bytes === String ? $util.base64.encode(message.privateKey, 0, message.privateKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.privateKey) : message.privateKey; + if (message.signature != null && message.hasOwnProperty("signature")) + object.signature = options.bytes === String ? $util.base64.encode(message.signature, 0, message.signature.length) : options.bytes === Array ? Array.prototype.slice.call(message.signature) : message.signature; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp; + return object; + }; + + /** + * Converts this SignedPreKeyRecordStructure to JSON. + * @function toJSON + * @memberof proto.SignedPreKeyRecordStructure + * @instance + * @returns {Object.} JSON object + */ + SignedPreKeyRecordStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SignedPreKeyRecordStructure; + })(); + + proto.StatusPSA = (function() { + + /** + * Properties of a StatusPSA. + * @memberof proto + * @interface IStatusPSA + * @property {number|Long} campaignId StatusPSA campaignId + * @property {number|Long|null} [campaignExpirationTimestamp] StatusPSA campaignExpirationTimestamp + */ + + /** + * Constructs a new StatusPSA. + * @memberof proto + * @classdesc Represents a StatusPSA. + * @implements IStatusPSA + * @constructor + * @param {proto.IStatusPSA=} [properties] Properties to set + */ + function StatusPSA(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StatusPSA campaignId. + * @member {number|Long} campaignId + * @memberof proto.StatusPSA + * @instance + */ + StatusPSA.prototype.campaignId = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * StatusPSA campaignExpirationTimestamp. + * @member {number|Long} campaignExpirationTimestamp + * @memberof proto.StatusPSA + * @instance + */ + StatusPSA.prototype.campaignExpirationTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new StatusPSA instance using the specified properties. + * @function create + * @memberof proto.StatusPSA + * @static + * @param {proto.IStatusPSA=} [properties] Properties to set + * @returns {proto.StatusPSA} StatusPSA instance + */ + StatusPSA.create = function create(properties) { + return new StatusPSA(properties); + }; + + /** + * Encodes the specified StatusPSA message. Does not implicitly {@link proto.StatusPSA.verify|verify} messages. + * @function encode + * @memberof proto.StatusPSA + * @static + * @param {proto.IStatusPSA} message StatusPSA message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StatusPSA.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + writer.uint32(/* id 44, wireType 0 =*/352).uint64(message.campaignId); + if (message.campaignExpirationTimestamp != null && Object.hasOwnProperty.call(message, "campaignExpirationTimestamp")) + writer.uint32(/* id 45, wireType 0 =*/360).uint64(message.campaignExpirationTimestamp); + return writer; + }; + + /** + * Encodes the specified StatusPSA message, length delimited. Does not implicitly {@link proto.StatusPSA.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.StatusPSA + * @static + * @param {proto.IStatusPSA} message StatusPSA message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StatusPSA.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StatusPSA message from the specified reader or buffer. + * @function decode + * @memberof proto.StatusPSA + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.StatusPSA} StatusPSA + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StatusPSA.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.StatusPSA(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 44: + message.campaignId = reader.uint64(); + break; + case 45: + message.campaignExpirationTimestamp = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("campaignId")) + throw $util.ProtocolError("missing required 'campaignId'", { instance: message }); + return message; + }; + + /** + * Decodes a StatusPSA message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.StatusPSA + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.StatusPSA} StatusPSA + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StatusPSA.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StatusPSA message. + * @function verify + * @memberof proto.StatusPSA + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StatusPSA.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isInteger(message.campaignId) && !(message.campaignId && $util.isInteger(message.campaignId.low) && $util.isInteger(message.campaignId.high))) + return "campaignId: integer|Long expected"; + if (message.campaignExpirationTimestamp != null && message.hasOwnProperty("campaignExpirationTimestamp")) + if (!$util.isInteger(message.campaignExpirationTimestamp) && !(message.campaignExpirationTimestamp && $util.isInteger(message.campaignExpirationTimestamp.low) && $util.isInteger(message.campaignExpirationTimestamp.high))) + return "campaignExpirationTimestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a StatusPSA message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.StatusPSA + * @static + * @param {Object.} object Plain object + * @returns {proto.StatusPSA} StatusPSA + */ + StatusPSA.fromObject = function fromObject(object) { + if (object instanceof $root.proto.StatusPSA) + return object; + var message = new $root.proto.StatusPSA(); + if (object.campaignId != null) + if ($util.Long) + (message.campaignId = $util.Long.fromValue(object.campaignId)).unsigned = true; + else if (typeof object.campaignId === "string") + message.campaignId = parseInt(object.campaignId, 10); + else if (typeof object.campaignId === "number") + message.campaignId = object.campaignId; + else if (typeof object.campaignId === "object") + message.campaignId = new $util.LongBits(object.campaignId.low >>> 0, object.campaignId.high >>> 0).toNumber(true); + if (object.campaignExpirationTimestamp != null) + if ($util.Long) + (message.campaignExpirationTimestamp = $util.Long.fromValue(object.campaignExpirationTimestamp)).unsigned = true; + else if (typeof object.campaignExpirationTimestamp === "string") + message.campaignExpirationTimestamp = parseInt(object.campaignExpirationTimestamp, 10); + else if (typeof object.campaignExpirationTimestamp === "number") + message.campaignExpirationTimestamp = object.campaignExpirationTimestamp; + else if (typeof object.campaignExpirationTimestamp === "object") + message.campaignExpirationTimestamp = new $util.LongBits(object.campaignExpirationTimestamp.low >>> 0, object.campaignExpirationTimestamp.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a StatusPSA message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.StatusPSA + * @static + * @param {proto.StatusPSA} message StatusPSA + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StatusPSA.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.campaignId = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.campaignId = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.campaignExpirationTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.campaignExpirationTimestamp = options.longs === String ? "0" : 0; + } + if (message.campaignId != null && message.hasOwnProperty("campaignId")) + if (typeof message.campaignId === "number") + object.campaignId = options.longs === String ? String(message.campaignId) : message.campaignId; + else + object.campaignId = options.longs === String ? $util.Long.prototype.toString.call(message.campaignId) : options.longs === Number ? new $util.LongBits(message.campaignId.low >>> 0, message.campaignId.high >>> 0).toNumber(true) : message.campaignId; + if (message.campaignExpirationTimestamp != null && message.hasOwnProperty("campaignExpirationTimestamp")) + if (typeof message.campaignExpirationTimestamp === "number") + object.campaignExpirationTimestamp = options.longs === String ? String(message.campaignExpirationTimestamp) : message.campaignExpirationTimestamp; + else + object.campaignExpirationTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.campaignExpirationTimestamp) : options.longs === Number ? new $util.LongBits(message.campaignExpirationTimestamp.low >>> 0, message.campaignExpirationTimestamp.high >>> 0).toNumber(true) : message.campaignExpirationTimestamp; + return object; + }; + + /** + * Converts this StatusPSA to JSON. + * @function toJSON + * @memberof proto.StatusPSA + * @instance + * @returns {Object.} JSON object + */ + StatusPSA.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StatusPSA; + })(); + + proto.StickerMetadata = (function() { + + /** + * Properties of a StickerMetadata. + * @memberof proto + * @interface IStickerMetadata + * @property {string|null} [url] StickerMetadata url + * @property {Uint8Array|null} [fileSha256] StickerMetadata fileSha256 + * @property {Uint8Array|null} [fileEncSha256] StickerMetadata fileEncSha256 + * @property {Uint8Array|null} [mediaKey] StickerMetadata mediaKey + * @property {string|null} [mimetype] StickerMetadata mimetype + * @property {number|null} [height] StickerMetadata height + * @property {number|null} [width] StickerMetadata width + * @property {string|null} [directPath] StickerMetadata directPath + * @property {number|Long|null} [fileLength] StickerMetadata fileLength + * @property {number|null} [weight] StickerMetadata weight + * @property {number|Long|null} [lastStickerSentTs] StickerMetadata lastStickerSentTs + */ + + /** + * Constructs a new StickerMetadata. + * @memberof proto + * @classdesc Represents a StickerMetadata. + * @implements IStickerMetadata + * @constructor + * @param {proto.IStickerMetadata=} [properties] Properties to set + */ + function StickerMetadata(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StickerMetadata url. + * @member {string} url + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.url = ""; + + /** + * StickerMetadata fileSha256. + * @member {Uint8Array} fileSha256 + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.fileSha256 = $util.newBuffer([]); + + /** + * StickerMetadata fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * StickerMetadata mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.mediaKey = $util.newBuffer([]); + + /** + * StickerMetadata mimetype. + * @member {string} mimetype + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.mimetype = ""; + + /** + * StickerMetadata height. + * @member {number} height + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.height = 0; + + /** + * StickerMetadata width. + * @member {number} width + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.width = 0; + + /** + * StickerMetadata directPath. + * @member {string} directPath + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.directPath = ""; + + /** + * StickerMetadata fileLength. + * @member {number|Long} fileLength + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * StickerMetadata weight. + * @member {number} weight + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.weight = 0; + + /** + * StickerMetadata lastStickerSentTs. + * @member {number|Long} lastStickerSentTs + * @memberof proto.StickerMetadata + * @instance + */ + StickerMetadata.prototype.lastStickerSentTs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new StickerMetadata instance using the specified properties. + * @function create + * @memberof proto.StickerMetadata + * @static + * @param {proto.IStickerMetadata=} [properties] Properties to set + * @returns {proto.StickerMetadata} StickerMetadata instance + */ + StickerMetadata.create = function create(properties) { + return new StickerMetadata(properties); + }; + + /** + * Encodes the specified StickerMetadata message. Does not implicitly {@link proto.StickerMetadata.verify|verify} messages. + * @function encode + * @memberof proto.StickerMetadata + * @static + * @param {proto.IStickerMetadata} message StickerMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerMetadata.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.fileSha256 != null && Object.hasOwnProperty.call(message, "fileSha256")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.fileSha256); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.fileEncSha256); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.mediaKey); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.mimetype); + if (message.height != null && Object.hasOwnProperty.call(message, "height")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.height); + if (message.width != null && Object.hasOwnProperty.call(message, "width")) + writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.width); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 8, wireType 2 =*/66).string(message.directPath); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 9, wireType 0 =*/72).uint64(message.fileLength); + if (message.weight != null && Object.hasOwnProperty.call(message, "weight")) + writer.uint32(/* id 10, wireType 5 =*/85).float(message.weight); + if (message.lastStickerSentTs != null && Object.hasOwnProperty.call(message, "lastStickerSentTs")) + writer.uint32(/* id 11, wireType 0 =*/88).int64(message.lastStickerSentTs); + return writer; + }; + + /** + * Encodes the specified StickerMetadata message, length delimited. Does not implicitly {@link proto.StickerMetadata.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.StickerMetadata + * @static + * @param {proto.IStickerMetadata} message StickerMetadata message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerMetadata.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StickerMetadata message from the specified reader or buffer. + * @function decode + * @memberof proto.StickerMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.StickerMetadata} StickerMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerMetadata.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.StickerMetadata(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.fileSha256 = reader.bytes(); + break; + case 3: + message.fileEncSha256 = reader.bytes(); + break; + case 4: + message.mediaKey = reader.bytes(); + break; + case 5: + message.mimetype = reader.string(); + break; + case 6: + message.height = reader.uint32(); + break; + case 7: + message.width = reader.uint32(); + break; + case 8: + message.directPath = reader.string(); + break; + case 9: + message.fileLength = reader.uint64(); + break; + case 10: + message.weight = reader.float(); + break; + case 11: + message.lastStickerSentTs = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StickerMetadata message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.StickerMetadata + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.StickerMetadata} StickerMetadata + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerMetadata.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StickerMetadata message. + * @function verify + * @memberof proto.StickerMetadata + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StickerMetadata.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + if (!(message.fileSha256 && typeof message.fileSha256.length === "number" || $util.isString(message.fileSha256))) + return "fileSha256: buffer expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + if (message.width != null && message.hasOwnProperty("width")) + if (!$util.isInteger(message.width)) + return "width: integer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.weight != null && message.hasOwnProperty("weight")) + if (typeof message.weight !== "number") + return "weight: number expected"; + if (message.lastStickerSentTs != null && message.hasOwnProperty("lastStickerSentTs")) + if (!$util.isInteger(message.lastStickerSentTs) && !(message.lastStickerSentTs && $util.isInteger(message.lastStickerSentTs.low) && $util.isInteger(message.lastStickerSentTs.high))) + return "lastStickerSentTs: integer|Long expected"; + return null; + }; + + /** + * Creates a StickerMetadata message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.StickerMetadata + * @static + * @param {Object.} object Plain object + * @returns {proto.StickerMetadata} StickerMetadata + */ + StickerMetadata.fromObject = function fromObject(object) { + if (object instanceof $root.proto.StickerMetadata) + return object; + var message = new $root.proto.StickerMetadata(); + if (object.url != null) + message.url = String(object.url); + if (object.fileSha256 != null) + if (typeof object.fileSha256 === "string") + $util.base64.decode(object.fileSha256, message.fileSha256 = $util.newBuffer($util.base64.length(object.fileSha256)), 0); + else if (object.fileSha256.length) + message.fileSha256 = object.fileSha256; + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.height != null) + message.height = object.height >>> 0; + if (object.width != null) + message.width = object.width >>> 0; + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.weight != null) + message.weight = Number(object.weight); + if (object.lastStickerSentTs != null) + if ($util.Long) + (message.lastStickerSentTs = $util.Long.fromValue(object.lastStickerSentTs)).unsigned = false; + else if (typeof object.lastStickerSentTs === "string") + message.lastStickerSentTs = parseInt(object.lastStickerSentTs, 10); + else if (typeof object.lastStickerSentTs === "number") + message.lastStickerSentTs = object.lastStickerSentTs; + else if (typeof object.lastStickerSentTs === "object") + message.lastStickerSentTs = new $util.LongBits(object.lastStickerSentTs.low >>> 0, object.lastStickerSentTs.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a StickerMetadata message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.StickerMetadata + * @static + * @param {proto.StickerMetadata} message StickerMetadata + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StickerMetadata.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = ""; + if (options.bytes === String) + object.fileSha256 = ""; + else { + object.fileSha256 = []; + if (options.bytes !== Array) + object.fileSha256 = $util.newBuffer(object.fileSha256); + } + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + object.mimetype = ""; + object.height = 0; + object.width = 0; + object.directPath = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + object.weight = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.lastStickerSentTs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.lastStickerSentTs = options.longs === String ? "0" : 0; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.fileSha256 != null && message.hasOwnProperty("fileSha256")) + object.fileSha256 = options.bytes === String ? $util.base64.encode(message.fileSha256, 0, message.fileSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileSha256) : message.fileSha256; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + if (message.width != null && message.hasOwnProperty("width")) + object.width = message.width; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.weight != null && message.hasOwnProperty("weight")) + object.weight = options.json && !isFinite(message.weight) ? String(message.weight) : message.weight; + if (message.lastStickerSentTs != null && message.hasOwnProperty("lastStickerSentTs")) + if (typeof message.lastStickerSentTs === "number") + object.lastStickerSentTs = options.longs === String ? String(message.lastStickerSentTs) : message.lastStickerSentTs; + else + object.lastStickerSentTs = options.longs === String ? $util.Long.prototype.toString.call(message.lastStickerSentTs) : options.longs === Number ? new $util.LongBits(message.lastStickerSentTs.low >>> 0, message.lastStickerSentTs.high >>> 0).toNumber() : message.lastStickerSentTs; + return object; + }; + + /** + * Converts this StickerMetadata to JSON. + * @function toJSON + * @memberof proto.StickerMetadata + * @instance + * @returns {Object.} JSON object + */ + StickerMetadata.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StickerMetadata; + })(); + + proto.SyncActionData = (function() { + + /** + * Properties of a SyncActionData. + * @memberof proto + * @interface ISyncActionData + * @property {Uint8Array|null} [index] SyncActionData index + * @property {proto.ISyncActionValue|null} [value] SyncActionData value + * @property {Uint8Array|null} [padding] SyncActionData padding + * @property {number|null} [version] SyncActionData version + */ + + /** + * Constructs a new SyncActionData. + * @memberof proto + * @classdesc Represents a SyncActionData. + * @implements ISyncActionData + * @constructor + * @param {proto.ISyncActionData=} [properties] Properties to set + */ + function SyncActionData(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncActionData index. + * @member {Uint8Array} index + * @memberof proto.SyncActionData + * @instance + */ + SyncActionData.prototype.index = $util.newBuffer([]); + + /** + * SyncActionData value. + * @member {proto.ISyncActionValue|null|undefined} value + * @memberof proto.SyncActionData + * @instance + */ + SyncActionData.prototype.value = null; + + /** + * SyncActionData padding. + * @member {Uint8Array} padding + * @memberof proto.SyncActionData + * @instance + */ + SyncActionData.prototype.padding = $util.newBuffer([]); + + /** + * SyncActionData version. + * @member {number} version + * @memberof proto.SyncActionData + * @instance + */ + SyncActionData.prototype.version = 0; + + /** + * Creates a new SyncActionData instance using the specified properties. + * @function create + * @memberof proto.SyncActionData + * @static + * @param {proto.ISyncActionData=} [properties] Properties to set + * @returns {proto.SyncActionData} SyncActionData instance + */ + SyncActionData.create = function create(properties) { + return new SyncActionData(properties); + }; + + /** + * Encodes the specified SyncActionData message. Does not implicitly {@link proto.SyncActionData.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionData + * @static + * @param {proto.ISyncActionData} message SyncActionData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.index != null && Object.hasOwnProperty.call(message, "index")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.index); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + $root.proto.SyncActionValue.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.padding != null && Object.hasOwnProperty.call(message, "padding")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.padding); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.version); + return writer; + }; + + /** + * Encodes the specified SyncActionData message, length delimited. Does not implicitly {@link proto.SyncActionData.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionData + * @static + * @param {proto.ISyncActionData} message SyncActionData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncActionData message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionData} SyncActionData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionData(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.index = reader.bytes(); + break; + case 2: + message.value = $root.proto.SyncActionValue.decode(reader, reader.uint32()); + break; + case 3: + message.padding = reader.bytes(); + break; + case 4: + message.version = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncActionData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionData} SyncActionData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncActionData message. + * @function verify + * @memberof proto.SyncActionData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncActionData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.index != null && message.hasOwnProperty("index")) + if (!(message.index && typeof message.index.length === "number" || $util.isString(message.index))) + return "index: buffer expected"; + if (message.value != null && message.hasOwnProperty("value")) { + var error = $root.proto.SyncActionValue.verify(message.value); + if (error) + return "value." + error; + } + if (message.padding != null && message.hasOwnProperty("padding")) + if (!(message.padding && typeof message.padding.length === "number" || $util.isString(message.padding))) + return "padding: buffer expected"; + if (message.version != null && message.hasOwnProperty("version")) + if (!$util.isInteger(message.version)) + return "version: integer expected"; + return null; + }; + + /** + * Creates a SyncActionData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionData + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionData} SyncActionData + */ + SyncActionData.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionData) + return object; + var message = new $root.proto.SyncActionData(); + if (object.index != null) + if (typeof object.index === "string") + $util.base64.decode(object.index, message.index = $util.newBuffer($util.base64.length(object.index)), 0); + else if (object.index.length) + message.index = object.index; + if (object.value != null) { + if (typeof object.value !== "object") + throw TypeError(".proto.SyncActionData.value: object expected"); + message.value = $root.proto.SyncActionValue.fromObject(object.value); + } + if (object.padding != null) + if (typeof object.padding === "string") + $util.base64.decode(object.padding, message.padding = $util.newBuffer($util.base64.length(object.padding)), 0); + else if (object.padding.length) + message.padding = object.padding; + if (object.version != null) + message.version = object.version | 0; + return message; + }; + + /** + * Creates a plain object from a SyncActionData message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionData + * @static + * @param {proto.SyncActionData} message SyncActionData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncActionData.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.index = ""; + else { + object.index = []; + if (options.bytes !== Array) + object.index = $util.newBuffer(object.index); + } + object.value = null; + if (options.bytes === String) + object.padding = ""; + else { + object.padding = []; + if (options.bytes !== Array) + object.padding = $util.newBuffer(object.padding); + } + object.version = 0; + } + if (message.index != null && message.hasOwnProperty("index")) + object.index = options.bytes === String ? $util.base64.encode(message.index, 0, message.index.length) : options.bytes === Array ? Array.prototype.slice.call(message.index) : message.index; + if (message.value != null && message.hasOwnProperty("value")) + object.value = $root.proto.SyncActionValue.toObject(message.value, options); + if (message.padding != null && message.hasOwnProperty("padding")) + object.padding = options.bytes === String ? $util.base64.encode(message.padding, 0, message.padding.length) : options.bytes === Array ? Array.prototype.slice.call(message.padding) : message.padding; + if (message.version != null && message.hasOwnProperty("version")) + object.version = message.version; + return object; + }; + + /** + * Converts this SyncActionData to JSON. + * @function toJSON + * @memberof proto.SyncActionData + * @instance + * @returns {Object.} JSON object + */ + SyncActionData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncActionData; + })(); + + proto.SyncActionValue = (function() { + + /** + * Properties of a SyncActionValue. + * @memberof proto + * @interface ISyncActionValue + * @property {number|Long|null} [timestamp] SyncActionValue timestamp + * @property {proto.SyncActionValue.IStarAction|null} [starAction] SyncActionValue starAction + * @property {proto.SyncActionValue.IContactAction|null} [contactAction] SyncActionValue contactAction + * @property {proto.SyncActionValue.IMuteAction|null} [muteAction] SyncActionValue muteAction + * @property {proto.SyncActionValue.IPinAction|null} [pinAction] SyncActionValue pinAction + * @property {proto.SyncActionValue.ISecurityNotificationSetting|null} [securityNotificationSetting] SyncActionValue securityNotificationSetting + * @property {proto.SyncActionValue.IPushNameSetting|null} [pushNameSetting] SyncActionValue pushNameSetting + * @property {proto.SyncActionValue.IQuickReplyAction|null} [quickReplyAction] SyncActionValue quickReplyAction + * @property {proto.SyncActionValue.IRecentEmojiWeightsAction|null} [recentEmojiWeightsAction] SyncActionValue recentEmojiWeightsAction + * @property {proto.SyncActionValue.ILabelEditAction|null} [labelEditAction] SyncActionValue labelEditAction + * @property {proto.SyncActionValue.ILabelAssociationAction|null} [labelAssociationAction] SyncActionValue labelAssociationAction + * @property {proto.SyncActionValue.ILocaleSetting|null} [localeSetting] SyncActionValue localeSetting + * @property {proto.SyncActionValue.IArchiveChatAction|null} [archiveChatAction] SyncActionValue archiveChatAction + * @property {proto.SyncActionValue.IDeleteMessageForMeAction|null} [deleteMessageForMeAction] SyncActionValue deleteMessageForMeAction + * @property {proto.SyncActionValue.IKeyExpiration|null} [keyExpiration] SyncActionValue keyExpiration + * @property {proto.SyncActionValue.IMarkChatAsReadAction|null} [markChatAsReadAction] SyncActionValue markChatAsReadAction + * @property {proto.SyncActionValue.IClearChatAction|null} [clearChatAction] SyncActionValue clearChatAction + * @property {proto.SyncActionValue.IDeleteChatAction|null} [deleteChatAction] SyncActionValue deleteChatAction + * @property {proto.SyncActionValue.IUnarchiveChatsSetting|null} [unarchiveChatsSetting] SyncActionValue unarchiveChatsSetting + * @property {proto.SyncActionValue.IPrimaryFeature|null} [primaryFeature] SyncActionValue primaryFeature + * @property {proto.SyncActionValue.IAndroidUnsupportedActions|null} [androidUnsupportedActions] SyncActionValue androidUnsupportedActions + * @property {proto.SyncActionValue.IAgentAction|null} [agentAction] SyncActionValue agentAction + * @property {proto.SyncActionValue.ISubscriptionAction|null} [subscriptionAction] SyncActionValue subscriptionAction + * @property {proto.SyncActionValue.IUserStatusMuteAction|null} [userStatusMuteAction] SyncActionValue userStatusMuteAction + * @property {proto.SyncActionValue.ITimeFormatAction|null} [timeFormatAction] SyncActionValue timeFormatAction + * @property {proto.SyncActionValue.INuxAction|null} [nuxAction] SyncActionValue nuxAction + * @property {proto.SyncActionValue.IPrimaryVersionAction|null} [primaryVersionAction] SyncActionValue primaryVersionAction + * @property {proto.SyncActionValue.IStickerAction|null} [stickerAction] SyncActionValue stickerAction + * @property {proto.SyncActionValue.IRemoveRecentStickerAction|null} [removeRecentStickerAction] SyncActionValue removeRecentStickerAction + * @property {proto.SyncActionValue.IChatAssignmentAction|null} [chatAssignment] SyncActionValue chatAssignment + * @property {proto.SyncActionValue.IChatAssignmentOpenedStatusAction|null} [chatAssignmentOpenedStatus] SyncActionValue chatAssignmentOpenedStatus + */ + + /** + * Constructs a new SyncActionValue. + * @memberof proto + * @classdesc Represents a SyncActionValue. + * @implements ISyncActionValue + * @constructor + * @param {proto.ISyncActionValue=} [properties] Properties to set + */ + function SyncActionValue(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncActionValue timestamp. + * @member {number|Long} timestamp + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * SyncActionValue starAction. + * @member {proto.SyncActionValue.IStarAction|null|undefined} starAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.starAction = null; + + /** + * SyncActionValue contactAction. + * @member {proto.SyncActionValue.IContactAction|null|undefined} contactAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.contactAction = null; + + /** + * SyncActionValue muteAction. + * @member {proto.SyncActionValue.IMuteAction|null|undefined} muteAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.muteAction = null; + + /** + * SyncActionValue pinAction. + * @member {proto.SyncActionValue.IPinAction|null|undefined} pinAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.pinAction = null; + + /** + * SyncActionValue securityNotificationSetting. + * @member {proto.SyncActionValue.ISecurityNotificationSetting|null|undefined} securityNotificationSetting + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.securityNotificationSetting = null; + + /** + * SyncActionValue pushNameSetting. + * @member {proto.SyncActionValue.IPushNameSetting|null|undefined} pushNameSetting + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.pushNameSetting = null; + + /** + * SyncActionValue quickReplyAction. + * @member {proto.SyncActionValue.IQuickReplyAction|null|undefined} quickReplyAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.quickReplyAction = null; + + /** + * SyncActionValue recentEmojiWeightsAction. + * @member {proto.SyncActionValue.IRecentEmojiWeightsAction|null|undefined} recentEmojiWeightsAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.recentEmojiWeightsAction = null; + + /** + * SyncActionValue labelEditAction. + * @member {proto.SyncActionValue.ILabelEditAction|null|undefined} labelEditAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.labelEditAction = null; + + /** + * SyncActionValue labelAssociationAction. + * @member {proto.SyncActionValue.ILabelAssociationAction|null|undefined} labelAssociationAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.labelAssociationAction = null; + + /** + * SyncActionValue localeSetting. + * @member {proto.SyncActionValue.ILocaleSetting|null|undefined} localeSetting + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.localeSetting = null; + + /** + * SyncActionValue archiveChatAction. + * @member {proto.SyncActionValue.IArchiveChatAction|null|undefined} archiveChatAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.archiveChatAction = null; + + /** + * SyncActionValue deleteMessageForMeAction. + * @member {proto.SyncActionValue.IDeleteMessageForMeAction|null|undefined} deleteMessageForMeAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.deleteMessageForMeAction = null; + + /** + * SyncActionValue keyExpiration. + * @member {proto.SyncActionValue.IKeyExpiration|null|undefined} keyExpiration + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.keyExpiration = null; + + /** + * SyncActionValue markChatAsReadAction. + * @member {proto.SyncActionValue.IMarkChatAsReadAction|null|undefined} markChatAsReadAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.markChatAsReadAction = null; + + /** + * SyncActionValue clearChatAction. + * @member {proto.SyncActionValue.IClearChatAction|null|undefined} clearChatAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.clearChatAction = null; + + /** + * SyncActionValue deleteChatAction. + * @member {proto.SyncActionValue.IDeleteChatAction|null|undefined} deleteChatAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.deleteChatAction = null; + + /** + * SyncActionValue unarchiveChatsSetting. + * @member {proto.SyncActionValue.IUnarchiveChatsSetting|null|undefined} unarchiveChatsSetting + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.unarchiveChatsSetting = null; + + /** + * SyncActionValue primaryFeature. + * @member {proto.SyncActionValue.IPrimaryFeature|null|undefined} primaryFeature + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.primaryFeature = null; + + /** + * SyncActionValue androidUnsupportedActions. + * @member {proto.SyncActionValue.IAndroidUnsupportedActions|null|undefined} androidUnsupportedActions + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.androidUnsupportedActions = null; + + /** + * SyncActionValue agentAction. + * @member {proto.SyncActionValue.IAgentAction|null|undefined} agentAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.agentAction = null; + + /** + * SyncActionValue subscriptionAction. + * @member {proto.SyncActionValue.ISubscriptionAction|null|undefined} subscriptionAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.subscriptionAction = null; + + /** + * SyncActionValue userStatusMuteAction. + * @member {proto.SyncActionValue.IUserStatusMuteAction|null|undefined} userStatusMuteAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.userStatusMuteAction = null; + + /** + * SyncActionValue timeFormatAction. + * @member {proto.SyncActionValue.ITimeFormatAction|null|undefined} timeFormatAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.timeFormatAction = null; + + /** + * SyncActionValue nuxAction. + * @member {proto.SyncActionValue.INuxAction|null|undefined} nuxAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.nuxAction = null; + + /** + * SyncActionValue primaryVersionAction. + * @member {proto.SyncActionValue.IPrimaryVersionAction|null|undefined} primaryVersionAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.primaryVersionAction = null; + + /** + * SyncActionValue stickerAction. + * @member {proto.SyncActionValue.IStickerAction|null|undefined} stickerAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.stickerAction = null; + + /** + * SyncActionValue removeRecentStickerAction. + * @member {proto.SyncActionValue.IRemoveRecentStickerAction|null|undefined} removeRecentStickerAction + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.removeRecentStickerAction = null; + + /** + * SyncActionValue chatAssignment. + * @member {proto.SyncActionValue.IChatAssignmentAction|null|undefined} chatAssignment + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.chatAssignment = null; + + /** + * SyncActionValue chatAssignmentOpenedStatus. + * @member {proto.SyncActionValue.IChatAssignmentOpenedStatusAction|null|undefined} chatAssignmentOpenedStatus + * @memberof proto.SyncActionValue + * @instance + */ + SyncActionValue.prototype.chatAssignmentOpenedStatus = null; + + /** + * Creates a new SyncActionValue instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue + * @static + * @param {proto.ISyncActionValue=} [properties] Properties to set + * @returns {proto.SyncActionValue} SyncActionValue instance + */ + SyncActionValue.create = function create(properties) { + return new SyncActionValue(properties); + }; + + /** + * Encodes the specified SyncActionValue message. Does not implicitly {@link proto.SyncActionValue.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue + * @static + * @param {proto.ISyncActionValue} message SyncActionValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionValue.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.timestamp); + if (message.starAction != null && Object.hasOwnProperty.call(message, "starAction")) + $root.proto.SyncActionValue.StarAction.encode(message.starAction, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.contactAction != null && Object.hasOwnProperty.call(message, "contactAction")) + $root.proto.SyncActionValue.ContactAction.encode(message.contactAction, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.muteAction != null && Object.hasOwnProperty.call(message, "muteAction")) + $root.proto.SyncActionValue.MuteAction.encode(message.muteAction, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.pinAction != null && Object.hasOwnProperty.call(message, "pinAction")) + $root.proto.SyncActionValue.PinAction.encode(message.pinAction, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.securityNotificationSetting != null && Object.hasOwnProperty.call(message, "securityNotificationSetting")) + $root.proto.SyncActionValue.SecurityNotificationSetting.encode(message.securityNotificationSetting, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.pushNameSetting != null && Object.hasOwnProperty.call(message, "pushNameSetting")) + $root.proto.SyncActionValue.PushNameSetting.encode(message.pushNameSetting, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.quickReplyAction != null && Object.hasOwnProperty.call(message, "quickReplyAction")) + $root.proto.SyncActionValue.QuickReplyAction.encode(message.quickReplyAction, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.recentEmojiWeightsAction != null && Object.hasOwnProperty.call(message, "recentEmojiWeightsAction")) + $root.proto.SyncActionValue.RecentEmojiWeightsAction.encode(message.recentEmojiWeightsAction, writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim(); + if (message.labelEditAction != null && Object.hasOwnProperty.call(message, "labelEditAction")) + $root.proto.SyncActionValue.LabelEditAction.encode(message.labelEditAction, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim(); + if (message.labelAssociationAction != null && Object.hasOwnProperty.call(message, "labelAssociationAction")) + $root.proto.SyncActionValue.LabelAssociationAction.encode(message.labelAssociationAction, writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim(); + if (message.localeSetting != null && Object.hasOwnProperty.call(message, "localeSetting")) + $root.proto.SyncActionValue.LocaleSetting.encode(message.localeSetting, writer.uint32(/* id 16, wireType 2 =*/130).fork()).ldelim(); + if (message.archiveChatAction != null && Object.hasOwnProperty.call(message, "archiveChatAction")) + $root.proto.SyncActionValue.ArchiveChatAction.encode(message.archiveChatAction, writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); + if (message.deleteMessageForMeAction != null && Object.hasOwnProperty.call(message, "deleteMessageForMeAction")) + $root.proto.SyncActionValue.DeleteMessageForMeAction.encode(message.deleteMessageForMeAction, writer.uint32(/* id 18, wireType 2 =*/146).fork()).ldelim(); + if (message.keyExpiration != null && Object.hasOwnProperty.call(message, "keyExpiration")) + $root.proto.SyncActionValue.KeyExpiration.encode(message.keyExpiration, writer.uint32(/* id 19, wireType 2 =*/154).fork()).ldelim(); + if (message.markChatAsReadAction != null && Object.hasOwnProperty.call(message, "markChatAsReadAction")) + $root.proto.SyncActionValue.MarkChatAsReadAction.encode(message.markChatAsReadAction, writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim(); + if (message.clearChatAction != null && Object.hasOwnProperty.call(message, "clearChatAction")) + $root.proto.SyncActionValue.ClearChatAction.encode(message.clearChatAction, writer.uint32(/* id 21, wireType 2 =*/170).fork()).ldelim(); + if (message.deleteChatAction != null && Object.hasOwnProperty.call(message, "deleteChatAction")) + $root.proto.SyncActionValue.DeleteChatAction.encode(message.deleteChatAction, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim(); + if (message.unarchiveChatsSetting != null && Object.hasOwnProperty.call(message, "unarchiveChatsSetting")) + $root.proto.SyncActionValue.UnarchiveChatsSetting.encode(message.unarchiveChatsSetting, writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim(); + if (message.primaryFeature != null && Object.hasOwnProperty.call(message, "primaryFeature")) + $root.proto.SyncActionValue.PrimaryFeature.encode(message.primaryFeature, writer.uint32(/* id 24, wireType 2 =*/194).fork()).ldelim(); + if (message.androidUnsupportedActions != null && Object.hasOwnProperty.call(message, "androidUnsupportedActions")) + $root.proto.SyncActionValue.AndroidUnsupportedActions.encode(message.androidUnsupportedActions, writer.uint32(/* id 26, wireType 2 =*/210).fork()).ldelim(); + if (message.agentAction != null && Object.hasOwnProperty.call(message, "agentAction")) + $root.proto.SyncActionValue.AgentAction.encode(message.agentAction, writer.uint32(/* id 27, wireType 2 =*/218).fork()).ldelim(); + if (message.subscriptionAction != null && Object.hasOwnProperty.call(message, "subscriptionAction")) + $root.proto.SyncActionValue.SubscriptionAction.encode(message.subscriptionAction, writer.uint32(/* id 28, wireType 2 =*/226).fork()).ldelim(); + if (message.userStatusMuteAction != null && Object.hasOwnProperty.call(message, "userStatusMuteAction")) + $root.proto.SyncActionValue.UserStatusMuteAction.encode(message.userStatusMuteAction, writer.uint32(/* id 29, wireType 2 =*/234).fork()).ldelim(); + if (message.timeFormatAction != null && Object.hasOwnProperty.call(message, "timeFormatAction")) + $root.proto.SyncActionValue.TimeFormatAction.encode(message.timeFormatAction, writer.uint32(/* id 30, wireType 2 =*/242).fork()).ldelim(); + if (message.nuxAction != null && Object.hasOwnProperty.call(message, "nuxAction")) + $root.proto.SyncActionValue.NuxAction.encode(message.nuxAction, writer.uint32(/* id 31, wireType 2 =*/250).fork()).ldelim(); + if (message.primaryVersionAction != null && Object.hasOwnProperty.call(message, "primaryVersionAction")) + $root.proto.SyncActionValue.PrimaryVersionAction.encode(message.primaryVersionAction, writer.uint32(/* id 32, wireType 2 =*/258).fork()).ldelim(); + if (message.stickerAction != null && Object.hasOwnProperty.call(message, "stickerAction")) + $root.proto.SyncActionValue.StickerAction.encode(message.stickerAction, writer.uint32(/* id 33, wireType 2 =*/266).fork()).ldelim(); + if (message.removeRecentStickerAction != null && Object.hasOwnProperty.call(message, "removeRecentStickerAction")) + $root.proto.SyncActionValue.RemoveRecentStickerAction.encode(message.removeRecentStickerAction, writer.uint32(/* id 34, wireType 2 =*/274).fork()).ldelim(); + if (message.chatAssignment != null && Object.hasOwnProperty.call(message, "chatAssignment")) + $root.proto.SyncActionValue.ChatAssignmentAction.encode(message.chatAssignment, writer.uint32(/* id 35, wireType 2 =*/282).fork()).ldelim(); + if (message.chatAssignmentOpenedStatus != null && Object.hasOwnProperty.call(message, "chatAssignmentOpenedStatus")) + $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction.encode(message.chatAssignmentOpenedStatus, writer.uint32(/* id 36, wireType 2 =*/290).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SyncActionValue message, length delimited. Does not implicitly {@link proto.SyncActionValue.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue + * @static + * @param {proto.ISyncActionValue} message SyncActionValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionValue.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncActionValue message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue} SyncActionValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionValue.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.timestamp = reader.int64(); + break; + case 2: + message.starAction = $root.proto.SyncActionValue.StarAction.decode(reader, reader.uint32()); + break; + case 3: + message.contactAction = $root.proto.SyncActionValue.ContactAction.decode(reader, reader.uint32()); + break; + case 4: + message.muteAction = $root.proto.SyncActionValue.MuteAction.decode(reader, reader.uint32()); + break; + case 5: + message.pinAction = $root.proto.SyncActionValue.PinAction.decode(reader, reader.uint32()); + break; + case 6: + message.securityNotificationSetting = $root.proto.SyncActionValue.SecurityNotificationSetting.decode(reader, reader.uint32()); + break; + case 7: + message.pushNameSetting = $root.proto.SyncActionValue.PushNameSetting.decode(reader, reader.uint32()); + break; + case 8: + message.quickReplyAction = $root.proto.SyncActionValue.QuickReplyAction.decode(reader, reader.uint32()); + break; + case 11: + message.recentEmojiWeightsAction = $root.proto.SyncActionValue.RecentEmojiWeightsAction.decode(reader, reader.uint32()); + break; + case 14: + message.labelEditAction = $root.proto.SyncActionValue.LabelEditAction.decode(reader, reader.uint32()); + break; + case 15: + message.labelAssociationAction = $root.proto.SyncActionValue.LabelAssociationAction.decode(reader, reader.uint32()); + break; + case 16: + message.localeSetting = $root.proto.SyncActionValue.LocaleSetting.decode(reader, reader.uint32()); + break; + case 17: + message.archiveChatAction = $root.proto.SyncActionValue.ArchiveChatAction.decode(reader, reader.uint32()); + break; + case 18: + message.deleteMessageForMeAction = $root.proto.SyncActionValue.DeleteMessageForMeAction.decode(reader, reader.uint32()); + break; + case 19: + message.keyExpiration = $root.proto.SyncActionValue.KeyExpiration.decode(reader, reader.uint32()); + break; + case 20: + message.markChatAsReadAction = $root.proto.SyncActionValue.MarkChatAsReadAction.decode(reader, reader.uint32()); + break; + case 21: + message.clearChatAction = $root.proto.SyncActionValue.ClearChatAction.decode(reader, reader.uint32()); + break; + case 22: + message.deleteChatAction = $root.proto.SyncActionValue.DeleteChatAction.decode(reader, reader.uint32()); + break; + case 23: + message.unarchiveChatsSetting = $root.proto.SyncActionValue.UnarchiveChatsSetting.decode(reader, reader.uint32()); + break; + case 24: + message.primaryFeature = $root.proto.SyncActionValue.PrimaryFeature.decode(reader, reader.uint32()); + break; + case 26: + message.androidUnsupportedActions = $root.proto.SyncActionValue.AndroidUnsupportedActions.decode(reader, reader.uint32()); + break; + case 27: + message.agentAction = $root.proto.SyncActionValue.AgentAction.decode(reader, reader.uint32()); + break; + case 28: + message.subscriptionAction = $root.proto.SyncActionValue.SubscriptionAction.decode(reader, reader.uint32()); + break; + case 29: + message.userStatusMuteAction = $root.proto.SyncActionValue.UserStatusMuteAction.decode(reader, reader.uint32()); + break; + case 30: + message.timeFormatAction = $root.proto.SyncActionValue.TimeFormatAction.decode(reader, reader.uint32()); + break; + case 31: + message.nuxAction = $root.proto.SyncActionValue.NuxAction.decode(reader, reader.uint32()); + break; + case 32: + message.primaryVersionAction = $root.proto.SyncActionValue.PrimaryVersionAction.decode(reader, reader.uint32()); + break; + case 33: + message.stickerAction = $root.proto.SyncActionValue.StickerAction.decode(reader, reader.uint32()); + break; + case 34: + message.removeRecentStickerAction = $root.proto.SyncActionValue.RemoveRecentStickerAction.decode(reader, reader.uint32()); + break; + case 35: + message.chatAssignment = $root.proto.SyncActionValue.ChatAssignmentAction.decode(reader, reader.uint32()); + break; + case 36: + message.chatAssignmentOpenedStatus = $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncActionValue message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue} SyncActionValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionValue.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncActionValue message. + * @function verify + * @memberof proto.SyncActionValue + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncActionValue.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + if (message.starAction != null && message.hasOwnProperty("starAction")) { + var error = $root.proto.SyncActionValue.StarAction.verify(message.starAction); + if (error) + return "starAction." + error; + } + if (message.contactAction != null && message.hasOwnProperty("contactAction")) { + var error = $root.proto.SyncActionValue.ContactAction.verify(message.contactAction); + if (error) + return "contactAction." + error; + } + if (message.muteAction != null && message.hasOwnProperty("muteAction")) { + var error = $root.proto.SyncActionValue.MuteAction.verify(message.muteAction); + if (error) + return "muteAction." + error; + } + if (message.pinAction != null && message.hasOwnProperty("pinAction")) { + var error = $root.proto.SyncActionValue.PinAction.verify(message.pinAction); + if (error) + return "pinAction." + error; + } + if (message.securityNotificationSetting != null && message.hasOwnProperty("securityNotificationSetting")) { + var error = $root.proto.SyncActionValue.SecurityNotificationSetting.verify(message.securityNotificationSetting); + if (error) + return "securityNotificationSetting." + error; + } + if (message.pushNameSetting != null && message.hasOwnProperty("pushNameSetting")) { + var error = $root.proto.SyncActionValue.PushNameSetting.verify(message.pushNameSetting); + if (error) + return "pushNameSetting." + error; + } + if (message.quickReplyAction != null && message.hasOwnProperty("quickReplyAction")) { + var error = $root.proto.SyncActionValue.QuickReplyAction.verify(message.quickReplyAction); + if (error) + return "quickReplyAction." + error; + } + if (message.recentEmojiWeightsAction != null && message.hasOwnProperty("recentEmojiWeightsAction")) { + var error = $root.proto.SyncActionValue.RecentEmojiWeightsAction.verify(message.recentEmojiWeightsAction); + if (error) + return "recentEmojiWeightsAction." + error; + } + if (message.labelEditAction != null && message.hasOwnProperty("labelEditAction")) { + var error = $root.proto.SyncActionValue.LabelEditAction.verify(message.labelEditAction); + if (error) + return "labelEditAction." + error; + } + if (message.labelAssociationAction != null && message.hasOwnProperty("labelAssociationAction")) { + var error = $root.proto.SyncActionValue.LabelAssociationAction.verify(message.labelAssociationAction); + if (error) + return "labelAssociationAction." + error; + } + if (message.localeSetting != null && message.hasOwnProperty("localeSetting")) { + var error = $root.proto.SyncActionValue.LocaleSetting.verify(message.localeSetting); + if (error) + return "localeSetting." + error; + } + if (message.archiveChatAction != null && message.hasOwnProperty("archiveChatAction")) { + var error = $root.proto.SyncActionValue.ArchiveChatAction.verify(message.archiveChatAction); + if (error) + return "archiveChatAction." + error; + } + if (message.deleteMessageForMeAction != null && message.hasOwnProperty("deleteMessageForMeAction")) { + var error = $root.proto.SyncActionValue.DeleteMessageForMeAction.verify(message.deleteMessageForMeAction); + if (error) + return "deleteMessageForMeAction." + error; + } + if (message.keyExpiration != null && message.hasOwnProperty("keyExpiration")) { + var error = $root.proto.SyncActionValue.KeyExpiration.verify(message.keyExpiration); + if (error) + return "keyExpiration." + error; + } + if (message.markChatAsReadAction != null && message.hasOwnProperty("markChatAsReadAction")) { + var error = $root.proto.SyncActionValue.MarkChatAsReadAction.verify(message.markChatAsReadAction); + if (error) + return "markChatAsReadAction." + error; + } + if (message.clearChatAction != null && message.hasOwnProperty("clearChatAction")) { + var error = $root.proto.SyncActionValue.ClearChatAction.verify(message.clearChatAction); + if (error) + return "clearChatAction." + error; + } + if (message.deleteChatAction != null && message.hasOwnProperty("deleteChatAction")) { + var error = $root.proto.SyncActionValue.DeleteChatAction.verify(message.deleteChatAction); + if (error) + return "deleteChatAction." + error; + } + if (message.unarchiveChatsSetting != null && message.hasOwnProperty("unarchiveChatsSetting")) { + var error = $root.proto.SyncActionValue.UnarchiveChatsSetting.verify(message.unarchiveChatsSetting); + if (error) + return "unarchiveChatsSetting." + error; + } + if (message.primaryFeature != null && message.hasOwnProperty("primaryFeature")) { + var error = $root.proto.SyncActionValue.PrimaryFeature.verify(message.primaryFeature); + if (error) + return "primaryFeature." + error; + } + if (message.androidUnsupportedActions != null && message.hasOwnProperty("androidUnsupportedActions")) { + var error = $root.proto.SyncActionValue.AndroidUnsupportedActions.verify(message.androidUnsupportedActions); + if (error) + return "androidUnsupportedActions." + error; + } + if (message.agentAction != null && message.hasOwnProperty("agentAction")) { + var error = $root.proto.SyncActionValue.AgentAction.verify(message.agentAction); + if (error) + return "agentAction." + error; + } + if (message.subscriptionAction != null && message.hasOwnProperty("subscriptionAction")) { + var error = $root.proto.SyncActionValue.SubscriptionAction.verify(message.subscriptionAction); + if (error) + return "subscriptionAction." + error; + } + if (message.userStatusMuteAction != null && message.hasOwnProperty("userStatusMuteAction")) { + var error = $root.proto.SyncActionValue.UserStatusMuteAction.verify(message.userStatusMuteAction); + if (error) + return "userStatusMuteAction." + error; + } + if (message.timeFormatAction != null && message.hasOwnProperty("timeFormatAction")) { + var error = $root.proto.SyncActionValue.TimeFormatAction.verify(message.timeFormatAction); + if (error) + return "timeFormatAction." + error; + } + if (message.nuxAction != null && message.hasOwnProperty("nuxAction")) { + var error = $root.proto.SyncActionValue.NuxAction.verify(message.nuxAction); + if (error) + return "nuxAction." + error; + } + if (message.primaryVersionAction != null && message.hasOwnProperty("primaryVersionAction")) { + var error = $root.proto.SyncActionValue.PrimaryVersionAction.verify(message.primaryVersionAction); + if (error) + return "primaryVersionAction." + error; + } + if (message.stickerAction != null && message.hasOwnProperty("stickerAction")) { + var error = $root.proto.SyncActionValue.StickerAction.verify(message.stickerAction); + if (error) + return "stickerAction." + error; + } + if (message.removeRecentStickerAction != null && message.hasOwnProperty("removeRecentStickerAction")) { + var error = $root.proto.SyncActionValue.RemoveRecentStickerAction.verify(message.removeRecentStickerAction); + if (error) + return "removeRecentStickerAction." + error; + } + if (message.chatAssignment != null && message.hasOwnProperty("chatAssignment")) { + var error = $root.proto.SyncActionValue.ChatAssignmentAction.verify(message.chatAssignment); + if (error) + return "chatAssignment." + error; + } + if (message.chatAssignmentOpenedStatus != null && message.hasOwnProperty("chatAssignmentOpenedStatus")) { + var error = $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction.verify(message.chatAssignmentOpenedStatus); + if (error) + return "chatAssignmentOpenedStatus." + error; + } + return null; + }; + + /** + * Creates a SyncActionValue message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue} SyncActionValue + */ + SyncActionValue.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue) + return object; + var message = new $root.proto.SyncActionValue(); + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(); + if (object.starAction != null) { + if (typeof object.starAction !== "object") + throw TypeError(".proto.SyncActionValue.starAction: object expected"); + message.starAction = $root.proto.SyncActionValue.StarAction.fromObject(object.starAction); + } + if (object.contactAction != null) { + if (typeof object.contactAction !== "object") + throw TypeError(".proto.SyncActionValue.contactAction: object expected"); + message.contactAction = $root.proto.SyncActionValue.ContactAction.fromObject(object.contactAction); + } + if (object.muteAction != null) { + if (typeof object.muteAction !== "object") + throw TypeError(".proto.SyncActionValue.muteAction: object expected"); + message.muteAction = $root.proto.SyncActionValue.MuteAction.fromObject(object.muteAction); + } + if (object.pinAction != null) { + if (typeof object.pinAction !== "object") + throw TypeError(".proto.SyncActionValue.pinAction: object expected"); + message.pinAction = $root.proto.SyncActionValue.PinAction.fromObject(object.pinAction); + } + if (object.securityNotificationSetting != null) { + if (typeof object.securityNotificationSetting !== "object") + throw TypeError(".proto.SyncActionValue.securityNotificationSetting: object expected"); + message.securityNotificationSetting = $root.proto.SyncActionValue.SecurityNotificationSetting.fromObject(object.securityNotificationSetting); + } + if (object.pushNameSetting != null) { + if (typeof object.pushNameSetting !== "object") + throw TypeError(".proto.SyncActionValue.pushNameSetting: object expected"); + message.pushNameSetting = $root.proto.SyncActionValue.PushNameSetting.fromObject(object.pushNameSetting); + } + if (object.quickReplyAction != null) { + if (typeof object.quickReplyAction !== "object") + throw TypeError(".proto.SyncActionValue.quickReplyAction: object expected"); + message.quickReplyAction = $root.proto.SyncActionValue.QuickReplyAction.fromObject(object.quickReplyAction); + } + if (object.recentEmojiWeightsAction != null) { + if (typeof object.recentEmojiWeightsAction !== "object") + throw TypeError(".proto.SyncActionValue.recentEmojiWeightsAction: object expected"); + message.recentEmojiWeightsAction = $root.proto.SyncActionValue.RecentEmojiWeightsAction.fromObject(object.recentEmojiWeightsAction); + } + if (object.labelEditAction != null) { + if (typeof object.labelEditAction !== "object") + throw TypeError(".proto.SyncActionValue.labelEditAction: object expected"); + message.labelEditAction = $root.proto.SyncActionValue.LabelEditAction.fromObject(object.labelEditAction); + } + if (object.labelAssociationAction != null) { + if (typeof object.labelAssociationAction !== "object") + throw TypeError(".proto.SyncActionValue.labelAssociationAction: object expected"); + message.labelAssociationAction = $root.proto.SyncActionValue.LabelAssociationAction.fromObject(object.labelAssociationAction); + } + if (object.localeSetting != null) { + if (typeof object.localeSetting !== "object") + throw TypeError(".proto.SyncActionValue.localeSetting: object expected"); + message.localeSetting = $root.proto.SyncActionValue.LocaleSetting.fromObject(object.localeSetting); + } + if (object.archiveChatAction != null) { + if (typeof object.archiveChatAction !== "object") + throw TypeError(".proto.SyncActionValue.archiveChatAction: object expected"); + message.archiveChatAction = $root.proto.SyncActionValue.ArchiveChatAction.fromObject(object.archiveChatAction); + } + if (object.deleteMessageForMeAction != null) { + if (typeof object.deleteMessageForMeAction !== "object") + throw TypeError(".proto.SyncActionValue.deleteMessageForMeAction: object expected"); + message.deleteMessageForMeAction = $root.proto.SyncActionValue.DeleteMessageForMeAction.fromObject(object.deleteMessageForMeAction); + } + if (object.keyExpiration != null) { + if (typeof object.keyExpiration !== "object") + throw TypeError(".proto.SyncActionValue.keyExpiration: object expected"); + message.keyExpiration = $root.proto.SyncActionValue.KeyExpiration.fromObject(object.keyExpiration); + } + if (object.markChatAsReadAction != null) { + if (typeof object.markChatAsReadAction !== "object") + throw TypeError(".proto.SyncActionValue.markChatAsReadAction: object expected"); + message.markChatAsReadAction = $root.proto.SyncActionValue.MarkChatAsReadAction.fromObject(object.markChatAsReadAction); + } + if (object.clearChatAction != null) { + if (typeof object.clearChatAction !== "object") + throw TypeError(".proto.SyncActionValue.clearChatAction: object expected"); + message.clearChatAction = $root.proto.SyncActionValue.ClearChatAction.fromObject(object.clearChatAction); + } + if (object.deleteChatAction != null) { + if (typeof object.deleteChatAction !== "object") + throw TypeError(".proto.SyncActionValue.deleteChatAction: object expected"); + message.deleteChatAction = $root.proto.SyncActionValue.DeleteChatAction.fromObject(object.deleteChatAction); + } + if (object.unarchiveChatsSetting != null) { + if (typeof object.unarchiveChatsSetting !== "object") + throw TypeError(".proto.SyncActionValue.unarchiveChatsSetting: object expected"); + message.unarchiveChatsSetting = $root.proto.SyncActionValue.UnarchiveChatsSetting.fromObject(object.unarchiveChatsSetting); + } + if (object.primaryFeature != null) { + if (typeof object.primaryFeature !== "object") + throw TypeError(".proto.SyncActionValue.primaryFeature: object expected"); + message.primaryFeature = $root.proto.SyncActionValue.PrimaryFeature.fromObject(object.primaryFeature); + } + if (object.androidUnsupportedActions != null) { + if (typeof object.androidUnsupportedActions !== "object") + throw TypeError(".proto.SyncActionValue.androidUnsupportedActions: object expected"); + message.androidUnsupportedActions = $root.proto.SyncActionValue.AndroidUnsupportedActions.fromObject(object.androidUnsupportedActions); + } + if (object.agentAction != null) { + if (typeof object.agentAction !== "object") + throw TypeError(".proto.SyncActionValue.agentAction: object expected"); + message.agentAction = $root.proto.SyncActionValue.AgentAction.fromObject(object.agentAction); + } + if (object.subscriptionAction != null) { + if (typeof object.subscriptionAction !== "object") + throw TypeError(".proto.SyncActionValue.subscriptionAction: object expected"); + message.subscriptionAction = $root.proto.SyncActionValue.SubscriptionAction.fromObject(object.subscriptionAction); + } + if (object.userStatusMuteAction != null) { + if (typeof object.userStatusMuteAction !== "object") + throw TypeError(".proto.SyncActionValue.userStatusMuteAction: object expected"); + message.userStatusMuteAction = $root.proto.SyncActionValue.UserStatusMuteAction.fromObject(object.userStatusMuteAction); + } + if (object.timeFormatAction != null) { + if (typeof object.timeFormatAction !== "object") + throw TypeError(".proto.SyncActionValue.timeFormatAction: object expected"); + message.timeFormatAction = $root.proto.SyncActionValue.TimeFormatAction.fromObject(object.timeFormatAction); + } + if (object.nuxAction != null) { + if (typeof object.nuxAction !== "object") + throw TypeError(".proto.SyncActionValue.nuxAction: object expected"); + message.nuxAction = $root.proto.SyncActionValue.NuxAction.fromObject(object.nuxAction); + } + if (object.primaryVersionAction != null) { + if (typeof object.primaryVersionAction !== "object") + throw TypeError(".proto.SyncActionValue.primaryVersionAction: object expected"); + message.primaryVersionAction = $root.proto.SyncActionValue.PrimaryVersionAction.fromObject(object.primaryVersionAction); + } + if (object.stickerAction != null) { + if (typeof object.stickerAction !== "object") + throw TypeError(".proto.SyncActionValue.stickerAction: object expected"); + message.stickerAction = $root.proto.SyncActionValue.StickerAction.fromObject(object.stickerAction); + } + if (object.removeRecentStickerAction != null) { + if (typeof object.removeRecentStickerAction !== "object") + throw TypeError(".proto.SyncActionValue.removeRecentStickerAction: object expected"); + message.removeRecentStickerAction = $root.proto.SyncActionValue.RemoveRecentStickerAction.fromObject(object.removeRecentStickerAction); + } + if (object.chatAssignment != null) { + if (typeof object.chatAssignment !== "object") + throw TypeError(".proto.SyncActionValue.chatAssignment: object expected"); + message.chatAssignment = $root.proto.SyncActionValue.ChatAssignmentAction.fromObject(object.chatAssignment); + } + if (object.chatAssignmentOpenedStatus != null) { + if (typeof object.chatAssignmentOpenedStatus !== "object") + throw TypeError(".proto.SyncActionValue.chatAssignmentOpenedStatus: object expected"); + message.chatAssignmentOpenedStatus = $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction.fromObject(object.chatAssignmentOpenedStatus); + } + return message; + }; + + /** + * Creates a plain object from a SyncActionValue message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue + * @static + * @param {proto.SyncActionValue} message SyncActionValue + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncActionValue.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + object.starAction = null; + object.contactAction = null; + object.muteAction = null; + object.pinAction = null; + object.securityNotificationSetting = null; + object.pushNameSetting = null; + object.quickReplyAction = null; + object.recentEmojiWeightsAction = null; + object.labelEditAction = null; + object.labelAssociationAction = null; + object.localeSetting = null; + object.archiveChatAction = null; + object.deleteMessageForMeAction = null; + object.keyExpiration = null; + object.markChatAsReadAction = null; + object.clearChatAction = null; + object.deleteChatAction = null; + object.unarchiveChatsSetting = null; + object.primaryFeature = null; + object.androidUnsupportedActions = null; + object.agentAction = null; + object.subscriptionAction = null; + object.userStatusMuteAction = null; + object.timeFormatAction = null; + object.nuxAction = null; + object.primaryVersionAction = null; + object.stickerAction = null; + object.removeRecentStickerAction = null; + object.chatAssignment = null; + object.chatAssignmentOpenedStatus = null; + } + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp; + if (message.starAction != null && message.hasOwnProperty("starAction")) + object.starAction = $root.proto.SyncActionValue.StarAction.toObject(message.starAction, options); + if (message.contactAction != null && message.hasOwnProperty("contactAction")) + object.contactAction = $root.proto.SyncActionValue.ContactAction.toObject(message.contactAction, options); + if (message.muteAction != null && message.hasOwnProperty("muteAction")) + object.muteAction = $root.proto.SyncActionValue.MuteAction.toObject(message.muteAction, options); + if (message.pinAction != null && message.hasOwnProperty("pinAction")) + object.pinAction = $root.proto.SyncActionValue.PinAction.toObject(message.pinAction, options); + if (message.securityNotificationSetting != null && message.hasOwnProperty("securityNotificationSetting")) + object.securityNotificationSetting = $root.proto.SyncActionValue.SecurityNotificationSetting.toObject(message.securityNotificationSetting, options); + if (message.pushNameSetting != null && message.hasOwnProperty("pushNameSetting")) + object.pushNameSetting = $root.proto.SyncActionValue.PushNameSetting.toObject(message.pushNameSetting, options); + if (message.quickReplyAction != null && message.hasOwnProperty("quickReplyAction")) + object.quickReplyAction = $root.proto.SyncActionValue.QuickReplyAction.toObject(message.quickReplyAction, options); + if (message.recentEmojiWeightsAction != null && message.hasOwnProperty("recentEmojiWeightsAction")) + object.recentEmojiWeightsAction = $root.proto.SyncActionValue.RecentEmojiWeightsAction.toObject(message.recentEmojiWeightsAction, options); + if (message.labelEditAction != null && message.hasOwnProperty("labelEditAction")) + object.labelEditAction = $root.proto.SyncActionValue.LabelEditAction.toObject(message.labelEditAction, options); + if (message.labelAssociationAction != null && message.hasOwnProperty("labelAssociationAction")) + object.labelAssociationAction = $root.proto.SyncActionValue.LabelAssociationAction.toObject(message.labelAssociationAction, options); + if (message.localeSetting != null && message.hasOwnProperty("localeSetting")) + object.localeSetting = $root.proto.SyncActionValue.LocaleSetting.toObject(message.localeSetting, options); + if (message.archiveChatAction != null && message.hasOwnProperty("archiveChatAction")) + object.archiveChatAction = $root.proto.SyncActionValue.ArchiveChatAction.toObject(message.archiveChatAction, options); + if (message.deleteMessageForMeAction != null && message.hasOwnProperty("deleteMessageForMeAction")) + object.deleteMessageForMeAction = $root.proto.SyncActionValue.DeleteMessageForMeAction.toObject(message.deleteMessageForMeAction, options); + if (message.keyExpiration != null && message.hasOwnProperty("keyExpiration")) + object.keyExpiration = $root.proto.SyncActionValue.KeyExpiration.toObject(message.keyExpiration, options); + if (message.markChatAsReadAction != null && message.hasOwnProperty("markChatAsReadAction")) + object.markChatAsReadAction = $root.proto.SyncActionValue.MarkChatAsReadAction.toObject(message.markChatAsReadAction, options); + if (message.clearChatAction != null && message.hasOwnProperty("clearChatAction")) + object.clearChatAction = $root.proto.SyncActionValue.ClearChatAction.toObject(message.clearChatAction, options); + if (message.deleteChatAction != null && message.hasOwnProperty("deleteChatAction")) + object.deleteChatAction = $root.proto.SyncActionValue.DeleteChatAction.toObject(message.deleteChatAction, options); + if (message.unarchiveChatsSetting != null && message.hasOwnProperty("unarchiveChatsSetting")) + object.unarchiveChatsSetting = $root.proto.SyncActionValue.UnarchiveChatsSetting.toObject(message.unarchiveChatsSetting, options); + if (message.primaryFeature != null && message.hasOwnProperty("primaryFeature")) + object.primaryFeature = $root.proto.SyncActionValue.PrimaryFeature.toObject(message.primaryFeature, options); + if (message.androidUnsupportedActions != null && message.hasOwnProperty("androidUnsupportedActions")) + object.androidUnsupportedActions = $root.proto.SyncActionValue.AndroidUnsupportedActions.toObject(message.androidUnsupportedActions, options); + if (message.agentAction != null && message.hasOwnProperty("agentAction")) + object.agentAction = $root.proto.SyncActionValue.AgentAction.toObject(message.agentAction, options); + if (message.subscriptionAction != null && message.hasOwnProperty("subscriptionAction")) + object.subscriptionAction = $root.proto.SyncActionValue.SubscriptionAction.toObject(message.subscriptionAction, options); + if (message.userStatusMuteAction != null && message.hasOwnProperty("userStatusMuteAction")) + object.userStatusMuteAction = $root.proto.SyncActionValue.UserStatusMuteAction.toObject(message.userStatusMuteAction, options); + if (message.timeFormatAction != null && message.hasOwnProperty("timeFormatAction")) + object.timeFormatAction = $root.proto.SyncActionValue.TimeFormatAction.toObject(message.timeFormatAction, options); + if (message.nuxAction != null && message.hasOwnProperty("nuxAction")) + object.nuxAction = $root.proto.SyncActionValue.NuxAction.toObject(message.nuxAction, options); + if (message.primaryVersionAction != null && message.hasOwnProperty("primaryVersionAction")) + object.primaryVersionAction = $root.proto.SyncActionValue.PrimaryVersionAction.toObject(message.primaryVersionAction, options); + if (message.stickerAction != null && message.hasOwnProperty("stickerAction")) + object.stickerAction = $root.proto.SyncActionValue.StickerAction.toObject(message.stickerAction, options); + if (message.removeRecentStickerAction != null && message.hasOwnProperty("removeRecentStickerAction")) + object.removeRecentStickerAction = $root.proto.SyncActionValue.RemoveRecentStickerAction.toObject(message.removeRecentStickerAction, options); + if (message.chatAssignment != null && message.hasOwnProperty("chatAssignment")) + object.chatAssignment = $root.proto.SyncActionValue.ChatAssignmentAction.toObject(message.chatAssignment, options); + if (message.chatAssignmentOpenedStatus != null && message.hasOwnProperty("chatAssignmentOpenedStatus")) + object.chatAssignmentOpenedStatus = $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction.toObject(message.chatAssignmentOpenedStatus, options); + return object; + }; + + /** + * Converts this SyncActionValue to JSON. + * @function toJSON + * @memberof proto.SyncActionValue + * @instance + * @returns {Object.} JSON object + */ + SyncActionValue.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + SyncActionValue.AgentAction = (function() { + + /** + * Properties of an AgentAction. + * @memberof proto.SyncActionValue + * @interface IAgentAction + * @property {string|null} [name] AgentAction name + * @property {number|null} [deviceID] AgentAction deviceID + * @property {boolean|null} [isDeleted] AgentAction isDeleted + */ + + /** + * Constructs a new AgentAction. + * @memberof proto.SyncActionValue + * @classdesc Represents an AgentAction. + * @implements IAgentAction + * @constructor + * @param {proto.SyncActionValue.IAgentAction=} [properties] Properties to set + */ + function AgentAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AgentAction name. + * @member {string} name + * @memberof proto.SyncActionValue.AgentAction + * @instance + */ + AgentAction.prototype.name = ""; + + /** + * AgentAction deviceID. + * @member {number} deviceID + * @memberof proto.SyncActionValue.AgentAction + * @instance + */ + AgentAction.prototype.deviceID = 0; + + /** + * AgentAction isDeleted. + * @member {boolean} isDeleted + * @memberof proto.SyncActionValue.AgentAction + * @instance + */ + AgentAction.prototype.isDeleted = false; + + /** + * Creates a new AgentAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {proto.SyncActionValue.IAgentAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.AgentAction} AgentAction instance + */ + AgentAction.create = function create(properties) { + return new AgentAction(properties); + }; + + /** + * Encodes the specified AgentAction message. Does not implicitly {@link proto.SyncActionValue.AgentAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {proto.SyncActionValue.IAgentAction} message AgentAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AgentAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.deviceID != null && Object.hasOwnProperty.call(message, "deviceID")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.deviceID); + if (message.isDeleted != null && Object.hasOwnProperty.call(message, "isDeleted")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.isDeleted); + return writer; + }; + + /** + * Encodes the specified AgentAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.AgentAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {proto.SyncActionValue.IAgentAction} message AgentAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AgentAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AgentAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.AgentAction} AgentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AgentAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.AgentAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.deviceID = reader.int32(); + break; + case 3: + message.isDeleted = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AgentAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.AgentAction} AgentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AgentAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AgentAction message. + * @function verify + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AgentAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.deviceID != null && message.hasOwnProperty("deviceID")) + if (!$util.isInteger(message.deviceID)) + return "deviceID: integer expected"; + if (message.isDeleted != null && message.hasOwnProperty("isDeleted")) + if (typeof message.isDeleted !== "boolean") + return "isDeleted: boolean expected"; + return null; + }; + + /** + * Creates an AgentAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.AgentAction} AgentAction + */ + AgentAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.AgentAction) + return object; + var message = new $root.proto.SyncActionValue.AgentAction(); + if (object.name != null) + message.name = String(object.name); + if (object.deviceID != null) + message.deviceID = object.deviceID | 0; + if (object.isDeleted != null) + message.isDeleted = Boolean(object.isDeleted); + return message; + }; + + /** + * Creates a plain object from an AgentAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.AgentAction + * @static + * @param {proto.SyncActionValue.AgentAction} message AgentAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AgentAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.name = ""; + object.deviceID = 0; + object.isDeleted = false; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.deviceID != null && message.hasOwnProperty("deviceID")) + object.deviceID = message.deviceID; + if (message.isDeleted != null && message.hasOwnProperty("isDeleted")) + object.isDeleted = message.isDeleted; + return object; + }; + + /** + * Converts this AgentAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.AgentAction + * @instance + * @returns {Object.} JSON object + */ + AgentAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AgentAction; + })(); + + SyncActionValue.AndroidUnsupportedActions = (function() { + + /** + * Properties of an AndroidUnsupportedActions. + * @memberof proto.SyncActionValue + * @interface IAndroidUnsupportedActions + * @property {boolean|null} [allowed] AndroidUnsupportedActions allowed + */ + + /** + * Constructs a new AndroidUnsupportedActions. + * @memberof proto.SyncActionValue + * @classdesc Represents an AndroidUnsupportedActions. + * @implements IAndroidUnsupportedActions + * @constructor + * @param {proto.SyncActionValue.IAndroidUnsupportedActions=} [properties] Properties to set + */ + function AndroidUnsupportedActions(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * AndroidUnsupportedActions allowed. + * @member {boolean} allowed + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @instance + */ + AndroidUnsupportedActions.prototype.allowed = false; + + /** + * Creates a new AndroidUnsupportedActions instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {proto.SyncActionValue.IAndroidUnsupportedActions=} [properties] Properties to set + * @returns {proto.SyncActionValue.AndroidUnsupportedActions} AndroidUnsupportedActions instance + */ + AndroidUnsupportedActions.create = function create(properties) { + return new AndroidUnsupportedActions(properties); + }; + + /** + * Encodes the specified AndroidUnsupportedActions message. Does not implicitly {@link proto.SyncActionValue.AndroidUnsupportedActions.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {proto.SyncActionValue.IAndroidUnsupportedActions} message AndroidUnsupportedActions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AndroidUnsupportedActions.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.allowed != null && Object.hasOwnProperty.call(message, "allowed")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.allowed); + return writer; + }; + + /** + * Encodes the specified AndroidUnsupportedActions message, length delimited. Does not implicitly {@link proto.SyncActionValue.AndroidUnsupportedActions.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {proto.SyncActionValue.IAndroidUnsupportedActions} message AndroidUnsupportedActions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + AndroidUnsupportedActions.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an AndroidUnsupportedActions message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.AndroidUnsupportedActions} AndroidUnsupportedActions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AndroidUnsupportedActions.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.AndroidUnsupportedActions(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.allowed = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an AndroidUnsupportedActions message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.AndroidUnsupportedActions} AndroidUnsupportedActions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + AndroidUnsupportedActions.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an AndroidUnsupportedActions message. + * @function verify + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + AndroidUnsupportedActions.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.allowed != null && message.hasOwnProperty("allowed")) + if (typeof message.allowed !== "boolean") + return "allowed: boolean expected"; + return null; + }; + + /** + * Creates an AndroidUnsupportedActions message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.AndroidUnsupportedActions} AndroidUnsupportedActions + */ + AndroidUnsupportedActions.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.AndroidUnsupportedActions) + return object; + var message = new $root.proto.SyncActionValue.AndroidUnsupportedActions(); + if (object.allowed != null) + message.allowed = Boolean(object.allowed); + return message; + }; + + /** + * Creates a plain object from an AndroidUnsupportedActions message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @static + * @param {proto.SyncActionValue.AndroidUnsupportedActions} message AndroidUnsupportedActions + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + AndroidUnsupportedActions.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.allowed = false; + if (message.allowed != null && message.hasOwnProperty("allowed")) + object.allowed = message.allowed; + return object; + }; + + /** + * Converts this AndroidUnsupportedActions to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.AndroidUnsupportedActions + * @instance + * @returns {Object.} JSON object + */ + AndroidUnsupportedActions.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return AndroidUnsupportedActions; + })(); + + SyncActionValue.ArchiveChatAction = (function() { + + /** + * Properties of an ArchiveChatAction. + * @memberof proto.SyncActionValue + * @interface IArchiveChatAction + * @property {boolean|null} [archived] ArchiveChatAction archived + * @property {proto.SyncActionValue.ISyncActionMessageRange|null} [messageRange] ArchiveChatAction messageRange + */ + + /** + * Constructs a new ArchiveChatAction. + * @memberof proto.SyncActionValue + * @classdesc Represents an ArchiveChatAction. + * @implements IArchiveChatAction + * @constructor + * @param {proto.SyncActionValue.IArchiveChatAction=} [properties] Properties to set + */ + function ArchiveChatAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ArchiveChatAction archived. + * @member {boolean} archived + * @memberof proto.SyncActionValue.ArchiveChatAction + * @instance + */ + ArchiveChatAction.prototype.archived = false; + + /** + * ArchiveChatAction messageRange. + * @member {proto.SyncActionValue.ISyncActionMessageRange|null|undefined} messageRange + * @memberof proto.SyncActionValue.ArchiveChatAction + * @instance + */ + ArchiveChatAction.prototype.messageRange = null; + + /** + * Creates a new ArchiveChatAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {proto.SyncActionValue.IArchiveChatAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.ArchiveChatAction} ArchiveChatAction instance + */ + ArchiveChatAction.create = function create(properties) { + return new ArchiveChatAction(properties); + }; + + /** + * Encodes the specified ArchiveChatAction message. Does not implicitly {@link proto.SyncActionValue.ArchiveChatAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {proto.SyncActionValue.IArchiveChatAction} message ArchiveChatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ArchiveChatAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.archived != null && Object.hasOwnProperty.call(message, "archived")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.archived); + if (message.messageRange != null && Object.hasOwnProperty.call(message, "messageRange")) + $root.proto.SyncActionValue.SyncActionMessageRange.encode(message.messageRange, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ArchiveChatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ArchiveChatAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {proto.SyncActionValue.IArchiveChatAction} message ArchiveChatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ArchiveChatAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an ArchiveChatAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.ArchiveChatAction} ArchiveChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ArchiveChatAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.ArchiveChatAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.archived = reader.bool(); + break; + case 2: + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an ArchiveChatAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.ArchiveChatAction} ArchiveChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ArchiveChatAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an ArchiveChatAction message. + * @function verify + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ArchiveChatAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.archived != null && message.hasOwnProperty("archived")) + if (typeof message.archived !== "boolean") + return "archived: boolean expected"; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) { + var error = $root.proto.SyncActionValue.SyncActionMessageRange.verify(message.messageRange); + if (error) + return "messageRange." + error; + } + return null; + }; + + /** + * Creates an ArchiveChatAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.ArchiveChatAction} ArchiveChatAction + */ + ArchiveChatAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.ArchiveChatAction) + return object; + var message = new $root.proto.SyncActionValue.ArchiveChatAction(); + if (object.archived != null) + message.archived = Boolean(object.archived); + if (object.messageRange != null) { + if (typeof object.messageRange !== "object") + throw TypeError(".proto.SyncActionValue.ArchiveChatAction.messageRange: object expected"); + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.fromObject(object.messageRange); + } + return message; + }; + + /** + * Creates a plain object from an ArchiveChatAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.ArchiveChatAction + * @static + * @param {proto.SyncActionValue.ArchiveChatAction} message ArchiveChatAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ArchiveChatAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.archived = false; + object.messageRange = null; + } + if (message.archived != null && message.hasOwnProperty("archived")) + object.archived = message.archived; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) + object.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.toObject(message.messageRange, options); + return object; + }; + + /** + * Converts this ArchiveChatAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.ArchiveChatAction + * @instance + * @returns {Object.} JSON object + */ + ArchiveChatAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ArchiveChatAction; + })(); + + SyncActionValue.ChatAssignmentAction = (function() { + + /** + * Properties of a ChatAssignmentAction. + * @memberof proto.SyncActionValue + * @interface IChatAssignmentAction + * @property {string|null} [deviceAgentID] ChatAssignmentAction deviceAgentID + */ + + /** + * Constructs a new ChatAssignmentAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a ChatAssignmentAction. + * @implements IChatAssignmentAction + * @constructor + * @param {proto.SyncActionValue.IChatAssignmentAction=} [properties] Properties to set + */ + function ChatAssignmentAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ChatAssignmentAction deviceAgentID. + * @member {string} deviceAgentID + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @instance + */ + ChatAssignmentAction.prototype.deviceAgentID = ""; + + /** + * Creates a new ChatAssignmentAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {proto.SyncActionValue.IChatAssignmentAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.ChatAssignmentAction} ChatAssignmentAction instance + */ + ChatAssignmentAction.create = function create(properties) { + return new ChatAssignmentAction(properties); + }; + + /** + * Encodes the specified ChatAssignmentAction message. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {proto.SyncActionValue.IChatAssignmentAction} message ChatAssignmentAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChatAssignmentAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.deviceAgentID != null && Object.hasOwnProperty.call(message, "deviceAgentID")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.deviceAgentID); + return writer; + }; + + /** + * Encodes the specified ChatAssignmentAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {proto.SyncActionValue.IChatAssignmentAction} message ChatAssignmentAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChatAssignmentAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ChatAssignmentAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.ChatAssignmentAction} ChatAssignmentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChatAssignmentAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.ChatAssignmentAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.deviceAgentID = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ChatAssignmentAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.ChatAssignmentAction} ChatAssignmentAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChatAssignmentAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ChatAssignmentAction message. + * @function verify + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ChatAssignmentAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.deviceAgentID != null && message.hasOwnProperty("deviceAgentID")) + if (!$util.isString(message.deviceAgentID)) + return "deviceAgentID: string expected"; + return null; + }; + + /** + * Creates a ChatAssignmentAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.ChatAssignmentAction} ChatAssignmentAction + */ + ChatAssignmentAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.ChatAssignmentAction) + return object; + var message = new $root.proto.SyncActionValue.ChatAssignmentAction(); + if (object.deviceAgentID != null) + message.deviceAgentID = String(object.deviceAgentID); + return message; + }; + + /** + * Creates a plain object from a ChatAssignmentAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @static + * @param {proto.SyncActionValue.ChatAssignmentAction} message ChatAssignmentAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ChatAssignmentAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.deviceAgentID = ""; + if (message.deviceAgentID != null && message.hasOwnProperty("deviceAgentID")) + object.deviceAgentID = message.deviceAgentID; + return object; + }; + + /** + * Converts this ChatAssignmentAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.ChatAssignmentAction + * @instance + * @returns {Object.} JSON object + */ + ChatAssignmentAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ChatAssignmentAction; + })(); + + SyncActionValue.ChatAssignmentOpenedStatusAction = (function() { + + /** + * Properties of a ChatAssignmentOpenedStatusAction. + * @memberof proto.SyncActionValue + * @interface IChatAssignmentOpenedStatusAction + * @property {boolean|null} [chatOpened] ChatAssignmentOpenedStatusAction chatOpened + */ + + /** + * Constructs a new ChatAssignmentOpenedStatusAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a ChatAssignmentOpenedStatusAction. + * @implements IChatAssignmentOpenedStatusAction + * @constructor + * @param {proto.SyncActionValue.IChatAssignmentOpenedStatusAction=} [properties] Properties to set + */ + function ChatAssignmentOpenedStatusAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ChatAssignmentOpenedStatusAction chatOpened. + * @member {boolean} chatOpened + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @instance + */ + ChatAssignmentOpenedStatusAction.prototype.chatOpened = false; + + /** + * Creates a new ChatAssignmentOpenedStatusAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {proto.SyncActionValue.IChatAssignmentOpenedStatusAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.ChatAssignmentOpenedStatusAction} ChatAssignmentOpenedStatusAction instance + */ + ChatAssignmentOpenedStatusAction.create = function create(properties) { + return new ChatAssignmentOpenedStatusAction(properties); + }; + + /** + * Encodes the specified ChatAssignmentOpenedStatusAction message. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentOpenedStatusAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {proto.SyncActionValue.IChatAssignmentOpenedStatusAction} message ChatAssignmentOpenedStatusAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChatAssignmentOpenedStatusAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.chatOpened != null && Object.hasOwnProperty.call(message, "chatOpened")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.chatOpened); + return writer; + }; + + /** + * Encodes the specified ChatAssignmentOpenedStatusAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ChatAssignmentOpenedStatusAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {proto.SyncActionValue.IChatAssignmentOpenedStatusAction} message ChatAssignmentOpenedStatusAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ChatAssignmentOpenedStatusAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ChatAssignmentOpenedStatusAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.ChatAssignmentOpenedStatusAction} ChatAssignmentOpenedStatusAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChatAssignmentOpenedStatusAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.chatOpened = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ChatAssignmentOpenedStatusAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.ChatAssignmentOpenedStatusAction} ChatAssignmentOpenedStatusAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ChatAssignmentOpenedStatusAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ChatAssignmentOpenedStatusAction message. + * @function verify + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ChatAssignmentOpenedStatusAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.chatOpened != null && message.hasOwnProperty("chatOpened")) + if (typeof message.chatOpened !== "boolean") + return "chatOpened: boolean expected"; + return null; + }; + + /** + * Creates a ChatAssignmentOpenedStatusAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.ChatAssignmentOpenedStatusAction} ChatAssignmentOpenedStatusAction + */ + ChatAssignmentOpenedStatusAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction) + return object; + var message = new $root.proto.SyncActionValue.ChatAssignmentOpenedStatusAction(); + if (object.chatOpened != null) + message.chatOpened = Boolean(object.chatOpened); + return message; + }; + + /** + * Creates a plain object from a ChatAssignmentOpenedStatusAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @static + * @param {proto.SyncActionValue.ChatAssignmentOpenedStatusAction} message ChatAssignmentOpenedStatusAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ChatAssignmentOpenedStatusAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.chatOpened = false; + if (message.chatOpened != null && message.hasOwnProperty("chatOpened")) + object.chatOpened = message.chatOpened; + return object; + }; + + /** + * Converts this ChatAssignmentOpenedStatusAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.ChatAssignmentOpenedStatusAction + * @instance + * @returns {Object.} JSON object + */ + ChatAssignmentOpenedStatusAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ChatAssignmentOpenedStatusAction; + })(); + + SyncActionValue.ClearChatAction = (function() { + + /** + * Properties of a ClearChatAction. + * @memberof proto.SyncActionValue + * @interface IClearChatAction + * @property {proto.SyncActionValue.ISyncActionMessageRange|null} [messageRange] ClearChatAction messageRange + */ + + /** + * Constructs a new ClearChatAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a ClearChatAction. + * @implements IClearChatAction + * @constructor + * @param {proto.SyncActionValue.IClearChatAction=} [properties] Properties to set + */ + function ClearChatAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ClearChatAction messageRange. + * @member {proto.SyncActionValue.ISyncActionMessageRange|null|undefined} messageRange + * @memberof proto.SyncActionValue.ClearChatAction + * @instance + */ + ClearChatAction.prototype.messageRange = null; + + /** + * Creates a new ClearChatAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {proto.SyncActionValue.IClearChatAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.ClearChatAction} ClearChatAction instance + */ + ClearChatAction.create = function create(properties) { + return new ClearChatAction(properties); + }; + + /** + * Encodes the specified ClearChatAction message. Does not implicitly {@link proto.SyncActionValue.ClearChatAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {proto.SyncActionValue.IClearChatAction} message ClearChatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClearChatAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.messageRange != null && Object.hasOwnProperty.call(message, "messageRange")) + $root.proto.SyncActionValue.SyncActionMessageRange.encode(message.messageRange, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ClearChatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ClearChatAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {proto.SyncActionValue.IClearChatAction} message ClearChatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ClearChatAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ClearChatAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.ClearChatAction} ClearChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClearChatAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.ClearChatAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ClearChatAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.ClearChatAction} ClearChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ClearChatAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ClearChatAction message. + * @function verify + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ClearChatAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) { + var error = $root.proto.SyncActionValue.SyncActionMessageRange.verify(message.messageRange); + if (error) + return "messageRange." + error; + } + return null; + }; + + /** + * Creates a ClearChatAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.ClearChatAction} ClearChatAction + */ + ClearChatAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.ClearChatAction) + return object; + var message = new $root.proto.SyncActionValue.ClearChatAction(); + if (object.messageRange != null) { + if (typeof object.messageRange !== "object") + throw TypeError(".proto.SyncActionValue.ClearChatAction.messageRange: object expected"); + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.fromObject(object.messageRange); + } + return message; + }; + + /** + * Creates a plain object from a ClearChatAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.ClearChatAction + * @static + * @param {proto.SyncActionValue.ClearChatAction} message ClearChatAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ClearChatAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.messageRange = null; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) + object.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.toObject(message.messageRange, options); + return object; + }; + + /** + * Converts this ClearChatAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.ClearChatAction + * @instance + * @returns {Object.} JSON object + */ + ClearChatAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ClearChatAction; + })(); + + SyncActionValue.ContactAction = (function() { + + /** + * Properties of a ContactAction. + * @memberof proto.SyncActionValue + * @interface IContactAction + * @property {string|null} [fullName] ContactAction fullName + * @property {string|null} [firstName] ContactAction firstName + * @property {string|null} [lidJid] ContactAction lidJid + */ + + /** + * Constructs a new ContactAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a ContactAction. + * @implements IContactAction + * @constructor + * @param {proto.SyncActionValue.IContactAction=} [properties] Properties to set + */ + function ContactAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ContactAction fullName. + * @member {string} fullName + * @memberof proto.SyncActionValue.ContactAction + * @instance + */ + ContactAction.prototype.fullName = ""; + + /** + * ContactAction firstName. + * @member {string} firstName + * @memberof proto.SyncActionValue.ContactAction + * @instance + */ + ContactAction.prototype.firstName = ""; + + /** + * ContactAction lidJid. + * @member {string} lidJid + * @memberof proto.SyncActionValue.ContactAction + * @instance + */ + ContactAction.prototype.lidJid = ""; + + /** + * Creates a new ContactAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {proto.SyncActionValue.IContactAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.ContactAction} ContactAction instance + */ + ContactAction.create = function create(properties) { + return new ContactAction(properties); + }; + + /** + * Encodes the specified ContactAction message. Does not implicitly {@link proto.SyncActionValue.ContactAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {proto.SyncActionValue.IContactAction} message ContactAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContactAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.fullName != null && Object.hasOwnProperty.call(message, "fullName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.fullName); + if (message.firstName != null && Object.hasOwnProperty.call(message, "firstName")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.firstName); + if (message.lidJid != null && Object.hasOwnProperty.call(message, "lidJid")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.lidJid); + return writer; + }; + + /** + * Encodes the specified ContactAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.ContactAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {proto.SyncActionValue.IContactAction} message ContactAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContactAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContactAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.ContactAction} ContactAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContactAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.ContactAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.fullName = reader.string(); + break; + case 2: + message.firstName = reader.string(); + break; + case 3: + message.lidJid = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContactAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.ContactAction} ContactAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContactAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContactAction message. + * @function verify + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContactAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.fullName != null && message.hasOwnProperty("fullName")) + if (!$util.isString(message.fullName)) + return "fullName: string expected"; + if (message.firstName != null && message.hasOwnProperty("firstName")) + if (!$util.isString(message.firstName)) + return "firstName: string expected"; + if (message.lidJid != null && message.hasOwnProperty("lidJid")) + if (!$util.isString(message.lidJid)) + return "lidJid: string expected"; + return null; + }; + + /** + * Creates a ContactAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.ContactAction} ContactAction + */ + ContactAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.ContactAction) + return object; + var message = new $root.proto.SyncActionValue.ContactAction(); + if (object.fullName != null) + message.fullName = String(object.fullName); + if (object.firstName != null) + message.firstName = String(object.firstName); + if (object.lidJid != null) + message.lidJid = String(object.lidJid); + return message; + }; + + /** + * Creates a plain object from a ContactAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.ContactAction + * @static + * @param {proto.SyncActionValue.ContactAction} message ContactAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ContactAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.fullName = ""; + object.firstName = ""; + object.lidJid = ""; + } + if (message.fullName != null && message.hasOwnProperty("fullName")) + object.fullName = message.fullName; + if (message.firstName != null && message.hasOwnProperty("firstName")) + object.firstName = message.firstName; + if (message.lidJid != null && message.hasOwnProperty("lidJid")) + object.lidJid = message.lidJid; + return object; + }; + + /** + * Converts this ContactAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.ContactAction + * @instance + * @returns {Object.} JSON object + */ + ContactAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ContactAction; + })(); + + SyncActionValue.DeleteChatAction = (function() { + + /** + * Properties of a DeleteChatAction. + * @memberof proto.SyncActionValue + * @interface IDeleteChatAction + * @property {proto.SyncActionValue.ISyncActionMessageRange|null} [messageRange] DeleteChatAction messageRange + */ + + /** + * Constructs a new DeleteChatAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a DeleteChatAction. + * @implements IDeleteChatAction + * @constructor + * @param {proto.SyncActionValue.IDeleteChatAction=} [properties] Properties to set + */ + function DeleteChatAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DeleteChatAction messageRange. + * @member {proto.SyncActionValue.ISyncActionMessageRange|null|undefined} messageRange + * @memberof proto.SyncActionValue.DeleteChatAction + * @instance + */ + DeleteChatAction.prototype.messageRange = null; + + /** + * Creates a new DeleteChatAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {proto.SyncActionValue.IDeleteChatAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.DeleteChatAction} DeleteChatAction instance + */ + DeleteChatAction.create = function create(properties) { + return new DeleteChatAction(properties); + }; + + /** + * Encodes the specified DeleteChatAction message. Does not implicitly {@link proto.SyncActionValue.DeleteChatAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {proto.SyncActionValue.IDeleteChatAction} message DeleteChatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteChatAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.messageRange != null && Object.hasOwnProperty.call(message, "messageRange")) + $root.proto.SyncActionValue.SyncActionMessageRange.encode(message.messageRange, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified DeleteChatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.DeleteChatAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {proto.SyncActionValue.IDeleteChatAction} message DeleteChatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteChatAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeleteChatAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.DeleteChatAction} DeleteChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteChatAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.DeleteChatAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeleteChatAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.DeleteChatAction} DeleteChatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteChatAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeleteChatAction message. + * @function verify + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeleteChatAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) { + var error = $root.proto.SyncActionValue.SyncActionMessageRange.verify(message.messageRange); + if (error) + return "messageRange." + error; + } + return null; + }; + + /** + * Creates a DeleteChatAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.DeleteChatAction} DeleteChatAction + */ + DeleteChatAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.DeleteChatAction) + return object; + var message = new $root.proto.SyncActionValue.DeleteChatAction(); + if (object.messageRange != null) { + if (typeof object.messageRange !== "object") + throw TypeError(".proto.SyncActionValue.DeleteChatAction.messageRange: object expected"); + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.fromObject(object.messageRange); + } + return message; + }; + + /** + * Creates a plain object from a DeleteChatAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.DeleteChatAction + * @static + * @param {proto.SyncActionValue.DeleteChatAction} message DeleteChatAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeleteChatAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.messageRange = null; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) + object.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.toObject(message.messageRange, options); + return object; + }; + + /** + * Converts this DeleteChatAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.DeleteChatAction + * @instance + * @returns {Object.} JSON object + */ + DeleteChatAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DeleteChatAction; + })(); + + SyncActionValue.DeleteMessageForMeAction = (function() { + + /** + * Properties of a DeleteMessageForMeAction. + * @memberof proto.SyncActionValue + * @interface IDeleteMessageForMeAction + * @property {boolean|null} [deleteMedia] DeleteMessageForMeAction deleteMedia + * @property {number|Long|null} [messageTimestamp] DeleteMessageForMeAction messageTimestamp + */ + + /** + * Constructs a new DeleteMessageForMeAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a DeleteMessageForMeAction. + * @implements IDeleteMessageForMeAction + * @constructor + * @param {proto.SyncActionValue.IDeleteMessageForMeAction=} [properties] Properties to set + */ + function DeleteMessageForMeAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DeleteMessageForMeAction deleteMedia. + * @member {boolean} deleteMedia + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @instance + */ + DeleteMessageForMeAction.prototype.deleteMedia = false; + + /** + * DeleteMessageForMeAction messageTimestamp. + * @member {number|Long} messageTimestamp + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @instance + */ + DeleteMessageForMeAction.prototype.messageTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new DeleteMessageForMeAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {proto.SyncActionValue.IDeleteMessageForMeAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.DeleteMessageForMeAction} DeleteMessageForMeAction instance + */ + DeleteMessageForMeAction.create = function create(properties) { + return new DeleteMessageForMeAction(properties); + }; + + /** + * Encodes the specified DeleteMessageForMeAction message. Does not implicitly {@link proto.SyncActionValue.DeleteMessageForMeAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {proto.SyncActionValue.IDeleteMessageForMeAction} message DeleteMessageForMeAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteMessageForMeAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.deleteMedia != null && Object.hasOwnProperty.call(message, "deleteMedia")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.deleteMedia); + if (message.messageTimestamp != null && Object.hasOwnProperty.call(message, "messageTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.messageTimestamp); + return writer; + }; + + /** + * Encodes the specified DeleteMessageForMeAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.DeleteMessageForMeAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {proto.SyncActionValue.IDeleteMessageForMeAction} message DeleteMessageForMeAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DeleteMessageForMeAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DeleteMessageForMeAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.DeleteMessageForMeAction} DeleteMessageForMeAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteMessageForMeAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.DeleteMessageForMeAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.deleteMedia = reader.bool(); + break; + case 2: + message.messageTimestamp = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DeleteMessageForMeAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.DeleteMessageForMeAction} DeleteMessageForMeAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DeleteMessageForMeAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DeleteMessageForMeAction message. + * @function verify + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DeleteMessageForMeAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.deleteMedia != null && message.hasOwnProperty("deleteMedia")) + if (typeof message.deleteMedia !== "boolean") + return "deleteMedia: boolean expected"; + if (message.messageTimestamp != null && message.hasOwnProperty("messageTimestamp")) + if (!$util.isInteger(message.messageTimestamp) && !(message.messageTimestamp && $util.isInteger(message.messageTimestamp.low) && $util.isInteger(message.messageTimestamp.high))) + return "messageTimestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a DeleteMessageForMeAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.DeleteMessageForMeAction} DeleteMessageForMeAction + */ + DeleteMessageForMeAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.DeleteMessageForMeAction) + return object; + var message = new $root.proto.SyncActionValue.DeleteMessageForMeAction(); + if (object.deleteMedia != null) + message.deleteMedia = Boolean(object.deleteMedia); + if (object.messageTimestamp != null) + if ($util.Long) + (message.messageTimestamp = $util.Long.fromValue(object.messageTimestamp)).unsigned = false; + else if (typeof object.messageTimestamp === "string") + message.messageTimestamp = parseInt(object.messageTimestamp, 10); + else if (typeof object.messageTimestamp === "number") + message.messageTimestamp = object.messageTimestamp; + else if (typeof object.messageTimestamp === "object") + message.messageTimestamp = new $util.LongBits(object.messageTimestamp.low >>> 0, object.messageTimestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a DeleteMessageForMeAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @static + * @param {proto.SyncActionValue.DeleteMessageForMeAction} message DeleteMessageForMeAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DeleteMessageForMeAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.deleteMedia = false; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.messageTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.messageTimestamp = options.longs === String ? "0" : 0; + } + if (message.deleteMedia != null && message.hasOwnProperty("deleteMedia")) + object.deleteMedia = message.deleteMedia; + if (message.messageTimestamp != null && message.hasOwnProperty("messageTimestamp")) + if (typeof message.messageTimestamp === "number") + object.messageTimestamp = options.longs === String ? String(message.messageTimestamp) : message.messageTimestamp; + else + object.messageTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.messageTimestamp) : options.longs === Number ? new $util.LongBits(message.messageTimestamp.low >>> 0, message.messageTimestamp.high >>> 0).toNumber() : message.messageTimestamp; + return object; + }; + + /** + * Converts this DeleteMessageForMeAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.DeleteMessageForMeAction + * @instance + * @returns {Object.} JSON object + */ + DeleteMessageForMeAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DeleteMessageForMeAction; + })(); + + SyncActionValue.KeyExpiration = (function() { + + /** + * Properties of a KeyExpiration. + * @memberof proto.SyncActionValue + * @interface IKeyExpiration + * @property {number|null} [expiredKeyEpoch] KeyExpiration expiredKeyEpoch + */ + + /** + * Constructs a new KeyExpiration. + * @memberof proto.SyncActionValue + * @classdesc Represents a KeyExpiration. + * @implements IKeyExpiration + * @constructor + * @param {proto.SyncActionValue.IKeyExpiration=} [properties] Properties to set + */ + function KeyExpiration(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * KeyExpiration expiredKeyEpoch. + * @member {number} expiredKeyEpoch + * @memberof proto.SyncActionValue.KeyExpiration + * @instance + */ + KeyExpiration.prototype.expiredKeyEpoch = 0; + + /** + * Creates a new KeyExpiration instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {proto.SyncActionValue.IKeyExpiration=} [properties] Properties to set + * @returns {proto.SyncActionValue.KeyExpiration} KeyExpiration instance + */ + KeyExpiration.create = function create(properties) { + return new KeyExpiration(properties); + }; + + /** + * Encodes the specified KeyExpiration message. Does not implicitly {@link proto.SyncActionValue.KeyExpiration.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {proto.SyncActionValue.IKeyExpiration} message KeyExpiration message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeyExpiration.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.expiredKeyEpoch != null && Object.hasOwnProperty.call(message, "expiredKeyEpoch")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.expiredKeyEpoch); + return writer; + }; + + /** + * Encodes the specified KeyExpiration message, length delimited. Does not implicitly {@link proto.SyncActionValue.KeyExpiration.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {proto.SyncActionValue.IKeyExpiration} message KeyExpiration message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + KeyExpiration.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a KeyExpiration message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.KeyExpiration} KeyExpiration + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeyExpiration.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.KeyExpiration(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.expiredKeyEpoch = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a KeyExpiration message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.KeyExpiration} KeyExpiration + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + KeyExpiration.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a KeyExpiration message. + * @function verify + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + KeyExpiration.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.expiredKeyEpoch != null && message.hasOwnProperty("expiredKeyEpoch")) + if (!$util.isInteger(message.expiredKeyEpoch)) + return "expiredKeyEpoch: integer expected"; + return null; + }; + + /** + * Creates a KeyExpiration message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.KeyExpiration} KeyExpiration + */ + KeyExpiration.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.KeyExpiration) + return object; + var message = new $root.proto.SyncActionValue.KeyExpiration(); + if (object.expiredKeyEpoch != null) + message.expiredKeyEpoch = object.expiredKeyEpoch | 0; + return message; + }; + + /** + * Creates a plain object from a KeyExpiration message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.KeyExpiration + * @static + * @param {proto.SyncActionValue.KeyExpiration} message KeyExpiration + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + KeyExpiration.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.expiredKeyEpoch = 0; + if (message.expiredKeyEpoch != null && message.hasOwnProperty("expiredKeyEpoch")) + object.expiredKeyEpoch = message.expiredKeyEpoch; + return object; + }; + + /** + * Converts this KeyExpiration to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.KeyExpiration + * @instance + * @returns {Object.} JSON object + */ + KeyExpiration.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return KeyExpiration; + })(); + + SyncActionValue.LabelAssociationAction = (function() { + + /** + * Properties of a LabelAssociationAction. + * @memberof proto.SyncActionValue + * @interface ILabelAssociationAction + * @property {boolean|null} [labeled] LabelAssociationAction labeled + */ + + /** + * Constructs a new LabelAssociationAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a LabelAssociationAction. + * @implements ILabelAssociationAction + * @constructor + * @param {proto.SyncActionValue.ILabelAssociationAction=} [properties] Properties to set + */ + function LabelAssociationAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LabelAssociationAction labeled. + * @member {boolean} labeled + * @memberof proto.SyncActionValue.LabelAssociationAction + * @instance + */ + LabelAssociationAction.prototype.labeled = false; + + /** + * Creates a new LabelAssociationAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {proto.SyncActionValue.ILabelAssociationAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.LabelAssociationAction} LabelAssociationAction instance + */ + LabelAssociationAction.create = function create(properties) { + return new LabelAssociationAction(properties); + }; + + /** + * Encodes the specified LabelAssociationAction message. Does not implicitly {@link proto.SyncActionValue.LabelAssociationAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {proto.SyncActionValue.ILabelAssociationAction} message LabelAssociationAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LabelAssociationAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.labeled != null && Object.hasOwnProperty.call(message, "labeled")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.labeled); + return writer; + }; + + /** + * Encodes the specified LabelAssociationAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.LabelAssociationAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {proto.SyncActionValue.ILabelAssociationAction} message LabelAssociationAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LabelAssociationAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LabelAssociationAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.LabelAssociationAction} LabelAssociationAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LabelAssociationAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.LabelAssociationAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.labeled = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LabelAssociationAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.LabelAssociationAction} LabelAssociationAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LabelAssociationAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LabelAssociationAction message. + * @function verify + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LabelAssociationAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.labeled != null && message.hasOwnProperty("labeled")) + if (typeof message.labeled !== "boolean") + return "labeled: boolean expected"; + return null; + }; + + /** + * Creates a LabelAssociationAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.LabelAssociationAction} LabelAssociationAction + */ + LabelAssociationAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.LabelAssociationAction) + return object; + var message = new $root.proto.SyncActionValue.LabelAssociationAction(); + if (object.labeled != null) + message.labeled = Boolean(object.labeled); + return message; + }; + + /** + * Creates a plain object from a LabelAssociationAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.LabelAssociationAction + * @static + * @param {proto.SyncActionValue.LabelAssociationAction} message LabelAssociationAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LabelAssociationAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.labeled = false; + if (message.labeled != null && message.hasOwnProperty("labeled")) + object.labeled = message.labeled; + return object; + }; + + /** + * Converts this LabelAssociationAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.LabelAssociationAction + * @instance + * @returns {Object.} JSON object + */ + LabelAssociationAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return LabelAssociationAction; + })(); + + SyncActionValue.LabelEditAction = (function() { + + /** + * Properties of a LabelEditAction. + * @memberof proto.SyncActionValue + * @interface ILabelEditAction + * @property {string|null} [name] LabelEditAction name + * @property {number|null} [color] LabelEditAction color + * @property {number|null} [predefinedId] LabelEditAction predefinedId + * @property {boolean|null} [deleted] LabelEditAction deleted + */ + + /** + * Constructs a new LabelEditAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a LabelEditAction. + * @implements ILabelEditAction + * @constructor + * @param {proto.SyncActionValue.ILabelEditAction=} [properties] Properties to set + */ + function LabelEditAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LabelEditAction name. + * @member {string} name + * @memberof proto.SyncActionValue.LabelEditAction + * @instance + */ + LabelEditAction.prototype.name = ""; + + /** + * LabelEditAction color. + * @member {number} color + * @memberof proto.SyncActionValue.LabelEditAction + * @instance + */ + LabelEditAction.prototype.color = 0; + + /** + * LabelEditAction predefinedId. + * @member {number} predefinedId + * @memberof proto.SyncActionValue.LabelEditAction + * @instance + */ + LabelEditAction.prototype.predefinedId = 0; + + /** + * LabelEditAction deleted. + * @member {boolean} deleted + * @memberof proto.SyncActionValue.LabelEditAction + * @instance + */ + LabelEditAction.prototype.deleted = false; + + /** + * Creates a new LabelEditAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {proto.SyncActionValue.ILabelEditAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.LabelEditAction} LabelEditAction instance + */ + LabelEditAction.create = function create(properties) { + return new LabelEditAction(properties); + }; + + /** + * Encodes the specified LabelEditAction message. Does not implicitly {@link proto.SyncActionValue.LabelEditAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {proto.SyncActionValue.ILabelEditAction} message LabelEditAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LabelEditAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.color != null && Object.hasOwnProperty.call(message, "color")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.color); + if (message.predefinedId != null && Object.hasOwnProperty.call(message, "predefinedId")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.predefinedId); + if (message.deleted != null && Object.hasOwnProperty.call(message, "deleted")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.deleted); + return writer; + }; + + /** + * Encodes the specified LabelEditAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.LabelEditAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {proto.SyncActionValue.ILabelEditAction} message LabelEditAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LabelEditAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LabelEditAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.LabelEditAction} LabelEditAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LabelEditAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.LabelEditAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.color = reader.int32(); + break; + case 3: + message.predefinedId = reader.int32(); + break; + case 4: + message.deleted = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LabelEditAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.LabelEditAction} LabelEditAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LabelEditAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LabelEditAction message. + * @function verify + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LabelEditAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.color != null && message.hasOwnProperty("color")) + if (!$util.isInteger(message.color)) + return "color: integer expected"; + if (message.predefinedId != null && message.hasOwnProperty("predefinedId")) + if (!$util.isInteger(message.predefinedId)) + return "predefinedId: integer expected"; + if (message.deleted != null && message.hasOwnProperty("deleted")) + if (typeof message.deleted !== "boolean") + return "deleted: boolean expected"; + return null; + }; + + /** + * Creates a LabelEditAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.LabelEditAction} LabelEditAction + */ + LabelEditAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.LabelEditAction) + return object; + var message = new $root.proto.SyncActionValue.LabelEditAction(); + if (object.name != null) + message.name = String(object.name); + if (object.color != null) + message.color = object.color | 0; + if (object.predefinedId != null) + message.predefinedId = object.predefinedId | 0; + if (object.deleted != null) + message.deleted = Boolean(object.deleted); + return message; + }; + + /** + * Creates a plain object from a LabelEditAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.LabelEditAction + * @static + * @param {proto.SyncActionValue.LabelEditAction} message LabelEditAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LabelEditAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.name = ""; + object.color = 0; + object.predefinedId = 0; + object.deleted = false; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.color != null && message.hasOwnProperty("color")) + object.color = message.color; + if (message.predefinedId != null && message.hasOwnProperty("predefinedId")) + object.predefinedId = message.predefinedId; + if (message.deleted != null && message.hasOwnProperty("deleted")) + object.deleted = message.deleted; + return object; + }; + + /** + * Converts this LabelEditAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.LabelEditAction + * @instance + * @returns {Object.} JSON object + */ + LabelEditAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return LabelEditAction; + })(); + + SyncActionValue.LocaleSetting = (function() { + + /** + * Properties of a LocaleSetting. + * @memberof proto.SyncActionValue + * @interface ILocaleSetting + * @property {string|null} [locale] LocaleSetting locale + */ + + /** + * Constructs a new LocaleSetting. + * @memberof proto.SyncActionValue + * @classdesc Represents a LocaleSetting. + * @implements ILocaleSetting + * @constructor + * @param {proto.SyncActionValue.ILocaleSetting=} [properties] Properties to set + */ + function LocaleSetting(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * LocaleSetting locale. + * @member {string} locale + * @memberof proto.SyncActionValue.LocaleSetting + * @instance + */ + LocaleSetting.prototype.locale = ""; + + /** + * Creates a new LocaleSetting instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {proto.SyncActionValue.ILocaleSetting=} [properties] Properties to set + * @returns {proto.SyncActionValue.LocaleSetting} LocaleSetting instance + */ + LocaleSetting.create = function create(properties) { + return new LocaleSetting(properties); + }; + + /** + * Encodes the specified LocaleSetting message. Does not implicitly {@link proto.SyncActionValue.LocaleSetting.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {proto.SyncActionValue.ILocaleSetting} message LocaleSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LocaleSetting.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.locale != null && Object.hasOwnProperty.call(message, "locale")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.locale); + return writer; + }; + + /** + * Encodes the specified LocaleSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.LocaleSetting.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {proto.SyncActionValue.ILocaleSetting} message LocaleSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + LocaleSetting.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a LocaleSetting message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.LocaleSetting} LocaleSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LocaleSetting.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.LocaleSetting(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.locale = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a LocaleSetting message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.LocaleSetting} LocaleSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + LocaleSetting.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a LocaleSetting message. + * @function verify + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + LocaleSetting.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.locale != null && message.hasOwnProperty("locale")) + if (!$util.isString(message.locale)) + return "locale: string expected"; + return null; + }; + + /** + * Creates a LocaleSetting message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.LocaleSetting} LocaleSetting + */ + LocaleSetting.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.LocaleSetting) + return object; + var message = new $root.proto.SyncActionValue.LocaleSetting(); + if (object.locale != null) + message.locale = String(object.locale); + return message; + }; + + /** + * Creates a plain object from a LocaleSetting message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.LocaleSetting + * @static + * @param {proto.SyncActionValue.LocaleSetting} message LocaleSetting + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + LocaleSetting.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.locale = ""; + if (message.locale != null && message.hasOwnProperty("locale")) + object.locale = message.locale; + return object; + }; + + /** + * Converts this LocaleSetting to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.LocaleSetting + * @instance + * @returns {Object.} JSON object + */ + LocaleSetting.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return LocaleSetting; + })(); + + SyncActionValue.MarkChatAsReadAction = (function() { + + /** + * Properties of a MarkChatAsReadAction. + * @memberof proto.SyncActionValue + * @interface IMarkChatAsReadAction + * @property {boolean|null} [read] MarkChatAsReadAction read + * @property {proto.SyncActionValue.ISyncActionMessageRange|null} [messageRange] MarkChatAsReadAction messageRange + */ + + /** + * Constructs a new MarkChatAsReadAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a MarkChatAsReadAction. + * @implements IMarkChatAsReadAction + * @constructor + * @param {proto.SyncActionValue.IMarkChatAsReadAction=} [properties] Properties to set + */ + function MarkChatAsReadAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MarkChatAsReadAction read. + * @member {boolean} read + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @instance + */ + MarkChatAsReadAction.prototype.read = false; + + /** + * MarkChatAsReadAction messageRange. + * @member {proto.SyncActionValue.ISyncActionMessageRange|null|undefined} messageRange + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @instance + */ + MarkChatAsReadAction.prototype.messageRange = null; + + /** + * Creates a new MarkChatAsReadAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {proto.SyncActionValue.IMarkChatAsReadAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.MarkChatAsReadAction} MarkChatAsReadAction instance + */ + MarkChatAsReadAction.create = function create(properties) { + return new MarkChatAsReadAction(properties); + }; + + /** + * Encodes the specified MarkChatAsReadAction message. Does not implicitly {@link proto.SyncActionValue.MarkChatAsReadAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {proto.SyncActionValue.IMarkChatAsReadAction} message MarkChatAsReadAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MarkChatAsReadAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.read != null && Object.hasOwnProperty.call(message, "read")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.read); + if (message.messageRange != null && Object.hasOwnProperty.call(message, "messageRange")) + $root.proto.SyncActionValue.SyncActionMessageRange.encode(message.messageRange, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified MarkChatAsReadAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.MarkChatAsReadAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {proto.SyncActionValue.IMarkChatAsReadAction} message MarkChatAsReadAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MarkChatAsReadAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MarkChatAsReadAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.MarkChatAsReadAction} MarkChatAsReadAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MarkChatAsReadAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.MarkChatAsReadAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.read = reader.bool(); + break; + case 2: + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MarkChatAsReadAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.MarkChatAsReadAction} MarkChatAsReadAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MarkChatAsReadAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MarkChatAsReadAction message. + * @function verify + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MarkChatAsReadAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.read != null && message.hasOwnProperty("read")) + if (typeof message.read !== "boolean") + return "read: boolean expected"; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) { + var error = $root.proto.SyncActionValue.SyncActionMessageRange.verify(message.messageRange); + if (error) + return "messageRange." + error; + } + return null; + }; + + /** + * Creates a MarkChatAsReadAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.MarkChatAsReadAction} MarkChatAsReadAction + */ + MarkChatAsReadAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.MarkChatAsReadAction) + return object; + var message = new $root.proto.SyncActionValue.MarkChatAsReadAction(); + if (object.read != null) + message.read = Boolean(object.read); + if (object.messageRange != null) { + if (typeof object.messageRange !== "object") + throw TypeError(".proto.SyncActionValue.MarkChatAsReadAction.messageRange: object expected"); + message.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.fromObject(object.messageRange); + } + return message; + }; + + /** + * Creates a plain object from a MarkChatAsReadAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @static + * @param {proto.SyncActionValue.MarkChatAsReadAction} message MarkChatAsReadAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MarkChatAsReadAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.read = false; + object.messageRange = null; + } + if (message.read != null && message.hasOwnProperty("read")) + object.read = message.read; + if (message.messageRange != null && message.hasOwnProperty("messageRange")) + object.messageRange = $root.proto.SyncActionValue.SyncActionMessageRange.toObject(message.messageRange, options); + return object; + }; + + /** + * Converts this MarkChatAsReadAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.MarkChatAsReadAction + * @instance + * @returns {Object.} JSON object + */ + MarkChatAsReadAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MarkChatAsReadAction; + })(); + + SyncActionValue.MuteAction = (function() { + + /** + * Properties of a MuteAction. + * @memberof proto.SyncActionValue + * @interface IMuteAction + * @property {boolean|null} [muted] MuteAction muted + * @property {number|Long|null} [muteEndTimestamp] MuteAction muteEndTimestamp + * @property {boolean|null} [autoMuted] MuteAction autoMuted + */ + + /** + * Constructs a new MuteAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a MuteAction. + * @implements IMuteAction + * @constructor + * @param {proto.SyncActionValue.IMuteAction=} [properties] Properties to set + */ + function MuteAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MuteAction muted. + * @member {boolean} muted + * @memberof proto.SyncActionValue.MuteAction + * @instance + */ + MuteAction.prototype.muted = false; + + /** + * MuteAction muteEndTimestamp. + * @member {number|Long} muteEndTimestamp + * @memberof proto.SyncActionValue.MuteAction + * @instance + */ + MuteAction.prototype.muteEndTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * MuteAction autoMuted. + * @member {boolean} autoMuted + * @memberof proto.SyncActionValue.MuteAction + * @instance + */ + MuteAction.prototype.autoMuted = false; + + /** + * Creates a new MuteAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {proto.SyncActionValue.IMuteAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.MuteAction} MuteAction instance + */ + MuteAction.create = function create(properties) { + return new MuteAction(properties); + }; + + /** + * Encodes the specified MuteAction message. Does not implicitly {@link proto.SyncActionValue.MuteAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {proto.SyncActionValue.IMuteAction} message MuteAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MuteAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.muted != null && Object.hasOwnProperty.call(message, "muted")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.muted); + if (message.muteEndTimestamp != null && Object.hasOwnProperty.call(message, "muteEndTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.muteEndTimestamp); + if (message.autoMuted != null && Object.hasOwnProperty.call(message, "autoMuted")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.autoMuted); + return writer; + }; + + /** + * Encodes the specified MuteAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.MuteAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {proto.SyncActionValue.IMuteAction} message MuteAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MuteAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MuteAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.MuteAction} MuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MuteAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.MuteAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.muted = reader.bool(); + break; + case 2: + message.muteEndTimestamp = reader.int64(); + break; + case 3: + message.autoMuted = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MuteAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.MuteAction} MuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MuteAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MuteAction message. + * @function verify + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MuteAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.muted != null && message.hasOwnProperty("muted")) + if (typeof message.muted !== "boolean") + return "muted: boolean expected"; + if (message.muteEndTimestamp != null && message.hasOwnProperty("muteEndTimestamp")) + if (!$util.isInteger(message.muteEndTimestamp) && !(message.muteEndTimestamp && $util.isInteger(message.muteEndTimestamp.low) && $util.isInteger(message.muteEndTimestamp.high))) + return "muteEndTimestamp: integer|Long expected"; + if (message.autoMuted != null && message.hasOwnProperty("autoMuted")) + if (typeof message.autoMuted !== "boolean") + return "autoMuted: boolean expected"; + return null; + }; + + /** + * Creates a MuteAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.MuteAction} MuteAction + */ + MuteAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.MuteAction) + return object; + var message = new $root.proto.SyncActionValue.MuteAction(); + if (object.muted != null) + message.muted = Boolean(object.muted); + if (object.muteEndTimestamp != null) + if ($util.Long) + (message.muteEndTimestamp = $util.Long.fromValue(object.muteEndTimestamp)).unsigned = false; + else if (typeof object.muteEndTimestamp === "string") + message.muteEndTimestamp = parseInt(object.muteEndTimestamp, 10); + else if (typeof object.muteEndTimestamp === "number") + message.muteEndTimestamp = object.muteEndTimestamp; + else if (typeof object.muteEndTimestamp === "object") + message.muteEndTimestamp = new $util.LongBits(object.muteEndTimestamp.low >>> 0, object.muteEndTimestamp.high >>> 0).toNumber(); + if (object.autoMuted != null) + message.autoMuted = Boolean(object.autoMuted); + return message; + }; + + /** + * Creates a plain object from a MuteAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.MuteAction + * @static + * @param {proto.SyncActionValue.MuteAction} message MuteAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + MuteAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.muted = false; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.muteEndTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.muteEndTimestamp = options.longs === String ? "0" : 0; + object.autoMuted = false; + } + if (message.muted != null && message.hasOwnProperty("muted")) + object.muted = message.muted; + if (message.muteEndTimestamp != null && message.hasOwnProperty("muteEndTimestamp")) + if (typeof message.muteEndTimestamp === "number") + object.muteEndTimestamp = options.longs === String ? String(message.muteEndTimestamp) : message.muteEndTimestamp; + else + object.muteEndTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.muteEndTimestamp) : options.longs === Number ? new $util.LongBits(message.muteEndTimestamp.low >>> 0, message.muteEndTimestamp.high >>> 0).toNumber() : message.muteEndTimestamp; + if (message.autoMuted != null && message.hasOwnProperty("autoMuted")) + object.autoMuted = message.autoMuted; + return object; + }; + + /** + * Converts this MuteAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.MuteAction + * @instance + * @returns {Object.} JSON object + */ + MuteAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MuteAction; + })(); + + SyncActionValue.NuxAction = (function() { + + /** + * Properties of a NuxAction. + * @memberof proto.SyncActionValue + * @interface INuxAction + * @property {boolean|null} [acknowledged] NuxAction acknowledged + */ + + /** + * Constructs a new NuxAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a NuxAction. + * @implements INuxAction + * @constructor + * @param {proto.SyncActionValue.INuxAction=} [properties] Properties to set + */ + function NuxAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * NuxAction acknowledged. + * @member {boolean} acknowledged + * @memberof proto.SyncActionValue.NuxAction + * @instance + */ + NuxAction.prototype.acknowledged = false; + + /** + * Creates a new NuxAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {proto.SyncActionValue.INuxAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.NuxAction} NuxAction instance + */ + NuxAction.create = function create(properties) { + return new NuxAction(properties); + }; + + /** + * Encodes the specified NuxAction message. Does not implicitly {@link proto.SyncActionValue.NuxAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {proto.SyncActionValue.INuxAction} message NuxAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NuxAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.acknowledged != null && Object.hasOwnProperty.call(message, "acknowledged")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.acknowledged); + return writer; + }; + + /** + * Encodes the specified NuxAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.NuxAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {proto.SyncActionValue.INuxAction} message NuxAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + NuxAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a NuxAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.NuxAction} NuxAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NuxAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.NuxAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.acknowledged = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a NuxAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.NuxAction} NuxAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + NuxAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a NuxAction message. + * @function verify + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + NuxAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.acknowledged != null && message.hasOwnProperty("acknowledged")) + if (typeof message.acknowledged !== "boolean") + return "acknowledged: boolean expected"; + return null; + }; + + /** + * Creates a NuxAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.NuxAction} NuxAction + */ + NuxAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.NuxAction) + return object; + var message = new $root.proto.SyncActionValue.NuxAction(); + if (object.acknowledged != null) + message.acknowledged = Boolean(object.acknowledged); + return message; + }; + + /** + * Creates a plain object from a NuxAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.NuxAction + * @static + * @param {proto.SyncActionValue.NuxAction} message NuxAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + NuxAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.acknowledged = false; + if (message.acknowledged != null && message.hasOwnProperty("acknowledged")) + object.acknowledged = message.acknowledged; + return object; + }; + + /** + * Converts this NuxAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.NuxAction + * @instance + * @returns {Object.} JSON object + */ + NuxAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return NuxAction; + })(); + + SyncActionValue.PinAction = (function() { + + /** + * Properties of a PinAction. + * @memberof proto.SyncActionValue + * @interface IPinAction + * @property {boolean|null} [pinned] PinAction pinned + */ + + /** + * Constructs a new PinAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a PinAction. + * @implements IPinAction + * @constructor + * @param {proto.SyncActionValue.IPinAction=} [properties] Properties to set + */ + function PinAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PinAction pinned. + * @member {boolean} pinned + * @memberof proto.SyncActionValue.PinAction + * @instance + */ + PinAction.prototype.pinned = false; + + /** + * Creates a new PinAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {proto.SyncActionValue.IPinAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.PinAction} PinAction instance + */ + PinAction.create = function create(properties) { + return new PinAction(properties); + }; + + /** + * Encodes the specified PinAction message. Does not implicitly {@link proto.SyncActionValue.PinAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {proto.SyncActionValue.IPinAction} message PinAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PinAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.pinned != null && Object.hasOwnProperty.call(message, "pinned")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.pinned); + return writer; + }; + + /** + * Encodes the specified PinAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.PinAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {proto.SyncActionValue.IPinAction} message PinAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PinAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PinAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.PinAction} PinAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PinAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.PinAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.pinned = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PinAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.PinAction} PinAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PinAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PinAction message. + * @function verify + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PinAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.pinned != null && message.hasOwnProperty("pinned")) + if (typeof message.pinned !== "boolean") + return "pinned: boolean expected"; + return null; + }; + + /** + * Creates a PinAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.PinAction} PinAction + */ + PinAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.PinAction) + return object; + var message = new $root.proto.SyncActionValue.PinAction(); + if (object.pinned != null) + message.pinned = Boolean(object.pinned); + return message; + }; + + /** + * Creates a plain object from a PinAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.PinAction + * @static + * @param {proto.SyncActionValue.PinAction} message PinAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PinAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.pinned = false; + if (message.pinned != null && message.hasOwnProperty("pinned")) + object.pinned = message.pinned; + return object; + }; + + /** + * Converts this PinAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.PinAction + * @instance + * @returns {Object.} JSON object + */ + PinAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PinAction; + })(); + + SyncActionValue.PrimaryFeature = (function() { + + /** + * Properties of a PrimaryFeature. + * @memberof proto.SyncActionValue + * @interface IPrimaryFeature + * @property {Array.|null} [flags] PrimaryFeature flags + */ + + /** + * Constructs a new PrimaryFeature. + * @memberof proto.SyncActionValue + * @classdesc Represents a PrimaryFeature. + * @implements IPrimaryFeature + * @constructor + * @param {proto.SyncActionValue.IPrimaryFeature=} [properties] Properties to set + */ + function PrimaryFeature(properties) { + this.flags = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PrimaryFeature flags. + * @member {Array.} flags + * @memberof proto.SyncActionValue.PrimaryFeature + * @instance + */ + PrimaryFeature.prototype.flags = $util.emptyArray; + + /** + * Creates a new PrimaryFeature instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {proto.SyncActionValue.IPrimaryFeature=} [properties] Properties to set + * @returns {proto.SyncActionValue.PrimaryFeature} PrimaryFeature instance + */ + PrimaryFeature.create = function create(properties) { + return new PrimaryFeature(properties); + }; + + /** + * Encodes the specified PrimaryFeature message. Does not implicitly {@link proto.SyncActionValue.PrimaryFeature.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {proto.SyncActionValue.IPrimaryFeature} message PrimaryFeature message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PrimaryFeature.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.flags != null && message.flags.length) + for (var i = 0; i < message.flags.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.flags[i]); + return writer; + }; + + /** + * Encodes the specified PrimaryFeature message, length delimited. Does not implicitly {@link proto.SyncActionValue.PrimaryFeature.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {proto.SyncActionValue.IPrimaryFeature} message PrimaryFeature message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PrimaryFeature.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PrimaryFeature message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.PrimaryFeature} PrimaryFeature + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PrimaryFeature.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.PrimaryFeature(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.flags && message.flags.length)) + message.flags = []; + message.flags.push(reader.string()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PrimaryFeature message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.PrimaryFeature} PrimaryFeature + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PrimaryFeature.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PrimaryFeature message. + * @function verify + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PrimaryFeature.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.flags != null && message.hasOwnProperty("flags")) { + if (!Array.isArray(message.flags)) + return "flags: array expected"; + for (var i = 0; i < message.flags.length; ++i) + if (!$util.isString(message.flags[i])) + return "flags: string[] expected"; + } + return null; + }; + + /** + * Creates a PrimaryFeature message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.PrimaryFeature} PrimaryFeature + */ + PrimaryFeature.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.PrimaryFeature) + return object; + var message = new $root.proto.SyncActionValue.PrimaryFeature(); + if (object.flags) { + if (!Array.isArray(object.flags)) + throw TypeError(".proto.SyncActionValue.PrimaryFeature.flags: array expected"); + message.flags = []; + for (var i = 0; i < object.flags.length; ++i) + message.flags[i] = String(object.flags[i]); + } + return message; + }; + + /** + * Creates a plain object from a PrimaryFeature message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.PrimaryFeature + * @static + * @param {proto.SyncActionValue.PrimaryFeature} message PrimaryFeature + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PrimaryFeature.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.flags = []; + if (message.flags && message.flags.length) { + object.flags = []; + for (var j = 0; j < message.flags.length; ++j) + object.flags[j] = message.flags[j]; + } + return object; + }; + + /** + * Converts this PrimaryFeature to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.PrimaryFeature + * @instance + * @returns {Object.} JSON object + */ + PrimaryFeature.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PrimaryFeature; + })(); + + SyncActionValue.PrimaryVersionAction = (function() { + + /** + * Properties of a PrimaryVersionAction. + * @memberof proto.SyncActionValue + * @interface IPrimaryVersionAction + * @property {string|null} [version] PrimaryVersionAction version + */ + + /** + * Constructs a new PrimaryVersionAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a PrimaryVersionAction. + * @implements IPrimaryVersionAction + * @constructor + * @param {proto.SyncActionValue.IPrimaryVersionAction=} [properties] Properties to set + */ + function PrimaryVersionAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PrimaryVersionAction version. + * @member {string} version + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @instance + */ + PrimaryVersionAction.prototype.version = ""; + + /** + * Creates a new PrimaryVersionAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {proto.SyncActionValue.IPrimaryVersionAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.PrimaryVersionAction} PrimaryVersionAction instance + */ + PrimaryVersionAction.create = function create(properties) { + return new PrimaryVersionAction(properties); + }; + + /** + * Encodes the specified PrimaryVersionAction message. Does not implicitly {@link proto.SyncActionValue.PrimaryVersionAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {proto.SyncActionValue.IPrimaryVersionAction} message PrimaryVersionAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PrimaryVersionAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.version); + return writer; + }; + + /** + * Encodes the specified PrimaryVersionAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.PrimaryVersionAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {proto.SyncActionValue.IPrimaryVersionAction} message PrimaryVersionAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PrimaryVersionAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PrimaryVersionAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.PrimaryVersionAction} PrimaryVersionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PrimaryVersionAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.PrimaryVersionAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.version = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PrimaryVersionAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.PrimaryVersionAction} PrimaryVersionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PrimaryVersionAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PrimaryVersionAction message. + * @function verify + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PrimaryVersionAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.version != null && message.hasOwnProperty("version")) + if (!$util.isString(message.version)) + return "version: string expected"; + return null; + }; + + /** + * Creates a PrimaryVersionAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.PrimaryVersionAction} PrimaryVersionAction + */ + PrimaryVersionAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.PrimaryVersionAction) + return object; + var message = new $root.proto.SyncActionValue.PrimaryVersionAction(); + if (object.version != null) + message.version = String(object.version); + return message; + }; + + /** + * Creates a plain object from a PrimaryVersionAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @static + * @param {proto.SyncActionValue.PrimaryVersionAction} message PrimaryVersionAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PrimaryVersionAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.version = ""; + if (message.version != null && message.hasOwnProperty("version")) + object.version = message.version; + return object; + }; + + /** + * Converts this PrimaryVersionAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.PrimaryVersionAction + * @instance + * @returns {Object.} JSON object + */ + PrimaryVersionAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PrimaryVersionAction; + })(); + + SyncActionValue.PushNameSetting = (function() { + + /** + * Properties of a PushNameSetting. + * @memberof proto.SyncActionValue + * @interface IPushNameSetting + * @property {string|null} [name] PushNameSetting name + */ + + /** + * Constructs a new PushNameSetting. + * @memberof proto.SyncActionValue + * @classdesc Represents a PushNameSetting. + * @implements IPushNameSetting + * @constructor + * @param {proto.SyncActionValue.IPushNameSetting=} [properties] Properties to set + */ + function PushNameSetting(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PushNameSetting name. + * @member {string} name + * @memberof proto.SyncActionValue.PushNameSetting + * @instance + */ + PushNameSetting.prototype.name = ""; + + /** + * Creates a new PushNameSetting instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {proto.SyncActionValue.IPushNameSetting=} [properties] Properties to set + * @returns {proto.SyncActionValue.PushNameSetting} PushNameSetting instance + */ + PushNameSetting.create = function create(properties) { + return new PushNameSetting(properties); + }; + + /** + * Encodes the specified PushNameSetting message. Does not implicitly {@link proto.SyncActionValue.PushNameSetting.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {proto.SyncActionValue.IPushNameSetting} message PushNameSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PushNameSetting.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + return writer; + }; + + /** + * Encodes the specified PushNameSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.PushNameSetting.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {proto.SyncActionValue.IPushNameSetting} message PushNameSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PushNameSetting.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PushNameSetting message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.PushNameSetting} PushNameSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PushNameSetting.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.PushNameSetting(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PushNameSetting message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.PushNameSetting} PushNameSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PushNameSetting.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PushNameSetting message. + * @function verify + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PushNameSetting.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + return null; + }; + + /** + * Creates a PushNameSetting message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.PushNameSetting} PushNameSetting + */ + PushNameSetting.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.PushNameSetting) + return object; + var message = new $root.proto.SyncActionValue.PushNameSetting(); + if (object.name != null) + message.name = String(object.name); + return message; + }; + + /** + * Creates a plain object from a PushNameSetting message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.PushNameSetting + * @static + * @param {proto.SyncActionValue.PushNameSetting} message PushNameSetting + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + PushNameSetting.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.name = ""; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + return object; + }; + + /** + * Converts this PushNameSetting to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.PushNameSetting + * @instance + * @returns {Object.} JSON object + */ + PushNameSetting.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PushNameSetting; + })(); + + SyncActionValue.QuickReplyAction = (function() { + + /** + * Properties of a QuickReplyAction. + * @memberof proto.SyncActionValue + * @interface IQuickReplyAction + * @property {string|null} [shortcut] QuickReplyAction shortcut + * @property {string|null} [message] QuickReplyAction message + * @property {Array.|null} [keywords] QuickReplyAction keywords + * @property {number|null} [count] QuickReplyAction count + * @property {boolean|null} [deleted] QuickReplyAction deleted + */ + + /** + * Constructs a new QuickReplyAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a QuickReplyAction. + * @implements IQuickReplyAction + * @constructor + * @param {proto.SyncActionValue.IQuickReplyAction=} [properties] Properties to set + */ + function QuickReplyAction(properties) { + this.keywords = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * QuickReplyAction shortcut. + * @member {string} shortcut + * @memberof proto.SyncActionValue.QuickReplyAction + * @instance + */ + QuickReplyAction.prototype.shortcut = ""; + + /** + * QuickReplyAction message. + * @member {string} message + * @memberof proto.SyncActionValue.QuickReplyAction + * @instance + */ + QuickReplyAction.prototype.message = ""; + + /** + * QuickReplyAction keywords. + * @member {Array.} keywords + * @memberof proto.SyncActionValue.QuickReplyAction + * @instance + */ + QuickReplyAction.prototype.keywords = $util.emptyArray; + + /** + * QuickReplyAction count. + * @member {number} count + * @memberof proto.SyncActionValue.QuickReplyAction + * @instance + */ + QuickReplyAction.prototype.count = 0; + + /** + * QuickReplyAction deleted. + * @member {boolean} deleted + * @memberof proto.SyncActionValue.QuickReplyAction + * @instance + */ + QuickReplyAction.prototype.deleted = false; + + /** + * Creates a new QuickReplyAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {proto.SyncActionValue.IQuickReplyAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.QuickReplyAction} QuickReplyAction instance + */ + QuickReplyAction.create = function create(properties) { + return new QuickReplyAction(properties); + }; + + /** + * Encodes the specified QuickReplyAction message. Does not implicitly {@link proto.SyncActionValue.QuickReplyAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {proto.SyncActionValue.IQuickReplyAction} message QuickReplyAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + QuickReplyAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.shortcut != null && Object.hasOwnProperty.call(message, "shortcut")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.shortcut); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.message); + if (message.keywords != null && message.keywords.length) + for (var i = 0; i < message.keywords.length; ++i) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.keywords[i]); + if (message.count != null && Object.hasOwnProperty.call(message, "count")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.count); + if (message.deleted != null && Object.hasOwnProperty.call(message, "deleted")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.deleted); + return writer; + }; + + /** + * Encodes the specified QuickReplyAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.QuickReplyAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {proto.SyncActionValue.IQuickReplyAction} message QuickReplyAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + QuickReplyAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a QuickReplyAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.QuickReplyAction} QuickReplyAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + QuickReplyAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.QuickReplyAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.shortcut = reader.string(); + break; + case 2: + message.message = reader.string(); + break; + case 3: + if (!(message.keywords && message.keywords.length)) + message.keywords = []; + message.keywords.push(reader.string()); + break; + case 4: + message.count = reader.int32(); + break; + case 5: + message.deleted = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a QuickReplyAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.QuickReplyAction} QuickReplyAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + QuickReplyAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a QuickReplyAction message. + * @function verify + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + QuickReplyAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.shortcut != null && message.hasOwnProperty("shortcut")) + if (!$util.isString(message.shortcut)) + return "shortcut: string expected"; + if (message.message != null && message.hasOwnProperty("message")) + if (!$util.isString(message.message)) + return "message: string expected"; + if (message.keywords != null && message.hasOwnProperty("keywords")) { + if (!Array.isArray(message.keywords)) + return "keywords: array expected"; + for (var i = 0; i < message.keywords.length; ++i) + if (!$util.isString(message.keywords[i])) + return "keywords: string[] expected"; + } + if (message.count != null && message.hasOwnProperty("count")) + if (!$util.isInteger(message.count)) + return "count: integer expected"; + if (message.deleted != null && message.hasOwnProperty("deleted")) + if (typeof message.deleted !== "boolean") + return "deleted: boolean expected"; + return null; + }; + + /** + * Creates a QuickReplyAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.QuickReplyAction} QuickReplyAction + */ + QuickReplyAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.QuickReplyAction) + return object; + var message = new $root.proto.SyncActionValue.QuickReplyAction(); + if (object.shortcut != null) + message.shortcut = String(object.shortcut); + if (object.message != null) + message.message = String(object.message); + if (object.keywords) { + if (!Array.isArray(object.keywords)) + throw TypeError(".proto.SyncActionValue.QuickReplyAction.keywords: array expected"); + message.keywords = []; + for (var i = 0; i < object.keywords.length; ++i) + message.keywords[i] = String(object.keywords[i]); + } + if (object.count != null) + message.count = object.count | 0; + if (object.deleted != null) + message.deleted = Boolean(object.deleted); + return message; + }; + + /** + * Creates a plain object from a QuickReplyAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.QuickReplyAction + * @static + * @param {proto.SyncActionValue.QuickReplyAction} message QuickReplyAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + QuickReplyAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.keywords = []; + if (options.defaults) { + object.shortcut = ""; + object.message = ""; + object.count = 0; + object.deleted = false; + } + if (message.shortcut != null && message.hasOwnProperty("shortcut")) + object.shortcut = message.shortcut; + if (message.message != null && message.hasOwnProperty("message")) + object.message = message.message; + if (message.keywords && message.keywords.length) { + object.keywords = []; + for (var j = 0; j < message.keywords.length; ++j) + object.keywords[j] = message.keywords[j]; + } + if (message.count != null && message.hasOwnProperty("count")) + object.count = message.count; + if (message.deleted != null && message.hasOwnProperty("deleted")) + object.deleted = message.deleted; + return object; + }; + + /** + * Converts this QuickReplyAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.QuickReplyAction + * @instance + * @returns {Object.} JSON object + */ + QuickReplyAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return QuickReplyAction; + })(); + + SyncActionValue.RecentEmojiWeightsAction = (function() { + + /** + * Properties of a RecentEmojiWeightsAction. + * @memberof proto.SyncActionValue + * @interface IRecentEmojiWeightsAction + * @property {Array.|null} [weights] RecentEmojiWeightsAction weights + */ + + /** + * Constructs a new RecentEmojiWeightsAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a RecentEmojiWeightsAction. + * @implements IRecentEmojiWeightsAction + * @constructor + * @param {proto.SyncActionValue.IRecentEmojiWeightsAction=} [properties] Properties to set + */ + function RecentEmojiWeightsAction(properties) { + this.weights = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RecentEmojiWeightsAction weights. + * @member {Array.} weights + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @instance + */ + RecentEmojiWeightsAction.prototype.weights = $util.emptyArray; + + /** + * Creates a new RecentEmojiWeightsAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {proto.SyncActionValue.IRecentEmojiWeightsAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.RecentEmojiWeightsAction} RecentEmojiWeightsAction instance + */ + RecentEmojiWeightsAction.create = function create(properties) { + return new RecentEmojiWeightsAction(properties); + }; + + /** + * Encodes the specified RecentEmojiWeightsAction message. Does not implicitly {@link proto.SyncActionValue.RecentEmojiWeightsAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {proto.SyncActionValue.IRecentEmojiWeightsAction} message RecentEmojiWeightsAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RecentEmojiWeightsAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.weights != null && message.weights.length) + for (var i = 0; i < message.weights.length; ++i) + $root.proto.RecentEmojiWeight.encode(message.weights[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified RecentEmojiWeightsAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.RecentEmojiWeightsAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {proto.SyncActionValue.IRecentEmojiWeightsAction} message RecentEmojiWeightsAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RecentEmojiWeightsAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RecentEmojiWeightsAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.RecentEmojiWeightsAction} RecentEmojiWeightsAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RecentEmojiWeightsAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.RecentEmojiWeightsAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.weights && message.weights.length)) + message.weights = []; + message.weights.push($root.proto.RecentEmojiWeight.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RecentEmojiWeightsAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.RecentEmojiWeightsAction} RecentEmojiWeightsAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RecentEmojiWeightsAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RecentEmojiWeightsAction message. + * @function verify + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RecentEmojiWeightsAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.weights != null && message.hasOwnProperty("weights")) { + if (!Array.isArray(message.weights)) + return "weights: array expected"; + for (var i = 0; i < message.weights.length; ++i) { + var error = $root.proto.RecentEmojiWeight.verify(message.weights[i]); + if (error) + return "weights." + error; + } + } + return null; + }; + + /** + * Creates a RecentEmojiWeightsAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.RecentEmojiWeightsAction} RecentEmojiWeightsAction + */ + RecentEmojiWeightsAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.RecentEmojiWeightsAction) + return object; + var message = new $root.proto.SyncActionValue.RecentEmojiWeightsAction(); + if (object.weights) { + if (!Array.isArray(object.weights)) + throw TypeError(".proto.SyncActionValue.RecentEmojiWeightsAction.weights: array expected"); + message.weights = []; + for (var i = 0; i < object.weights.length; ++i) { + if (typeof object.weights[i] !== "object") + throw TypeError(".proto.SyncActionValue.RecentEmojiWeightsAction.weights: object expected"); + message.weights[i] = $root.proto.RecentEmojiWeight.fromObject(object.weights[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a RecentEmojiWeightsAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @static + * @param {proto.SyncActionValue.RecentEmojiWeightsAction} message RecentEmojiWeightsAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RecentEmojiWeightsAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.weights = []; + if (message.weights && message.weights.length) { + object.weights = []; + for (var j = 0; j < message.weights.length; ++j) + object.weights[j] = $root.proto.RecentEmojiWeight.toObject(message.weights[j], options); + } + return object; + }; + + /** + * Converts this RecentEmojiWeightsAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.RecentEmojiWeightsAction + * @instance + * @returns {Object.} JSON object + */ + RecentEmojiWeightsAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RecentEmojiWeightsAction; + })(); + + SyncActionValue.RemoveRecentStickerAction = (function() { + + /** + * Properties of a RemoveRecentStickerAction. + * @memberof proto.SyncActionValue + * @interface IRemoveRecentStickerAction + * @property {number|Long|null} [lastStickerSentTs] RemoveRecentStickerAction lastStickerSentTs + */ + + /** + * Constructs a new RemoveRecentStickerAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a RemoveRecentStickerAction. + * @implements IRemoveRecentStickerAction + * @constructor + * @param {proto.SyncActionValue.IRemoveRecentStickerAction=} [properties] Properties to set + */ + function RemoveRecentStickerAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RemoveRecentStickerAction lastStickerSentTs. + * @member {number|Long} lastStickerSentTs + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @instance + */ + RemoveRecentStickerAction.prototype.lastStickerSentTs = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new RemoveRecentStickerAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {proto.SyncActionValue.IRemoveRecentStickerAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.RemoveRecentStickerAction} RemoveRecentStickerAction instance + */ + RemoveRecentStickerAction.create = function create(properties) { + return new RemoveRecentStickerAction(properties); + }; + + /** + * Encodes the specified RemoveRecentStickerAction message. Does not implicitly {@link proto.SyncActionValue.RemoveRecentStickerAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {proto.SyncActionValue.IRemoveRecentStickerAction} message RemoveRecentStickerAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RemoveRecentStickerAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.lastStickerSentTs != null && Object.hasOwnProperty.call(message, "lastStickerSentTs")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.lastStickerSentTs); + return writer; + }; + + /** + * Encodes the specified RemoveRecentStickerAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.RemoveRecentStickerAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {proto.SyncActionValue.IRemoveRecentStickerAction} message RemoveRecentStickerAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RemoveRecentStickerAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RemoveRecentStickerAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.RemoveRecentStickerAction} RemoveRecentStickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RemoveRecentStickerAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.RemoveRecentStickerAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.lastStickerSentTs = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RemoveRecentStickerAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.RemoveRecentStickerAction} RemoveRecentStickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RemoveRecentStickerAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RemoveRecentStickerAction message. + * @function verify + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RemoveRecentStickerAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.lastStickerSentTs != null && message.hasOwnProperty("lastStickerSentTs")) + if (!$util.isInteger(message.lastStickerSentTs) && !(message.lastStickerSentTs && $util.isInteger(message.lastStickerSentTs.low) && $util.isInteger(message.lastStickerSentTs.high))) + return "lastStickerSentTs: integer|Long expected"; + return null; + }; + + /** + * Creates a RemoveRecentStickerAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.RemoveRecentStickerAction} RemoveRecentStickerAction + */ + RemoveRecentStickerAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.RemoveRecentStickerAction) + return object; + var message = new $root.proto.SyncActionValue.RemoveRecentStickerAction(); + if (object.lastStickerSentTs != null) + if ($util.Long) + (message.lastStickerSentTs = $util.Long.fromValue(object.lastStickerSentTs)).unsigned = false; + else if (typeof object.lastStickerSentTs === "string") + message.lastStickerSentTs = parseInt(object.lastStickerSentTs, 10); + else if (typeof object.lastStickerSentTs === "number") + message.lastStickerSentTs = object.lastStickerSentTs; + else if (typeof object.lastStickerSentTs === "object") + message.lastStickerSentTs = new $util.LongBits(object.lastStickerSentTs.low >>> 0, object.lastStickerSentTs.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a RemoveRecentStickerAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @static + * @param {proto.SyncActionValue.RemoveRecentStickerAction} message RemoveRecentStickerAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RemoveRecentStickerAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.lastStickerSentTs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.lastStickerSentTs = options.longs === String ? "0" : 0; + if (message.lastStickerSentTs != null && message.hasOwnProperty("lastStickerSentTs")) + if (typeof message.lastStickerSentTs === "number") + object.lastStickerSentTs = options.longs === String ? String(message.lastStickerSentTs) : message.lastStickerSentTs; + else + object.lastStickerSentTs = options.longs === String ? $util.Long.prototype.toString.call(message.lastStickerSentTs) : options.longs === Number ? new $util.LongBits(message.lastStickerSentTs.low >>> 0, message.lastStickerSentTs.high >>> 0).toNumber() : message.lastStickerSentTs; + return object; + }; + + /** + * Converts this RemoveRecentStickerAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.RemoveRecentStickerAction + * @instance + * @returns {Object.} JSON object + */ + RemoveRecentStickerAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RemoveRecentStickerAction; + })(); + + SyncActionValue.SecurityNotificationSetting = (function() { + + /** + * Properties of a SecurityNotificationSetting. + * @memberof proto.SyncActionValue + * @interface ISecurityNotificationSetting + * @property {boolean|null} [showNotification] SecurityNotificationSetting showNotification + */ + + /** + * Constructs a new SecurityNotificationSetting. + * @memberof proto.SyncActionValue + * @classdesc Represents a SecurityNotificationSetting. + * @implements ISecurityNotificationSetting + * @constructor + * @param {proto.SyncActionValue.ISecurityNotificationSetting=} [properties] Properties to set + */ + function SecurityNotificationSetting(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SecurityNotificationSetting showNotification. + * @member {boolean} showNotification + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @instance + */ + SecurityNotificationSetting.prototype.showNotification = false; + + /** + * Creates a new SecurityNotificationSetting instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {proto.SyncActionValue.ISecurityNotificationSetting=} [properties] Properties to set + * @returns {proto.SyncActionValue.SecurityNotificationSetting} SecurityNotificationSetting instance + */ + SecurityNotificationSetting.create = function create(properties) { + return new SecurityNotificationSetting(properties); + }; + + /** + * Encodes the specified SecurityNotificationSetting message. Does not implicitly {@link proto.SyncActionValue.SecurityNotificationSetting.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {proto.SyncActionValue.ISecurityNotificationSetting} message SecurityNotificationSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SecurityNotificationSetting.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.showNotification != null && Object.hasOwnProperty.call(message, "showNotification")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.showNotification); + return writer; + }; + + /** + * Encodes the specified SecurityNotificationSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.SecurityNotificationSetting.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {proto.SyncActionValue.ISecurityNotificationSetting} message SecurityNotificationSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SecurityNotificationSetting.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SecurityNotificationSetting message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.SecurityNotificationSetting} SecurityNotificationSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SecurityNotificationSetting.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.SecurityNotificationSetting(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.showNotification = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SecurityNotificationSetting message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.SecurityNotificationSetting} SecurityNotificationSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SecurityNotificationSetting.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SecurityNotificationSetting message. + * @function verify + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SecurityNotificationSetting.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.showNotification != null && message.hasOwnProperty("showNotification")) + if (typeof message.showNotification !== "boolean") + return "showNotification: boolean expected"; + return null; + }; + + /** + * Creates a SecurityNotificationSetting message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.SecurityNotificationSetting} SecurityNotificationSetting + */ + SecurityNotificationSetting.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.SecurityNotificationSetting) + return object; + var message = new $root.proto.SyncActionValue.SecurityNotificationSetting(); + if (object.showNotification != null) + message.showNotification = Boolean(object.showNotification); + return message; + }; + + /** + * Creates a plain object from a SecurityNotificationSetting message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @static + * @param {proto.SyncActionValue.SecurityNotificationSetting} message SecurityNotificationSetting + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SecurityNotificationSetting.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.showNotification = false; + if (message.showNotification != null && message.hasOwnProperty("showNotification")) + object.showNotification = message.showNotification; + return object; + }; + + /** + * Converts this SecurityNotificationSetting to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.SecurityNotificationSetting + * @instance + * @returns {Object.} JSON object + */ + SecurityNotificationSetting.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SecurityNotificationSetting; + })(); + + SyncActionValue.StarAction = (function() { + + /** + * Properties of a StarAction. + * @memberof proto.SyncActionValue + * @interface IStarAction + * @property {boolean|null} [starred] StarAction starred + */ + + /** + * Constructs a new StarAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a StarAction. + * @implements IStarAction + * @constructor + * @param {proto.SyncActionValue.IStarAction=} [properties] Properties to set + */ + function StarAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StarAction starred. + * @member {boolean} starred + * @memberof proto.SyncActionValue.StarAction + * @instance + */ + StarAction.prototype.starred = false; + + /** + * Creates a new StarAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {proto.SyncActionValue.IStarAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.StarAction} StarAction instance + */ + StarAction.create = function create(properties) { + return new StarAction(properties); + }; + + /** + * Encodes the specified StarAction message. Does not implicitly {@link proto.SyncActionValue.StarAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {proto.SyncActionValue.IStarAction} message StarAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StarAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.starred != null && Object.hasOwnProperty.call(message, "starred")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.starred); + return writer; + }; + + /** + * Encodes the specified StarAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.StarAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {proto.SyncActionValue.IStarAction} message StarAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StarAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StarAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.StarAction} StarAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StarAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.StarAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.starred = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StarAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.StarAction} StarAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StarAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StarAction message. + * @function verify + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StarAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.starred != null && message.hasOwnProperty("starred")) + if (typeof message.starred !== "boolean") + return "starred: boolean expected"; + return null; + }; + + /** + * Creates a StarAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.StarAction} StarAction + */ + StarAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.StarAction) + return object; + var message = new $root.proto.SyncActionValue.StarAction(); + if (object.starred != null) + message.starred = Boolean(object.starred); + return message; + }; + + /** + * Creates a plain object from a StarAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.StarAction + * @static + * @param {proto.SyncActionValue.StarAction} message StarAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StarAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.starred = false; + if (message.starred != null && message.hasOwnProperty("starred")) + object.starred = message.starred; + return object; + }; + + /** + * Converts this StarAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.StarAction + * @instance + * @returns {Object.} JSON object + */ + StarAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StarAction; + })(); + + SyncActionValue.StickerAction = (function() { + + /** + * Properties of a StickerAction. + * @memberof proto.SyncActionValue + * @interface IStickerAction + * @property {string|null} [url] StickerAction url + * @property {Uint8Array|null} [fileEncSha256] StickerAction fileEncSha256 + * @property {Uint8Array|null} [mediaKey] StickerAction mediaKey + * @property {string|null} [mimetype] StickerAction mimetype + * @property {number|null} [height] StickerAction height + * @property {number|null} [width] StickerAction width + * @property {string|null} [directPath] StickerAction directPath + * @property {number|Long|null} [fileLength] StickerAction fileLength + * @property {boolean|null} [isFavorite] StickerAction isFavorite + * @property {number|null} [deviceIdHint] StickerAction deviceIdHint + */ + + /** + * Constructs a new StickerAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a StickerAction. + * @implements IStickerAction + * @constructor + * @param {proto.SyncActionValue.IStickerAction=} [properties] Properties to set + */ + function StickerAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StickerAction url. + * @member {string} url + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.url = ""; + + /** + * StickerAction fileEncSha256. + * @member {Uint8Array} fileEncSha256 + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.fileEncSha256 = $util.newBuffer([]); + + /** + * StickerAction mediaKey. + * @member {Uint8Array} mediaKey + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.mediaKey = $util.newBuffer([]); + + /** + * StickerAction mimetype. + * @member {string} mimetype + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.mimetype = ""; + + /** + * StickerAction height. + * @member {number} height + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.height = 0; + + /** + * StickerAction width. + * @member {number} width + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.width = 0; + + /** + * StickerAction directPath. + * @member {string} directPath + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.directPath = ""; + + /** + * StickerAction fileLength. + * @member {number|Long} fileLength + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.fileLength = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * StickerAction isFavorite. + * @member {boolean} isFavorite + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.isFavorite = false; + + /** + * StickerAction deviceIdHint. + * @member {number} deviceIdHint + * @memberof proto.SyncActionValue.StickerAction + * @instance + */ + StickerAction.prototype.deviceIdHint = 0; + + /** + * Creates a new StickerAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {proto.SyncActionValue.IStickerAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.StickerAction} StickerAction instance + */ + StickerAction.create = function create(properties) { + return new StickerAction(properties); + }; + + /** + * Encodes the specified StickerAction message. Does not implicitly {@link proto.SyncActionValue.StickerAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {proto.SyncActionValue.IStickerAction} message StickerAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.url); + if (message.fileEncSha256 != null && Object.hasOwnProperty.call(message, "fileEncSha256")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.fileEncSha256); + if (message.mediaKey != null && Object.hasOwnProperty.call(message, "mediaKey")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.mediaKey); + if (message.mimetype != null && Object.hasOwnProperty.call(message, "mimetype")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.mimetype); + if (message.height != null && Object.hasOwnProperty.call(message, "height")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.height); + if (message.width != null && Object.hasOwnProperty.call(message, "width")) + writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.width); + if (message.directPath != null && Object.hasOwnProperty.call(message, "directPath")) + writer.uint32(/* id 7, wireType 2 =*/58).string(message.directPath); + if (message.fileLength != null && Object.hasOwnProperty.call(message, "fileLength")) + writer.uint32(/* id 8, wireType 0 =*/64).uint64(message.fileLength); + if (message.isFavorite != null && Object.hasOwnProperty.call(message, "isFavorite")) + writer.uint32(/* id 9, wireType 0 =*/72).bool(message.isFavorite); + if (message.deviceIdHint != null && Object.hasOwnProperty.call(message, "deviceIdHint")) + writer.uint32(/* id 10, wireType 0 =*/80).uint32(message.deviceIdHint); + return writer; + }; + + /** + * Encodes the specified StickerAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.StickerAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {proto.SyncActionValue.IStickerAction} message StickerAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StickerAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StickerAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.StickerAction} StickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.StickerAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.url = reader.string(); + break; + case 2: + message.fileEncSha256 = reader.bytes(); + break; + case 3: + message.mediaKey = reader.bytes(); + break; + case 4: + message.mimetype = reader.string(); + break; + case 5: + message.height = reader.uint32(); + break; + case 6: + message.width = reader.uint32(); + break; + case 7: + message.directPath = reader.string(); + break; + case 8: + message.fileLength = reader.uint64(); + break; + case 9: + message.isFavorite = reader.bool(); + break; + case 10: + message.deviceIdHint = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StickerAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.StickerAction} StickerAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StickerAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StickerAction message. + * @function verify + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StickerAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.url != null && message.hasOwnProperty("url")) + if (!$util.isString(message.url)) + return "url: string expected"; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + if (!(message.fileEncSha256 && typeof message.fileEncSha256.length === "number" || $util.isString(message.fileEncSha256))) + return "fileEncSha256: buffer expected"; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + if (!(message.mediaKey && typeof message.mediaKey.length === "number" || $util.isString(message.mediaKey))) + return "mediaKey: buffer expected"; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + if (!$util.isString(message.mimetype)) + return "mimetype: string expected"; + if (message.height != null && message.hasOwnProperty("height")) + if (!$util.isInteger(message.height)) + return "height: integer expected"; + if (message.width != null && message.hasOwnProperty("width")) + if (!$util.isInteger(message.width)) + return "width: integer expected"; + if (message.directPath != null && message.hasOwnProperty("directPath")) + if (!$util.isString(message.directPath)) + return "directPath: string expected"; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (!$util.isInteger(message.fileLength) && !(message.fileLength && $util.isInteger(message.fileLength.low) && $util.isInteger(message.fileLength.high))) + return "fileLength: integer|Long expected"; + if (message.isFavorite != null && message.hasOwnProperty("isFavorite")) + if (typeof message.isFavorite !== "boolean") + return "isFavorite: boolean expected"; + if (message.deviceIdHint != null && message.hasOwnProperty("deviceIdHint")) + if (!$util.isInteger(message.deviceIdHint)) + return "deviceIdHint: integer expected"; + return null; + }; + + /** + * Creates a StickerAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.StickerAction} StickerAction + */ + StickerAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.StickerAction) + return object; + var message = new $root.proto.SyncActionValue.StickerAction(); + if (object.url != null) + message.url = String(object.url); + if (object.fileEncSha256 != null) + if (typeof object.fileEncSha256 === "string") + $util.base64.decode(object.fileEncSha256, message.fileEncSha256 = $util.newBuffer($util.base64.length(object.fileEncSha256)), 0); + else if (object.fileEncSha256.length) + message.fileEncSha256 = object.fileEncSha256; + if (object.mediaKey != null) + if (typeof object.mediaKey === "string") + $util.base64.decode(object.mediaKey, message.mediaKey = $util.newBuffer($util.base64.length(object.mediaKey)), 0); + else if (object.mediaKey.length) + message.mediaKey = object.mediaKey; + if (object.mimetype != null) + message.mimetype = String(object.mimetype); + if (object.height != null) + message.height = object.height >>> 0; + if (object.width != null) + message.width = object.width >>> 0; + if (object.directPath != null) + message.directPath = String(object.directPath); + if (object.fileLength != null) + if ($util.Long) + (message.fileLength = $util.Long.fromValue(object.fileLength)).unsigned = true; + else if (typeof object.fileLength === "string") + message.fileLength = parseInt(object.fileLength, 10); + else if (typeof object.fileLength === "number") + message.fileLength = object.fileLength; + else if (typeof object.fileLength === "object") + message.fileLength = new $util.LongBits(object.fileLength.low >>> 0, object.fileLength.high >>> 0).toNumber(true); + if (object.isFavorite != null) + message.isFavorite = Boolean(object.isFavorite); + if (object.deviceIdHint != null) + message.deviceIdHint = object.deviceIdHint >>> 0; + return message; + }; + + /** + * Creates a plain object from a StickerAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.StickerAction + * @static + * @param {proto.SyncActionValue.StickerAction} message StickerAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StickerAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.url = ""; + if (options.bytes === String) + object.fileEncSha256 = ""; + else { + object.fileEncSha256 = []; + if (options.bytes !== Array) + object.fileEncSha256 = $util.newBuffer(object.fileEncSha256); + } + if (options.bytes === String) + object.mediaKey = ""; + else { + object.mediaKey = []; + if (options.bytes !== Array) + object.mediaKey = $util.newBuffer(object.mediaKey); + } + object.mimetype = ""; + object.height = 0; + object.width = 0; + object.directPath = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.fileLength = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.fileLength = options.longs === String ? "0" : 0; + object.isFavorite = false; + object.deviceIdHint = 0; + } + if (message.url != null && message.hasOwnProperty("url")) + object.url = message.url; + if (message.fileEncSha256 != null && message.hasOwnProperty("fileEncSha256")) + object.fileEncSha256 = options.bytes === String ? $util.base64.encode(message.fileEncSha256, 0, message.fileEncSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.fileEncSha256) : message.fileEncSha256; + if (message.mediaKey != null && message.hasOwnProperty("mediaKey")) + object.mediaKey = options.bytes === String ? $util.base64.encode(message.mediaKey, 0, message.mediaKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaKey) : message.mediaKey; + if (message.mimetype != null && message.hasOwnProperty("mimetype")) + object.mimetype = message.mimetype; + if (message.height != null && message.hasOwnProperty("height")) + object.height = message.height; + if (message.width != null && message.hasOwnProperty("width")) + object.width = message.width; + if (message.directPath != null && message.hasOwnProperty("directPath")) + object.directPath = message.directPath; + if (message.fileLength != null && message.hasOwnProperty("fileLength")) + if (typeof message.fileLength === "number") + object.fileLength = options.longs === String ? String(message.fileLength) : message.fileLength; + else + object.fileLength = options.longs === String ? $util.Long.prototype.toString.call(message.fileLength) : options.longs === Number ? new $util.LongBits(message.fileLength.low >>> 0, message.fileLength.high >>> 0).toNumber(true) : message.fileLength; + if (message.isFavorite != null && message.hasOwnProperty("isFavorite")) + object.isFavorite = message.isFavorite; + if (message.deviceIdHint != null && message.hasOwnProperty("deviceIdHint")) + object.deviceIdHint = message.deviceIdHint; + return object; + }; + + /** + * Converts this StickerAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.StickerAction + * @instance + * @returns {Object.} JSON object + */ + StickerAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StickerAction; + })(); + + SyncActionValue.SubscriptionAction = (function() { + + /** + * Properties of a SubscriptionAction. + * @memberof proto.SyncActionValue + * @interface ISubscriptionAction + * @property {boolean|null} [isDeactivated] SubscriptionAction isDeactivated + * @property {boolean|null} [isAutoRenewing] SubscriptionAction isAutoRenewing + * @property {number|Long|null} [expirationDate] SubscriptionAction expirationDate + */ + + /** + * Constructs a new SubscriptionAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a SubscriptionAction. + * @implements ISubscriptionAction + * @constructor + * @param {proto.SyncActionValue.ISubscriptionAction=} [properties] Properties to set + */ + function SubscriptionAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SubscriptionAction isDeactivated. + * @member {boolean} isDeactivated + * @memberof proto.SyncActionValue.SubscriptionAction + * @instance + */ + SubscriptionAction.prototype.isDeactivated = false; + + /** + * SubscriptionAction isAutoRenewing. + * @member {boolean} isAutoRenewing + * @memberof proto.SyncActionValue.SubscriptionAction + * @instance + */ + SubscriptionAction.prototype.isAutoRenewing = false; + + /** + * SubscriptionAction expirationDate. + * @member {number|Long} expirationDate + * @memberof proto.SyncActionValue.SubscriptionAction + * @instance + */ + SubscriptionAction.prototype.expirationDate = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new SubscriptionAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {proto.SyncActionValue.ISubscriptionAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.SubscriptionAction} SubscriptionAction instance + */ + SubscriptionAction.create = function create(properties) { + return new SubscriptionAction(properties); + }; + + /** + * Encodes the specified SubscriptionAction message. Does not implicitly {@link proto.SyncActionValue.SubscriptionAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {proto.SyncActionValue.ISubscriptionAction} message SubscriptionAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SubscriptionAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.isDeactivated != null && Object.hasOwnProperty.call(message, "isDeactivated")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.isDeactivated); + if (message.isAutoRenewing != null && Object.hasOwnProperty.call(message, "isAutoRenewing")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.isAutoRenewing); + if (message.expirationDate != null && Object.hasOwnProperty.call(message, "expirationDate")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.expirationDate); + return writer; + }; + + /** + * Encodes the specified SubscriptionAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.SubscriptionAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {proto.SyncActionValue.ISubscriptionAction} message SubscriptionAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SubscriptionAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SubscriptionAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.SubscriptionAction} SubscriptionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SubscriptionAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.SubscriptionAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.isDeactivated = reader.bool(); + break; + case 2: + message.isAutoRenewing = reader.bool(); + break; + case 3: + message.expirationDate = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SubscriptionAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.SubscriptionAction} SubscriptionAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SubscriptionAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SubscriptionAction message. + * @function verify + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SubscriptionAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.isDeactivated != null && message.hasOwnProperty("isDeactivated")) + if (typeof message.isDeactivated !== "boolean") + return "isDeactivated: boolean expected"; + if (message.isAutoRenewing != null && message.hasOwnProperty("isAutoRenewing")) + if (typeof message.isAutoRenewing !== "boolean") + return "isAutoRenewing: boolean expected"; + if (message.expirationDate != null && message.hasOwnProperty("expirationDate")) + if (!$util.isInteger(message.expirationDate) && !(message.expirationDate && $util.isInteger(message.expirationDate.low) && $util.isInteger(message.expirationDate.high))) + return "expirationDate: integer|Long expected"; + return null; + }; + + /** + * Creates a SubscriptionAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.SubscriptionAction} SubscriptionAction + */ + SubscriptionAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.SubscriptionAction) + return object; + var message = new $root.proto.SyncActionValue.SubscriptionAction(); + if (object.isDeactivated != null) + message.isDeactivated = Boolean(object.isDeactivated); + if (object.isAutoRenewing != null) + message.isAutoRenewing = Boolean(object.isAutoRenewing); + if (object.expirationDate != null) + if ($util.Long) + (message.expirationDate = $util.Long.fromValue(object.expirationDate)).unsigned = false; + else if (typeof object.expirationDate === "string") + message.expirationDate = parseInt(object.expirationDate, 10); + else if (typeof object.expirationDate === "number") + message.expirationDate = object.expirationDate; + else if (typeof object.expirationDate === "object") + message.expirationDate = new $util.LongBits(object.expirationDate.low >>> 0, object.expirationDate.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a SubscriptionAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.SubscriptionAction + * @static + * @param {proto.SyncActionValue.SubscriptionAction} message SubscriptionAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SubscriptionAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.isDeactivated = false; + object.isAutoRenewing = false; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.expirationDate = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.expirationDate = options.longs === String ? "0" : 0; + } + if (message.isDeactivated != null && message.hasOwnProperty("isDeactivated")) + object.isDeactivated = message.isDeactivated; + if (message.isAutoRenewing != null && message.hasOwnProperty("isAutoRenewing")) + object.isAutoRenewing = message.isAutoRenewing; + if (message.expirationDate != null && message.hasOwnProperty("expirationDate")) + if (typeof message.expirationDate === "number") + object.expirationDate = options.longs === String ? String(message.expirationDate) : message.expirationDate; + else + object.expirationDate = options.longs === String ? $util.Long.prototype.toString.call(message.expirationDate) : options.longs === Number ? new $util.LongBits(message.expirationDate.low >>> 0, message.expirationDate.high >>> 0).toNumber() : message.expirationDate; + return object; + }; + + /** + * Converts this SubscriptionAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.SubscriptionAction + * @instance + * @returns {Object.} JSON object + */ + SubscriptionAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SubscriptionAction; + })(); + + SyncActionValue.SyncActionMessage = (function() { + + /** + * Properties of a SyncActionMessage. + * @memberof proto.SyncActionValue + * @interface ISyncActionMessage + * @property {proto.IMessageKey|null} [key] SyncActionMessage key + * @property {number|Long|null} [timestamp] SyncActionMessage timestamp + */ + + /** + * Constructs a new SyncActionMessage. + * @memberof proto.SyncActionValue + * @classdesc Represents a SyncActionMessage. + * @implements ISyncActionMessage + * @constructor + * @param {proto.SyncActionValue.ISyncActionMessage=} [properties] Properties to set + */ + function SyncActionMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncActionMessage key. + * @member {proto.IMessageKey|null|undefined} key + * @memberof proto.SyncActionValue.SyncActionMessage + * @instance + */ + SyncActionMessage.prototype.key = null; + + /** + * SyncActionMessage timestamp. + * @member {number|Long} timestamp + * @memberof proto.SyncActionValue.SyncActionMessage + * @instance + */ + SyncActionMessage.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new SyncActionMessage instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {proto.SyncActionValue.ISyncActionMessage=} [properties] Properties to set + * @returns {proto.SyncActionValue.SyncActionMessage} SyncActionMessage instance + */ + SyncActionMessage.create = function create(properties) { + return new SyncActionMessage(properties); + }; + + /** + * Encodes the specified SyncActionMessage message. Does not implicitly {@link proto.SyncActionValue.SyncActionMessage.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {proto.SyncActionValue.ISyncActionMessage} message SyncActionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.key != null && Object.hasOwnProperty.call(message, "key")) + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.timestamp); + return writer; + }; + + /** + * Encodes the specified SyncActionMessage message, length delimited. Does not implicitly {@link proto.SyncActionValue.SyncActionMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {proto.SyncActionValue.ISyncActionMessage} message SyncActionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncActionMessage message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.SyncActionMessage} SyncActionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.SyncActionMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.timestamp = reader.int64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncActionMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.SyncActionMessage} SyncActionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncActionMessage message. + * @function verify + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncActionMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.key != null && message.hasOwnProperty("key")) { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a SyncActionMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.SyncActionMessage} SyncActionMessage + */ + SyncActionMessage.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.SyncActionMessage) + return object; + var message = new $root.proto.SyncActionValue.SyncActionMessage(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.SyncActionValue.SyncActionMessage.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a SyncActionMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.SyncActionMessage + * @static + * @param {proto.SyncActionValue.SyncActionMessage} message SyncActionMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncActionMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.key = null; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp; + return object; + }; + + /** + * Converts this SyncActionMessage to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.SyncActionMessage + * @instance + * @returns {Object.} JSON object + */ + SyncActionMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncActionMessage; + })(); + + SyncActionValue.SyncActionMessageRange = (function() { + + /** + * Properties of a SyncActionMessageRange. + * @memberof proto.SyncActionValue + * @interface ISyncActionMessageRange + * @property {number|Long|null} [lastMessageTimestamp] SyncActionMessageRange lastMessageTimestamp + * @property {number|Long|null} [lastSystemMessageTimestamp] SyncActionMessageRange lastSystemMessageTimestamp + * @property {Array.|null} [messages] SyncActionMessageRange messages + */ + + /** + * Constructs a new SyncActionMessageRange. + * @memberof proto.SyncActionValue + * @classdesc Represents a SyncActionMessageRange. + * @implements ISyncActionMessageRange + * @constructor + * @param {proto.SyncActionValue.ISyncActionMessageRange=} [properties] Properties to set + */ + function SyncActionMessageRange(properties) { + this.messages = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncActionMessageRange lastMessageTimestamp. + * @member {number|Long} lastMessageTimestamp + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @instance + */ + SyncActionMessageRange.prototype.lastMessageTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * SyncActionMessageRange lastSystemMessageTimestamp. + * @member {number|Long} lastSystemMessageTimestamp + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @instance + */ + SyncActionMessageRange.prototype.lastSystemMessageTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * SyncActionMessageRange messages. + * @member {Array.} messages + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @instance + */ + SyncActionMessageRange.prototype.messages = $util.emptyArray; + + /** + * Creates a new SyncActionMessageRange instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {proto.SyncActionValue.ISyncActionMessageRange=} [properties] Properties to set + * @returns {proto.SyncActionValue.SyncActionMessageRange} SyncActionMessageRange instance + */ + SyncActionMessageRange.create = function create(properties) { + return new SyncActionMessageRange(properties); + }; + + /** + * Encodes the specified SyncActionMessageRange message. Does not implicitly {@link proto.SyncActionValue.SyncActionMessageRange.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {proto.SyncActionValue.ISyncActionMessageRange} message SyncActionMessageRange message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionMessageRange.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.lastMessageTimestamp != null && Object.hasOwnProperty.call(message, "lastMessageTimestamp")) + writer.uint32(/* id 1, wireType 0 =*/8).int64(message.lastMessageTimestamp); + if (message.lastSystemMessageTimestamp != null && Object.hasOwnProperty.call(message, "lastSystemMessageTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.lastSystemMessageTimestamp); + if (message.messages != null && message.messages.length) + for (var i = 0; i < message.messages.length; ++i) + $root.proto.SyncActionValue.SyncActionMessage.encode(message.messages[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SyncActionMessageRange message, length delimited. Does not implicitly {@link proto.SyncActionValue.SyncActionMessageRange.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {proto.SyncActionValue.ISyncActionMessageRange} message SyncActionMessageRange message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncActionMessageRange.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncActionMessageRange message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.SyncActionMessageRange} SyncActionMessageRange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionMessageRange.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.SyncActionMessageRange(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.lastMessageTimestamp = reader.int64(); + break; + case 2: + message.lastSystemMessageTimestamp = reader.int64(); + break; + case 3: + if (!(message.messages && message.messages.length)) + message.messages = []; + message.messages.push($root.proto.SyncActionValue.SyncActionMessage.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncActionMessageRange message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.SyncActionMessageRange} SyncActionMessageRange + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncActionMessageRange.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncActionMessageRange message. + * @function verify + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncActionMessageRange.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.lastMessageTimestamp != null && message.hasOwnProperty("lastMessageTimestamp")) + if (!$util.isInteger(message.lastMessageTimestamp) && !(message.lastMessageTimestamp && $util.isInteger(message.lastMessageTimestamp.low) && $util.isInteger(message.lastMessageTimestamp.high))) + return "lastMessageTimestamp: integer|Long expected"; + if (message.lastSystemMessageTimestamp != null && message.hasOwnProperty("lastSystemMessageTimestamp")) + if (!$util.isInteger(message.lastSystemMessageTimestamp) && !(message.lastSystemMessageTimestamp && $util.isInteger(message.lastSystemMessageTimestamp.low) && $util.isInteger(message.lastSystemMessageTimestamp.high))) + return "lastSystemMessageTimestamp: integer|Long expected"; + if (message.messages != null && message.hasOwnProperty("messages")) { + if (!Array.isArray(message.messages)) + return "messages: array expected"; + for (var i = 0; i < message.messages.length; ++i) { + var error = $root.proto.SyncActionValue.SyncActionMessage.verify(message.messages[i]); + if (error) + return "messages." + error; + } + } + return null; + }; + + /** + * Creates a SyncActionMessageRange message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.SyncActionMessageRange} SyncActionMessageRange + */ + SyncActionMessageRange.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.SyncActionMessageRange) + return object; + var message = new $root.proto.SyncActionValue.SyncActionMessageRange(); + if (object.lastMessageTimestamp != null) + if ($util.Long) + (message.lastMessageTimestamp = $util.Long.fromValue(object.lastMessageTimestamp)).unsigned = false; + else if (typeof object.lastMessageTimestamp === "string") + message.lastMessageTimestamp = parseInt(object.lastMessageTimestamp, 10); + else if (typeof object.lastMessageTimestamp === "number") + message.lastMessageTimestamp = object.lastMessageTimestamp; + else if (typeof object.lastMessageTimestamp === "object") + message.lastMessageTimestamp = new $util.LongBits(object.lastMessageTimestamp.low >>> 0, object.lastMessageTimestamp.high >>> 0).toNumber(); + if (object.lastSystemMessageTimestamp != null) + if ($util.Long) + (message.lastSystemMessageTimestamp = $util.Long.fromValue(object.lastSystemMessageTimestamp)).unsigned = false; + else if (typeof object.lastSystemMessageTimestamp === "string") + message.lastSystemMessageTimestamp = parseInt(object.lastSystemMessageTimestamp, 10); + else if (typeof object.lastSystemMessageTimestamp === "number") + message.lastSystemMessageTimestamp = object.lastSystemMessageTimestamp; + else if (typeof object.lastSystemMessageTimestamp === "object") + message.lastSystemMessageTimestamp = new $util.LongBits(object.lastSystemMessageTimestamp.low >>> 0, object.lastSystemMessageTimestamp.high >>> 0).toNumber(); + if (object.messages) { + if (!Array.isArray(object.messages)) + throw TypeError(".proto.SyncActionValue.SyncActionMessageRange.messages: array expected"); + message.messages = []; + for (var i = 0; i < object.messages.length; ++i) { + if (typeof object.messages[i] !== "object") + throw TypeError(".proto.SyncActionValue.SyncActionMessageRange.messages: object expected"); + message.messages[i] = $root.proto.SyncActionValue.SyncActionMessage.fromObject(object.messages[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a SyncActionMessageRange message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @static + * @param {proto.SyncActionValue.SyncActionMessageRange} message SyncActionMessageRange + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncActionMessageRange.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.messages = []; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.lastMessageTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.lastMessageTimestamp = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.lastSystemMessageTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.lastSystemMessageTimestamp = options.longs === String ? "0" : 0; + } + if (message.lastMessageTimestamp != null && message.hasOwnProperty("lastMessageTimestamp")) + if (typeof message.lastMessageTimestamp === "number") + object.lastMessageTimestamp = options.longs === String ? String(message.lastMessageTimestamp) : message.lastMessageTimestamp; + else + object.lastMessageTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.lastMessageTimestamp) : options.longs === Number ? new $util.LongBits(message.lastMessageTimestamp.low >>> 0, message.lastMessageTimestamp.high >>> 0).toNumber() : message.lastMessageTimestamp; + if (message.lastSystemMessageTimestamp != null && message.hasOwnProperty("lastSystemMessageTimestamp")) + if (typeof message.lastSystemMessageTimestamp === "number") + object.lastSystemMessageTimestamp = options.longs === String ? String(message.lastSystemMessageTimestamp) : message.lastSystemMessageTimestamp; + else + object.lastSystemMessageTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.lastSystemMessageTimestamp) : options.longs === Number ? new $util.LongBits(message.lastSystemMessageTimestamp.low >>> 0, message.lastSystemMessageTimestamp.high >>> 0).toNumber() : message.lastSystemMessageTimestamp; + if (message.messages && message.messages.length) { + object.messages = []; + for (var j = 0; j < message.messages.length; ++j) + object.messages[j] = $root.proto.SyncActionValue.SyncActionMessage.toObject(message.messages[j], options); + } + return object; + }; + + /** + * Converts this SyncActionMessageRange to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.SyncActionMessageRange + * @instance + * @returns {Object.} JSON object + */ + SyncActionMessageRange.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncActionMessageRange; + })(); + + SyncActionValue.TimeFormatAction = (function() { + + /** + * Properties of a TimeFormatAction. + * @memberof proto.SyncActionValue + * @interface ITimeFormatAction + * @property {boolean|null} [isTwentyFourHourFormatEnabled] TimeFormatAction isTwentyFourHourFormatEnabled + */ + + /** + * Constructs a new TimeFormatAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a TimeFormatAction. + * @implements ITimeFormatAction + * @constructor + * @param {proto.SyncActionValue.ITimeFormatAction=} [properties] Properties to set + */ + function TimeFormatAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TimeFormatAction isTwentyFourHourFormatEnabled. + * @member {boolean} isTwentyFourHourFormatEnabled + * @memberof proto.SyncActionValue.TimeFormatAction + * @instance + */ + TimeFormatAction.prototype.isTwentyFourHourFormatEnabled = false; + + /** + * Creates a new TimeFormatAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {proto.SyncActionValue.ITimeFormatAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.TimeFormatAction} TimeFormatAction instance + */ + TimeFormatAction.create = function create(properties) { + return new TimeFormatAction(properties); + }; + + /** + * Encodes the specified TimeFormatAction message. Does not implicitly {@link proto.SyncActionValue.TimeFormatAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {proto.SyncActionValue.ITimeFormatAction} message TimeFormatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TimeFormatAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.isTwentyFourHourFormatEnabled != null && Object.hasOwnProperty.call(message, "isTwentyFourHourFormatEnabled")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.isTwentyFourHourFormatEnabled); + return writer; + }; + + /** + * Encodes the specified TimeFormatAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.TimeFormatAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {proto.SyncActionValue.ITimeFormatAction} message TimeFormatAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TimeFormatAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TimeFormatAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.TimeFormatAction} TimeFormatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TimeFormatAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.TimeFormatAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.isTwentyFourHourFormatEnabled = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TimeFormatAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.TimeFormatAction} TimeFormatAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TimeFormatAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TimeFormatAction message. + * @function verify + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TimeFormatAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.isTwentyFourHourFormatEnabled != null && message.hasOwnProperty("isTwentyFourHourFormatEnabled")) + if (typeof message.isTwentyFourHourFormatEnabled !== "boolean") + return "isTwentyFourHourFormatEnabled: boolean expected"; + return null; + }; + + /** + * Creates a TimeFormatAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.TimeFormatAction} TimeFormatAction + */ + TimeFormatAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.TimeFormatAction) + return object; + var message = new $root.proto.SyncActionValue.TimeFormatAction(); + if (object.isTwentyFourHourFormatEnabled != null) + message.isTwentyFourHourFormatEnabled = Boolean(object.isTwentyFourHourFormatEnabled); + return message; + }; + + /** + * Creates a plain object from a TimeFormatAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.TimeFormatAction + * @static + * @param {proto.SyncActionValue.TimeFormatAction} message TimeFormatAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + TimeFormatAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.isTwentyFourHourFormatEnabled = false; + if (message.isTwentyFourHourFormatEnabled != null && message.hasOwnProperty("isTwentyFourHourFormatEnabled")) + object.isTwentyFourHourFormatEnabled = message.isTwentyFourHourFormatEnabled; + return object; + }; + + /** + * Converts this TimeFormatAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.TimeFormatAction + * @instance + * @returns {Object.} JSON object + */ + TimeFormatAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TimeFormatAction; + })(); + + SyncActionValue.UnarchiveChatsSetting = (function() { + + /** + * Properties of an UnarchiveChatsSetting. + * @memberof proto.SyncActionValue + * @interface IUnarchiveChatsSetting + * @property {boolean|null} [unarchiveChats] UnarchiveChatsSetting unarchiveChats + */ + + /** + * Constructs a new UnarchiveChatsSetting. + * @memberof proto.SyncActionValue + * @classdesc Represents an UnarchiveChatsSetting. + * @implements IUnarchiveChatsSetting + * @constructor + * @param {proto.SyncActionValue.IUnarchiveChatsSetting=} [properties] Properties to set + */ + function UnarchiveChatsSetting(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * UnarchiveChatsSetting unarchiveChats. + * @member {boolean} unarchiveChats + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @instance + */ + UnarchiveChatsSetting.prototype.unarchiveChats = false; + + /** + * Creates a new UnarchiveChatsSetting instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {proto.SyncActionValue.IUnarchiveChatsSetting=} [properties] Properties to set + * @returns {proto.SyncActionValue.UnarchiveChatsSetting} UnarchiveChatsSetting instance + */ + UnarchiveChatsSetting.create = function create(properties) { + return new UnarchiveChatsSetting(properties); + }; + + /** + * Encodes the specified UnarchiveChatsSetting message. Does not implicitly {@link proto.SyncActionValue.UnarchiveChatsSetting.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {proto.SyncActionValue.IUnarchiveChatsSetting} message UnarchiveChatsSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnarchiveChatsSetting.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.unarchiveChats != null && Object.hasOwnProperty.call(message, "unarchiveChats")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.unarchiveChats); + return writer; + }; + + /** + * Encodes the specified UnarchiveChatsSetting message, length delimited. Does not implicitly {@link proto.SyncActionValue.UnarchiveChatsSetting.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {proto.SyncActionValue.IUnarchiveChatsSetting} message UnarchiveChatsSetting message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnarchiveChatsSetting.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an UnarchiveChatsSetting message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.UnarchiveChatsSetting} UnarchiveChatsSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnarchiveChatsSetting.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.UnarchiveChatsSetting(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.unarchiveChats = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an UnarchiveChatsSetting message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.UnarchiveChatsSetting} UnarchiveChatsSetting + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnarchiveChatsSetting.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an UnarchiveChatsSetting message. + * @function verify + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UnarchiveChatsSetting.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.unarchiveChats != null && message.hasOwnProperty("unarchiveChats")) + if (typeof message.unarchiveChats !== "boolean") + return "unarchiveChats: boolean expected"; + return null; + }; + + /** + * Creates an UnarchiveChatsSetting message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.UnarchiveChatsSetting} UnarchiveChatsSetting + */ + UnarchiveChatsSetting.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.UnarchiveChatsSetting) + return object; + var message = new $root.proto.SyncActionValue.UnarchiveChatsSetting(); + if (object.unarchiveChats != null) + message.unarchiveChats = Boolean(object.unarchiveChats); + return message; + }; + + /** + * Creates a plain object from an UnarchiveChatsSetting message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @static + * @param {proto.SyncActionValue.UnarchiveChatsSetting} message UnarchiveChatsSetting + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + UnarchiveChatsSetting.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.unarchiveChats = false; + if (message.unarchiveChats != null && message.hasOwnProperty("unarchiveChats")) + object.unarchiveChats = message.unarchiveChats; + return object; + }; + + /** + * Converts this UnarchiveChatsSetting to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.UnarchiveChatsSetting + * @instance + * @returns {Object.} JSON object + */ + UnarchiveChatsSetting.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return UnarchiveChatsSetting; + })(); + + SyncActionValue.UserStatusMuteAction = (function() { + + /** + * Properties of a UserStatusMuteAction. + * @memberof proto.SyncActionValue + * @interface IUserStatusMuteAction + * @property {boolean|null} [muted] UserStatusMuteAction muted + */ + + /** + * Constructs a new UserStatusMuteAction. + * @memberof proto.SyncActionValue + * @classdesc Represents a UserStatusMuteAction. + * @implements IUserStatusMuteAction + * @constructor + * @param {proto.SyncActionValue.IUserStatusMuteAction=} [properties] Properties to set + */ + function UserStatusMuteAction(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * UserStatusMuteAction muted. + * @member {boolean} muted + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @instance + */ + UserStatusMuteAction.prototype.muted = false; + + /** + * Creates a new UserStatusMuteAction instance using the specified properties. + * @function create + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {proto.SyncActionValue.IUserStatusMuteAction=} [properties] Properties to set + * @returns {proto.SyncActionValue.UserStatusMuteAction} UserStatusMuteAction instance + */ + UserStatusMuteAction.create = function create(properties) { + return new UserStatusMuteAction(properties); + }; + + /** + * Encodes the specified UserStatusMuteAction message. Does not implicitly {@link proto.SyncActionValue.UserStatusMuteAction.verify|verify} messages. + * @function encode + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {proto.SyncActionValue.IUserStatusMuteAction} message UserStatusMuteAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserStatusMuteAction.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.muted != null && Object.hasOwnProperty.call(message, "muted")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.muted); + return writer; + }; + + /** + * Encodes the specified UserStatusMuteAction message, length delimited. Does not implicitly {@link proto.SyncActionValue.UserStatusMuteAction.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {proto.SyncActionValue.IUserStatusMuteAction} message UserStatusMuteAction message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserStatusMuteAction.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a UserStatusMuteAction message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncActionValue.UserStatusMuteAction} UserStatusMuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserStatusMuteAction.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncActionValue.UserStatusMuteAction(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.muted = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a UserStatusMuteAction message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncActionValue.UserStatusMuteAction} UserStatusMuteAction + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserStatusMuteAction.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a UserStatusMuteAction message. + * @function verify + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UserStatusMuteAction.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.muted != null && message.hasOwnProperty("muted")) + if (typeof message.muted !== "boolean") + return "muted: boolean expected"; + return null; + }; + + /** + * Creates a UserStatusMuteAction message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncActionValue.UserStatusMuteAction} UserStatusMuteAction + */ + UserStatusMuteAction.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncActionValue.UserStatusMuteAction) + return object; + var message = new $root.proto.SyncActionValue.UserStatusMuteAction(); + if (object.muted != null) + message.muted = Boolean(object.muted); + return message; + }; + + /** + * Creates a plain object from a UserStatusMuteAction message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @static + * @param {proto.SyncActionValue.UserStatusMuteAction} message UserStatusMuteAction + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + UserStatusMuteAction.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.muted = false; + if (message.muted != null && message.hasOwnProperty("muted")) + object.muted = message.muted; + return object; + }; + + /** + * Converts this UserStatusMuteAction to JSON. + * @function toJSON + * @memberof proto.SyncActionValue.UserStatusMuteAction + * @instance + * @returns {Object.} JSON object + */ + UserStatusMuteAction.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return UserStatusMuteAction; + })(); + + return SyncActionValue; + })(); + + proto.SyncdIndex = (function() { + + /** + * Properties of a SyncdIndex. + * @memberof proto + * @interface ISyncdIndex + * @property {Uint8Array|null} [blob] SyncdIndex blob + */ + + /** + * Constructs a new SyncdIndex. + * @memberof proto + * @classdesc Represents a SyncdIndex. + * @implements ISyncdIndex + * @constructor + * @param {proto.ISyncdIndex=} [properties] Properties to set + */ + function SyncdIndex(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdIndex blob. + * @member {Uint8Array} blob + * @memberof proto.SyncdIndex + * @instance + */ + SyncdIndex.prototype.blob = $util.newBuffer([]); + + /** + * Creates a new SyncdIndex instance using the specified properties. + * @function create + * @memberof proto.SyncdIndex + * @static + * @param {proto.ISyncdIndex=} [properties] Properties to set + * @returns {proto.SyncdIndex} SyncdIndex instance + */ + SyncdIndex.create = function create(properties) { + return new SyncdIndex(properties); + }; + + /** + * Encodes the specified SyncdIndex message. Does not implicitly {@link proto.SyncdIndex.verify|verify} messages. + * @function encode + * @memberof proto.SyncdIndex + * @static + * @param {proto.ISyncdIndex} message SyncdIndex message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdIndex.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.blob != null && Object.hasOwnProperty.call(message, "blob")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.blob); + return writer; + }; + + /** + * Encodes the specified SyncdIndex message, length delimited. Does not implicitly {@link proto.SyncdIndex.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdIndex + * @static + * @param {proto.ISyncdIndex} message SyncdIndex message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdIndex.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdIndex message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdIndex + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdIndex} SyncdIndex + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdIndex.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdIndex(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.blob = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdIndex message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdIndex + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdIndex} SyncdIndex + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdIndex.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdIndex message. + * @function verify + * @memberof proto.SyncdIndex + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdIndex.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.blob != null && message.hasOwnProperty("blob")) + if (!(message.blob && typeof message.blob.length === "number" || $util.isString(message.blob))) + return "blob: buffer expected"; + return null; + }; + + /** + * Creates a SyncdIndex message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdIndex + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdIndex} SyncdIndex + */ + SyncdIndex.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdIndex) + return object; + var message = new $root.proto.SyncdIndex(); + if (object.blob != null) + if (typeof object.blob === "string") + $util.base64.decode(object.blob, message.blob = $util.newBuffer($util.base64.length(object.blob)), 0); + else if (object.blob.length) + message.blob = object.blob; + return message; + }; + + /** + * Creates a plain object from a SyncdIndex message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdIndex + * @static + * @param {proto.SyncdIndex} message SyncdIndex + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdIndex.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.blob = ""; + else { + object.blob = []; + if (options.bytes !== Array) + object.blob = $util.newBuffer(object.blob); + } + if (message.blob != null && message.hasOwnProperty("blob")) + object.blob = options.bytes === String ? $util.base64.encode(message.blob, 0, message.blob.length) : options.bytes === Array ? Array.prototype.slice.call(message.blob) : message.blob; + return object; + }; + + /** + * Converts this SyncdIndex to JSON. + * @function toJSON + * @memberof proto.SyncdIndex + * @instance + * @returns {Object.} JSON object + */ + SyncdIndex.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncdIndex; + })(); + + proto.SyncdMutation = (function() { + + /** + * Properties of a SyncdMutation. + * @memberof proto + * @interface ISyncdMutation + * @property {proto.SyncdMutation.SyncdOperation|null} [operation] SyncdMutation operation + * @property {proto.ISyncdRecord|null} [record] SyncdMutation record + */ + + /** + * Constructs a new SyncdMutation. + * @memberof proto + * @classdesc Represents a SyncdMutation. + * @implements ISyncdMutation + * @constructor + * @param {proto.ISyncdMutation=} [properties] Properties to set + */ + function SyncdMutation(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdMutation operation. + * @member {proto.SyncdMutation.SyncdOperation} operation + * @memberof proto.SyncdMutation + * @instance + */ + SyncdMutation.prototype.operation = 0; + + /** + * SyncdMutation record. + * @member {proto.ISyncdRecord|null|undefined} record + * @memberof proto.SyncdMutation + * @instance + */ + SyncdMutation.prototype.record = null; + + /** + * Creates a new SyncdMutation instance using the specified properties. + * @function create + * @memberof proto.SyncdMutation + * @static + * @param {proto.ISyncdMutation=} [properties] Properties to set + * @returns {proto.SyncdMutation} SyncdMutation instance + */ + SyncdMutation.create = function create(properties) { + return new SyncdMutation(properties); + }; + + /** + * Encodes the specified SyncdMutation message. Does not implicitly {@link proto.SyncdMutation.verify|verify} messages. + * @function encode + * @memberof proto.SyncdMutation + * @static + * @param {proto.ISyncdMutation} message SyncdMutation message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdMutation.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.operation != null && Object.hasOwnProperty.call(message, "operation")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.operation); + if (message.record != null && Object.hasOwnProperty.call(message, "record")) + $root.proto.SyncdRecord.encode(message.record, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SyncdMutation message, length delimited. Does not implicitly {@link proto.SyncdMutation.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdMutation + * @static + * @param {proto.ISyncdMutation} message SyncdMutation message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdMutation.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdMutation message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdMutation + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdMutation} SyncdMutation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdMutation.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdMutation(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.operation = reader.int32(); + break; + case 2: + message.record = $root.proto.SyncdRecord.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdMutation message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdMutation + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdMutation} SyncdMutation + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdMutation.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdMutation message. + * @function verify + * @memberof proto.SyncdMutation + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdMutation.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.operation != null && message.hasOwnProperty("operation")) + switch (message.operation) { + default: + return "operation: enum value expected"; + case 0: + case 1: + break; + } + if (message.record != null && message.hasOwnProperty("record")) { + var error = $root.proto.SyncdRecord.verify(message.record); + if (error) + return "record." + error; + } + return null; + }; + + /** + * Creates a SyncdMutation message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdMutation + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdMutation} SyncdMutation + */ + SyncdMutation.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdMutation) + return object; + var message = new $root.proto.SyncdMutation(); + switch (object.operation) { + case "SET": + case 0: + message.operation = 0; + break; + case "REMOVE": + case 1: + message.operation = 1; + break; + } + if (object.record != null) { + if (typeof object.record !== "object") + throw TypeError(".proto.SyncdMutation.record: object expected"); + message.record = $root.proto.SyncdRecord.fromObject(object.record); + } + return message; + }; + + /** + * Creates a plain object from a SyncdMutation message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdMutation + * @static + * @param {proto.SyncdMutation} message SyncdMutation + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdMutation.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.operation = options.enums === String ? "SET" : 0; + object.record = null; + } + if (message.operation != null && message.hasOwnProperty("operation")) + object.operation = options.enums === String ? $root.proto.SyncdMutation.SyncdOperation[message.operation] : message.operation; + if (message.record != null && message.hasOwnProperty("record")) + object.record = $root.proto.SyncdRecord.toObject(message.record, options); + return object; + }; + + /** + * Converts this SyncdMutation to JSON. + * @function toJSON + * @memberof proto.SyncdMutation + * @instance + * @returns {Object.} JSON object + */ + SyncdMutation.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * SyncdOperation enum. + * @name proto.SyncdMutation.SyncdOperation + * @enum {number} + * @property {number} SET=0 SET value + * @property {number} REMOVE=1 REMOVE value + */ + SyncdMutation.SyncdOperation = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "SET"] = 0; + values[valuesById[1] = "REMOVE"] = 1; + return values; + })(); + + return SyncdMutation; + })(); + + proto.SyncdMutations = (function() { + + /** + * Properties of a SyncdMutations. + * @memberof proto + * @interface ISyncdMutations + * @property {Array.|null} [mutations] SyncdMutations mutations + */ + + /** + * Constructs a new SyncdMutations. + * @memberof proto + * @classdesc Represents a SyncdMutations. + * @implements ISyncdMutations + * @constructor + * @param {proto.ISyncdMutations=} [properties] Properties to set + */ + function SyncdMutations(properties) { + this.mutations = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdMutations mutations. + * @member {Array.} mutations + * @memberof proto.SyncdMutations + * @instance + */ + SyncdMutations.prototype.mutations = $util.emptyArray; + + /** + * Creates a new SyncdMutations instance using the specified properties. + * @function create + * @memberof proto.SyncdMutations + * @static + * @param {proto.ISyncdMutations=} [properties] Properties to set + * @returns {proto.SyncdMutations} SyncdMutations instance + */ + SyncdMutations.create = function create(properties) { + return new SyncdMutations(properties); + }; + + /** + * Encodes the specified SyncdMutations message. Does not implicitly {@link proto.SyncdMutations.verify|verify} messages. + * @function encode + * @memberof proto.SyncdMutations + * @static + * @param {proto.ISyncdMutations} message SyncdMutations message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdMutations.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.mutations != null && message.mutations.length) + for (var i = 0; i < message.mutations.length; ++i) + $root.proto.SyncdMutation.encode(message.mutations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SyncdMutations message, length delimited. Does not implicitly {@link proto.SyncdMutations.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdMutations + * @static + * @param {proto.ISyncdMutations} message SyncdMutations message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdMutations.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdMutations message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdMutations + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdMutations} SyncdMutations + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdMutations.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdMutations(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.mutations && message.mutations.length)) + message.mutations = []; + message.mutations.push($root.proto.SyncdMutation.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdMutations message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdMutations + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdMutations} SyncdMutations + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdMutations.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdMutations message. + * @function verify + * @memberof proto.SyncdMutations + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdMutations.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.mutations != null && message.hasOwnProperty("mutations")) { + if (!Array.isArray(message.mutations)) + return "mutations: array expected"; + for (var i = 0; i < message.mutations.length; ++i) { + var error = $root.proto.SyncdMutation.verify(message.mutations[i]); + if (error) + return "mutations." + error; + } + } + return null; + }; + + /** + * Creates a SyncdMutations message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdMutations + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdMutations} SyncdMutations + */ + SyncdMutations.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdMutations) + return object; + var message = new $root.proto.SyncdMutations(); + if (object.mutations) { + if (!Array.isArray(object.mutations)) + throw TypeError(".proto.SyncdMutations.mutations: array expected"); + message.mutations = []; + for (var i = 0; i < object.mutations.length; ++i) { + if (typeof object.mutations[i] !== "object") + throw TypeError(".proto.SyncdMutations.mutations: object expected"); + message.mutations[i] = $root.proto.SyncdMutation.fromObject(object.mutations[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a SyncdMutations message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdMutations + * @static + * @param {proto.SyncdMutations} message SyncdMutations + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdMutations.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.mutations = []; + if (message.mutations && message.mutations.length) { + object.mutations = []; + for (var j = 0; j < message.mutations.length; ++j) + object.mutations[j] = $root.proto.SyncdMutation.toObject(message.mutations[j], options); + } + return object; + }; + + /** + * Converts this SyncdMutations to JSON. + * @function toJSON + * @memberof proto.SyncdMutations + * @instance + * @returns {Object.} JSON object + */ + SyncdMutations.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncdMutations; + })(); + + proto.SyncdPatch = (function() { + + /** + * Properties of a SyncdPatch. + * @memberof proto + * @interface ISyncdPatch + * @property {proto.ISyncdVersion|null} [version] SyncdPatch version + * @property {Array.|null} [mutations] SyncdPatch mutations + * @property {proto.IExternalBlobReference|null} [externalMutations] SyncdPatch externalMutations + * @property {Uint8Array|null} [snapshotMac] SyncdPatch snapshotMac + * @property {Uint8Array|null} [patchMac] SyncdPatch patchMac + * @property {proto.IKeyId|null} [keyId] SyncdPatch keyId + * @property {proto.IExitCode|null} [exitCode] SyncdPatch exitCode + * @property {number|null} [deviceIndex] SyncdPatch deviceIndex + */ + + /** + * Constructs a new SyncdPatch. + * @memberof proto + * @classdesc Represents a SyncdPatch. + * @implements ISyncdPatch + * @constructor + * @param {proto.ISyncdPatch=} [properties] Properties to set + */ + function SyncdPatch(properties) { + this.mutations = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdPatch version. + * @member {proto.ISyncdVersion|null|undefined} version + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.version = null; + + /** + * SyncdPatch mutations. + * @member {Array.} mutations + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.mutations = $util.emptyArray; + + /** + * SyncdPatch externalMutations. + * @member {proto.IExternalBlobReference|null|undefined} externalMutations + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.externalMutations = null; + + /** + * SyncdPatch snapshotMac. + * @member {Uint8Array} snapshotMac + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.snapshotMac = $util.newBuffer([]); + + /** + * SyncdPatch patchMac. + * @member {Uint8Array} patchMac + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.patchMac = $util.newBuffer([]); + + /** + * SyncdPatch keyId. + * @member {proto.IKeyId|null|undefined} keyId + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.keyId = null; + + /** + * SyncdPatch exitCode. + * @member {proto.IExitCode|null|undefined} exitCode + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.exitCode = null; + + /** + * SyncdPatch deviceIndex. + * @member {number} deviceIndex + * @memberof proto.SyncdPatch + * @instance + */ + SyncdPatch.prototype.deviceIndex = 0; + + /** + * Creates a new SyncdPatch instance using the specified properties. + * @function create + * @memberof proto.SyncdPatch + * @static + * @param {proto.ISyncdPatch=} [properties] Properties to set + * @returns {proto.SyncdPatch} SyncdPatch instance + */ + SyncdPatch.create = function create(properties) { + return new SyncdPatch(properties); + }; + + /** + * Encodes the specified SyncdPatch message. Does not implicitly {@link proto.SyncdPatch.verify|verify} messages. + * @function encode + * @memberof proto.SyncdPatch + * @static + * @param {proto.ISyncdPatch} message SyncdPatch message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdPatch.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + $root.proto.SyncdVersion.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.mutations != null && message.mutations.length) + for (var i = 0; i < message.mutations.length; ++i) + $root.proto.SyncdMutation.encode(message.mutations[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.externalMutations != null && Object.hasOwnProperty.call(message, "externalMutations")) + $root.proto.ExternalBlobReference.encode(message.externalMutations, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.snapshotMac != null && Object.hasOwnProperty.call(message, "snapshotMac")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.snapshotMac); + if (message.patchMac != null && Object.hasOwnProperty.call(message, "patchMac")) + writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.patchMac); + if (message.keyId != null && Object.hasOwnProperty.call(message, "keyId")) + $root.proto.KeyId.encode(message.keyId, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.exitCode != null && Object.hasOwnProperty.call(message, "exitCode")) + $root.proto.ExitCode.encode(message.exitCode, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.deviceIndex != null && Object.hasOwnProperty.call(message, "deviceIndex")) + writer.uint32(/* id 8, wireType 0 =*/64).uint32(message.deviceIndex); + return writer; + }; + + /** + * Encodes the specified SyncdPatch message, length delimited. Does not implicitly {@link proto.SyncdPatch.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdPatch + * @static + * @param {proto.ISyncdPatch} message SyncdPatch message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdPatch.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdPatch message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdPatch + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdPatch} SyncdPatch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdPatch.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdPatch(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.version = $root.proto.SyncdVersion.decode(reader, reader.uint32()); + break; + case 2: + if (!(message.mutations && message.mutations.length)) + message.mutations = []; + message.mutations.push($root.proto.SyncdMutation.decode(reader, reader.uint32())); + break; + case 3: + message.externalMutations = $root.proto.ExternalBlobReference.decode(reader, reader.uint32()); + break; + case 4: + message.snapshotMac = reader.bytes(); + break; + case 5: + message.patchMac = reader.bytes(); + break; + case 6: + message.keyId = $root.proto.KeyId.decode(reader, reader.uint32()); + break; + case 7: + message.exitCode = $root.proto.ExitCode.decode(reader, reader.uint32()); + break; + case 8: + message.deviceIndex = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdPatch message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdPatch + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdPatch} SyncdPatch + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdPatch.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdPatch message. + * @function verify + * @memberof proto.SyncdPatch + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdPatch.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.version != null && message.hasOwnProperty("version")) { + var error = $root.proto.SyncdVersion.verify(message.version); + if (error) + return "version." + error; + } + if (message.mutations != null && message.hasOwnProperty("mutations")) { + if (!Array.isArray(message.mutations)) + return "mutations: array expected"; + for (var i = 0; i < message.mutations.length; ++i) { + var error = $root.proto.SyncdMutation.verify(message.mutations[i]); + if (error) + return "mutations." + error; + } + } + if (message.externalMutations != null && message.hasOwnProperty("externalMutations")) { + var error = $root.proto.ExternalBlobReference.verify(message.externalMutations); + if (error) + return "externalMutations." + error; + } + if (message.snapshotMac != null && message.hasOwnProperty("snapshotMac")) + if (!(message.snapshotMac && typeof message.snapshotMac.length === "number" || $util.isString(message.snapshotMac))) + return "snapshotMac: buffer expected"; + if (message.patchMac != null && message.hasOwnProperty("patchMac")) + if (!(message.patchMac && typeof message.patchMac.length === "number" || $util.isString(message.patchMac))) + return "patchMac: buffer expected"; + if (message.keyId != null && message.hasOwnProperty("keyId")) { + var error = $root.proto.KeyId.verify(message.keyId); + if (error) + return "keyId." + error; + } + if (message.exitCode != null && message.hasOwnProperty("exitCode")) { + var error = $root.proto.ExitCode.verify(message.exitCode); + if (error) + return "exitCode." + error; + } + if (message.deviceIndex != null && message.hasOwnProperty("deviceIndex")) + if (!$util.isInteger(message.deviceIndex)) + return "deviceIndex: integer expected"; + return null; + }; + + /** + * Creates a SyncdPatch message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdPatch + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdPatch} SyncdPatch + */ + SyncdPatch.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdPatch) + return object; + var message = new $root.proto.SyncdPatch(); + if (object.version != null) { + if (typeof object.version !== "object") + throw TypeError(".proto.SyncdPatch.version: object expected"); + message.version = $root.proto.SyncdVersion.fromObject(object.version); + } + if (object.mutations) { + if (!Array.isArray(object.mutations)) + throw TypeError(".proto.SyncdPatch.mutations: array expected"); + message.mutations = []; + for (var i = 0; i < object.mutations.length; ++i) { + if (typeof object.mutations[i] !== "object") + throw TypeError(".proto.SyncdPatch.mutations: object expected"); + message.mutations[i] = $root.proto.SyncdMutation.fromObject(object.mutations[i]); + } + } + if (object.externalMutations != null) { + if (typeof object.externalMutations !== "object") + throw TypeError(".proto.SyncdPatch.externalMutations: object expected"); + message.externalMutations = $root.proto.ExternalBlobReference.fromObject(object.externalMutations); + } + if (object.snapshotMac != null) + if (typeof object.snapshotMac === "string") + $util.base64.decode(object.snapshotMac, message.snapshotMac = $util.newBuffer($util.base64.length(object.snapshotMac)), 0); + else if (object.snapshotMac.length) + message.snapshotMac = object.snapshotMac; + if (object.patchMac != null) + if (typeof object.patchMac === "string") + $util.base64.decode(object.patchMac, message.patchMac = $util.newBuffer($util.base64.length(object.patchMac)), 0); + else if (object.patchMac.length) + message.patchMac = object.patchMac; + if (object.keyId != null) { + if (typeof object.keyId !== "object") + throw TypeError(".proto.SyncdPatch.keyId: object expected"); + message.keyId = $root.proto.KeyId.fromObject(object.keyId); + } + if (object.exitCode != null) { + if (typeof object.exitCode !== "object") + throw TypeError(".proto.SyncdPatch.exitCode: object expected"); + message.exitCode = $root.proto.ExitCode.fromObject(object.exitCode); + } + if (object.deviceIndex != null) + message.deviceIndex = object.deviceIndex >>> 0; + return message; + }; + + /** + * Creates a plain object from a SyncdPatch message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdPatch + * @static + * @param {proto.SyncdPatch} message SyncdPatch + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdPatch.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.mutations = []; + if (options.defaults) { + object.version = null; + object.externalMutations = null; + if (options.bytes === String) + object.snapshotMac = ""; + else { + object.snapshotMac = []; + if (options.bytes !== Array) + object.snapshotMac = $util.newBuffer(object.snapshotMac); + } + if (options.bytes === String) + object.patchMac = ""; + else { + object.patchMac = []; + if (options.bytes !== Array) + object.patchMac = $util.newBuffer(object.patchMac); + } + object.keyId = null; + object.exitCode = null; + object.deviceIndex = 0; + } + if (message.version != null && message.hasOwnProperty("version")) + object.version = $root.proto.SyncdVersion.toObject(message.version, options); + if (message.mutations && message.mutations.length) { + object.mutations = []; + for (var j = 0; j < message.mutations.length; ++j) + object.mutations[j] = $root.proto.SyncdMutation.toObject(message.mutations[j], options); + } + if (message.externalMutations != null && message.hasOwnProperty("externalMutations")) + object.externalMutations = $root.proto.ExternalBlobReference.toObject(message.externalMutations, options); + if (message.snapshotMac != null && message.hasOwnProperty("snapshotMac")) + object.snapshotMac = options.bytes === String ? $util.base64.encode(message.snapshotMac, 0, message.snapshotMac.length) : options.bytes === Array ? Array.prototype.slice.call(message.snapshotMac) : message.snapshotMac; + if (message.patchMac != null && message.hasOwnProperty("patchMac")) + object.patchMac = options.bytes === String ? $util.base64.encode(message.patchMac, 0, message.patchMac.length) : options.bytes === Array ? Array.prototype.slice.call(message.patchMac) : message.patchMac; + if (message.keyId != null && message.hasOwnProperty("keyId")) + object.keyId = $root.proto.KeyId.toObject(message.keyId, options); + if (message.exitCode != null && message.hasOwnProperty("exitCode")) + object.exitCode = $root.proto.ExitCode.toObject(message.exitCode, options); + if (message.deviceIndex != null && message.hasOwnProperty("deviceIndex")) + object.deviceIndex = message.deviceIndex; + return object; + }; + + /** + * Converts this SyncdPatch to JSON. + * @function toJSON + * @memberof proto.SyncdPatch + * @instance + * @returns {Object.} JSON object + */ + SyncdPatch.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncdPatch; + })(); + + proto.SyncdRecord = (function() { + + /** + * Properties of a SyncdRecord. + * @memberof proto + * @interface ISyncdRecord + * @property {proto.ISyncdIndex|null} [index] SyncdRecord index + * @property {proto.ISyncdValue|null} [value] SyncdRecord value + * @property {proto.IKeyId|null} [keyId] SyncdRecord keyId + */ + + /** + * Constructs a new SyncdRecord. + * @memberof proto + * @classdesc Represents a SyncdRecord. + * @implements ISyncdRecord + * @constructor + * @param {proto.ISyncdRecord=} [properties] Properties to set + */ + function SyncdRecord(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdRecord index. + * @member {proto.ISyncdIndex|null|undefined} index + * @memberof proto.SyncdRecord + * @instance + */ + SyncdRecord.prototype.index = null; + + /** + * SyncdRecord value. + * @member {proto.ISyncdValue|null|undefined} value + * @memberof proto.SyncdRecord + * @instance + */ + SyncdRecord.prototype.value = null; + + /** + * SyncdRecord keyId. + * @member {proto.IKeyId|null|undefined} keyId + * @memberof proto.SyncdRecord + * @instance + */ + SyncdRecord.prototype.keyId = null; + + /** + * Creates a new SyncdRecord instance using the specified properties. + * @function create + * @memberof proto.SyncdRecord + * @static + * @param {proto.ISyncdRecord=} [properties] Properties to set + * @returns {proto.SyncdRecord} SyncdRecord instance + */ + SyncdRecord.create = function create(properties) { + return new SyncdRecord(properties); + }; + + /** + * Encodes the specified SyncdRecord message. Does not implicitly {@link proto.SyncdRecord.verify|verify} messages. + * @function encode + * @memberof proto.SyncdRecord + * @static + * @param {proto.ISyncdRecord} message SyncdRecord message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdRecord.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.index != null && Object.hasOwnProperty.call(message, "index")) + $root.proto.SyncdIndex.encode(message.index, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.value != null && Object.hasOwnProperty.call(message, "value")) + $root.proto.SyncdValue.encode(message.value, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.keyId != null && Object.hasOwnProperty.call(message, "keyId")) + $root.proto.KeyId.encode(message.keyId, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SyncdRecord message, length delimited. Does not implicitly {@link proto.SyncdRecord.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdRecord + * @static + * @param {proto.ISyncdRecord} message SyncdRecord message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdRecord.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdRecord message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdRecord + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdRecord} SyncdRecord + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdRecord.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdRecord(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.index = $root.proto.SyncdIndex.decode(reader, reader.uint32()); + break; + case 2: + message.value = $root.proto.SyncdValue.decode(reader, reader.uint32()); + break; + case 3: + message.keyId = $root.proto.KeyId.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdRecord message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdRecord + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdRecord} SyncdRecord + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdRecord.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdRecord message. + * @function verify + * @memberof proto.SyncdRecord + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdRecord.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.index != null && message.hasOwnProperty("index")) { + var error = $root.proto.SyncdIndex.verify(message.index); + if (error) + return "index." + error; + } + if (message.value != null && message.hasOwnProperty("value")) { + var error = $root.proto.SyncdValue.verify(message.value); + if (error) + return "value." + error; + } + if (message.keyId != null && message.hasOwnProperty("keyId")) { + var error = $root.proto.KeyId.verify(message.keyId); + if (error) + return "keyId." + error; + } + return null; + }; + + /** + * Creates a SyncdRecord message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdRecord + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdRecord} SyncdRecord + */ + SyncdRecord.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdRecord) + return object; + var message = new $root.proto.SyncdRecord(); + if (object.index != null) { + if (typeof object.index !== "object") + throw TypeError(".proto.SyncdRecord.index: object expected"); + message.index = $root.proto.SyncdIndex.fromObject(object.index); + } + if (object.value != null) { + if (typeof object.value !== "object") + throw TypeError(".proto.SyncdRecord.value: object expected"); + message.value = $root.proto.SyncdValue.fromObject(object.value); + } + if (object.keyId != null) { + if (typeof object.keyId !== "object") + throw TypeError(".proto.SyncdRecord.keyId: object expected"); + message.keyId = $root.proto.KeyId.fromObject(object.keyId); + } + return message; + }; + + /** + * Creates a plain object from a SyncdRecord message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdRecord + * @static + * @param {proto.SyncdRecord} message SyncdRecord + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdRecord.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.index = null; + object.value = null; + object.keyId = null; + } + if (message.index != null && message.hasOwnProperty("index")) + object.index = $root.proto.SyncdIndex.toObject(message.index, options); + if (message.value != null && message.hasOwnProperty("value")) + object.value = $root.proto.SyncdValue.toObject(message.value, options); + if (message.keyId != null && message.hasOwnProperty("keyId")) + object.keyId = $root.proto.KeyId.toObject(message.keyId, options); + return object; + }; + + /** + * Converts this SyncdRecord to JSON. + * @function toJSON + * @memberof proto.SyncdRecord + * @instance + * @returns {Object.} JSON object + */ + SyncdRecord.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncdRecord; + })(); + + proto.SyncdSnapshot = (function() { + + /** + * Properties of a SyncdSnapshot. + * @memberof proto + * @interface ISyncdSnapshot + * @property {proto.ISyncdVersion|null} [version] SyncdSnapshot version + * @property {Array.|null} [records] SyncdSnapshot records + * @property {Uint8Array|null} [mac] SyncdSnapshot mac + * @property {proto.IKeyId|null} [keyId] SyncdSnapshot keyId + */ + + /** + * Constructs a new SyncdSnapshot. + * @memberof proto + * @classdesc Represents a SyncdSnapshot. + * @implements ISyncdSnapshot + * @constructor + * @param {proto.ISyncdSnapshot=} [properties] Properties to set + */ + function SyncdSnapshot(properties) { + this.records = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdSnapshot version. + * @member {proto.ISyncdVersion|null|undefined} version + * @memberof proto.SyncdSnapshot + * @instance + */ + SyncdSnapshot.prototype.version = null; + + /** + * SyncdSnapshot records. + * @member {Array.} records + * @memberof proto.SyncdSnapshot + * @instance + */ + SyncdSnapshot.prototype.records = $util.emptyArray; + + /** + * SyncdSnapshot mac. + * @member {Uint8Array} mac + * @memberof proto.SyncdSnapshot + * @instance + */ + SyncdSnapshot.prototype.mac = $util.newBuffer([]); + + /** + * SyncdSnapshot keyId. + * @member {proto.IKeyId|null|undefined} keyId + * @memberof proto.SyncdSnapshot + * @instance + */ + SyncdSnapshot.prototype.keyId = null; + + /** + * Creates a new SyncdSnapshot instance using the specified properties. + * @function create + * @memberof proto.SyncdSnapshot + * @static + * @param {proto.ISyncdSnapshot=} [properties] Properties to set + * @returns {proto.SyncdSnapshot} SyncdSnapshot instance + */ + SyncdSnapshot.create = function create(properties) { + return new SyncdSnapshot(properties); + }; + + /** + * Encodes the specified SyncdSnapshot message. Does not implicitly {@link proto.SyncdSnapshot.verify|verify} messages. + * @function encode + * @memberof proto.SyncdSnapshot + * @static + * @param {proto.ISyncdSnapshot} message SyncdSnapshot message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdSnapshot.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + $root.proto.SyncdVersion.encode(message.version, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.records != null && message.records.length) + for (var i = 0; i < message.records.length; ++i) + $root.proto.SyncdRecord.encode(message.records[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.mac != null && Object.hasOwnProperty.call(message, "mac")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.mac); + if (message.keyId != null && Object.hasOwnProperty.call(message, "keyId")) + $root.proto.KeyId.encode(message.keyId, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SyncdSnapshot message, length delimited. Does not implicitly {@link proto.SyncdSnapshot.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdSnapshot + * @static + * @param {proto.ISyncdSnapshot} message SyncdSnapshot message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdSnapshot.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdSnapshot message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdSnapshot + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdSnapshot} SyncdSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdSnapshot.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdSnapshot(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.version = $root.proto.SyncdVersion.decode(reader, reader.uint32()); + break; + case 2: + if (!(message.records && message.records.length)) + message.records = []; + message.records.push($root.proto.SyncdRecord.decode(reader, reader.uint32())); + break; + case 3: + message.mac = reader.bytes(); + break; + case 4: + message.keyId = $root.proto.KeyId.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdSnapshot message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdSnapshot + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdSnapshot} SyncdSnapshot + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdSnapshot.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdSnapshot message. + * @function verify + * @memberof proto.SyncdSnapshot + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdSnapshot.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.version != null && message.hasOwnProperty("version")) { + var error = $root.proto.SyncdVersion.verify(message.version); + if (error) + return "version." + error; + } + if (message.records != null && message.hasOwnProperty("records")) { + if (!Array.isArray(message.records)) + return "records: array expected"; + for (var i = 0; i < message.records.length; ++i) { + var error = $root.proto.SyncdRecord.verify(message.records[i]); + if (error) + return "records." + error; + } + } + if (message.mac != null && message.hasOwnProperty("mac")) + if (!(message.mac && typeof message.mac.length === "number" || $util.isString(message.mac))) + return "mac: buffer expected"; + if (message.keyId != null && message.hasOwnProperty("keyId")) { + var error = $root.proto.KeyId.verify(message.keyId); + if (error) + return "keyId." + error; + } + return null; + }; + + /** + * Creates a SyncdSnapshot message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdSnapshot + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdSnapshot} SyncdSnapshot + */ + SyncdSnapshot.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdSnapshot) + return object; + var message = new $root.proto.SyncdSnapshot(); + if (object.version != null) { + if (typeof object.version !== "object") + throw TypeError(".proto.SyncdSnapshot.version: object expected"); + message.version = $root.proto.SyncdVersion.fromObject(object.version); + } + if (object.records) { + if (!Array.isArray(object.records)) + throw TypeError(".proto.SyncdSnapshot.records: array expected"); + message.records = []; + for (var i = 0; i < object.records.length; ++i) { + if (typeof object.records[i] !== "object") + throw TypeError(".proto.SyncdSnapshot.records: object expected"); + message.records[i] = $root.proto.SyncdRecord.fromObject(object.records[i]); + } + } + if (object.mac != null) + if (typeof object.mac === "string") + $util.base64.decode(object.mac, message.mac = $util.newBuffer($util.base64.length(object.mac)), 0); + else if (object.mac.length) + message.mac = object.mac; + if (object.keyId != null) { + if (typeof object.keyId !== "object") + throw TypeError(".proto.SyncdSnapshot.keyId: object expected"); + message.keyId = $root.proto.KeyId.fromObject(object.keyId); + } + return message; + }; + + /** + * Creates a plain object from a SyncdSnapshot message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdSnapshot + * @static + * @param {proto.SyncdSnapshot} message SyncdSnapshot + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdSnapshot.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.records = []; + if (options.defaults) { + object.version = null; + if (options.bytes === String) + object.mac = ""; + else { + object.mac = []; + if (options.bytes !== Array) + object.mac = $util.newBuffer(object.mac); + } + object.keyId = null; + } + if (message.version != null && message.hasOwnProperty("version")) + object.version = $root.proto.SyncdVersion.toObject(message.version, options); + if (message.records && message.records.length) { + object.records = []; + for (var j = 0; j < message.records.length; ++j) + object.records[j] = $root.proto.SyncdRecord.toObject(message.records[j], options); + } + if (message.mac != null && message.hasOwnProperty("mac")) + object.mac = options.bytes === String ? $util.base64.encode(message.mac, 0, message.mac.length) : options.bytes === Array ? Array.prototype.slice.call(message.mac) : message.mac; + if (message.keyId != null && message.hasOwnProperty("keyId")) + object.keyId = $root.proto.KeyId.toObject(message.keyId, options); + return object; + }; + + /** + * Converts this SyncdSnapshot to JSON. + * @function toJSON + * @memberof proto.SyncdSnapshot + * @instance + * @returns {Object.} JSON object + */ + SyncdSnapshot.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncdSnapshot; + })(); + + proto.SyncdValue = (function() { + + /** + * Properties of a SyncdValue. + * @memberof proto + * @interface ISyncdValue + * @property {Uint8Array|null} [blob] SyncdValue blob + */ + + /** + * Constructs a new SyncdValue. + * @memberof proto + * @classdesc Represents a SyncdValue. + * @implements ISyncdValue + * @constructor + * @param {proto.ISyncdValue=} [properties] Properties to set + */ + function SyncdValue(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdValue blob. + * @member {Uint8Array} blob + * @memberof proto.SyncdValue + * @instance + */ + SyncdValue.prototype.blob = $util.newBuffer([]); + + /** + * Creates a new SyncdValue instance using the specified properties. + * @function create + * @memberof proto.SyncdValue + * @static + * @param {proto.ISyncdValue=} [properties] Properties to set + * @returns {proto.SyncdValue} SyncdValue instance + */ + SyncdValue.create = function create(properties) { + return new SyncdValue(properties); + }; + + /** + * Encodes the specified SyncdValue message. Does not implicitly {@link proto.SyncdValue.verify|verify} messages. + * @function encode + * @memberof proto.SyncdValue + * @static + * @param {proto.ISyncdValue} message SyncdValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdValue.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.blob != null && Object.hasOwnProperty.call(message, "blob")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.blob); + return writer; + }; + + /** + * Encodes the specified SyncdValue message, length delimited. Does not implicitly {@link proto.SyncdValue.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdValue + * @static + * @param {proto.ISyncdValue} message SyncdValue message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdValue.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdValue message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdValue} SyncdValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdValue.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdValue(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.blob = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdValue message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdValue + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdValue} SyncdValue + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdValue.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdValue message. + * @function verify + * @memberof proto.SyncdValue + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdValue.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.blob != null && message.hasOwnProperty("blob")) + if (!(message.blob && typeof message.blob.length === "number" || $util.isString(message.blob))) + return "blob: buffer expected"; + return null; + }; + + /** + * Creates a SyncdValue message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdValue + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdValue} SyncdValue + */ + SyncdValue.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdValue) + return object; + var message = new $root.proto.SyncdValue(); + if (object.blob != null) + if (typeof object.blob === "string") + $util.base64.decode(object.blob, message.blob = $util.newBuffer($util.base64.length(object.blob)), 0); + else if (object.blob.length) + message.blob = object.blob; + return message; + }; + + /** + * Creates a plain object from a SyncdValue message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdValue + * @static + * @param {proto.SyncdValue} message SyncdValue + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdValue.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.blob = ""; + else { + object.blob = []; + if (options.bytes !== Array) + object.blob = $util.newBuffer(object.blob); + } + if (message.blob != null && message.hasOwnProperty("blob")) + object.blob = options.bytes === String ? $util.base64.encode(message.blob, 0, message.blob.length) : options.bytes === Array ? Array.prototype.slice.call(message.blob) : message.blob; + return object; + }; + + /** + * Converts this SyncdValue to JSON. + * @function toJSON + * @memberof proto.SyncdValue + * @instance + * @returns {Object.} JSON object + */ + SyncdValue.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncdValue; + })(); + + proto.SyncdVersion = (function() { + + /** + * Properties of a SyncdVersion. + * @memberof proto + * @interface ISyncdVersion + * @property {number|Long|null} [version] SyncdVersion version + */ + + /** + * Constructs a new SyncdVersion. + * @memberof proto + * @classdesc Represents a SyncdVersion. + * @implements ISyncdVersion + * @constructor + * @param {proto.ISyncdVersion=} [properties] Properties to set + */ + function SyncdVersion(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SyncdVersion version. + * @member {number|Long} version + * @memberof proto.SyncdVersion + * @instance + */ + SyncdVersion.prototype.version = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new SyncdVersion instance using the specified properties. + * @function create + * @memberof proto.SyncdVersion + * @static + * @param {proto.ISyncdVersion=} [properties] Properties to set + * @returns {proto.SyncdVersion} SyncdVersion instance + */ + SyncdVersion.create = function create(properties) { + return new SyncdVersion(properties); + }; + + /** + * Encodes the specified SyncdVersion message. Does not implicitly {@link proto.SyncdVersion.verify|verify} messages. + * @function encode + * @memberof proto.SyncdVersion + * @static + * @param {proto.ISyncdVersion} message SyncdVersion message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdVersion.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.version != null && Object.hasOwnProperty.call(message, "version")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.version); + return writer; + }; + + /** + * Encodes the specified SyncdVersion message, length delimited. Does not implicitly {@link proto.SyncdVersion.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.SyncdVersion + * @static + * @param {proto.ISyncdVersion} message SyncdVersion message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SyncdVersion.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SyncdVersion message from the specified reader or buffer. + * @function decode + * @memberof proto.SyncdVersion + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.SyncdVersion} SyncdVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdVersion.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.SyncdVersion(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.version = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SyncdVersion message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.SyncdVersion + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.SyncdVersion} SyncdVersion + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SyncdVersion.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SyncdVersion message. + * @function verify + * @memberof proto.SyncdVersion + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SyncdVersion.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.version != null && message.hasOwnProperty("version")) + if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high))) + return "version: integer|Long expected"; + return null; + }; + + /** + * Creates a SyncdVersion message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.SyncdVersion + * @static + * @param {Object.} object Plain object + * @returns {proto.SyncdVersion} SyncdVersion + */ + SyncdVersion.fromObject = function fromObject(object) { + if (object instanceof $root.proto.SyncdVersion) + return object; + var message = new $root.proto.SyncdVersion(); + if (object.version != null) + if ($util.Long) + (message.version = $util.Long.fromValue(object.version)).unsigned = true; + else if (typeof object.version === "string") + message.version = parseInt(object.version, 10); + else if (typeof object.version === "number") + message.version = object.version; + else if (typeof object.version === "object") + message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a SyncdVersion message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.SyncdVersion + * @static + * @param {proto.SyncdVersion} message SyncdVersion + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SyncdVersion.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.version = options.longs === String ? "0" : 0; + if (message.version != null && message.hasOwnProperty("version")) + if (typeof message.version === "number") + object.version = options.longs === String ? String(message.version) : message.version; + else + object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber(true) : message.version; + return object; + }; + + /** + * Converts this SyncdVersion to JSON. + * @function toJSON + * @memberof proto.SyncdVersion + * @instance + * @returns {Object.} JSON object + */ + SyncdVersion.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SyncdVersion; + })(); + + proto.TemplateButton = (function() { + + /** + * Properties of a TemplateButton. + * @memberof proto + * @interface ITemplateButton + * @property {number|null} [index] TemplateButton index + * @property {proto.TemplateButton.IQuickReplyButton|null} [quickReplyButton] TemplateButton quickReplyButton + * @property {proto.TemplateButton.IURLButton|null} [urlButton] TemplateButton urlButton + * @property {proto.TemplateButton.ICallButton|null} [callButton] TemplateButton callButton + */ + + /** + * Constructs a new TemplateButton. + * @memberof proto + * @classdesc Represents a TemplateButton. + * @implements ITemplateButton + * @constructor + * @param {proto.ITemplateButton=} [properties] Properties to set + */ + function TemplateButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TemplateButton index. + * @member {number} index + * @memberof proto.TemplateButton + * @instance + */ + TemplateButton.prototype.index = 0; + + /** + * TemplateButton quickReplyButton. + * @member {proto.TemplateButton.IQuickReplyButton|null|undefined} quickReplyButton + * @memberof proto.TemplateButton + * @instance + */ + TemplateButton.prototype.quickReplyButton = null; + + /** + * TemplateButton urlButton. + * @member {proto.TemplateButton.IURLButton|null|undefined} urlButton + * @memberof proto.TemplateButton + * @instance + */ + TemplateButton.prototype.urlButton = null; + + /** + * TemplateButton callButton. + * @member {proto.TemplateButton.ICallButton|null|undefined} callButton + * @memberof proto.TemplateButton + * @instance + */ + TemplateButton.prototype.callButton = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * TemplateButton button. + * @member {"quickReplyButton"|"urlButton"|"callButton"|undefined} button + * @memberof proto.TemplateButton + * @instance + */ + Object.defineProperty(TemplateButton.prototype, "button", { + get: $util.oneOfGetter($oneOfFields = ["quickReplyButton", "urlButton", "callButton"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new TemplateButton instance using the specified properties. + * @function create + * @memberof proto.TemplateButton + * @static + * @param {proto.ITemplateButton=} [properties] Properties to set + * @returns {proto.TemplateButton} TemplateButton instance + */ + TemplateButton.create = function create(properties) { + return new TemplateButton(properties); + }; + + /** + * Encodes the specified TemplateButton message. Does not implicitly {@link proto.TemplateButton.verify|verify} messages. + * @function encode + * @memberof proto.TemplateButton + * @static + * @param {proto.ITemplateButton} message TemplateButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TemplateButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.quickReplyButton != null && Object.hasOwnProperty.call(message, "quickReplyButton")) + $root.proto.TemplateButton.QuickReplyButton.encode(message.quickReplyButton, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.urlButton != null && Object.hasOwnProperty.call(message, "urlButton")) + $root.proto.TemplateButton.URLButton.encode(message.urlButton, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.callButton != null && Object.hasOwnProperty.call(message, "callButton")) + $root.proto.TemplateButton.CallButton.encode(message.callButton, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.index != null && Object.hasOwnProperty.call(message, "index")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.index); + return writer; + }; + + /** + * Encodes the specified TemplateButton message, length delimited. Does not implicitly {@link proto.TemplateButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.TemplateButton + * @static + * @param {proto.ITemplateButton} message TemplateButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TemplateButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TemplateButton message from the specified reader or buffer. + * @function decode + * @memberof proto.TemplateButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.TemplateButton} TemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TemplateButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.TemplateButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 4: + message.index = reader.uint32(); + break; + case 1: + message.quickReplyButton = $root.proto.TemplateButton.QuickReplyButton.decode(reader, reader.uint32()); + break; + case 2: + message.urlButton = $root.proto.TemplateButton.URLButton.decode(reader, reader.uint32()); + break; + case 3: + message.callButton = $root.proto.TemplateButton.CallButton.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TemplateButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.TemplateButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.TemplateButton} TemplateButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TemplateButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TemplateButton message. + * @function verify + * @memberof proto.TemplateButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TemplateButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.index != null && message.hasOwnProperty("index")) + if (!$util.isInteger(message.index)) + return "index: integer expected"; + if (message.quickReplyButton != null && message.hasOwnProperty("quickReplyButton")) { + properties.button = 1; + { + var error = $root.proto.TemplateButton.QuickReplyButton.verify(message.quickReplyButton); + if (error) + return "quickReplyButton." + error; + } + } + if (message.urlButton != null && message.hasOwnProperty("urlButton")) { + if (properties.button === 1) + return "button: multiple values"; + properties.button = 1; + { + var error = $root.proto.TemplateButton.URLButton.verify(message.urlButton); + if (error) + return "urlButton." + error; + } + } + if (message.callButton != null && message.hasOwnProperty("callButton")) { + if (properties.button === 1) + return "button: multiple values"; + properties.button = 1; + { + var error = $root.proto.TemplateButton.CallButton.verify(message.callButton); + if (error) + return "callButton." + error; + } + } + return null; + }; + + /** + * Creates a TemplateButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.TemplateButton + * @static + * @param {Object.} object Plain object + * @returns {proto.TemplateButton} TemplateButton + */ + TemplateButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.TemplateButton) + return object; + var message = new $root.proto.TemplateButton(); + if (object.index != null) + message.index = object.index >>> 0; + if (object.quickReplyButton != null) { + if (typeof object.quickReplyButton !== "object") + throw TypeError(".proto.TemplateButton.quickReplyButton: object expected"); + message.quickReplyButton = $root.proto.TemplateButton.QuickReplyButton.fromObject(object.quickReplyButton); + } + if (object.urlButton != null) { + if (typeof object.urlButton !== "object") + throw TypeError(".proto.TemplateButton.urlButton: object expected"); + message.urlButton = $root.proto.TemplateButton.URLButton.fromObject(object.urlButton); + } + if (object.callButton != null) { + if (typeof object.callButton !== "object") + throw TypeError(".proto.TemplateButton.callButton: object expected"); + message.callButton = $root.proto.TemplateButton.CallButton.fromObject(object.callButton); + } + return message; + }; + + /** + * Creates a plain object from a TemplateButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.TemplateButton + * @static + * @param {proto.TemplateButton} message TemplateButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + TemplateButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.index = 0; + if (message.quickReplyButton != null && message.hasOwnProperty("quickReplyButton")) { + object.quickReplyButton = $root.proto.TemplateButton.QuickReplyButton.toObject(message.quickReplyButton, options); + if (options.oneofs) + object.button = "quickReplyButton"; + } + if (message.urlButton != null && message.hasOwnProperty("urlButton")) { + object.urlButton = $root.proto.TemplateButton.URLButton.toObject(message.urlButton, options); + if (options.oneofs) + object.button = "urlButton"; + } + if (message.callButton != null && message.hasOwnProperty("callButton")) { + object.callButton = $root.proto.TemplateButton.CallButton.toObject(message.callButton, options); + if (options.oneofs) + object.button = "callButton"; + } + if (message.index != null && message.hasOwnProperty("index")) + object.index = message.index; + return object; + }; + + /** + * Converts this TemplateButton to JSON. + * @function toJSON + * @memberof proto.TemplateButton + * @instance + * @returns {Object.} JSON object + */ + TemplateButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + TemplateButton.CallButton = (function() { + + /** + * Properties of a CallButton. + * @memberof proto.TemplateButton + * @interface ICallButton + * @property {proto.Message.IHighlyStructuredMessage|null} [displayText] CallButton displayText + * @property {proto.Message.IHighlyStructuredMessage|null} [phoneNumber] CallButton phoneNumber + */ + + /** + * Constructs a new CallButton. + * @memberof proto.TemplateButton + * @classdesc Represents a CallButton. + * @implements ICallButton + * @constructor + * @param {proto.TemplateButton.ICallButton=} [properties] Properties to set + */ + function CallButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * CallButton displayText. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} displayText + * @memberof proto.TemplateButton.CallButton + * @instance + */ + CallButton.prototype.displayText = null; + + /** + * CallButton phoneNumber. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} phoneNumber + * @memberof proto.TemplateButton.CallButton + * @instance + */ + CallButton.prototype.phoneNumber = null; + + /** + * Creates a new CallButton instance using the specified properties. + * @function create + * @memberof proto.TemplateButton.CallButton + * @static + * @param {proto.TemplateButton.ICallButton=} [properties] Properties to set + * @returns {proto.TemplateButton.CallButton} CallButton instance + */ + CallButton.create = function create(properties) { + return new CallButton(properties); + }; + + /** + * Encodes the specified CallButton message. Does not implicitly {@link proto.TemplateButton.CallButton.verify|verify} messages. + * @function encode + * @memberof proto.TemplateButton.CallButton + * @static + * @param {proto.TemplateButton.ICallButton} message CallButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CallButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayText != null && Object.hasOwnProperty.call(message, "displayText")) + $root.proto.Message.HighlyStructuredMessage.encode(message.displayText, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.phoneNumber != null && Object.hasOwnProperty.call(message, "phoneNumber")) + $root.proto.Message.HighlyStructuredMessage.encode(message.phoneNumber, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified CallButton message, length delimited. Does not implicitly {@link proto.TemplateButton.CallButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.TemplateButton.CallButton + * @static + * @param {proto.TemplateButton.ICallButton} message CallButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + CallButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a CallButton message from the specified reader or buffer. + * @function decode + * @memberof proto.TemplateButton.CallButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.TemplateButton.CallButton} CallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CallButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.TemplateButton.CallButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayText = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + case 2: + message.phoneNumber = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a CallButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.TemplateButton.CallButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.TemplateButton.CallButton} CallButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + CallButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a CallButton message. + * @function verify + * @memberof proto.TemplateButton.CallButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + CallButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayText != null && message.hasOwnProperty("displayText")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.displayText); + if (error) + return "displayText." + error; + } + if (message.phoneNumber != null && message.hasOwnProperty("phoneNumber")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.phoneNumber); + if (error) + return "phoneNumber." + error; + } + return null; + }; + + /** + * Creates a CallButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.TemplateButton.CallButton + * @static + * @param {Object.} object Plain object + * @returns {proto.TemplateButton.CallButton} CallButton + */ + CallButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.TemplateButton.CallButton) + return object; + var message = new $root.proto.TemplateButton.CallButton(); + if (object.displayText != null) { + if (typeof object.displayText !== "object") + throw TypeError(".proto.TemplateButton.CallButton.displayText: object expected"); + message.displayText = $root.proto.Message.HighlyStructuredMessage.fromObject(object.displayText); + } + if (object.phoneNumber != null) { + if (typeof object.phoneNumber !== "object") + throw TypeError(".proto.TemplateButton.CallButton.phoneNumber: object expected"); + message.phoneNumber = $root.proto.Message.HighlyStructuredMessage.fromObject(object.phoneNumber); + } + return message; + }; + + /** + * Creates a plain object from a CallButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.TemplateButton.CallButton + * @static + * @param {proto.TemplateButton.CallButton} message CallButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + CallButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayText = null; + object.phoneNumber = null; + } + if (message.displayText != null && message.hasOwnProperty("displayText")) + object.displayText = $root.proto.Message.HighlyStructuredMessage.toObject(message.displayText, options); + if (message.phoneNumber != null && message.hasOwnProperty("phoneNumber")) + object.phoneNumber = $root.proto.Message.HighlyStructuredMessage.toObject(message.phoneNumber, options); + return object; + }; + + /** + * Converts this CallButton to JSON. + * @function toJSON + * @memberof proto.TemplateButton.CallButton + * @instance + * @returns {Object.} JSON object + */ + CallButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return CallButton; + })(); + + TemplateButton.QuickReplyButton = (function() { + + /** + * Properties of a QuickReplyButton. + * @memberof proto.TemplateButton + * @interface IQuickReplyButton + * @property {proto.Message.IHighlyStructuredMessage|null} [displayText] QuickReplyButton displayText + * @property {string|null} [id] QuickReplyButton id + */ + + /** + * Constructs a new QuickReplyButton. + * @memberof proto.TemplateButton + * @classdesc Represents a QuickReplyButton. + * @implements IQuickReplyButton + * @constructor + * @param {proto.TemplateButton.IQuickReplyButton=} [properties] Properties to set + */ + function QuickReplyButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * QuickReplyButton displayText. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} displayText + * @memberof proto.TemplateButton.QuickReplyButton + * @instance + */ + QuickReplyButton.prototype.displayText = null; + + /** + * QuickReplyButton id. + * @member {string} id + * @memberof proto.TemplateButton.QuickReplyButton + * @instance + */ + QuickReplyButton.prototype.id = ""; + + /** + * Creates a new QuickReplyButton instance using the specified properties. + * @function create + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {proto.TemplateButton.IQuickReplyButton=} [properties] Properties to set + * @returns {proto.TemplateButton.QuickReplyButton} QuickReplyButton instance + */ + QuickReplyButton.create = function create(properties) { + return new QuickReplyButton(properties); + }; + + /** + * Encodes the specified QuickReplyButton message. Does not implicitly {@link proto.TemplateButton.QuickReplyButton.verify|verify} messages. + * @function encode + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {proto.TemplateButton.IQuickReplyButton} message QuickReplyButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + QuickReplyButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayText != null && Object.hasOwnProperty.call(message, "displayText")) + $root.proto.Message.HighlyStructuredMessage.encode(message.displayText, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.id); + return writer; + }; + + /** + * Encodes the specified QuickReplyButton message, length delimited. Does not implicitly {@link proto.TemplateButton.QuickReplyButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {proto.TemplateButton.IQuickReplyButton} message QuickReplyButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + QuickReplyButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a QuickReplyButton message from the specified reader or buffer. + * @function decode + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.TemplateButton.QuickReplyButton} QuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + QuickReplyButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.TemplateButton.QuickReplyButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayText = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + case 2: + message.id = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a QuickReplyButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.TemplateButton.QuickReplyButton} QuickReplyButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + QuickReplyButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a QuickReplyButton message. + * @function verify + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + QuickReplyButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayText != null && message.hasOwnProperty("displayText")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.displayText); + if (error) + return "displayText." + error; + } + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isString(message.id)) + return "id: string expected"; + return null; + }; + + /** + * Creates a QuickReplyButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {Object.} object Plain object + * @returns {proto.TemplateButton.QuickReplyButton} QuickReplyButton + */ + QuickReplyButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.TemplateButton.QuickReplyButton) + return object; + var message = new $root.proto.TemplateButton.QuickReplyButton(); + if (object.displayText != null) { + if (typeof object.displayText !== "object") + throw TypeError(".proto.TemplateButton.QuickReplyButton.displayText: object expected"); + message.displayText = $root.proto.Message.HighlyStructuredMessage.fromObject(object.displayText); + } + if (object.id != null) + message.id = String(object.id); + return message; + }; + + /** + * Creates a plain object from a QuickReplyButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.TemplateButton.QuickReplyButton + * @static + * @param {proto.TemplateButton.QuickReplyButton} message QuickReplyButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + QuickReplyButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayText = null; + object.id = ""; + } + if (message.displayText != null && message.hasOwnProperty("displayText")) + object.displayText = $root.proto.Message.HighlyStructuredMessage.toObject(message.displayText, options); + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + return object; + }; + + /** + * Converts this QuickReplyButton to JSON. + * @function toJSON + * @memberof proto.TemplateButton.QuickReplyButton + * @instance + * @returns {Object.} JSON object + */ + QuickReplyButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return QuickReplyButton; + })(); + + TemplateButton.URLButton = (function() { + + /** + * Properties of a URLButton. + * @memberof proto.TemplateButton + * @interface IURLButton + * @property {proto.Message.IHighlyStructuredMessage|null} [displayText] URLButton displayText + * @property {proto.Message.IHighlyStructuredMessage|null} [url] URLButton url + */ + + /** + * Constructs a new URLButton. + * @memberof proto.TemplateButton + * @classdesc Represents a URLButton. + * @implements IURLButton + * @constructor + * @param {proto.TemplateButton.IURLButton=} [properties] Properties to set + */ + function URLButton(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * URLButton displayText. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} displayText + * @memberof proto.TemplateButton.URLButton + * @instance + */ + URLButton.prototype.displayText = null; + + /** + * URLButton url. + * @member {proto.Message.IHighlyStructuredMessage|null|undefined} url + * @memberof proto.TemplateButton.URLButton + * @instance + */ + URLButton.prototype.url = null; + + /** + * Creates a new URLButton instance using the specified properties. + * @function create + * @memberof proto.TemplateButton.URLButton + * @static + * @param {proto.TemplateButton.IURLButton=} [properties] Properties to set + * @returns {proto.TemplateButton.URLButton} URLButton instance + */ + URLButton.create = function create(properties) { + return new URLButton(properties); + }; + + /** + * Encodes the specified URLButton message. Does not implicitly {@link proto.TemplateButton.URLButton.verify|verify} messages. + * @function encode + * @memberof proto.TemplateButton.URLButton + * @static + * @param {proto.TemplateButton.IURLButton} message URLButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + URLButton.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.displayText != null && Object.hasOwnProperty.call(message, "displayText")) + $root.proto.Message.HighlyStructuredMessage.encode(message.displayText, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.url != null && Object.hasOwnProperty.call(message, "url")) + $root.proto.Message.HighlyStructuredMessage.encode(message.url, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified URLButton message, length delimited. Does not implicitly {@link proto.TemplateButton.URLButton.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.TemplateButton.URLButton + * @static + * @param {proto.TemplateButton.IURLButton} message URLButton message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + URLButton.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a URLButton message from the specified reader or buffer. + * @function decode + * @memberof proto.TemplateButton.URLButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.TemplateButton.URLButton} URLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + URLButton.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.TemplateButton.URLButton(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.displayText = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + case 2: + message.url = $root.proto.Message.HighlyStructuredMessage.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a URLButton message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.TemplateButton.URLButton + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.TemplateButton.URLButton} URLButton + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + URLButton.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a URLButton message. + * @function verify + * @memberof proto.TemplateButton.URLButton + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + URLButton.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.displayText != null && message.hasOwnProperty("displayText")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.displayText); + if (error) + return "displayText." + error; + } + if (message.url != null && message.hasOwnProperty("url")) { + var error = $root.proto.Message.HighlyStructuredMessage.verify(message.url); + if (error) + return "url." + error; + } + return null; + }; + + /** + * Creates a URLButton message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.TemplateButton.URLButton + * @static + * @param {Object.} object Plain object + * @returns {proto.TemplateButton.URLButton} URLButton + */ + URLButton.fromObject = function fromObject(object) { + if (object instanceof $root.proto.TemplateButton.URLButton) + return object; + var message = new $root.proto.TemplateButton.URLButton(); + if (object.displayText != null) { + if (typeof object.displayText !== "object") + throw TypeError(".proto.TemplateButton.URLButton.displayText: object expected"); + message.displayText = $root.proto.Message.HighlyStructuredMessage.fromObject(object.displayText); + } + if (object.url != null) { + if (typeof object.url !== "object") + throw TypeError(".proto.TemplateButton.URLButton.url: object expected"); + message.url = $root.proto.Message.HighlyStructuredMessage.fromObject(object.url); + } + return message; + }; + + /** + * Creates a plain object from a URLButton message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.TemplateButton.URLButton + * @static + * @param {proto.TemplateButton.URLButton} message URLButton + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + URLButton.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.displayText = null; + object.url = null; + } + if (message.displayText != null && message.hasOwnProperty("displayText")) + object.displayText = $root.proto.Message.HighlyStructuredMessage.toObject(message.displayText, options); + if (message.url != null && message.hasOwnProperty("url")) + object.url = $root.proto.Message.HighlyStructuredMessage.toObject(message.url, options); + return object; + }; + + /** + * Converts this URLButton to JSON. + * @function toJSON + * @memberof proto.TemplateButton.URLButton + * @instance + * @returns {Object.} JSON object + */ + URLButton.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return URLButton; + })(); + + return TemplateButton; + })(); + + proto.UserReceipt = (function() { + + /** + * Properties of a UserReceipt. + * @memberof proto + * @interface IUserReceipt + * @property {string} userJid UserReceipt userJid + * @property {number|Long|null} [receiptTimestamp] UserReceipt receiptTimestamp + * @property {number|Long|null} [readTimestamp] UserReceipt readTimestamp + * @property {number|Long|null} [playedTimestamp] UserReceipt playedTimestamp + * @property {Array.|null} [pendingDeviceJid] UserReceipt pendingDeviceJid + * @property {Array.|null} [deliveredDeviceJid] UserReceipt deliveredDeviceJid + */ + + /** + * Constructs a new UserReceipt. + * @memberof proto + * @classdesc Represents a UserReceipt. + * @implements IUserReceipt + * @constructor + * @param {proto.IUserReceipt=} [properties] Properties to set + */ + function UserReceipt(properties) { + this.pendingDeviceJid = []; + this.deliveredDeviceJid = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * UserReceipt userJid. + * @member {string} userJid + * @memberof proto.UserReceipt + * @instance + */ + UserReceipt.prototype.userJid = ""; + + /** + * UserReceipt receiptTimestamp. + * @member {number|Long} receiptTimestamp + * @memberof proto.UserReceipt + * @instance + */ + UserReceipt.prototype.receiptTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * UserReceipt readTimestamp. + * @member {number|Long} readTimestamp + * @memberof proto.UserReceipt + * @instance + */ + UserReceipt.prototype.readTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * UserReceipt playedTimestamp. + * @member {number|Long} playedTimestamp + * @memberof proto.UserReceipt + * @instance + */ + UserReceipt.prototype.playedTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * UserReceipt pendingDeviceJid. + * @member {Array.} pendingDeviceJid + * @memberof proto.UserReceipt + * @instance + */ + UserReceipt.prototype.pendingDeviceJid = $util.emptyArray; + + /** + * UserReceipt deliveredDeviceJid. + * @member {Array.} deliveredDeviceJid + * @memberof proto.UserReceipt + * @instance + */ + UserReceipt.prototype.deliveredDeviceJid = $util.emptyArray; + + /** + * Creates a new UserReceipt instance using the specified properties. + * @function create + * @memberof proto.UserReceipt + * @static + * @param {proto.IUserReceipt=} [properties] Properties to set + * @returns {proto.UserReceipt} UserReceipt instance + */ + UserReceipt.create = function create(properties) { + return new UserReceipt(properties); + }; + + /** + * Encodes the specified UserReceipt message. Does not implicitly {@link proto.UserReceipt.verify|verify} messages. + * @function encode + * @memberof proto.UserReceipt + * @static + * @param {proto.IUserReceipt} message UserReceipt message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserReceipt.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + writer.uint32(/* id 1, wireType 2 =*/10).string(message.userJid); + if (message.receiptTimestamp != null && Object.hasOwnProperty.call(message, "receiptTimestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).int64(message.receiptTimestamp); + if (message.readTimestamp != null && Object.hasOwnProperty.call(message, "readTimestamp")) + writer.uint32(/* id 3, wireType 0 =*/24).int64(message.readTimestamp); + if (message.playedTimestamp != null && Object.hasOwnProperty.call(message, "playedTimestamp")) + writer.uint32(/* id 4, wireType 0 =*/32).int64(message.playedTimestamp); + if (message.pendingDeviceJid != null && message.pendingDeviceJid.length) + for (var i = 0; i < message.pendingDeviceJid.length; ++i) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.pendingDeviceJid[i]); + if (message.deliveredDeviceJid != null && message.deliveredDeviceJid.length) + for (var i = 0; i < message.deliveredDeviceJid.length; ++i) + writer.uint32(/* id 6, wireType 2 =*/50).string(message.deliveredDeviceJid[i]); + return writer; + }; + + /** + * Encodes the specified UserReceipt message, length delimited. Does not implicitly {@link proto.UserReceipt.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.UserReceipt + * @static + * @param {proto.IUserReceipt} message UserReceipt message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserReceipt.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a UserReceipt message from the specified reader or buffer. + * @function decode + * @memberof proto.UserReceipt + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.UserReceipt} UserReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserReceipt.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.UserReceipt(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.userJid = reader.string(); + break; + case 2: + message.receiptTimestamp = reader.int64(); + break; + case 3: + message.readTimestamp = reader.int64(); + break; + case 4: + message.playedTimestamp = reader.int64(); + break; + case 5: + if (!(message.pendingDeviceJid && message.pendingDeviceJid.length)) + message.pendingDeviceJid = []; + message.pendingDeviceJid.push(reader.string()); + break; + case 6: + if (!(message.deliveredDeviceJid && message.deliveredDeviceJid.length)) + message.deliveredDeviceJid = []; + message.deliveredDeviceJid.push(reader.string()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("userJid")) + throw $util.ProtocolError("missing required 'userJid'", { instance: message }); + return message; + }; + + /** + * Decodes a UserReceipt message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.UserReceipt + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.UserReceipt} UserReceipt + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserReceipt.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a UserReceipt message. + * @function verify + * @memberof proto.UserReceipt + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UserReceipt.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (!$util.isString(message.userJid)) + return "userJid: string expected"; + if (message.receiptTimestamp != null && message.hasOwnProperty("receiptTimestamp")) + if (!$util.isInteger(message.receiptTimestamp) && !(message.receiptTimestamp && $util.isInteger(message.receiptTimestamp.low) && $util.isInteger(message.receiptTimestamp.high))) + return "receiptTimestamp: integer|Long expected"; + if (message.readTimestamp != null && message.hasOwnProperty("readTimestamp")) + if (!$util.isInteger(message.readTimestamp) && !(message.readTimestamp && $util.isInteger(message.readTimestamp.low) && $util.isInteger(message.readTimestamp.high))) + return "readTimestamp: integer|Long expected"; + if (message.playedTimestamp != null && message.hasOwnProperty("playedTimestamp")) + if (!$util.isInteger(message.playedTimestamp) && !(message.playedTimestamp && $util.isInteger(message.playedTimestamp.low) && $util.isInteger(message.playedTimestamp.high))) + return "playedTimestamp: integer|Long expected"; + if (message.pendingDeviceJid != null && message.hasOwnProperty("pendingDeviceJid")) { + if (!Array.isArray(message.pendingDeviceJid)) + return "pendingDeviceJid: array expected"; + for (var i = 0; i < message.pendingDeviceJid.length; ++i) + if (!$util.isString(message.pendingDeviceJid[i])) + return "pendingDeviceJid: string[] expected"; + } + if (message.deliveredDeviceJid != null && message.hasOwnProperty("deliveredDeviceJid")) { + if (!Array.isArray(message.deliveredDeviceJid)) + return "deliveredDeviceJid: array expected"; + for (var i = 0; i < message.deliveredDeviceJid.length; ++i) + if (!$util.isString(message.deliveredDeviceJid[i])) + return "deliveredDeviceJid: string[] expected"; + } + return null; + }; + + /** + * Creates a UserReceipt message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.UserReceipt + * @static + * @param {Object.} object Plain object + * @returns {proto.UserReceipt} UserReceipt + */ + UserReceipt.fromObject = function fromObject(object) { + if (object instanceof $root.proto.UserReceipt) + return object; + var message = new $root.proto.UserReceipt(); + if (object.userJid != null) + message.userJid = String(object.userJid); + if (object.receiptTimestamp != null) + if ($util.Long) + (message.receiptTimestamp = $util.Long.fromValue(object.receiptTimestamp)).unsigned = false; + else if (typeof object.receiptTimestamp === "string") + message.receiptTimestamp = parseInt(object.receiptTimestamp, 10); + else if (typeof object.receiptTimestamp === "number") + message.receiptTimestamp = object.receiptTimestamp; + else if (typeof object.receiptTimestamp === "object") + message.receiptTimestamp = new $util.LongBits(object.receiptTimestamp.low >>> 0, object.receiptTimestamp.high >>> 0).toNumber(); + if (object.readTimestamp != null) + if ($util.Long) + (message.readTimestamp = $util.Long.fromValue(object.readTimestamp)).unsigned = false; + else if (typeof object.readTimestamp === "string") + message.readTimestamp = parseInt(object.readTimestamp, 10); + else if (typeof object.readTimestamp === "number") + message.readTimestamp = object.readTimestamp; + else if (typeof object.readTimestamp === "object") + message.readTimestamp = new $util.LongBits(object.readTimestamp.low >>> 0, object.readTimestamp.high >>> 0).toNumber(); + if (object.playedTimestamp != null) + if ($util.Long) + (message.playedTimestamp = $util.Long.fromValue(object.playedTimestamp)).unsigned = false; + else if (typeof object.playedTimestamp === "string") + message.playedTimestamp = parseInt(object.playedTimestamp, 10); + else if (typeof object.playedTimestamp === "number") + message.playedTimestamp = object.playedTimestamp; + else if (typeof object.playedTimestamp === "object") + message.playedTimestamp = new $util.LongBits(object.playedTimestamp.low >>> 0, object.playedTimestamp.high >>> 0).toNumber(); + if (object.pendingDeviceJid) { + if (!Array.isArray(object.pendingDeviceJid)) + throw TypeError(".proto.UserReceipt.pendingDeviceJid: array expected"); + message.pendingDeviceJid = []; + for (var i = 0; i < object.pendingDeviceJid.length; ++i) + message.pendingDeviceJid[i] = String(object.pendingDeviceJid[i]); + } + if (object.deliveredDeviceJid) { + if (!Array.isArray(object.deliveredDeviceJid)) + throw TypeError(".proto.UserReceipt.deliveredDeviceJid: array expected"); + message.deliveredDeviceJid = []; + for (var i = 0; i < object.deliveredDeviceJid.length; ++i) + message.deliveredDeviceJid[i] = String(object.deliveredDeviceJid[i]); + } + return message; + }; + + /** + * Creates a plain object from a UserReceipt message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.UserReceipt + * @static + * @param {proto.UserReceipt} message UserReceipt + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + UserReceipt.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.pendingDeviceJid = []; + object.deliveredDeviceJid = []; + } + if (options.defaults) { + object.userJid = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.receiptTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.receiptTimestamp = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.readTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.readTimestamp = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.playedTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.playedTimestamp = options.longs === String ? "0" : 0; + } + if (message.userJid != null && message.hasOwnProperty("userJid")) + object.userJid = message.userJid; + if (message.receiptTimestamp != null && message.hasOwnProperty("receiptTimestamp")) + if (typeof message.receiptTimestamp === "number") + object.receiptTimestamp = options.longs === String ? String(message.receiptTimestamp) : message.receiptTimestamp; + else + object.receiptTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.receiptTimestamp) : options.longs === Number ? new $util.LongBits(message.receiptTimestamp.low >>> 0, message.receiptTimestamp.high >>> 0).toNumber() : message.receiptTimestamp; + if (message.readTimestamp != null && message.hasOwnProperty("readTimestamp")) + if (typeof message.readTimestamp === "number") + object.readTimestamp = options.longs === String ? String(message.readTimestamp) : message.readTimestamp; + else + object.readTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.readTimestamp) : options.longs === Number ? new $util.LongBits(message.readTimestamp.low >>> 0, message.readTimestamp.high >>> 0).toNumber() : message.readTimestamp; + if (message.playedTimestamp != null && message.hasOwnProperty("playedTimestamp")) + if (typeof message.playedTimestamp === "number") + object.playedTimestamp = options.longs === String ? String(message.playedTimestamp) : message.playedTimestamp; + else + object.playedTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.playedTimestamp) : options.longs === Number ? new $util.LongBits(message.playedTimestamp.low >>> 0, message.playedTimestamp.high >>> 0).toNumber() : message.playedTimestamp; + if (message.pendingDeviceJid && message.pendingDeviceJid.length) { + object.pendingDeviceJid = []; + for (var j = 0; j < message.pendingDeviceJid.length; ++j) + object.pendingDeviceJid[j] = message.pendingDeviceJid[j]; + } + if (message.deliveredDeviceJid && message.deliveredDeviceJid.length) { + object.deliveredDeviceJid = []; + for (var j = 0; j < message.deliveredDeviceJid.length; ++j) + object.deliveredDeviceJid[j] = message.deliveredDeviceJid[j]; + } + return object; + }; + + /** + * Converts this UserReceipt to JSON. + * @function toJSON + * @memberof proto.UserReceipt + * @instance + * @returns {Object.} JSON object + */ + UserReceipt.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return UserReceipt; + })(); + + proto.VerifiedNameCertificate = (function() { + + /** + * Properties of a VerifiedNameCertificate. + * @memberof proto + * @interface IVerifiedNameCertificate + * @property {Uint8Array|null} [details] VerifiedNameCertificate details + * @property {Uint8Array|null} [signature] VerifiedNameCertificate signature + * @property {Uint8Array|null} [serverSignature] VerifiedNameCertificate serverSignature + */ + + /** + * Constructs a new VerifiedNameCertificate. + * @memberof proto + * @classdesc Represents a VerifiedNameCertificate. + * @implements IVerifiedNameCertificate + * @constructor + * @param {proto.IVerifiedNameCertificate=} [properties] Properties to set + */ + function VerifiedNameCertificate(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * VerifiedNameCertificate details. + * @member {Uint8Array} details + * @memberof proto.VerifiedNameCertificate + * @instance + */ + VerifiedNameCertificate.prototype.details = $util.newBuffer([]); + + /** + * VerifiedNameCertificate signature. + * @member {Uint8Array} signature + * @memberof proto.VerifiedNameCertificate + * @instance + */ + VerifiedNameCertificate.prototype.signature = $util.newBuffer([]); + + /** + * VerifiedNameCertificate serverSignature. + * @member {Uint8Array} serverSignature + * @memberof proto.VerifiedNameCertificate + * @instance + */ + VerifiedNameCertificate.prototype.serverSignature = $util.newBuffer([]); + + /** + * Creates a new VerifiedNameCertificate instance using the specified properties. + * @function create + * @memberof proto.VerifiedNameCertificate + * @static + * @param {proto.IVerifiedNameCertificate=} [properties] Properties to set + * @returns {proto.VerifiedNameCertificate} VerifiedNameCertificate instance + */ + VerifiedNameCertificate.create = function create(properties) { + return new VerifiedNameCertificate(properties); + }; + + /** + * Encodes the specified VerifiedNameCertificate message. Does not implicitly {@link proto.VerifiedNameCertificate.verify|verify} messages. + * @function encode + * @memberof proto.VerifiedNameCertificate + * @static + * @param {proto.IVerifiedNameCertificate} message VerifiedNameCertificate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VerifiedNameCertificate.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.details != null && Object.hasOwnProperty.call(message, "details")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.details); + if (message.signature != null && Object.hasOwnProperty.call(message, "signature")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.signature); + if (message.serverSignature != null && Object.hasOwnProperty.call(message, "serverSignature")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.serverSignature); + return writer; + }; + + /** + * Encodes the specified VerifiedNameCertificate message, length delimited. Does not implicitly {@link proto.VerifiedNameCertificate.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.VerifiedNameCertificate + * @static + * @param {proto.IVerifiedNameCertificate} message VerifiedNameCertificate message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + VerifiedNameCertificate.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a VerifiedNameCertificate message from the specified reader or buffer. + * @function decode + * @memberof proto.VerifiedNameCertificate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.VerifiedNameCertificate} VerifiedNameCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VerifiedNameCertificate.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.VerifiedNameCertificate(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.details = reader.bytes(); + break; + case 2: + message.signature = reader.bytes(); + break; + case 3: + message.serverSignature = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a VerifiedNameCertificate message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.VerifiedNameCertificate + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.VerifiedNameCertificate} VerifiedNameCertificate + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + VerifiedNameCertificate.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a VerifiedNameCertificate message. + * @function verify + * @memberof proto.VerifiedNameCertificate + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + VerifiedNameCertificate.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.details != null && message.hasOwnProperty("details")) + if (!(message.details && typeof message.details.length === "number" || $util.isString(message.details))) + return "details: buffer expected"; + if (message.signature != null && message.hasOwnProperty("signature")) + if (!(message.signature && typeof message.signature.length === "number" || $util.isString(message.signature))) + return "signature: buffer expected"; + if (message.serverSignature != null && message.hasOwnProperty("serverSignature")) + if (!(message.serverSignature && typeof message.serverSignature.length === "number" || $util.isString(message.serverSignature))) + return "serverSignature: buffer expected"; + return null; + }; + + /** + * Creates a VerifiedNameCertificate message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.VerifiedNameCertificate + * @static + * @param {Object.} object Plain object + * @returns {proto.VerifiedNameCertificate} VerifiedNameCertificate + */ + VerifiedNameCertificate.fromObject = function fromObject(object) { + if (object instanceof $root.proto.VerifiedNameCertificate) + return object; + var message = new $root.proto.VerifiedNameCertificate(); + if (object.details != null) + if (typeof object.details === "string") + $util.base64.decode(object.details, message.details = $util.newBuffer($util.base64.length(object.details)), 0); + else if (object.details.length) + message.details = object.details; + if (object.signature != null) + if (typeof object.signature === "string") + $util.base64.decode(object.signature, message.signature = $util.newBuffer($util.base64.length(object.signature)), 0); + else if (object.signature.length) + message.signature = object.signature; + if (object.serverSignature != null) + if (typeof object.serverSignature === "string") + $util.base64.decode(object.serverSignature, message.serverSignature = $util.newBuffer($util.base64.length(object.serverSignature)), 0); + else if (object.serverSignature.length) + message.serverSignature = object.serverSignature; + return message; + }; + + /** + * Creates a plain object from a VerifiedNameCertificate message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.VerifiedNameCertificate + * @static + * @param {proto.VerifiedNameCertificate} message VerifiedNameCertificate + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + VerifiedNameCertificate.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.details = ""; + else { + object.details = []; + if (options.bytes !== Array) + object.details = $util.newBuffer(object.details); + } + if (options.bytes === String) + object.signature = ""; + else { + object.signature = []; + if (options.bytes !== Array) + object.signature = $util.newBuffer(object.signature); + } + if (options.bytes === String) + object.serverSignature = ""; + else { + object.serverSignature = []; + if (options.bytes !== Array) + object.serverSignature = $util.newBuffer(object.serverSignature); + } + } + if (message.details != null && message.hasOwnProperty("details")) + object.details = options.bytes === String ? $util.base64.encode(message.details, 0, message.details.length) : options.bytes === Array ? Array.prototype.slice.call(message.details) : message.details; + if (message.signature != null && message.hasOwnProperty("signature")) + object.signature = options.bytes === String ? $util.base64.encode(message.signature, 0, message.signature.length) : options.bytes === Array ? Array.prototype.slice.call(message.signature) : message.signature; + if (message.serverSignature != null && message.hasOwnProperty("serverSignature")) + object.serverSignature = options.bytes === String ? $util.base64.encode(message.serverSignature, 0, message.serverSignature.length) : options.bytes === Array ? Array.prototype.slice.call(message.serverSignature) : message.serverSignature; + return object; + }; + + /** + * Converts this VerifiedNameCertificate to JSON. + * @function toJSON + * @memberof proto.VerifiedNameCertificate + * @instance + * @returns {Object.} JSON object + */ + VerifiedNameCertificate.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + VerifiedNameCertificate.Details = (function() { + + /** + * Properties of a Details. + * @memberof proto.VerifiedNameCertificate + * @interface IDetails + * @property {number|Long|null} [serial] Details serial + * @property {string|null} [issuer] Details issuer + * @property {string|null} [verifiedName] Details verifiedName + * @property {Array.|null} [localizedNames] Details localizedNames + * @property {number|Long|null} [issueTime] Details issueTime + */ + + /** + * Constructs a new Details. + * @memberof proto.VerifiedNameCertificate + * @classdesc Represents a Details. + * @implements IDetails + * @constructor + * @param {proto.VerifiedNameCertificate.IDetails=} [properties] Properties to set + */ + function Details(properties) { + this.localizedNames = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Details serial. + * @member {number|Long} serial + * @memberof proto.VerifiedNameCertificate.Details + * @instance + */ + Details.prototype.serial = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Details issuer. + * @member {string} issuer + * @memberof proto.VerifiedNameCertificate.Details + * @instance + */ + Details.prototype.issuer = ""; + + /** + * Details verifiedName. + * @member {string} verifiedName + * @memberof proto.VerifiedNameCertificate.Details + * @instance + */ + Details.prototype.verifiedName = ""; + + /** + * Details localizedNames. + * @member {Array.} localizedNames + * @memberof proto.VerifiedNameCertificate.Details + * @instance + */ + Details.prototype.localizedNames = $util.emptyArray; + + /** + * Details issueTime. + * @member {number|Long} issueTime + * @memberof proto.VerifiedNameCertificate.Details + * @instance + */ + Details.prototype.issueTime = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new Details instance using the specified properties. + * @function create + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {proto.VerifiedNameCertificate.IDetails=} [properties] Properties to set + * @returns {proto.VerifiedNameCertificate.Details} Details instance + */ + Details.create = function create(properties) { + return new Details(properties); + }; + + /** + * Encodes the specified Details message. Does not implicitly {@link proto.VerifiedNameCertificate.Details.verify|verify} messages. + * @function encode + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {proto.VerifiedNameCertificate.IDetails} message Details message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Details.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.serial != null && Object.hasOwnProperty.call(message, "serial")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.serial); + if (message.issuer != null && Object.hasOwnProperty.call(message, "issuer")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.issuer); + if (message.verifiedName != null && Object.hasOwnProperty.call(message, "verifiedName")) + writer.uint32(/* id 4, wireType 2 =*/34).string(message.verifiedName); + if (message.localizedNames != null && message.localizedNames.length) + for (var i = 0; i < message.localizedNames.length; ++i) + $root.proto.LocalizedName.encode(message.localizedNames[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + if (message.issueTime != null && Object.hasOwnProperty.call(message, "issueTime")) + writer.uint32(/* id 10, wireType 0 =*/80).uint64(message.issueTime); + return writer; + }; + + /** + * Encodes the specified Details message, length delimited. Does not implicitly {@link proto.VerifiedNameCertificate.Details.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {proto.VerifiedNameCertificate.IDetails} message Details message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Details.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Details message from the specified reader or buffer. + * @function decode + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.VerifiedNameCertificate.Details} Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Details.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.VerifiedNameCertificate.Details(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.serial = reader.uint64(); + break; + case 2: + message.issuer = reader.string(); + break; + case 4: + message.verifiedName = reader.string(); + break; + case 8: + if (!(message.localizedNames && message.localizedNames.length)) + message.localizedNames = []; + message.localizedNames.push($root.proto.LocalizedName.decode(reader, reader.uint32())); + break; + case 10: + message.issueTime = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Details message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.VerifiedNameCertificate.Details} Details + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Details.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Details message. + * @function verify + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Details.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.serial != null && message.hasOwnProperty("serial")) + if (!$util.isInteger(message.serial) && !(message.serial && $util.isInteger(message.serial.low) && $util.isInteger(message.serial.high))) + return "serial: integer|Long expected"; + if (message.issuer != null && message.hasOwnProperty("issuer")) + if (!$util.isString(message.issuer)) + return "issuer: string expected"; + if (message.verifiedName != null && message.hasOwnProperty("verifiedName")) + if (!$util.isString(message.verifiedName)) + return "verifiedName: string expected"; + if (message.localizedNames != null && message.hasOwnProperty("localizedNames")) { + if (!Array.isArray(message.localizedNames)) + return "localizedNames: array expected"; + for (var i = 0; i < message.localizedNames.length; ++i) { + var error = $root.proto.LocalizedName.verify(message.localizedNames[i]); + if (error) + return "localizedNames." + error; + } + } + if (message.issueTime != null && message.hasOwnProperty("issueTime")) + if (!$util.isInteger(message.issueTime) && !(message.issueTime && $util.isInteger(message.issueTime.low) && $util.isInteger(message.issueTime.high))) + return "issueTime: integer|Long expected"; + return null; + }; + + /** + * Creates a Details message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {Object.} object Plain object + * @returns {proto.VerifiedNameCertificate.Details} Details + */ + Details.fromObject = function fromObject(object) { + if (object instanceof $root.proto.VerifiedNameCertificate.Details) + return object; + var message = new $root.proto.VerifiedNameCertificate.Details(); + if (object.serial != null) + if ($util.Long) + (message.serial = $util.Long.fromValue(object.serial)).unsigned = true; + else if (typeof object.serial === "string") + message.serial = parseInt(object.serial, 10); + else if (typeof object.serial === "number") + message.serial = object.serial; + else if (typeof object.serial === "object") + message.serial = new $util.LongBits(object.serial.low >>> 0, object.serial.high >>> 0).toNumber(true); + if (object.issuer != null) + message.issuer = String(object.issuer); + if (object.verifiedName != null) + message.verifiedName = String(object.verifiedName); + if (object.localizedNames) { + if (!Array.isArray(object.localizedNames)) + throw TypeError(".proto.VerifiedNameCertificate.Details.localizedNames: array expected"); + message.localizedNames = []; + for (var i = 0; i < object.localizedNames.length; ++i) { + if (typeof object.localizedNames[i] !== "object") + throw TypeError(".proto.VerifiedNameCertificate.Details.localizedNames: object expected"); + message.localizedNames[i] = $root.proto.LocalizedName.fromObject(object.localizedNames[i]); + } + } + if (object.issueTime != null) + if ($util.Long) + (message.issueTime = $util.Long.fromValue(object.issueTime)).unsigned = true; + else if (typeof object.issueTime === "string") + message.issueTime = parseInt(object.issueTime, 10); + else if (typeof object.issueTime === "number") + message.issueTime = object.issueTime; + else if (typeof object.issueTime === "object") + message.issueTime = new $util.LongBits(object.issueTime.low >>> 0, object.issueTime.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a Details message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.VerifiedNameCertificate.Details + * @static + * @param {proto.VerifiedNameCertificate.Details} message Details + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Details.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.localizedNames = []; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.serial = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.serial = options.longs === String ? "0" : 0; + object.issuer = ""; + object.verifiedName = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.issueTime = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.issueTime = options.longs === String ? "0" : 0; + } + if (message.serial != null && message.hasOwnProperty("serial")) + if (typeof message.serial === "number") + object.serial = options.longs === String ? String(message.serial) : message.serial; + else + object.serial = options.longs === String ? $util.Long.prototype.toString.call(message.serial) : options.longs === Number ? new $util.LongBits(message.serial.low >>> 0, message.serial.high >>> 0).toNumber(true) : message.serial; + if (message.issuer != null && message.hasOwnProperty("issuer")) + object.issuer = message.issuer; + if (message.verifiedName != null && message.hasOwnProperty("verifiedName")) + object.verifiedName = message.verifiedName; + if (message.localizedNames && message.localizedNames.length) { + object.localizedNames = []; + for (var j = 0; j < message.localizedNames.length; ++j) + object.localizedNames[j] = $root.proto.LocalizedName.toObject(message.localizedNames[j], options); + } + if (message.issueTime != null && message.hasOwnProperty("issueTime")) + if (typeof message.issueTime === "number") + object.issueTime = options.longs === String ? String(message.issueTime) : message.issueTime; + else + object.issueTime = options.longs === String ? $util.Long.prototype.toString.call(message.issueTime) : options.longs === Number ? new $util.LongBits(message.issueTime.low >>> 0, message.issueTime.high >>> 0).toNumber(true) : message.issueTime; + return object; + }; + + /** + * Converts this Details to JSON. + * @function toJSON + * @memberof proto.VerifiedNameCertificate.Details + * @instance + * @returns {Object.} JSON object + */ + Details.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Details; + })(); + + return VerifiedNameCertificate; + })(); + + proto.WallpaperSettings = (function() { + + /** + * Properties of a WallpaperSettings. + * @memberof proto + * @interface IWallpaperSettings + * @property {string|null} [filename] WallpaperSettings filename + * @property {number|null} [opacity] WallpaperSettings opacity + */ + + /** + * Constructs a new WallpaperSettings. + * @memberof proto + * @classdesc Represents a WallpaperSettings. + * @implements IWallpaperSettings + * @constructor + * @param {proto.IWallpaperSettings=} [properties] Properties to set + */ + function WallpaperSettings(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WallpaperSettings filename. + * @member {string} filename + * @memberof proto.WallpaperSettings + * @instance + */ + WallpaperSettings.prototype.filename = ""; + + /** + * WallpaperSettings opacity. + * @member {number} opacity + * @memberof proto.WallpaperSettings + * @instance + */ + WallpaperSettings.prototype.opacity = 0; + + /** + * Creates a new WallpaperSettings instance using the specified properties. + * @function create + * @memberof proto.WallpaperSettings + * @static + * @param {proto.IWallpaperSettings=} [properties] Properties to set + * @returns {proto.WallpaperSettings} WallpaperSettings instance + */ + WallpaperSettings.create = function create(properties) { + return new WallpaperSettings(properties); + }; + + /** + * Encodes the specified WallpaperSettings message. Does not implicitly {@link proto.WallpaperSettings.verify|verify} messages. + * @function encode + * @memberof proto.WallpaperSettings + * @static + * @param {proto.IWallpaperSettings} message WallpaperSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WallpaperSettings.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.filename != null && Object.hasOwnProperty.call(message, "filename")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.filename); + if (message.opacity != null && Object.hasOwnProperty.call(message, "opacity")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.opacity); + return writer; + }; + + /** + * Encodes the specified WallpaperSettings message, length delimited. Does not implicitly {@link proto.WallpaperSettings.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.WallpaperSettings + * @static + * @param {proto.IWallpaperSettings} message WallpaperSettings message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WallpaperSettings.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WallpaperSettings message from the specified reader or buffer. + * @function decode + * @memberof proto.WallpaperSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.WallpaperSettings} WallpaperSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WallpaperSettings.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.WallpaperSettings(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.filename = reader.string(); + break; + case 2: + message.opacity = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a WallpaperSettings message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.WallpaperSettings + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.WallpaperSettings} WallpaperSettings + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WallpaperSettings.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WallpaperSettings message. + * @function verify + * @memberof proto.WallpaperSettings + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WallpaperSettings.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.filename != null && message.hasOwnProperty("filename")) + if (!$util.isString(message.filename)) + return "filename: string expected"; + if (message.opacity != null && message.hasOwnProperty("opacity")) + if (!$util.isInteger(message.opacity)) + return "opacity: integer expected"; + return null; + }; + + /** + * Creates a WallpaperSettings message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.WallpaperSettings + * @static + * @param {Object.} object Plain object + * @returns {proto.WallpaperSettings} WallpaperSettings + */ + WallpaperSettings.fromObject = function fromObject(object) { + if (object instanceof $root.proto.WallpaperSettings) + return object; + var message = new $root.proto.WallpaperSettings(); + if (object.filename != null) + message.filename = String(object.filename); + if (object.opacity != null) + message.opacity = object.opacity >>> 0; + return message; + }; + + /** + * Creates a plain object from a WallpaperSettings message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.WallpaperSettings + * @static + * @param {proto.WallpaperSettings} message WallpaperSettings + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WallpaperSettings.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.filename = ""; + object.opacity = 0; + } + if (message.filename != null && message.hasOwnProperty("filename")) + object.filename = message.filename; + if (message.opacity != null && message.hasOwnProperty("opacity")) + object.opacity = message.opacity; + return object; + }; + + /** + * Converts this WallpaperSettings to JSON. + * @function toJSON + * @memberof proto.WallpaperSettings + * @instance + * @returns {Object.} JSON object + */ + WallpaperSettings.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return WallpaperSettings; + })(); + + proto.WebFeatures = (function() { + + /** + * Properties of a WebFeatures. + * @memberof proto + * @interface IWebFeatures + * @property {proto.WebFeatures.Flag|null} [labelsDisplay] WebFeatures labelsDisplay + * @property {proto.WebFeatures.Flag|null} [voipIndividualOutgoing] WebFeatures voipIndividualOutgoing + * @property {proto.WebFeatures.Flag|null} [groupsV3] WebFeatures groupsV3 + * @property {proto.WebFeatures.Flag|null} [groupsV3Create] WebFeatures groupsV3Create + * @property {proto.WebFeatures.Flag|null} [changeNumberV2] WebFeatures changeNumberV2 + * @property {proto.WebFeatures.Flag|null} [queryStatusV3Thumbnail] WebFeatures queryStatusV3Thumbnail + * @property {proto.WebFeatures.Flag|null} [liveLocations] WebFeatures liveLocations + * @property {proto.WebFeatures.Flag|null} [queryVname] WebFeatures queryVname + * @property {proto.WebFeatures.Flag|null} [voipIndividualIncoming] WebFeatures voipIndividualIncoming + * @property {proto.WebFeatures.Flag|null} [quickRepliesQuery] WebFeatures quickRepliesQuery + * @property {proto.WebFeatures.Flag|null} [payments] WebFeatures payments + * @property {proto.WebFeatures.Flag|null} [stickerPackQuery] WebFeatures stickerPackQuery + * @property {proto.WebFeatures.Flag|null} [liveLocationsFinal] WebFeatures liveLocationsFinal + * @property {proto.WebFeatures.Flag|null} [labelsEdit] WebFeatures labelsEdit + * @property {proto.WebFeatures.Flag|null} [mediaUpload] WebFeatures mediaUpload + * @property {proto.WebFeatures.Flag|null} [mediaUploadRichQuickReplies] WebFeatures mediaUploadRichQuickReplies + * @property {proto.WebFeatures.Flag|null} [vnameV2] WebFeatures vnameV2 + * @property {proto.WebFeatures.Flag|null} [videoPlaybackUrl] WebFeatures videoPlaybackUrl + * @property {proto.WebFeatures.Flag|null} [statusRanking] WebFeatures statusRanking + * @property {proto.WebFeatures.Flag|null} [voipIndividualVideo] WebFeatures voipIndividualVideo + * @property {proto.WebFeatures.Flag|null} [thirdPartyStickers] WebFeatures thirdPartyStickers + * @property {proto.WebFeatures.Flag|null} [frequentlyForwardedSetting] WebFeatures frequentlyForwardedSetting + * @property {proto.WebFeatures.Flag|null} [groupsV4JoinPermission] WebFeatures groupsV4JoinPermission + * @property {proto.WebFeatures.Flag|null} [recentStickers] WebFeatures recentStickers + * @property {proto.WebFeatures.Flag|null} [catalog] WebFeatures catalog + * @property {proto.WebFeatures.Flag|null} [starredStickers] WebFeatures starredStickers + * @property {proto.WebFeatures.Flag|null} [voipGroupCall] WebFeatures voipGroupCall + * @property {proto.WebFeatures.Flag|null} [templateMessage] WebFeatures templateMessage + * @property {proto.WebFeatures.Flag|null} [templateMessageInteractivity] WebFeatures templateMessageInteractivity + * @property {proto.WebFeatures.Flag|null} [ephemeralMessages] WebFeatures ephemeralMessages + * @property {proto.WebFeatures.Flag|null} [e2ENotificationSync] WebFeatures e2ENotificationSync + * @property {proto.WebFeatures.Flag|null} [recentStickersV2] WebFeatures recentStickersV2 + * @property {proto.WebFeatures.Flag|null} [recentStickersV3] WebFeatures recentStickersV3 + * @property {proto.WebFeatures.Flag|null} [userNotice] WebFeatures userNotice + * @property {proto.WebFeatures.Flag|null} [support] WebFeatures support + * @property {proto.WebFeatures.Flag|null} [groupUiiCleanup] WebFeatures groupUiiCleanup + * @property {proto.WebFeatures.Flag|null} [groupDogfoodingInternalOnly] WebFeatures groupDogfoodingInternalOnly + * @property {proto.WebFeatures.Flag|null} [settingsSync] WebFeatures settingsSync + * @property {proto.WebFeatures.Flag|null} [archiveV2] WebFeatures archiveV2 + * @property {proto.WebFeatures.Flag|null} [ephemeralAllowGroupMembers] WebFeatures ephemeralAllowGroupMembers + * @property {proto.WebFeatures.Flag|null} [ephemeral24HDuration] WebFeatures ephemeral24HDuration + * @property {proto.WebFeatures.Flag|null} [mdForceUpgrade] WebFeatures mdForceUpgrade + * @property {proto.WebFeatures.Flag|null} [disappearingMode] WebFeatures disappearingMode + * @property {proto.WebFeatures.Flag|null} [externalMdOptInAvailable] WebFeatures externalMdOptInAvailable + * @property {proto.WebFeatures.Flag|null} [noDeleteMessageTimeLimit] WebFeatures noDeleteMessageTimeLimit + */ + + /** + * Constructs a new WebFeatures. + * @memberof proto + * @classdesc Represents a WebFeatures. + * @implements IWebFeatures + * @constructor + * @param {proto.IWebFeatures=} [properties] Properties to set + */ + function WebFeatures(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WebFeatures labelsDisplay. + * @member {proto.WebFeatures.Flag} labelsDisplay + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.labelsDisplay = 0; + + /** + * WebFeatures voipIndividualOutgoing. + * @member {proto.WebFeatures.Flag} voipIndividualOutgoing + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.voipIndividualOutgoing = 0; + + /** + * WebFeatures groupsV3. + * @member {proto.WebFeatures.Flag} groupsV3 + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.groupsV3 = 0; + + /** + * WebFeatures groupsV3Create. + * @member {proto.WebFeatures.Flag} groupsV3Create + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.groupsV3Create = 0; + + /** + * WebFeatures changeNumberV2. + * @member {proto.WebFeatures.Flag} changeNumberV2 + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.changeNumberV2 = 0; + + /** + * WebFeatures queryStatusV3Thumbnail. + * @member {proto.WebFeatures.Flag} queryStatusV3Thumbnail + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.queryStatusV3Thumbnail = 0; + + /** + * WebFeatures liveLocations. + * @member {proto.WebFeatures.Flag} liveLocations + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.liveLocations = 0; + + /** + * WebFeatures queryVname. + * @member {proto.WebFeatures.Flag} queryVname + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.queryVname = 0; + + /** + * WebFeatures voipIndividualIncoming. + * @member {proto.WebFeatures.Flag} voipIndividualIncoming + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.voipIndividualIncoming = 0; + + /** + * WebFeatures quickRepliesQuery. + * @member {proto.WebFeatures.Flag} quickRepliesQuery + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.quickRepliesQuery = 0; + + /** + * WebFeatures payments. + * @member {proto.WebFeatures.Flag} payments + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.payments = 0; + + /** + * WebFeatures stickerPackQuery. + * @member {proto.WebFeatures.Flag} stickerPackQuery + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.stickerPackQuery = 0; + + /** + * WebFeatures liveLocationsFinal. + * @member {proto.WebFeatures.Flag} liveLocationsFinal + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.liveLocationsFinal = 0; + + /** + * WebFeatures labelsEdit. + * @member {proto.WebFeatures.Flag} labelsEdit + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.labelsEdit = 0; + + /** + * WebFeatures mediaUpload. + * @member {proto.WebFeatures.Flag} mediaUpload + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.mediaUpload = 0; + + /** + * WebFeatures mediaUploadRichQuickReplies. + * @member {proto.WebFeatures.Flag} mediaUploadRichQuickReplies + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.mediaUploadRichQuickReplies = 0; + + /** + * WebFeatures vnameV2. + * @member {proto.WebFeatures.Flag} vnameV2 + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.vnameV2 = 0; + + /** + * WebFeatures videoPlaybackUrl. + * @member {proto.WebFeatures.Flag} videoPlaybackUrl + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.videoPlaybackUrl = 0; + + /** + * WebFeatures statusRanking. + * @member {proto.WebFeatures.Flag} statusRanking + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.statusRanking = 0; + + /** + * WebFeatures voipIndividualVideo. + * @member {proto.WebFeatures.Flag} voipIndividualVideo + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.voipIndividualVideo = 0; + + /** + * WebFeatures thirdPartyStickers. + * @member {proto.WebFeatures.Flag} thirdPartyStickers + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.thirdPartyStickers = 0; + + /** + * WebFeatures frequentlyForwardedSetting. + * @member {proto.WebFeatures.Flag} frequentlyForwardedSetting + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.frequentlyForwardedSetting = 0; + + /** + * WebFeatures groupsV4JoinPermission. + * @member {proto.WebFeatures.Flag} groupsV4JoinPermission + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.groupsV4JoinPermission = 0; + + /** + * WebFeatures recentStickers. + * @member {proto.WebFeatures.Flag} recentStickers + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.recentStickers = 0; + + /** + * WebFeatures catalog. + * @member {proto.WebFeatures.Flag} catalog + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.catalog = 0; + + /** + * WebFeatures starredStickers. + * @member {proto.WebFeatures.Flag} starredStickers + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.starredStickers = 0; + + /** + * WebFeatures voipGroupCall. + * @member {proto.WebFeatures.Flag} voipGroupCall + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.voipGroupCall = 0; + + /** + * WebFeatures templateMessage. + * @member {proto.WebFeatures.Flag} templateMessage + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.templateMessage = 0; + + /** + * WebFeatures templateMessageInteractivity. + * @member {proto.WebFeatures.Flag} templateMessageInteractivity + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.templateMessageInteractivity = 0; + + /** + * WebFeatures ephemeralMessages. + * @member {proto.WebFeatures.Flag} ephemeralMessages + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.ephemeralMessages = 0; + + /** + * WebFeatures e2ENotificationSync. + * @member {proto.WebFeatures.Flag} e2ENotificationSync + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.e2ENotificationSync = 0; + + /** + * WebFeatures recentStickersV2. + * @member {proto.WebFeatures.Flag} recentStickersV2 + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.recentStickersV2 = 0; + + /** + * WebFeatures recentStickersV3. + * @member {proto.WebFeatures.Flag} recentStickersV3 + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.recentStickersV3 = 0; + + /** + * WebFeatures userNotice. + * @member {proto.WebFeatures.Flag} userNotice + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.userNotice = 0; + + /** + * WebFeatures support. + * @member {proto.WebFeatures.Flag} support + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.support = 0; + + /** + * WebFeatures groupUiiCleanup. + * @member {proto.WebFeatures.Flag} groupUiiCleanup + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.groupUiiCleanup = 0; + + /** + * WebFeatures groupDogfoodingInternalOnly. + * @member {proto.WebFeatures.Flag} groupDogfoodingInternalOnly + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.groupDogfoodingInternalOnly = 0; + + /** + * WebFeatures settingsSync. + * @member {proto.WebFeatures.Flag} settingsSync + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.settingsSync = 0; + + /** + * WebFeatures archiveV2. + * @member {proto.WebFeatures.Flag} archiveV2 + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.archiveV2 = 0; + + /** + * WebFeatures ephemeralAllowGroupMembers. + * @member {proto.WebFeatures.Flag} ephemeralAllowGroupMembers + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.ephemeralAllowGroupMembers = 0; + + /** + * WebFeatures ephemeral24HDuration. + * @member {proto.WebFeatures.Flag} ephemeral24HDuration + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.ephemeral24HDuration = 0; + + /** + * WebFeatures mdForceUpgrade. + * @member {proto.WebFeatures.Flag} mdForceUpgrade + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.mdForceUpgrade = 0; + + /** + * WebFeatures disappearingMode. + * @member {proto.WebFeatures.Flag} disappearingMode + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.disappearingMode = 0; + + /** + * WebFeatures externalMdOptInAvailable. + * @member {proto.WebFeatures.Flag} externalMdOptInAvailable + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.externalMdOptInAvailable = 0; + + /** + * WebFeatures noDeleteMessageTimeLimit. + * @member {proto.WebFeatures.Flag} noDeleteMessageTimeLimit + * @memberof proto.WebFeatures + * @instance + */ + WebFeatures.prototype.noDeleteMessageTimeLimit = 0; + + /** + * Creates a new WebFeatures instance using the specified properties. + * @function create + * @memberof proto.WebFeatures + * @static + * @param {proto.IWebFeatures=} [properties] Properties to set + * @returns {proto.WebFeatures} WebFeatures instance + */ + WebFeatures.create = function create(properties) { + return new WebFeatures(properties); + }; + + /** + * Encodes the specified WebFeatures message. Does not implicitly {@link proto.WebFeatures.verify|verify} messages. + * @function encode + * @memberof proto.WebFeatures + * @static + * @param {proto.IWebFeatures} message WebFeatures message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebFeatures.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.labelsDisplay != null && Object.hasOwnProperty.call(message, "labelsDisplay")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.labelsDisplay); + if (message.voipIndividualOutgoing != null && Object.hasOwnProperty.call(message, "voipIndividualOutgoing")) + writer.uint32(/* id 2, wireType 0 =*/16).int32(message.voipIndividualOutgoing); + if (message.groupsV3 != null && Object.hasOwnProperty.call(message, "groupsV3")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.groupsV3); + if (message.groupsV3Create != null && Object.hasOwnProperty.call(message, "groupsV3Create")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.groupsV3Create); + if (message.changeNumberV2 != null && Object.hasOwnProperty.call(message, "changeNumberV2")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.changeNumberV2); + if (message.queryStatusV3Thumbnail != null && Object.hasOwnProperty.call(message, "queryStatusV3Thumbnail")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.queryStatusV3Thumbnail); + if (message.liveLocations != null && Object.hasOwnProperty.call(message, "liveLocations")) + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.liveLocations); + if (message.queryVname != null && Object.hasOwnProperty.call(message, "queryVname")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.queryVname); + if (message.voipIndividualIncoming != null && Object.hasOwnProperty.call(message, "voipIndividualIncoming")) + writer.uint32(/* id 9, wireType 0 =*/72).int32(message.voipIndividualIncoming); + if (message.quickRepliesQuery != null && Object.hasOwnProperty.call(message, "quickRepliesQuery")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.quickRepliesQuery); + if (message.payments != null && Object.hasOwnProperty.call(message, "payments")) + writer.uint32(/* id 11, wireType 0 =*/88).int32(message.payments); + if (message.stickerPackQuery != null && Object.hasOwnProperty.call(message, "stickerPackQuery")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.stickerPackQuery); + if (message.liveLocationsFinal != null && Object.hasOwnProperty.call(message, "liveLocationsFinal")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.liveLocationsFinal); + if (message.labelsEdit != null && Object.hasOwnProperty.call(message, "labelsEdit")) + writer.uint32(/* id 14, wireType 0 =*/112).int32(message.labelsEdit); + if (message.mediaUpload != null && Object.hasOwnProperty.call(message, "mediaUpload")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.mediaUpload); + if (message.mediaUploadRichQuickReplies != null && Object.hasOwnProperty.call(message, "mediaUploadRichQuickReplies")) + writer.uint32(/* id 18, wireType 0 =*/144).int32(message.mediaUploadRichQuickReplies); + if (message.vnameV2 != null && Object.hasOwnProperty.call(message, "vnameV2")) + writer.uint32(/* id 19, wireType 0 =*/152).int32(message.vnameV2); + if (message.videoPlaybackUrl != null && Object.hasOwnProperty.call(message, "videoPlaybackUrl")) + writer.uint32(/* id 20, wireType 0 =*/160).int32(message.videoPlaybackUrl); + if (message.statusRanking != null && Object.hasOwnProperty.call(message, "statusRanking")) + writer.uint32(/* id 21, wireType 0 =*/168).int32(message.statusRanking); + if (message.voipIndividualVideo != null && Object.hasOwnProperty.call(message, "voipIndividualVideo")) + writer.uint32(/* id 22, wireType 0 =*/176).int32(message.voipIndividualVideo); + if (message.thirdPartyStickers != null && Object.hasOwnProperty.call(message, "thirdPartyStickers")) + writer.uint32(/* id 23, wireType 0 =*/184).int32(message.thirdPartyStickers); + if (message.frequentlyForwardedSetting != null && Object.hasOwnProperty.call(message, "frequentlyForwardedSetting")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.frequentlyForwardedSetting); + if (message.groupsV4JoinPermission != null && Object.hasOwnProperty.call(message, "groupsV4JoinPermission")) + writer.uint32(/* id 25, wireType 0 =*/200).int32(message.groupsV4JoinPermission); + if (message.recentStickers != null && Object.hasOwnProperty.call(message, "recentStickers")) + writer.uint32(/* id 26, wireType 0 =*/208).int32(message.recentStickers); + if (message.catalog != null && Object.hasOwnProperty.call(message, "catalog")) + writer.uint32(/* id 27, wireType 0 =*/216).int32(message.catalog); + if (message.starredStickers != null && Object.hasOwnProperty.call(message, "starredStickers")) + writer.uint32(/* id 28, wireType 0 =*/224).int32(message.starredStickers); + if (message.voipGroupCall != null && Object.hasOwnProperty.call(message, "voipGroupCall")) + writer.uint32(/* id 29, wireType 0 =*/232).int32(message.voipGroupCall); + if (message.templateMessage != null && Object.hasOwnProperty.call(message, "templateMessage")) + writer.uint32(/* id 30, wireType 0 =*/240).int32(message.templateMessage); + if (message.templateMessageInteractivity != null && Object.hasOwnProperty.call(message, "templateMessageInteractivity")) + writer.uint32(/* id 31, wireType 0 =*/248).int32(message.templateMessageInteractivity); + if (message.ephemeralMessages != null && Object.hasOwnProperty.call(message, "ephemeralMessages")) + writer.uint32(/* id 32, wireType 0 =*/256).int32(message.ephemeralMessages); + if (message.e2ENotificationSync != null && Object.hasOwnProperty.call(message, "e2ENotificationSync")) + writer.uint32(/* id 33, wireType 0 =*/264).int32(message.e2ENotificationSync); + if (message.recentStickersV2 != null && Object.hasOwnProperty.call(message, "recentStickersV2")) + writer.uint32(/* id 34, wireType 0 =*/272).int32(message.recentStickersV2); + if (message.recentStickersV3 != null && Object.hasOwnProperty.call(message, "recentStickersV3")) + writer.uint32(/* id 36, wireType 0 =*/288).int32(message.recentStickersV3); + if (message.userNotice != null && Object.hasOwnProperty.call(message, "userNotice")) + writer.uint32(/* id 37, wireType 0 =*/296).int32(message.userNotice); + if (message.support != null && Object.hasOwnProperty.call(message, "support")) + writer.uint32(/* id 39, wireType 0 =*/312).int32(message.support); + if (message.groupUiiCleanup != null && Object.hasOwnProperty.call(message, "groupUiiCleanup")) + writer.uint32(/* id 40, wireType 0 =*/320).int32(message.groupUiiCleanup); + if (message.groupDogfoodingInternalOnly != null && Object.hasOwnProperty.call(message, "groupDogfoodingInternalOnly")) + writer.uint32(/* id 41, wireType 0 =*/328).int32(message.groupDogfoodingInternalOnly); + if (message.settingsSync != null && Object.hasOwnProperty.call(message, "settingsSync")) + writer.uint32(/* id 42, wireType 0 =*/336).int32(message.settingsSync); + if (message.archiveV2 != null && Object.hasOwnProperty.call(message, "archiveV2")) + writer.uint32(/* id 43, wireType 0 =*/344).int32(message.archiveV2); + if (message.ephemeralAllowGroupMembers != null && Object.hasOwnProperty.call(message, "ephemeralAllowGroupMembers")) + writer.uint32(/* id 44, wireType 0 =*/352).int32(message.ephemeralAllowGroupMembers); + if (message.ephemeral24HDuration != null && Object.hasOwnProperty.call(message, "ephemeral24HDuration")) + writer.uint32(/* id 45, wireType 0 =*/360).int32(message.ephemeral24HDuration); + if (message.mdForceUpgrade != null && Object.hasOwnProperty.call(message, "mdForceUpgrade")) + writer.uint32(/* id 46, wireType 0 =*/368).int32(message.mdForceUpgrade); + if (message.disappearingMode != null && Object.hasOwnProperty.call(message, "disappearingMode")) + writer.uint32(/* id 47, wireType 0 =*/376).int32(message.disappearingMode); + if (message.externalMdOptInAvailable != null && Object.hasOwnProperty.call(message, "externalMdOptInAvailable")) + writer.uint32(/* id 48, wireType 0 =*/384).int32(message.externalMdOptInAvailable); + if (message.noDeleteMessageTimeLimit != null && Object.hasOwnProperty.call(message, "noDeleteMessageTimeLimit")) + writer.uint32(/* id 49, wireType 0 =*/392).int32(message.noDeleteMessageTimeLimit); + return writer; + }; + + /** + * Encodes the specified WebFeatures message, length delimited. Does not implicitly {@link proto.WebFeatures.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.WebFeatures + * @static + * @param {proto.IWebFeatures} message WebFeatures message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebFeatures.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WebFeatures message from the specified reader or buffer. + * @function decode + * @memberof proto.WebFeatures + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.WebFeatures} WebFeatures + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebFeatures.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.WebFeatures(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.labelsDisplay = reader.int32(); + break; + case 2: + message.voipIndividualOutgoing = reader.int32(); + break; + case 3: + message.groupsV3 = reader.int32(); + break; + case 4: + message.groupsV3Create = reader.int32(); + break; + case 5: + message.changeNumberV2 = reader.int32(); + break; + case 6: + message.queryStatusV3Thumbnail = reader.int32(); + break; + case 7: + message.liveLocations = reader.int32(); + break; + case 8: + message.queryVname = reader.int32(); + break; + case 9: + message.voipIndividualIncoming = reader.int32(); + break; + case 10: + message.quickRepliesQuery = reader.int32(); + break; + case 11: + message.payments = reader.int32(); + break; + case 12: + message.stickerPackQuery = reader.int32(); + break; + case 13: + message.liveLocationsFinal = reader.int32(); + break; + case 14: + message.labelsEdit = reader.int32(); + break; + case 15: + message.mediaUpload = reader.int32(); + break; + case 18: + message.mediaUploadRichQuickReplies = reader.int32(); + break; + case 19: + message.vnameV2 = reader.int32(); + break; + case 20: + message.videoPlaybackUrl = reader.int32(); + break; + case 21: + message.statusRanking = reader.int32(); + break; + case 22: + message.voipIndividualVideo = reader.int32(); + break; + case 23: + message.thirdPartyStickers = reader.int32(); + break; + case 24: + message.frequentlyForwardedSetting = reader.int32(); + break; + case 25: + message.groupsV4JoinPermission = reader.int32(); + break; + case 26: + message.recentStickers = reader.int32(); + break; + case 27: + message.catalog = reader.int32(); + break; + case 28: + message.starredStickers = reader.int32(); + break; + case 29: + message.voipGroupCall = reader.int32(); + break; + case 30: + message.templateMessage = reader.int32(); + break; + case 31: + message.templateMessageInteractivity = reader.int32(); + break; + case 32: + message.ephemeralMessages = reader.int32(); + break; + case 33: + message.e2ENotificationSync = reader.int32(); + break; + case 34: + message.recentStickersV2 = reader.int32(); + break; + case 36: + message.recentStickersV3 = reader.int32(); + break; + case 37: + message.userNotice = reader.int32(); + break; + case 39: + message.support = reader.int32(); + break; + case 40: + message.groupUiiCleanup = reader.int32(); + break; + case 41: + message.groupDogfoodingInternalOnly = reader.int32(); + break; + case 42: + message.settingsSync = reader.int32(); + break; + case 43: + message.archiveV2 = reader.int32(); + break; + case 44: + message.ephemeralAllowGroupMembers = reader.int32(); + break; + case 45: + message.ephemeral24HDuration = reader.int32(); + break; + case 46: + message.mdForceUpgrade = reader.int32(); + break; + case 47: + message.disappearingMode = reader.int32(); + break; + case 48: + message.externalMdOptInAvailable = reader.int32(); + break; + case 49: + message.noDeleteMessageTimeLimit = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a WebFeatures message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.WebFeatures + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.WebFeatures} WebFeatures + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebFeatures.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WebFeatures message. + * @function verify + * @memberof proto.WebFeatures + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WebFeatures.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.labelsDisplay != null && message.hasOwnProperty("labelsDisplay")) + switch (message.labelsDisplay) { + default: + return "labelsDisplay: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.voipIndividualOutgoing != null && message.hasOwnProperty("voipIndividualOutgoing")) + switch (message.voipIndividualOutgoing) { + default: + return "voipIndividualOutgoing: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.groupsV3 != null && message.hasOwnProperty("groupsV3")) + switch (message.groupsV3) { + default: + return "groupsV3: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.groupsV3Create != null && message.hasOwnProperty("groupsV3Create")) + switch (message.groupsV3Create) { + default: + return "groupsV3Create: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.changeNumberV2 != null && message.hasOwnProperty("changeNumberV2")) + switch (message.changeNumberV2) { + default: + return "changeNumberV2: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.queryStatusV3Thumbnail != null && message.hasOwnProperty("queryStatusV3Thumbnail")) + switch (message.queryStatusV3Thumbnail) { + default: + return "queryStatusV3Thumbnail: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.liveLocations != null && message.hasOwnProperty("liveLocations")) + switch (message.liveLocations) { + default: + return "liveLocations: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.queryVname != null && message.hasOwnProperty("queryVname")) + switch (message.queryVname) { + default: + return "queryVname: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.voipIndividualIncoming != null && message.hasOwnProperty("voipIndividualIncoming")) + switch (message.voipIndividualIncoming) { + default: + return "voipIndividualIncoming: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.quickRepliesQuery != null && message.hasOwnProperty("quickRepliesQuery")) + switch (message.quickRepliesQuery) { + default: + return "quickRepliesQuery: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.payments != null && message.hasOwnProperty("payments")) + switch (message.payments) { + default: + return "payments: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.stickerPackQuery != null && message.hasOwnProperty("stickerPackQuery")) + switch (message.stickerPackQuery) { + default: + return "stickerPackQuery: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.liveLocationsFinal != null && message.hasOwnProperty("liveLocationsFinal")) + switch (message.liveLocationsFinal) { + default: + return "liveLocationsFinal: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.labelsEdit != null && message.hasOwnProperty("labelsEdit")) + switch (message.labelsEdit) { + default: + return "labelsEdit: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.mediaUpload != null && message.hasOwnProperty("mediaUpload")) + switch (message.mediaUpload) { + default: + return "mediaUpload: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.mediaUploadRichQuickReplies != null && message.hasOwnProperty("mediaUploadRichQuickReplies")) + switch (message.mediaUploadRichQuickReplies) { + default: + return "mediaUploadRichQuickReplies: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.vnameV2 != null && message.hasOwnProperty("vnameV2")) + switch (message.vnameV2) { + default: + return "vnameV2: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.videoPlaybackUrl != null && message.hasOwnProperty("videoPlaybackUrl")) + switch (message.videoPlaybackUrl) { + default: + return "videoPlaybackUrl: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.statusRanking != null && message.hasOwnProperty("statusRanking")) + switch (message.statusRanking) { + default: + return "statusRanking: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.voipIndividualVideo != null && message.hasOwnProperty("voipIndividualVideo")) + switch (message.voipIndividualVideo) { + default: + return "voipIndividualVideo: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.thirdPartyStickers != null && message.hasOwnProperty("thirdPartyStickers")) + switch (message.thirdPartyStickers) { + default: + return "thirdPartyStickers: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.frequentlyForwardedSetting != null && message.hasOwnProperty("frequentlyForwardedSetting")) + switch (message.frequentlyForwardedSetting) { + default: + return "frequentlyForwardedSetting: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.groupsV4JoinPermission != null && message.hasOwnProperty("groupsV4JoinPermission")) + switch (message.groupsV4JoinPermission) { + default: + return "groupsV4JoinPermission: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.recentStickers != null && message.hasOwnProperty("recentStickers")) + switch (message.recentStickers) { + default: + return "recentStickers: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.catalog != null && message.hasOwnProperty("catalog")) + switch (message.catalog) { + default: + return "catalog: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.starredStickers != null && message.hasOwnProperty("starredStickers")) + switch (message.starredStickers) { + default: + return "starredStickers: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.voipGroupCall != null && message.hasOwnProperty("voipGroupCall")) + switch (message.voipGroupCall) { + default: + return "voipGroupCall: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.templateMessage != null && message.hasOwnProperty("templateMessage")) + switch (message.templateMessage) { + default: + return "templateMessage: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.templateMessageInteractivity != null && message.hasOwnProperty("templateMessageInteractivity")) + switch (message.templateMessageInteractivity) { + default: + return "templateMessageInteractivity: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.ephemeralMessages != null && message.hasOwnProperty("ephemeralMessages")) + switch (message.ephemeralMessages) { + default: + return "ephemeralMessages: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.e2ENotificationSync != null && message.hasOwnProperty("e2ENotificationSync")) + switch (message.e2ENotificationSync) { + default: + return "e2ENotificationSync: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.recentStickersV2 != null && message.hasOwnProperty("recentStickersV2")) + switch (message.recentStickersV2) { + default: + return "recentStickersV2: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.recentStickersV3 != null && message.hasOwnProperty("recentStickersV3")) + switch (message.recentStickersV3) { + default: + return "recentStickersV3: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.userNotice != null && message.hasOwnProperty("userNotice")) + switch (message.userNotice) { + default: + return "userNotice: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.support != null && message.hasOwnProperty("support")) + switch (message.support) { + default: + return "support: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.groupUiiCleanup != null && message.hasOwnProperty("groupUiiCleanup")) + switch (message.groupUiiCleanup) { + default: + return "groupUiiCleanup: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.groupDogfoodingInternalOnly != null && message.hasOwnProperty("groupDogfoodingInternalOnly")) + switch (message.groupDogfoodingInternalOnly) { + default: + return "groupDogfoodingInternalOnly: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.settingsSync != null && message.hasOwnProperty("settingsSync")) + switch (message.settingsSync) { + default: + return "settingsSync: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.archiveV2 != null && message.hasOwnProperty("archiveV2")) + switch (message.archiveV2) { + default: + return "archiveV2: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.ephemeralAllowGroupMembers != null && message.hasOwnProperty("ephemeralAllowGroupMembers")) + switch (message.ephemeralAllowGroupMembers) { + default: + return "ephemeralAllowGroupMembers: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.ephemeral24HDuration != null && message.hasOwnProperty("ephemeral24HDuration")) + switch (message.ephemeral24HDuration) { + default: + return "ephemeral24HDuration: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.mdForceUpgrade != null && message.hasOwnProperty("mdForceUpgrade")) + switch (message.mdForceUpgrade) { + default: + return "mdForceUpgrade: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) + switch (message.disappearingMode) { + default: + return "disappearingMode: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.externalMdOptInAvailable != null && message.hasOwnProperty("externalMdOptInAvailable")) + switch (message.externalMdOptInAvailable) { + default: + return "externalMdOptInAvailable: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + if (message.noDeleteMessageTimeLimit != null && message.hasOwnProperty("noDeleteMessageTimeLimit")) + switch (message.noDeleteMessageTimeLimit) { + default: + return "noDeleteMessageTimeLimit: enum value expected"; + case 0: + case 1: + case 2: + case 3: + break; + } + return null; + }; + + /** + * Creates a WebFeatures message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.WebFeatures + * @static + * @param {Object.} object Plain object + * @returns {proto.WebFeatures} WebFeatures + */ + WebFeatures.fromObject = function fromObject(object) { + if (object instanceof $root.proto.WebFeatures) + return object; + var message = new $root.proto.WebFeatures(); + switch (object.labelsDisplay) { + case "NOT_STARTED": + case 0: + message.labelsDisplay = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.labelsDisplay = 1; + break; + case "DEVELOPMENT": + case 2: + message.labelsDisplay = 2; + break; + case "PRODUCTION": + case 3: + message.labelsDisplay = 3; + break; + } + switch (object.voipIndividualOutgoing) { + case "NOT_STARTED": + case 0: + message.voipIndividualOutgoing = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.voipIndividualOutgoing = 1; + break; + case "DEVELOPMENT": + case 2: + message.voipIndividualOutgoing = 2; + break; + case "PRODUCTION": + case 3: + message.voipIndividualOutgoing = 3; + break; + } + switch (object.groupsV3) { + case "NOT_STARTED": + case 0: + message.groupsV3 = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.groupsV3 = 1; + break; + case "DEVELOPMENT": + case 2: + message.groupsV3 = 2; + break; + case "PRODUCTION": + case 3: + message.groupsV3 = 3; + break; + } + switch (object.groupsV3Create) { + case "NOT_STARTED": + case 0: + message.groupsV3Create = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.groupsV3Create = 1; + break; + case "DEVELOPMENT": + case 2: + message.groupsV3Create = 2; + break; + case "PRODUCTION": + case 3: + message.groupsV3Create = 3; + break; + } + switch (object.changeNumberV2) { + case "NOT_STARTED": + case 0: + message.changeNumberV2 = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.changeNumberV2 = 1; + break; + case "DEVELOPMENT": + case 2: + message.changeNumberV2 = 2; + break; + case "PRODUCTION": + case 3: + message.changeNumberV2 = 3; + break; + } + switch (object.queryStatusV3Thumbnail) { + case "NOT_STARTED": + case 0: + message.queryStatusV3Thumbnail = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.queryStatusV3Thumbnail = 1; + break; + case "DEVELOPMENT": + case 2: + message.queryStatusV3Thumbnail = 2; + break; + case "PRODUCTION": + case 3: + message.queryStatusV3Thumbnail = 3; + break; + } + switch (object.liveLocations) { + case "NOT_STARTED": + case 0: + message.liveLocations = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.liveLocations = 1; + break; + case "DEVELOPMENT": + case 2: + message.liveLocations = 2; + break; + case "PRODUCTION": + case 3: + message.liveLocations = 3; + break; + } + switch (object.queryVname) { + case "NOT_STARTED": + case 0: + message.queryVname = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.queryVname = 1; + break; + case "DEVELOPMENT": + case 2: + message.queryVname = 2; + break; + case "PRODUCTION": + case 3: + message.queryVname = 3; + break; + } + switch (object.voipIndividualIncoming) { + case "NOT_STARTED": + case 0: + message.voipIndividualIncoming = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.voipIndividualIncoming = 1; + break; + case "DEVELOPMENT": + case 2: + message.voipIndividualIncoming = 2; + break; + case "PRODUCTION": + case 3: + message.voipIndividualIncoming = 3; + break; + } + switch (object.quickRepliesQuery) { + case "NOT_STARTED": + case 0: + message.quickRepliesQuery = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.quickRepliesQuery = 1; + break; + case "DEVELOPMENT": + case 2: + message.quickRepliesQuery = 2; + break; + case "PRODUCTION": + case 3: + message.quickRepliesQuery = 3; + break; + } + switch (object.payments) { + case "NOT_STARTED": + case 0: + message.payments = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.payments = 1; + break; + case "DEVELOPMENT": + case 2: + message.payments = 2; + break; + case "PRODUCTION": + case 3: + message.payments = 3; + break; + } + switch (object.stickerPackQuery) { + case "NOT_STARTED": + case 0: + message.stickerPackQuery = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.stickerPackQuery = 1; + break; + case "DEVELOPMENT": + case 2: + message.stickerPackQuery = 2; + break; + case "PRODUCTION": + case 3: + message.stickerPackQuery = 3; + break; + } + switch (object.liveLocationsFinal) { + case "NOT_STARTED": + case 0: + message.liveLocationsFinal = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.liveLocationsFinal = 1; + break; + case "DEVELOPMENT": + case 2: + message.liveLocationsFinal = 2; + break; + case "PRODUCTION": + case 3: + message.liveLocationsFinal = 3; + break; + } + switch (object.labelsEdit) { + case "NOT_STARTED": + case 0: + message.labelsEdit = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.labelsEdit = 1; + break; + case "DEVELOPMENT": + case 2: + message.labelsEdit = 2; + break; + case "PRODUCTION": + case 3: + message.labelsEdit = 3; + break; + } + switch (object.mediaUpload) { + case "NOT_STARTED": + case 0: + message.mediaUpload = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.mediaUpload = 1; + break; + case "DEVELOPMENT": + case 2: + message.mediaUpload = 2; + break; + case "PRODUCTION": + case 3: + message.mediaUpload = 3; + break; + } + switch (object.mediaUploadRichQuickReplies) { + case "NOT_STARTED": + case 0: + message.mediaUploadRichQuickReplies = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.mediaUploadRichQuickReplies = 1; + break; + case "DEVELOPMENT": + case 2: + message.mediaUploadRichQuickReplies = 2; + break; + case "PRODUCTION": + case 3: + message.mediaUploadRichQuickReplies = 3; + break; + } + switch (object.vnameV2) { + case "NOT_STARTED": + case 0: + message.vnameV2 = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.vnameV2 = 1; + break; + case "DEVELOPMENT": + case 2: + message.vnameV2 = 2; + break; + case "PRODUCTION": + case 3: + message.vnameV2 = 3; + break; + } + switch (object.videoPlaybackUrl) { + case "NOT_STARTED": + case 0: + message.videoPlaybackUrl = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.videoPlaybackUrl = 1; + break; + case "DEVELOPMENT": + case 2: + message.videoPlaybackUrl = 2; + break; + case "PRODUCTION": + case 3: + message.videoPlaybackUrl = 3; + break; + } + switch (object.statusRanking) { + case "NOT_STARTED": + case 0: + message.statusRanking = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.statusRanking = 1; + break; + case "DEVELOPMENT": + case 2: + message.statusRanking = 2; + break; + case "PRODUCTION": + case 3: + message.statusRanking = 3; + break; + } + switch (object.voipIndividualVideo) { + case "NOT_STARTED": + case 0: + message.voipIndividualVideo = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.voipIndividualVideo = 1; + break; + case "DEVELOPMENT": + case 2: + message.voipIndividualVideo = 2; + break; + case "PRODUCTION": + case 3: + message.voipIndividualVideo = 3; + break; + } + switch (object.thirdPartyStickers) { + case "NOT_STARTED": + case 0: + message.thirdPartyStickers = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.thirdPartyStickers = 1; + break; + case "DEVELOPMENT": + case 2: + message.thirdPartyStickers = 2; + break; + case "PRODUCTION": + case 3: + message.thirdPartyStickers = 3; + break; + } + switch (object.frequentlyForwardedSetting) { + case "NOT_STARTED": + case 0: + message.frequentlyForwardedSetting = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.frequentlyForwardedSetting = 1; + break; + case "DEVELOPMENT": + case 2: + message.frequentlyForwardedSetting = 2; + break; + case "PRODUCTION": + case 3: + message.frequentlyForwardedSetting = 3; + break; + } + switch (object.groupsV4JoinPermission) { + case "NOT_STARTED": + case 0: + message.groupsV4JoinPermission = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.groupsV4JoinPermission = 1; + break; + case "DEVELOPMENT": + case 2: + message.groupsV4JoinPermission = 2; + break; + case "PRODUCTION": + case 3: + message.groupsV4JoinPermission = 3; + break; + } + switch (object.recentStickers) { + case "NOT_STARTED": + case 0: + message.recentStickers = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.recentStickers = 1; + break; + case "DEVELOPMENT": + case 2: + message.recentStickers = 2; + break; + case "PRODUCTION": + case 3: + message.recentStickers = 3; + break; + } + switch (object.catalog) { + case "NOT_STARTED": + case 0: + message.catalog = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.catalog = 1; + break; + case "DEVELOPMENT": + case 2: + message.catalog = 2; + break; + case "PRODUCTION": + case 3: + message.catalog = 3; + break; + } + switch (object.starredStickers) { + case "NOT_STARTED": + case 0: + message.starredStickers = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.starredStickers = 1; + break; + case "DEVELOPMENT": + case 2: + message.starredStickers = 2; + break; + case "PRODUCTION": + case 3: + message.starredStickers = 3; + break; + } + switch (object.voipGroupCall) { + case "NOT_STARTED": + case 0: + message.voipGroupCall = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.voipGroupCall = 1; + break; + case "DEVELOPMENT": + case 2: + message.voipGroupCall = 2; + break; + case "PRODUCTION": + case 3: + message.voipGroupCall = 3; + break; + } + switch (object.templateMessage) { + case "NOT_STARTED": + case 0: + message.templateMessage = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.templateMessage = 1; + break; + case "DEVELOPMENT": + case 2: + message.templateMessage = 2; + break; + case "PRODUCTION": + case 3: + message.templateMessage = 3; + break; + } + switch (object.templateMessageInteractivity) { + case "NOT_STARTED": + case 0: + message.templateMessageInteractivity = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.templateMessageInteractivity = 1; + break; + case "DEVELOPMENT": + case 2: + message.templateMessageInteractivity = 2; + break; + case "PRODUCTION": + case 3: + message.templateMessageInteractivity = 3; + break; + } + switch (object.ephemeralMessages) { + case "NOT_STARTED": + case 0: + message.ephemeralMessages = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.ephemeralMessages = 1; + break; + case "DEVELOPMENT": + case 2: + message.ephemeralMessages = 2; + break; + case "PRODUCTION": + case 3: + message.ephemeralMessages = 3; + break; + } + switch (object.e2ENotificationSync) { + case "NOT_STARTED": + case 0: + message.e2ENotificationSync = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.e2ENotificationSync = 1; + break; + case "DEVELOPMENT": + case 2: + message.e2ENotificationSync = 2; + break; + case "PRODUCTION": + case 3: + message.e2ENotificationSync = 3; + break; + } + switch (object.recentStickersV2) { + case "NOT_STARTED": + case 0: + message.recentStickersV2 = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.recentStickersV2 = 1; + break; + case "DEVELOPMENT": + case 2: + message.recentStickersV2 = 2; + break; + case "PRODUCTION": + case 3: + message.recentStickersV2 = 3; + break; + } + switch (object.recentStickersV3) { + case "NOT_STARTED": + case 0: + message.recentStickersV3 = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.recentStickersV3 = 1; + break; + case "DEVELOPMENT": + case 2: + message.recentStickersV3 = 2; + break; + case "PRODUCTION": + case 3: + message.recentStickersV3 = 3; + break; + } + switch (object.userNotice) { + case "NOT_STARTED": + case 0: + message.userNotice = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.userNotice = 1; + break; + case "DEVELOPMENT": + case 2: + message.userNotice = 2; + break; + case "PRODUCTION": + case 3: + message.userNotice = 3; + break; + } + switch (object.support) { + case "NOT_STARTED": + case 0: + message.support = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.support = 1; + break; + case "DEVELOPMENT": + case 2: + message.support = 2; + break; + case "PRODUCTION": + case 3: + message.support = 3; + break; + } + switch (object.groupUiiCleanup) { + case "NOT_STARTED": + case 0: + message.groupUiiCleanup = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.groupUiiCleanup = 1; + break; + case "DEVELOPMENT": + case 2: + message.groupUiiCleanup = 2; + break; + case "PRODUCTION": + case 3: + message.groupUiiCleanup = 3; + break; + } + switch (object.groupDogfoodingInternalOnly) { + case "NOT_STARTED": + case 0: + message.groupDogfoodingInternalOnly = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.groupDogfoodingInternalOnly = 1; + break; + case "DEVELOPMENT": + case 2: + message.groupDogfoodingInternalOnly = 2; + break; + case "PRODUCTION": + case 3: + message.groupDogfoodingInternalOnly = 3; + break; + } + switch (object.settingsSync) { + case "NOT_STARTED": + case 0: + message.settingsSync = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.settingsSync = 1; + break; + case "DEVELOPMENT": + case 2: + message.settingsSync = 2; + break; + case "PRODUCTION": + case 3: + message.settingsSync = 3; + break; + } + switch (object.archiveV2) { + case "NOT_STARTED": + case 0: + message.archiveV2 = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.archiveV2 = 1; + break; + case "DEVELOPMENT": + case 2: + message.archiveV2 = 2; + break; + case "PRODUCTION": + case 3: + message.archiveV2 = 3; + break; + } + switch (object.ephemeralAllowGroupMembers) { + case "NOT_STARTED": + case 0: + message.ephemeralAllowGroupMembers = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.ephemeralAllowGroupMembers = 1; + break; + case "DEVELOPMENT": + case 2: + message.ephemeralAllowGroupMembers = 2; + break; + case "PRODUCTION": + case 3: + message.ephemeralAllowGroupMembers = 3; + break; + } + switch (object.ephemeral24HDuration) { + case "NOT_STARTED": + case 0: + message.ephemeral24HDuration = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.ephemeral24HDuration = 1; + break; + case "DEVELOPMENT": + case 2: + message.ephemeral24HDuration = 2; + break; + case "PRODUCTION": + case 3: + message.ephemeral24HDuration = 3; + break; + } + switch (object.mdForceUpgrade) { + case "NOT_STARTED": + case 0: + message.mdForceUpgrade = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.mdForceUpgrade = 1; + break; + case "DEVELOPMENT": + case 2: + message.mdForceUpgrade = 2; + break; + case "PRODUCTION": + case 3: + message.mdForceUpgrade = 3; + break; + } + switch (object.disappearingMode) { + case "NOT_STARTED": + case 0: + message.disappearingMode = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.disappearingMode = 1; + break; + case "DEVELOPMENT": + case 2: + message.disappearingMode = 2; + break; + case "PRODUCTION": + case 3: + message.disappearingMode = 3; + break; + } + switch (object.externalMdOptInAvailable) { + case "NOT_STARTED": + case 0: + message.externalMdOptInAvailable = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.externalMdOptInAvailable = 1; + break; + case "DEVELOPMENT": + case 2: + message.externalMdOptInAvailable = 2; + break; + case "PRODUCTION": + case 3: + message.externalMdOptInAvailable = 3; + break; + } + switch (object.noDeleteMessageTimeLimit) { + case "NOT_STARTED": + case 0: + message.noDeleteMessageTimeLimit = 0; + break; + case "FORCE_UPGRADE": + case 1: + message.noDeleteMessageTimeLimit = 1; + break; + case "DEVELOPMENT": + case 2: + message.noDeleteMessageTimeLimit = 2; + break; + case "PRODUCTION": + case 3: + message.noDeleteMessageTimeLimit = 3; + break; + } + return message; + }; + + /** + * Creates a plain object from a WebFeatures message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.WebFeatures + * @static + * @param {proto.WebFeatures} message WebFeatures + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WebFeatures.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.labelsDisplay = options.enums === String ? "NOT_STARTED" : 0; + object.voipIndividualOutgoing = options.enums === String ? "NOT_STARTED" : 0; + object.groupsV3 = options.enums === String ? "NOT_STARTED" : 0; + object.groupsV3Create = options.enums === String ? "NOT_STARTED" : 0; + object.changeNumberV2 = options.enums === String ? "NOT_STARTED" : 0; + object.queryStatusV3Thumbnail = options.enums === String ? "NOT_STARTED" : 0; + object.liveLocations = options.enums === String ? "NOT_STARTED" : 0; + object.queryVname = options.enums === String ? "NOT_STARTED" : 0; + object.voipIndividualIncoming = options.enums === String ? "NOT_STARTED" : 0; + object.quickRepliesQuery = options.enums === String ? "NOT_STARTED" : 0; + object.payments = options.enums === String ? "NOT_STARTED" : 0; + object.stickerPackQuery = options.enums === String ? "NOT_STARTED" : 0; + object.liveLocationsFinal = options.enums === String ? "NOT_STARTED" : 0; + object.labelsEdit = options.enums === String ? "NOT_STARTED" : 0; + object.mediaUpload = options.enums === String ? "NOT_STARTED" : 0; + object.mediaUploadRichQuickReplies = options.enums === String ? "NOT_STARTED" : 0; + object.vnameV2 = options.enums === String ? "NOT_STARTED" : 0; + object.videoPlaybackUrl = options.enums === String ? "NOT_STARTED" : 0; + object.statusRanking = options.enums === String ? "NOT_STARTED" : 0; + object.voipIndividualVideo = options.enums === String ? "NOT_STARTED" : 0; + object.thirdPartyStickers = options.enums === String ? "NOT_STARTED" : 0; + object.frequentlyForwardedSetting = options.enums === String ? "NOT_STARTED" : 0; + object.groupsV4JoinPermission = options.enums === String ? "NOT_STARTED" : 0; + object.recentStickers = options.enums === String ? "NOT_STARTED" : 0; + object.catalog = options.enums === String ? "NOT_STARTED" : 0; + object.starredStickers = options.enums === String ? "NOT_STARTED" : 0; + object.voipGroupCall = options.enums === String ? "NOT_STARTED" : 0; + object.templateMessage = options.enums === String ? "NOT_STARTED" : 0; + object.templateMessageInteractivity = options.enums === String ? "NOT_STARTED" : 0; + object.ephemeralMessages = options.enums === String ? "NOT_STARTED" : 0; + object.e2ENotificationSync = options.enums === String ? "NOT_STARTED" : 0; + object.recentStickersV2 = options.enums === String ? "NOT_STARTED" : 0; + object.recentStickersV3 = options.enums === String ? "NOT_STARTED" : 0; + object.userNotice = options.enums === String ? "NOT_STARTED" : 0; + object.support = options.enums === String ? "NOT_STARTED" : 0; + object.groupUiiCleanup = options.enums === String ? "NOT_STARTED" : 0; + object.groupDogfoodingInternalOnly = options.enums === String ? "NOT_STARTED" : 0; + object.settingsSync = options.enums === String ? "NOT_STARTED" : 0; + object.archiveV2 = options.enums === String ? "NOT_STARTED" : 0; + object.ephemeralAllowGroupMembers = options.enums === String ? "NOT_STARTED" : 0; + object.ephemeral24HDuration = options.enums === String ? "NOT_STARTED" : 0; + object.mdForceUpgrade = options.enums === String ? "NOT_STARTED" : 0; + object.disappearingMode = options.enums === String ? "NOT_STARTED" : 0; + object.externalMdOptInAvailable = options.enums === String ? "NOT_STARTED" : 0; + object.noDeleteMessageTimeLimit = options.enums === String ? "NOT_STARTED" : 0; + } + if (message.labelsDisplay != null && message.hasOwnProperty("labelsDisplay")) + object.labelsDisplay = options.enums === String ? $root.proto.WebFeatures.Flag[message.labelsDisplay] : message.labelsDisplay; + if (message.voipIndividualOutgoing != null && message.hasOwnProperty("voipIndividualOutgoing")) + object.voipIndividualOutgoing = options.enums === String ? $root.proto.WebFeatures.Flag[message.voipIndividualOutgoing] : message.voipIndividualOutgoing; + if (message.groupsV3 != null && message.hasOwnProperty("groupsV3")) + object.groupsV3 = options.enums === String ? $root.proto.WebFeatures.Flag[message.groupsV3] : message.groupsV3; + if (message.groupsV3Create != null && message.hasOwnProperty("groupsV3Create")) + object.groupsV3Create = options.enums === String ? $root.proto.WebFeatures.Flag[message.groupsV3Create] : message.groupsV3Create; + if (message.changeNumberV2 != null && message.hasOwnProperty("changeNumberV2")) + object.changeNumberV2 = options.enums === String ? $root.proto.WebFeatures.Flag[message.changeNumberV2] : message.changeNumberV2; + if (message.queryStatusV3Thumbnail != null && message.hasOwnProperty("queryStatusV3Thumbnail")) + object.queryStatusV3Thumbnail = options.enums === String ? $root.proto.WebFeatures.Flag[message.queryStatusV3Thumbnail] : message.queryStatusV3Thumbnail; + if (message.liveLocations != null && message.hasOwnProperty("liveLocations")) + object.liveLocations = options.enums === String ? $root.proto.WebFeatures.Flag[message.liveLocations] : message.liveLocations; + if (message.queryVname != null && message.hasOwnProperty("queryVname")) + object.queryVname = options.enums === String ? $root.proto.WebFeatures.Flag[message.queryVname] : message.queryVname; + if (message.voipIndividualIncoming != null && message.hasOwnProperty("voipIndividualIncoming")) + object.voipIndividualIncoming = options.enums === String ? $root.proto.WebFeatures.Flag[message.voipIndividualIncoming] : message.voipIndividualIncoming; + if (message.quickRepliesQuery != null && message.hasOwnProperty("quickRepliesQuery")) + object.quickRepliesQuery = options.enums === String ? $root.proto.WebFeatures.Flag[message.quickRepliesQuery] : message.quickRepliesQuery; + if (message.payments != null && message.hasOwnProperty("payments")) + object.payments = options.enums === String ? $root.proto.WebFeatures.Flag[message.payments] : message.payments; + if (message.stickerPackQuery != null && message.hasOwnProperty("stickerPackQuery")) + object.stickerPackQuery = options.enums === String ? $root.proto.WebFeatures.Flag[message.stickerPackQuery] : message.stickerPackQuery; + if (message.liveLocationsFinal != null && message.hasOwnProperty("liveLocationsFinal")) + object.liveLocationsFinal = options.enums === String ? $root.proto.WebFeatures.Flag[message.liveLocationsFinal] : message.liveLocationsFinal; + if (message.labelsEdit != null && message.hasOwnProperty("labelsEdit")) + object.labelsEdit = options.enums === String ? $root.proto.WebFeatures.Flag[message.labelsEdit] : message.labelsEdit; + if (message.mediaUpload != null && message.hasOwnProperty("mediaUpload")) + object.mediaUpload = options.enums === String ? $root.proto.WebFeatures.Flag[message.mediaUpload] : message.mediaUpload; + if (message.mediaUploadRichQuickReplies != null && message.hasOwnProperty("mediaUploadRichQuickReplies")) + object.mediaUploadRichQuickReplies = options.enums === String ? $root.proto.WebFeatures.Flag[message.mediaUploadRichQuickReplies] : message.mediaUploadRichQuickReplies; + if (message.vnameV2 != null && message.hasOwnProperty("vnameV2")) + object.vnameV2 = options.enums === String ? $root.proto.WebFeatures.Flag[message.vnameV2] : message.vnameV2; + if (message.videoPlaybackUrl != null && message.hasOwnProperty("videoPlaybackUrl")) + object.videoPlaybackUrl = options.enums === String ? $root.proto.WebFeatures.Flag[message.videoPlaybackUrl] : message.videoPlaybackUrl; + if (message.statusRanking != null && message.hasOwnProperty("statusRanking")) + object.statusRanking = options.enums === String ? $root.proto.WebFeatures.Flag[message.statusRanking] : message.statusRanking; + if (message.voipIndividualVideo != null && message.hasOwnProperty("voipIndividualVideo")) + object.voipIndividualVideo = options.enums === String ? $root.proto.WebFeatures.Flag[message.voipIndividualVideo] : message.voipIndividualVideo; + if (message.thirdPartyStickers != null && message.hasOwnProperty("thirdPartyStickers")) + object.thirdPartyStickers = options.enums === String ? $root.proto.WebFeatures.Flag[message.thirdPartyStickers] : message.thirdPartyStickers; + if (message.frequentlyForwardedSetting != null && message.hasOwnProperty("frequentlyForwardedSetting")) + object.frequentlyForwardedSetting = options.enums === String ? $root.proto.WebFeatures.Flag[message.frequentlyForwardedSetting] : message.frequentlyForwardedSetting; + if (message.groupsV4JoinPermission != null && message.hasOwnProperty("groupsV4JoinPermission")) + object.groupsV4JoinPermission = options.enums === String ? $root.proto.WebFeatures.Flag[message.groupsV4JoinPermission] : message.groupsV4JoinPermission; + if (message.recentStickers != null && message.hasOwnProperty("recentStickers")) + object.recentStickers = options.enums === String ? $root.proto.WebFeatures.Flag[message.recentStickers] : message.recentStickers; + if (message.catalog != null && message.hasOwnProperty("catalog")) + object.catalog = options.enums === String ? $root.proto.WebFeatures.Flag[message.catalog] : message.catalog; + if (message.starredStickers != null && message.hasOwnProperty("starredStickers")) + object.starredStickers = options.enums === String ? $root.proto.WebFeatures.Flag[message.starredStickers] : message.starredStickers; + if (message.voipGroupCall != null && message.hasOwnProperty("voipGroupCall")) + object.voipGroupCall = options.enums === String ? $root.proto.WebFeatures.Flag[message.voipGroupCall] : message.voipGroupCall; + if (message.templateMessage != null && message.hasOwnProperty("templateMessage")) + object.templateMessage = options.enums === String ? $root.proto.WebFeatures.Flag[message.templateMessage] : message.templateMessage; + if (message.templateMessageInteractivity != null && message.hasOwnProperty("templateMessageInteractivity")) + object.templateMessageInteractivity = options.enums === String ? $root.proto.WebFeatures.Flag[message.templateMessageInteractivity] : message.templateMessageInteractivity; + if (message.ephemeralMessages != null && message.hasOwnProperty("ephemeralMessages")) + object.ephemeralMessages = options.enums === String ? $root.proto.WebFeatures.Flag[message.ephemeralMessages] : message.ephemeralMessages; + if (message.e2ENotificationSync != null && message.hasOwnProperty("e2ENotificationSync")) + object.e2ENotificationSync = options.enums === String ? $root.proto.WebFeatures.Flag[message.e2ENotificationSync] : message.e2ENotificationSync; + if (message.recentStickersV2 != null && message.hasOwnProperty("recentStickersV2")) + object.recentStickersV2 = options.enums === String ? $root.proto.WebFeatures.Flag[message.recentStickersV2] : message.recentStickersV2; + if (message.recentStickersV3 != null && message.hasOwnProperty("recentStickersV3")) + object.recentStickersV3 = options.enums === String ? $root.proto.WebFeatures.Flag[message.recentStickersV3] : message.recentStickersV3; + if (message.userNotice != null && message.hasOwnProperty("userNotice")) + object.userNotice = options.enums === String ? $root.proto.WebFeatures.Flag[message.userNotice] : message.userNotice; + if (message.support != null && message.hasOwnProperty("support")) + object.support = options.enums === String ? $root.proto.WebFeatures.Flag[message.support] : message.support; + if (message.groupUiiCleanup != null && message.hasOwnProperty("groupUiiCleanup")) + object.groupUiiCleanup = options.enums === String ? $root.proto.WebFeatures.Flag[message.groupUiiCleanup] : message.groupUiiCleanup; + if (message.groupDogfoodingInternalOnly != null && message.hasOwnProperty("groupDogfoodingInternalOnly")) + object.groupDogfoodingInternalOnly = options.enums === String ? $root.proto.WebFeatures.Flag[message.groupDogfoodingInternalOnly] : message.groupDogfoodingInternalOnly; + if (message.settingsSync != null && message.hasOwnProperty("settingsSync")) + object.settingsSync = options.enums === String ? $root.proto.WebFeatures.Flag[message.settingsSync] : message.settingsSync; + if (message.archiveV2 != null && message.hasOwnProperty("archiveV2")) + object.archiveV2 = options.enums === String ? $root.proto.WebFeatures.Flag[message.archiveV2] : message.archiveV2; + if (message.ephemeralAllowGroupMembers != null && message.hasOwnProperty("ephemeralAllowGroupMembers")) + object.ephemeralAllowGroupMembers = options.enums === String ? $root.proto.WebFeatures.Flag[message.ephemeralAllowGroupMembers] : message.ephemeralAllowGroupMembers; + if (message.ephemeral24HDuration != null && message.hasOwnProperty("ephemeral24HDuration")) + object.ephemeral24HDuration = options.enums === String ? $root.proto.WebFeatures.Flag[message.ephemeral24HDuration] : message.ephemeral24HDuration; + if (message.mdForceUpgrade != null && message.hasOwnProperty("mdForceUpgrade")) + object.mdForceUpgrade = options.enums === String ? $root.proto.WebFeatures.Flag[message.mdForceUpgrade] : message.mdForceUpgrade; + if (message.disappearingMode != null && message.hasOwnProperty("disappearingMode")) + object.disappearingMode = options.enums === String ? $root.proto.WebFeatures.Flag[message.disappearingMode] : message.disappearingMode; + if (message.externalMdOptInAvailable != null && message.hasOwnProperty("externalMdOptInAvailable")) + object.externalMdOptInAvailable = options.enums === String ? $root.proto.WebFeatures.Flag[message.externalMdOptInAvailable] : message.externalMdOptInAvailable; + if (message.noDeleteMessageTimeLimit != null && message.hasOwnProperty("noDeleteMessageTimeLimit")) + object.noDeleteMessageTimeLimit = options.enums === String ? $root.proto.WebFeatures.Flag[message.noDeleteMessageTimeLimit] : message.noDeleteMessageTimeLimit; + return object; + }; + + /** + * Converts this WebFeatures to JSON. + * @function toJSON + * @memberof proto.WebFeatures + * @instance + * @returns {Object.} JSON object + */ + WebFeatures.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Flag enum. + * @name proto.WebFeatures.Flag + * @enum {number} + * @property {number} NOT_STARTED=0 NOT_STARTED value + * @property {number} FORCE_UPGRADE=1 FORCE_UPGRADE value + * @property {number} DEVELOPMENT=2 DEVELOPMENT value + * @property {number} PRODUCTION=3 PRODUCTION value + */ + WebFeatures.Flag = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "NOT_STARTED"] = 0; + values[valuesById[1] = "FORCE_UPGRADE"] = 1; + values[valuesById[2] = "DEVELOPMENT"] = 2; + values[valuesById[3] = "PRODUCTION"] = 3; + return values; + })(); + + return WebFeatures; + })(); + + proto.WebMessageInfo = (function() { + + /** + * Properties of a WebMessageInfo. + * @memberof proto + * @interface IWebMessageInfo + * @property {proto.IMessageKey} key WebMessageInfo key + * @property {proto.IMessage|null} [message] WebMessageInfo message + * @property {number|Long|null} [messageTimestamp] WebMessageInfo messageTimestamp + * @property {proto.WebMessageInfo.Status|null} [status] WebMessageInfo status + * @property {string|null} [participant] WebMessageInfo participant + * @property {number|Long|null} [messageC2STimestamp] WebMessageInfo messageC2STimestamp + * @property {boolean|null} [ignore] WebMessageInfo ignore + * @property {boolean|null} [starred] WebMessageInfo starred + * @property {boolean|null} [broadcast] WebMessageInfo broadcast + * @property {string|null} [pushName] WebMessageInfo pushName + * @property {Uint8Array|null} [mediaCiphertextSha256] WebMessageInfo mediaCiphertextSha256 + * @property {boolean|null} [multicast] WebMessageInfo multicast + * @property {boolean|null} [urlText] WebMessageInfo urlText + * @property {boolean|null} [urlNumber] WebMessageInfo urlNumber + * @property {proto.WebMessageInfo.StubType|null} [messageStubType] WebMessageInfo messageStubType + * @property {boolean|null} [clearMedia] WebMessageInfo clearMedia + * @property {Array.|null} [messageStubParameters] WebMessageInfo messageStubParameters + * @property {number|null} [duration] WebMessageInfo duration + * @property {Array.|null} [labels] WebMessageInfo labels + * @property {proto.IPaymentInfo|null} [paymentInfo] WebMessageInfo paymentInfo + * @property {proto.Message.ILiveLocationMessage|null} [finalLiveLocation] WebMessageInfo finalLiveLocation + * @property {proto.IPaymentInfo|null} [quotedPaymentInfo] WebMessageInfo quotedPaymentInfo + * @property {number|Long|null} [ephemeralStartTimestamp] WebMessageInfo ephemeralStartTimestamp + * @property {number|null} [ephemeralDuration] WebMessageInfo ephemeralDuration + * @property {boolean|null} [ephemeralOffToOn] WebMessageInfo ephemeralOffToOn + * @property {boolean|null} [ephemeralOutOfSync] WebMessageInfo ephemeralOutOfSync + * @property {proto.WebMessageInfo.BizPrivacyStatus|null} [bizPrivacyStatus] WebMessageInfo bizPrivacyStatus + * @property {string|null} [verifiedBizName] WebMessageInfo verifiedBizName + * @property {proto.IMediaData|null} [mediaData] WebMessageInfo mediaData + * @property {proto.IPhotoChange|null} [photoChange] WebMessageInfo photoChange + * @property {Array.|null} [userReceipt] WebMessageInfo userReceipt + * @property {Array.|null} [reactions] WebMessageInfo reactions + * @property {proto.IMediaData|null} [quotedStickerData] WebMessageInfo quotedStickerData + * @property {Uint8Array|null} [futureproofData] WebMessageInfo futureproofData + * @property {proto.IStatusPSA|null} [statusPsa] WebMessageInfo statusPsa + * @property {Array.|null} [pollUpdates] WebMessageInfo pollUpdates + * @property {proto.IPollAdditionalMetadata|null} [pollAdditionalMetadata] WebMessageInfo pollAdditionalMetadata + * @property {string|null} [agentId] WebMessageInfo agentId + * @property {boolean|null} [statusAlreadyViewed] WebMessageInfo statusAlreadyViewed + * @property {Uint8Array|null} [messageSecret] WebMessageInfo messageSecret + * @property {proto.IKeepInChat|null} [keepInChat] WebMessageInfo keepInChat + * @property {string|null} [originalSelfAuthorUserJidString] WebMessageInfo originalSelfAuthorUserJidString + * @property {number|Long|null} [revokeMessageTimestamp] WebMessageInfo revokeMessageTimestamp + */ + + /** + * Constructs a new WebMessageInfo. + * @memberof proto + * @classdesc Represents a WebMessageInfo. + * @implements IWebMessageInfo + * @constructor + * @param {proto.IWebMessageInfo=} [properties] Properties to set + */ + function WebMessageInfo(properties) { + this.messageStubParameters = []; + this.labels = []; + this.userReceipt = []; + this.reactions = []; + this.pollUpdates = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WebMessageInfo key. + * @member {proto.IMessageKey} key + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.key = null; + + /** + * WebMessageInfo message. + * @member {proto.IMessage|null|undefined} message + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.message = null; + + /** + * WebMessageInfo messageTimestamp. + * @member {number|Long} messageTimestamp + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.messageTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * WebMessageInfo status. + * @member {proto.WebMessageInfo.Status} status + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.status = 0; + + /** + * WebMessageInfo participant. + * @member {string} participant + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.participant = ""; + + /** + * WebMessageInfo messageC2STimestamp. + * @member {number|Long} messageC2STimestamp + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.messageC2STimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * WebMessageInfo ignore. + * @member {boolean} ignore + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.ignore = false; + + /** + * WebMessageInfo starred. + * @member {boolean} starred + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.starred = false; + + /** + * WebMessageInfo broadcast. + * @member {boolean} broadcast + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.broadcast = false; + + /** + * WebMessageInfo pushName. + * @member {string} pushName + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.pushName = ""; + + /** + * WebMessageInfo mediaCiphertextSha256. + * @member {Uint8Array} mediaCiphertextSha256 + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.mediaCiphertextSha256 = $util.newBuffer([]); + + /** + * WebMessageInfo multicast. + * @member {boolean} multicast + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.multicast = false; + + /** + * WebMessageInfo urlText. + * @member {boolean} urlText + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.urlText = false; + + /** + * WebMessageInfo urlNumber. + * @member {boolean} urlNumber + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.urlNumber = false; + + /** + * WebMessageInfo messageStubType. + * @member {proto.WebMessageInfo.StubType} messageStubType + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.messageStubType = 0; + + /** + * WebMessageInfo clearMedia. + * @member {boolean} clearMedia + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.clearMedia = false; + + /** + * WebMessageInfo messageStubParameters. + * @member {Array.} messageStubParameters + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.messageStubParameters = $util.emptyArray; + + /** + * WebMessageInfo duration. + * @member {number} duration + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.duration = 0; + + /** + * WebMessageInfo labels. + * @member {Array.} labels + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.labels = $util.emptyArray; + + /** + * WebMessageInfo paymentInfo. + * @member {proto.IPaymentInfo|null|undefined} paymentInfo + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.paymentInfo = null; + + /** + * WebMessageInfo finalLiveLocation. + * @member {proto.Message.ILiveLocationMessage|null|undefined} finalLiveLocation + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.finalLiveLocation = null; + + /** + * WebMessageInfo quotedPaymentInfo. + * @member {proto.IPaymentInfo|null|undefined} quotedPaymentInfo + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.quotedPaymentInfo = null; + + /** + * WebMessageInfo ephemeralStartTimestamp. + * @member {number|Long} ephemeralStartTimestamp + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.ephemeralStartTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * WebMessageInfo ephemeralDuration. + * @member {number} ephemeralDuration + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.ephemeralDuration = 0; + + /** + * WebMessageInfo ephemeralOffToOn. + * @member {boolean} ephemeralOffToOn + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.ephemeralOffToOn = false; + + /** + * WebMessageInfo ephemeralOutOfSync. + * @member {boolean} ephemeralOutOfSync + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.ephemeralOutOfSync = false; + + /** + * WebMessageInfo bizPrivacyStatus. + * @member {proto.WebMessageInfo.BizPrivacyStatus} bizPrivacyStatus + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.bizPrivacyStatus = 0; + + /** + * WebMessageInfo verifiedBizName. + * @member {string} verifiedBizName + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.verifiedBizName = ""; + + /** + * WebMessageInfo mediaData. + * @member {proto.IMediaData|null|undefined} mediaData + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.mediaData = null; + + /** + * WebMessageInfo photoChange. + * @member {proto.IPhotoChange|null|undefined} photoChange + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.photoChange = null; + + /** + * WebMessageInfo userReceipt. + * @member {Array.} userReceipt + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.userReceipt = $util.emptyArray; + + /** + * WebMessageInfo reactions. + * @member {Array.} reactions + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.reactions = $util.emptyArray; + + /** + * WebMessageInfo quotedStickerData. + * @member {proto.IMediaData|null|undefined} quotedStickerData + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.quotedStickerData = null; + + /** + * WebMessageInfo futureproofData. + * @member {Uint8Array} futureproofData + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.futureproofData = $util.newBuffer([]); + + /** + * WebMessageInfo statusPsa. + * @member {proto.IStatusPSA|null|undefined} statusPsa + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.statusPsa = null; + + /** + * WebMessageInfo pollUpdates. + * @member {Array.} pollUpdates + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.pollUpdates = $util.emptyArray; + + /** + * WebMessageInfo pollAdditionalMetadata. + * @member {proto.IPollAdditionalMetadata|null|undefined} pollAdditionalMetadata + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.pollAdditionalMetadata = null; + + /** + * WebMessageInfo agentId. + * @member {string} agentId + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.agentId = ""; + + /** + * WebMessageInfo statusAlreadyViewed. + * @member {boolean} statusAlreadyViewed + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.statusAlreadyViewed = false; + + /** + * WebMessageInfo messageSecret. + * @member {Uint8Array} messageSecret + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.messageSecret = $util.newBuffer([]); + + /** + * WebMessageInfo keepInChat. + * @member {proto.IKeepInChat|null|undefined} keepInChat + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.keepInChat = null; + + /** + * WebMessageInfo originalSelfAuthorUserJidString. + * @member {string} originalSelfAuthorUserJidString + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.originalSelfAuthorUserJidString = ""; + + /** + * WebMessageInfo revokeMessageTimestamp. + * @member {number|Long} revokeMessageTimestamp + * @memberof proto.WebMessageInfo + * @instance + */ + WebMessageInfo.prototype.revokeMessageTimestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new WebMessageInfo instance using the specified properties. + * @function create + * @memberof proto.WebMessageInfo + * @static + * @param {proto.IWebMessageInfo=} [properties] Properties to set + * @returns {proto.WebMessageInfo} WebMessageInfo instance + */ + WebMessageInfo.create = function create(properties) { + return new WebMessageInfo(properties); + }; + + /** + * Encodes the specified WebMessageInfo message. Does not implicitly {@link proto.WebMessageInfo.verify|verify} messages. + * @function encode + * @memberof proto.WebMessageInfo + * @static + * @param {proto.IWebMessageInfo} message WebMessageInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebMessageInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + $root.proto.MessageKey.encode(message.key, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.message != null && Object.hasOwnProperty.call(message, "message")) + $root.proto.Message.encode(message.message, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.messageTimestamp != null && Object.hasOwnProperty.call(message, "messageTimestamp")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.messageTimestamp); + if (message.status != null && Object.hasOwnProperty.call(message, "status")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.status); + if (message.participant != null && Object.hasOwnProperty.call(message, "participant")) + writer.uint32(/* id 5, wireType 2 =*/42).string(message.participant); + if (message.messageC2STimestamp != null && Object.hasOwnProperty.call(message, "messageC2STimestamp")) + writer.uint32(/* id 6, wireType 0 =*/48).uint64(message.messageC2STimestamp); + if (message.ignore != null && Object.hasOwnProperty.call(message, "ignore")) + writer.uint32(/* id 16, wireType 0 =*/128).bool(message.ignore); + if (message.starred != null && Object.hasOwnProperty.call(message, "starred")) + writer.uint32(/* id 17, wireType 0 =*/136).bool(message.starred); + if (message.broadcast != null && Object.hasOwnProperty.call(message, "broadcast")) + writer.uint32(/* id 18, wireType 0 =*/144).bool(message.broadcast); + if (message.pushName != null && Object.hasOwnProperty.call(message, "pushName")) + writer.uint32(/* id 19, wireType 2 =*/154).string(message.pushName); + if (message.mediaCiphertextSha256 != null && Object.hasOwnProperty.call(message, "mediaCiphertextSha256")) + writer.uint32(/* id 20, wireType 2 =*/162).bytes(message.mediaCiphertextSha256); + if (message.multicast != null && Object.hasOwnProperty.call(message, "multicast")) + writer.uint32(/* id 21, wireType 0 =*/168).bool(message.multicast); + if (message.urlText != null && Object.hasOwnProperty.call(message, "urlText")) + writer.uint32(/* id 22, wireType 0 =*/176).bool(message.urlText); + if (message.urlNumber != null && Object.hasOwnProperty.call(message, "urlNumber")) + writer.uint32(/* id 23, wireType 0 =*/184).bool(message.urlNumber); + if (message.messageStubType != null && Object.hasOwnProperty.call(message, "messageStubType")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.messageStubType); + if (message.clearMedia != null && Object.hasOwnProperty.call(message, "clearMedia")) + writer.uint32(/* id 25, wireType 0 =*/200).bool(message.clearMedia); + if (message.messageStubParameters != null && message.messageStubParameters.length) + for (var i = 0; i < message.messageStubParameters.length; ++i) + writer.uint32(/* id 26, wireType 2 =*/210).string(message.messageStubParameters[i]); + if (message.duration != null && Object.hasOwnProperty.call(message, "duration")) + writer.uint32(/* id 27, wireType 0 =*/216).uint32(message.duration); + if (message.labels != null && message.labels.length) + for (var i = 0; i < message.labels.length; ++i) + writer.uint32(/* id 28, wireType 2 =*/226).string(message.labels[i]); + if (message.paymentInfo != null && Object.hasOwnProperty.call(message, "paymentInfo")) + $root.proto.PaymentInfo.encode(message.paymentInfo, writer.uint32(/* id 29, wireType 2 =*/234).fork()).ldelim(); + if (message.finalLiveLocation != null && Object.hasOwnProperty.call(message, "finalLiveLocation")) + $root.proto.Message.LiveLocationMessage.encode(message.finalLiveLocation, writer.uint32(/* id 30, wireType 2 =*/242).fork()).ldelim(); + if (message.quotedPaymentInfo != null && Object.hasOwnProperty.call(message, "quotedPaymentInfo")) + $root.proto.PaymentInfo.encode(message.quotedPaymentInfo, writer.uint32(/* id 31, wireType 2 =*/250).fork()).ldelim(); + if (message.ephemeralStartTimestamp != null && Object.hasOwnProperty.call(message, "ephemeralStartTimestamp")) + writer.uint32(/* id 32, wireType 0 =*/256).uint64(message.ephemeralStartTimestamp); + if (message.ephemeralDuration != null && Object.hasOwnProperty.call(message, "ephemeralDuration")) + writer.uint32(/* id 33, wireType 0 =*/264).uint32(message.ephemeralDuration); + if (message.ephemeralOffToOn != null && Object.hasOwnProperty.call(message, "ephemeralOffToOn")) + writer.uint32(/* id 34, wireType 0 =*/272).bool(message.ephemeralOffToOn); + if (message.ephemeralOutOfSync != null && Object.hasOwnProperty.call(message, "ephemeralOutOfSync")) + writer.uint32(/* id 35, wireType 0 =*/280).bool(message.ephemeralOutOfSync); + if (message.bizPrivacyStatus != null && Object.hasOwnProperty.call(message, "bizPrivacyStatus")) + writer.uint32(/* id 36, wireType 0 =*/288).int32(message.bizPrivacyStatus); + if (message.verifiedBizName != null && Object.hasOwnProperty.call(message, "verifiedBizName")) + writer.uint32(/* id 37, wireType 2 =*/298).string(message.verifiedBizName); + if (message.mediaData != null && Object.hasOwnProperty.call(message, "mediaData")) + $root.proto.MediaData.encode(message.mediaData, writer.uint32(/* id 38, wireType 2 =*/306).fork()).ldelim(); + if (message.photoChange != null && Object.hasOwnProperty.call(message, "photoChange")) + $root.proto.PhotoChange.encode(message.photoChange, writer.uint32(/* id 39, wireType 2 =*/314).fork()).ldelim(); + if (message.userReceipt != null && message.userReceipt.length) + for (var i = 0; i < message.userReceipt.length; ++i) + $root.proto.UserReceipt.encode(message.userReceipt[i], writer.uint32(/* id 40, wireType 2 =*/322).fork()).ldelim(); + if (message.reactions != null && message.reactions.length) + for (var i = 0; i < message.reactions.length; ++i) + $root.proto.Reaction.encode(message.reactions[i], writer.uint32(/* id 41, wireType 2 =*/330).fork()).ldelim(); + if (message.quotedStickerData != null && Object.hasOwnProperty.call(message, "quotedStickerData")) + $root.proto.MediaData.encode(message.quotedStickerData, writer.uint32(/* id 42, wireType 2 =*/338).fork()).ldelim(); + if (message.futureproofData != null && Object.hasOwnProperty.call(message, "futureproofData")) + writer.uint32(/* id 43, wireType 2 =*/346).bytes(message.futureproofData); + if (message.statusPsa != null && Object.hasOwnProperty.call(message, "statusPsa")) + $root.proto.StatusPSA.encode(message.statusPsa, writer.uint32(/* id 44, wireType 2 =*/354).fork()).ldelim(); + if (message.pollUpdates != null && message.pollUpdates.length) + for (var i = 0; i < message.pollUpdates.length; ++i) + $root.proto.PollUpdate.encode(message.pollUpdates[i], writer.uint32(/* id 45, wireType 2 =*/362).fork()).ldelim(); + if (message.pollAdditionalMetadata != null && Object.hasOwnProperty.call(message, "pollAdditionalMetadata")) + $root.proto.PollAdditionalMetadata.encode(message.pollAdditionalMetadata, writer.uint32(/* id 46, wireType 2 =*/370).fork()).ldelim(); + if (message.agentId != null && Object.hasOwnProperty.call(message, "agentId")) + writer.uint32(/* id 47, wireType 2 =*/378).string(message.agentId); + if (message.statusAlreadyViewed != null && Object.hasOwnProperty.call(message, "statusAlreadyViewed")) + writer.uint32(/* id 48, wireType 0 =*/384).bool(message.statusAlreadyViewed); + if (message.messageSecret != null && Object.hasOwnProperty.call(message, "messageSecret")) + writer.uint32(/* id 49, wireType 2 =*/394).bytes(message.messageSecret); + if (message.keepInChat != null && Object.hasOwnProperty.call(message, "keepInChat")) + $root.proto.KeepInChat.encode(message.keepInChat, writer.uint32(/* id 50, wireType 2 =*/402).fork()).ldelim(); + if (message.originalSelfAuthorUserJidString != null && Object.hasOwnProperty.call(message, "originalSelfAuthorUserJidString")) + writer.uint32(/* id 51, wireType 2 =*/410).string(message.originalSelfAuthorUserJidString); + if (message.revokeMessageTimestamp != null && Object.hasOwnProperty.call(message, "revokeMessageTimestamp")) + writer.uint32(/* id 52, wireType 0 =*/416).uint64(message.revokeMessageTimestamp); + return writer; + }; + + /** + * Encodes the specified WebMessageInfo message, length delimited. Does not implicitly {@link proto.WebMessageInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.WebMessageInfo + * @static + * @param {proto.IWebMessageInfo} message WebMessageInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebMessageInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WebMessageInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.WebMessageInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.WebMessageInfo} WebMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebMessageInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.WebMessageInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.key = $root.proto.MessageKey.decode(reader, reader.uint32()); + break; + case 2: + message.message = $root.proto.Message.decode(reader, reader.uint32()); + break; + case 3: + message.messageTimestamp = reader.uint64(); + break; + case 4: + message.status = reader.int32(); + break; + case 5: + message.participant = reader.string(); + break; + case 6: + message.messageC2STimestamp = reader.uint64(); + break; + case 16: + message.ignore = reader.bool(); + break; + case 17: + message.starred = reader.bool(); + break; + case 18: + message.broadcast = reader.bool(); + break; + case 19: + message.pushName = reader.string(); + break; + case 20: + message.mediaCiphertextSha256 = reader.bytes(); + break; + case 21: + message.multicast = reader.bool(); + break; + case 22: + message.urlText = reader.bool(); + break; + case 23: + message.urlNumber = reader.bool(); + break; + case 24: + message.messageStubType = reader.int32(); + break; + case 25: + message.clearMedia = reader.bool(); + break; + case 26: + if (!(message.messageStubParameters && message.messageStubParameters.length)) + message.messageStubParameters = []; + message.messageStubParameters.push(reader.string()); + break; + case 27: + message.duration = reader.uint32(); + break; + case 28: + if (!(message.labels && message.labels.length)) + message.labels = []; + message.labels.push(reader.string()); + break; + case 29: + message.paymentInfo = $root.proto.PaymentInfo.decode(reader, reader.uint32()); + break; + case 30: + message.finalLiveLocation = $root.proto.Message.LiveLocationMessage.decode(reader, reader.uint32()); + break; + case 31: + message.quotedPaymentInfo = $root.proto.PaymentInfo.decode(reader, reader.uint32()); + break; + case 32: + message.ephemeralStartTimestamp = reader.uint64(); + break; + case 33: + message.ephemeralDuration = reader.uint32(); + break; + case 34: + message.ephemeralOffToOn = reader.bool(); + break; + case 35: + message.ephemeralOutOfSync = reader.bool(); + break; + case 36: + message.bizPrivacyStatus = reader.int32(); + break; + case 37: + message.verifiedBizName = reader.string(); + break; + case 38: + message.mediaData = $root.proto.MediaData.decode(reader, reader.uint32()); + break; + case 39: + message.photoChange = $root.proto.PhotoChange.decode(reader, reader.uint32()); + break; + case 40: + if (!(message.userReceipt && message.userReceipt.length)) + message.userReceipt = []; + message.userReceipt.push($root.proto.UserReceipt.decode(reader, reader.uint32())); + break; + case 41: + if (!(message.reactions && message.reactions.length)) + message.reactions = []; + message.reactions.push($root.proto.Reaction.decode(reader, reader.uint32())); + break; + case 42: + message.quotedStickerData = $root.proto.MediaData.decode(reader, reader.uint32()); + break; + case 43: + message.futureproofData = reader.bytes(); + break; + case 44: + message.statusPsa = $root.proto.StatusPSA.decode(reader, reader.uint32()); + break; + case 45: + if (!(message.pollUpdates && message.pollUpdates.length)) + message.pollUpdates = []; + message.pollUpdates.push($root.proto.PollUpdate.decode(reader, reader.uint32())); + break; + case 46: + message.pollAdditionalMetadata = $root.proto.PollAdditionalMetadata.decode(reader, reader.uint32()); + break; + case 47: + message.agentId = reader.string(); + break; + case 48: + message.statusAlreadyViewed = reader.bool(); + break; + case 49: + message.messageSecret = reader.bytes(); + break; + case 50: + message.keepInChat = $root.proto.KeepInChat.decode(reader, reader.uint32()); + break; + case 51: + message.originalSelfAuthorUserJidString = reader.string(); + break; + case 52: + message.revokeMessageTimestamp = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + if (!message.hasOwnProperty("key")) + throw $util.ProtocolError("missing required 'key'", { instance: message }); + return message; + }; + + /** + * Decodes a WebMessageInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.WebMessageInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.WebMessageInfo} WebMessageInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebMessageInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WebMessageInfo message. + * @function verify + * @memberof proto.WebMessageInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WebMessageInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + { + var error = $root.proto.MessageKey.verify(message.key); + if (error) + return "key." + error; + } + if (message.message != null && message.hasOwnProperty("message")) { + var error = $root.proto.Message.verify(message.message); + if (error) + return "message." + error; + } + if (message.messageTimestamp != null && message.hasOwnProperty("messageTimestamp")) + if (!$util.isInteger(message.messageTimestamp) && !(message.messageTimestamp && $util.isInteger(message.messageTimestamp.low) && $util.isInteger(message.messageTimestamp.high))) + return "messageTimestamp: integer|Long expected"; + if (message.status != null && message.hasOwnProperty("status")) + switch (message.status) { + default: + return "status: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; + } + if (message.participant != null && message.hasOwnProperty("participant")) + if (!$util.isString(message.participant)) + return "participant: string expected"; + if (message.messageC2STimestamp != null && message.hasOwnProperty("messageC2STimestamp")) + if (!$util.isInteger(message.messageC2STimestamp) && !(message.messageC2STimestamp && $util.isInteger(message.messageC2STimestamp.low) && $util.isInteger(message.messageC2STimestamp.high))) + return "messageC2STimestamp: integer|Long expected"; + if (message.ignore != null && message.hasOwnProperty("ignore")) + if (typeof message.ignore !== "boolean") + return "ignore: boolean expected"; + if (message.starred != null && message.hasOwnProperty("starred")) + if (typeof message.starred !== "boolean") + return "starred: boolean expected"; + if (message.broadcast != null && message.hasOwnProperty("broadcast")) + if (typeof message.broadcast !== "boolean") + return "broadcast: boolean expected"; + if (message.pushName != null && message.hasOwnProperty("pushName")) + if (!$util.isString(message.pushName)) + return "pushName: string expected"; + if (message.mediaCiphertextSha256 != null && message.hasOwnProperty("mediaCiphertextSha256")) + if (!(message.mediaCiphertextSha256 && typeof message.mediaCiphertextSha256.length === "number" || $util.isString(message.mediaCiphertextSha256))) + return "mediaCiphertextSha256: buffer expected"; + if (message.multicast != null && message.hasOwnProperty("multicast")) + if (typeof message.multicast !== "boolean") + return "multicast: boolean expected"; + if (message.urlText != null && message.hasOwnProperty("urlText")) + if (typeof message.urlText !== "boolean") + return "urlText: boolean expected"; + if (message.urlNumber != null && message.hasOwnProperty("urlNumber")) + if (typeof message.urlNumber !== "boolean") + return "urlNumber: boolean expected"; + if (message.messageStubType != null && message.hasOwnProperty("messageStubType")) + switch (message.messageStubType) { + default: + return "messageStubType: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case 37: + case 38: + case 39: + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + case 47: + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + case 64: + case 65: + case 66: + case 67: + case 68: + case 69: + case 70: + case 71: + case 72: + case 73: + case 74: + case 75: + case 76: + case 77: + case 78: + case 79: + case 80: + case 81: + case 82: + case 83: + case 84: + case 85: + case 86: + case 87: + case 88: + case 89: + case 90: + case 91: + case 92: + case 93: + case 94: + case 95: + case 96: + case 97: + case 98: + case 99: + case 100: + case 101: + case 102: + case 103: + case 104: + case 105: + case 106: + case 107: + case 108: + case 109: + case 110: + case 111: + case 112: + case 113: + case 114: + case 115: + case 116: + case 117: + case 118: + case 119: + case 120: + case 121: + case 122: + case 123: + case 124: + case 125: + case 126: + case 127: + case 128: + case 129: + case 130: + case 131: + case 132: + case 133: + case 134: + case 135: + case 136: + case 137: + case 138: + case 139: + case 140: + case 141: + case 142: + case 143: + case 144: + case 145: + case 146: + case 147: + case 148: + case 149: + case 150: + case 151: + case 152: + case 153: + case 154: + case 155: + case 156: + case 157: + case 158: + case 159: + case 160: + case 161: + break; + } + if (message.clearMedia != null && message.hasOwnProperty("clearMedia")) + if (typeof message.clearMedia !== "boolean") + return "clearMedia: boolean expected"; + if (message.messageStubParameters != null && message.hasOwnProperty("messageStubParameters")) { + if (!Array.isArray(message.messageStubParameters)) + return "messageStubParameters: array expected"; + for (var i = 0; i < message.messageStubParameters.length; ++i) + if (!$util.isString(message.messageStubParameters[i])) + return "messageStubParameters: string[] expected"; + } + if (message.duration != null && message.hasOwnProperty("duration")) + if (!$util.isInteger(message.duration)) + return "duration: integer expected"; + if (message.labels != null && message.hasOwnProperty("labels")) { + if (!Array.isArray(message.labels)) + return "labels: array expected"; + for (var i = 0; i < message.labels.length; ++i) + if (!$util.isString(message.labels[i])) + return "labels: string[] expected"; + } + if (message.paymentInfo != null && message.hasOwnProperty("paymentInfo")) { + var error = $root.proto.PaymentInfo.verify(message.paymentInfo); + if (error) + return "paymentInfo." + error; + } + if (message.finalLiveLocation != null && message.hasOwnProperty("finalLiveLocation")) { + var error = $root.proto.Message.LiveLocationMessage.verify(message.finalLiveLocation); + if (error) + return "finalLiveLocation." + error; + } + if (message.quotedPaymentInfo != null && message.hasOwnProperty("quotedPaymentInfo")) { + var error = $root.proto.PaymentInfo.verify(message.quotedPaymentInfo); + if (error) + return "quotedPaymentInfo." + error; + } + if (message.ephemeralStartTimestamp != null && message.hasOwnProperty("ephemeralStartTimestamp")) + if (!$util.isInteger(message.ephemeralStartTimestamp) && !(message.ephemeralStartTimestamp && $util.isInteger(message.ephemeralStartTimestamp.low) && $util.isInteger(message.ephemeralStartTimestamp.high))) + return "ephemeralStartTimestamp: integer|Long expected"; + if (message.ephemeralDuration != null && message.hasOwnProperty("ephemeralDuration")) + if (!$util.isInteger(message.ephemeralDuration)) + return "ephemeralDuration: integer expected"; + if (message.ephemeralOffToOn != null && message.hasOwnProperty("ephemeralOffToOn")) + if (typeof message.ephemeralOffToOn !== "boolean") + return "ephemeralOffToOn: boolean expected"; + if (message.ephemeralOutOfSync != null && message.hasOwnProperty("ephemeralOutOfSync")) + if (typeof message.ephemeralOutOfSync !== "boolean") + return "ephemeralOutOfSync: boolean expected"; + if (message.bizPrivacyStatus != null && message.hasOwnProperty("bizPrivacyStatus")) + switch (message.bizPrivacyStatus) { + default: + return "bizPrivacyStatus: enum value expected"; + case 0: + case 2: + case 1: + case 3: + break; + } + if (message.verifiedBizName != null && message.hasOwnProperty("verifiedBizName")) + if (!$util.isString(message.verifiedBizName)) + return "verifiedBizName: string expected"; + if (message.mediaData != null && message.hasOwnProperty("mediaData")) { + var error = $root.proto.MediaData.verify(message.mediaData); + if (error) + return "mediaData." + error; + } + if (message.photoChange != null && message.hasOwnProperty("photoChange")) { + var error = $root.proto.PhotoChange.verify(message.photoChange); + if (error) + return "photoChange." + error; + } + if (message.userReceipt != null && message.hasOwnProperty("userReceipt")) { + if (!Array.isArray(message.userReceipt)) + return "userReceipt: array expected"; + for (var i = 0; i < message.userReceipt.length; ++i) { + var error = $root.proto.UserReceipt.verify(message.userReceipt[i]); + if (error) + return "userReceipt." + error; + } + } + if (message.reactions != null && message.hasOwnProperty("reactions")) { + if (!Array.isArray(message.reactions)) + return "reactions: array expected"; + for (var i = 0; i < message.reactions.length; ++i) { + var error = $root.proto.Reaction.verify(message.reactions[i]); + if (error) + return "reactions." + error; + } + } + if (message.quotedStickerData != null && message.hasOwnProperty("quotedStickerData")) { + var error = $root.proto.MediaData.verify(message.quotedStickerData); + if (error) + return "quotedStickerData." + error; + } + if (message.futureproofData != null && message.hasOwnProperty("futureproofData")) + if (!(message.futureproofData && typeof message.futureproofData.length === "number" || $util.isString(message.futureproofData))) + return "futureproofData: buffer expected"; + if (message.statusPsa != null && message.hasOwnProperty("statusPsa")) { + var error = $root.proto.StatusPSA.verify(message.statusPsa); + if (error) + return "statusPsa." + error; + } + if (message.pollUpdates != null && message.hasOwnProperty("pollUpdates")) { + if (!Array.isArray(message.pollUpdates)) + return "pollUpdates: array expected"; + for (var i = 0; i < message.pollUpdates.length; ++i) { + var error = $root.proto.PollUpdate.verify(message.pollUpdates[i]); + if (error) + return "pollUpdates." + error; + } + } + if (message.pollAdditionalMetadata != null && message.hasOwnProperty("pollAdditionalMetadata")) { + var error = $root.proto.PollAdditionalMetadata.verify(message.pollAdditionalMetadata); + if (error) + return "pollAdditionalMetadata." + error; + } + if (message.agentId != null && message.hasOwnProperty("agentId")) + if (!$util.isString(message.agentId)) + return "agentId: string expected"; + if (message.statusAlreadyViewed != null && message.hasOwnProperty("statusAlreadyViewed")) + if (typeof message.statusAlreadyViewed !== "boolean") + return "statusAlreadyViewed: boolean expected"; + if (message.messageSecret != null && message.hasOwnProperty("messageSecret")) + if (!(message.messageSecret && typeof message.messageSecret.length === "number" || $util.isString(message.messageSecret))) + return "messageSecret: buffer expected"; + if (message.keepInChat != null && message.hasOwnProperty("keepInChat")) { + var error = $root.proto.KeepInChat.verify(message.keepInChat); + if (error) + return "keepInChat." + error; + } + if (message.originalSelfAuthorUserJidString != null && message.hasOwnProperty("originalSelfAuthorUserJidString")) + if (!$util.isString(message.originalSelfAuthorUserJidString)) + return "originalSelfAuthorUserJidString: string expected"; + if (message.revokeMessageTimestamp != null && message.hasOwnProperty("revokeMessageTimestamp")) + if (!$util.isInteger(message.revokeMessageTimestamp) && !(message.revokeMessageTimestamp && $util.isInteger(message.revokeMessageTimestamp.low) && $util.isInteger(message.revokeMessageTimestamp.high))) + return "revokeMessageTimestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a WebMessageInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.WebMessageInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.WebMessageInfo} WebMessageInfo + */ + WebMessageInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.WebMessageInfo) + return object; + var message = new $root.proto.WebMessageInfo(); + if (object.key != null) { + if (typeof object.key !== "object") + throw TypeError(".proto.WebMessageInfo.key: object expected"); + message.key = $root.proto.MessageKey.fromObject(object.key); + } + if (object.message != null) { + if (typeof object.message !== "object") + throw TypeError(".proto.WebMessageInfo.message: object expected"); + message.message = $root.proto.Message.fromObject(object.message); + } + if (object.messageTimestamp != null) + if ($util.Long) + (message.messageTimestamp = $util.Long.fromValue(object.messageTimestamp)).unsigned = true; + else if (typeof object.messageTimestamp === "string") + message.messageTimestamp = parseInt(object.messageTimestamp, 10); + else if (typeof object.messageTimestamp === "number") + message.messageTimestamp = object.messageTimestamp; + else if (typeof object.messageTimestamp === "object") + message.messageTimestamp = new $util.LongBits(object.messageTimestamp.low >>> 0, object.messageTimestamp.high >>> 0).toNumber(true); + switch (object.status) { + case "ERROR": + case 0: + message.status = 0; + break; + case "PENDING": + case 1: + message.status = 1; + break; + case "SERVER_ACK": + case 2: + message.status = 2; + break; + case "DELIVERY_ACK": + case 3: + message.status = 3; + break; + case "READ": + case 4: + message.status = 4; + break; + case "PLAYED": + case 5: + message.status = 5; + break; + } + if (object.participant != null) + message.participant = String(object.participant); + if (object.messageC2STimestamp != null) + if ($util.Long) + (message.messageC2STimestamp = $util.Long.fromValue(object.messageC2STimestamp)).unsigned = true; + else if (typeof object.messageC2STimestamp === "string") + message.messageC2STimestamp = parseInt(object.messageC2STimestamp, 10); + else if (typeof object.messageC2STimestamp === "number") + message.messageC2STimestamp = object.messageC2STimestamp; + else if (typeof object.messageC2STimestamp === "object") + message.messageC2STimestamp = new $util.LongBits(object.messageC2STimestamp.low >>> 0, object.messageC2STimestamp.high >>> 0).toNumber(true); + if (object.ignore != null) + message.ignore = Boolean(object.ignore); + if (object.starred != null) + message.starred = Boolean(object.starred); + if (object.broadcast != null) + message.broadcast = Boolean(object.broadcast); + if (object.pushName != null) + message.pushName = String(object.pushName); + if (object.mediaCiphertextSha256 != null) + if (typeof object.mediaCiphertextSha256 === "string") + $util.base64.decode(object.mediaCiphertextSha256, message.mediaCiphertextSha256 = $util.newBuffer($util.base64.length(object.mediaCiphertextSha256)), 0); + else if (object.mediaCiphertextSha256.length) + message.mediaCiphertextSha256 = object.mediaCiphertextSha256; + if (object.multicast != null) + message.multicast = Boolean(object.multicast); + if (object.urlText != null) + message.urlText = Boolean(object.urlText); + if (object.urlNumber != null) + message.urlNumber = Boolean(object.urlNumber); + switch (object.messageStubType) { + case "UNKNOWN": + case 0: + message.messageStubType = 0; + break; + case "REVOKE": + case 1: + message.messageStubType = 1; + break; + case "CIPHERTEXT": + case 2: + message.messageStubType = 2; + break; + case "FUTUREPROOF": + case 3: + message.messageStubType = 3; + break; + case "NON_VERIFIED_TRANSITION": + case 4: + message.messageStubType = 4; + break; + case "UNVERIFIED_TRANSITION": + case 5: + message.messageStubType = 5; + break; + case "VERIFIED_TRANSITION": + case 6: + message.messageStubType = 6; + break; + case "VERIFIED_LOW_UNKNOWN": + case 7: + message.messageStubType = 7; + break; + case "VERIFIED_HIGH": + case 8: + message.messageStubType = 8; + break; + case "VERIFIED_INITIAL_UNKNOWN": + case 9: + message.messageStubType = 9; + break; + case "VERIFIED_INITIAL_LOW": + case 10: + message.messageStubType = 10; + break; + case "VERIFIED_INITIAL_HIGH": + case 11: + message.messageStubType = 11; + break; + case "VERIFIED_TRANSITION_ANY_TO_NONE": + case 12: + message.messageStubType = 12; + break; + case "VERIFIED_TRANSITION_ANY_TO_HIGH": + case 13: + message.messageStubType = 13; + break; + case "VERIFIED_TRANSITION_HIGH_TO_LOW": + case 14: + message.messageStubType = 14; + break; + case "VERIFIED_TRANSITION_HIGH_TO_UNKNOWN": + case 15: + message.messageStubType = 15; + break; + case "VERIFIED_TRANSITION_UNKNOWN_TO_LOW": + case 16: + message.messageStubType = 16; + break; + case "VERIFIED_TRANSITION_LOW_TO_UNKNOWN": + case 17: + message.messageStubType = 17; + break; + case "VERIFIED_TRANSITION_NONE_TO_LOW": + case 18: + message.messageStubType = 18; + break; + case "VERIFIED_TRANSITION_NONE_TO_UNKNOWN": + case 19: + message.messageStubType = 19; + break; + case "GROUP_CREATE": + case 20: + message.messageStubType = 20; + break; + case "GROUP_CHANGE_SUBJECT": + case 21: + message.messageStubType = 21; + break; + case "GROUP_CHANGE_ICON": + case 22: + message.messageStubType = 22; + break; + case "GROUP_CHANGE_INVITE_LINK": + case 23: + message.messageStubType = 23; + break; + case "GROUP_CHANGE_DESCRIPTION": + case 24: + message.messageStubType = 24; + break; + case "GROUP_CHANGE_RESTRICT": + case 25: + message.messageStubType = 25; + break; + case "GROUP_CHANGE_ANNOUNCE": + case 26: + message.messageStubType = 26; + break; + case "GROUP_PARTICIPANT_ADD": + case 27: + message.messageStubType = 27; + break; + case "GROUP_PARTICIPANT_REMOVE": + case 28: + message.messageStubType = 28; + break; + case "GROUP_PARTICIPANT_PROMOTE": + case 29: + message.messageStubType = 29; + break; + case "GROUP_PARTICIPANT_DEMOTE": + case 30: + message.messageStubType = 30; + break; + case "GROUP_PARTICIPANT_INVITE": + case 31: + message.messageStubType = 31; + break; + case "GROUP_PARTICIPANT_LEAVE": + case 32: + message.messageStubType = 32; + break; + case "GROUP_PARTICIPANT_CHANGE_NUMBER": + case 33: + message.messageStubType = 33; + break; + case "BROADCAST_CREATE": + case 34: + message.messageStubType = 34; + break; + case "BROADCAST_ADD": + case 35: + message.messageStubType = 35; + break; + case "BROADCAST_REMOVE": + case 36: + message.messageStubType = 36; + break; + case "GENERIC_NOTIFICATION": + case 37: + message.messageStubType = 37; + break; + case "E2E_IDENTITY_CHANGED": + case 38: + message.messageStubType = 38; + break; + case "E2E_ENCRYPTED": + case 39: + message.messageStubType = 39; + break; + case "CALL_MISSED_VOICE": + case 40: + message.messageStubType = 40; + break; + case "CALL_MISSED_VIDEO": + case 41: + message.messageStubType = 41; + break; + case "INDIVIDUAL_CHANGE_NUMBER": + case 42: + message.messageStubType = 42; + break; + case "GROUP_DELETE": + case 43: + message.messageStubType = 43; + break; + case "GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE": + case 44: + message.messageStubType = 44; + break; + case "CALL_MISSED_GROUP_VOICE": + case 45: + message.messageStubType = 45; + break; + case "CALL_MISSED_GROUP_VIDEO": + case 46: + message.messageStubType = 46; + break; + case "PAYMENT_CIPHERTEXT": + case 47: + message.messageStubType = 47; + break; + case "PAYMENT_FUTUREPROOF": + case 48: + message.messageStubType = 48; + break; + case "PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED": + case 49: + message.messageStubType = 49; + break; + case "PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED": + case 50: + message.messageStubType = 50; + break; + case "PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED": + case 51: + message.messageStubType = 51; + break; + case "PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP": + case 52: + message.messageStubType = 52; + break; + case "PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP": + case 53: + message.messageStubType = 53; + break; + case "PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER": + case 54: + message.messageStubType = 54; + break; + case "PAYMENT_ACTION_SEND_PAYMENT_REMINDER": + case 55: + message.messageStubType = 55; + break; + case "PAYMENT_ACTION_SEND_PAYMENT_INVITATION": + case 56: + message.messageStubType = 56; + break; + case "PAYMENT_ACTION_REQUEST_DECLINED": + case 57: + message.messageStubType = 57; + break; + case "PAYMENT_ACTION_REQUEST_EXPIRED": + case 58: + message.messageStubType = 58; + break; + case "PAYMENT_ACTION_REQUEST_CANCELLED": + case 59: + message.messageStubType = 59; + break; + case "BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM": + case 60: + message.messageStubType = 60; + break; + case "BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP": + case 61: + message.messageStubType = 61; + break; + case "BIZ_INTRO_TOP": + case 62: + message.messageStubType = 62; + break; + case "BIZ_INTRO_BOTTOM": + case 63: + message.messageStubType = 63; + break; + case "BIZ_NAME_CHANGE": + case 64: + message.messageStubType = 64; + break; + case "BIZ_MOVE_TO_CONSUMER_APP": + case 65: + message.messageStubType = 65; + break; + case "BIZ_TWO_TIER_MIGRATION_TOP": + case 66: + message.messageStubType = 66; + break; + case "BIZ_TWO_TIER_MIGRATION_BOTTOM": + case 67: + message.messageStubType = 67; + break; + case "OVERSIZED": + case 68: + message.messageStubType = 68; + break; + case "GROUP_CHANGE_NO_FREQUENTLY_FORWARDED": + case 69: + message.messageStubType = 69; + break; + case "GROUP_V4_ADD_INVITE_SENT": + case 70: + message.messageStubType = 70; + break; + case "GROUP_PARTICIPANT_ADD_REQUEST_JOIN": + case 71: + message.messageStubType = 71; + break; + case "CHANGE_EPHEMERAL_SETTING": + case 72: + message.messageStubType = 72; + break; + case "E2E_DEVICE_CHANGED": + case 73: + message.messageStubType = 73; + break; + case "VIEWED_ONCE": + case 74: + message.messageStubType = 74; + break; + case "E2E_ENCRYPTED_NOW": + case 75: + message.messageStubType = 75; + break; + case "BLUE_MSG_BSP_FB_TO_BSP_PREMISE": + case 76: + message.messageStubType = 76; + break; + case "BLUE_MSG_BSP_FB_TO_SELF_FB": + case 77: + message.messageStubType = 77; + break; + case "BLUE_MSG_BSP_FB_TO_SELF_PREMISE": + case 78: + message.messageStubType = 78; + break; + case "BLUE_MSG_BSP_FB_UNVERIFIED": + case 79: + message.messageStubType = 79; + break; + case "BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED": + case 80: + message.messageStubType = 80; + break; + case "BLUE_MSG_BSP_FB_VERIFIED": + case 81: + message.messageStubType = 81; + break; + case "BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED": + case 82: + message.messageStubType = 82; + break; + case "BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE": + case 83: + message.messageStubType = 83; + break; + case "BLUE_MSG_BSP_PREMISE_UNVERIFIED": + case 84: + message.messageStubType = 84; + break; + case "BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED": + case 85: + message.messageStubType = 85; + break; + case "BLUE_MSG_BSP_PREMISE_VERIFIED": + case 86: + message.messageStubType = 86; + break; + case "BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED": + case 87: + message.messageStubType = 87; + break; + case "BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED": + case 88: + message.messageStubType = 88; + break; + case "BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED": + case 89: + message.messageStubType = 89; + break; + case "BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED": + case 90: + message.messageStubType = 90; + break; + case "BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED": + case 91: + message.messageStubType = 91; + break; + case "BLUE_MSG_SELF_FB_TO_BSP_PREMISE": + case 92: + message.messageStubType = 92; + break; + case "BLUE_MSG_SELF_FB_TO_SELF_PREMISE": + case 93: + message.messageStubType = 93; + break; + case "BLUE_MSG_SELF_FB_UNVERIFIED": + case 94: + message.messageStubType = 94; + break; + case "BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED": + case 95: + message.messageStubType = 95; + break; + case "BLUE_MSG_SELF_FB_VERIFIED": + case 96: + message.messageStubType = 96; + break; + case "BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED": + case 97: + message.messageStubType = 97; + break; + case "BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE": + case 98: + message.messageStubType = 98; + break; + case "BLUE_MSG_SELF_PREMISE_UNVERIFIED": + case 99: + message.messageStubType = 99; + break; + case "BLUE_MSG_SELF_PREMISE_VERIFIED": + case 100: + message.messageStubType = 100; + break; + case "BLUE_MSG_TO_BSP_FB": + case 101: + message.messageStubType = 101; + break; + case "BLUE_MSG_TO_CONSUMER": + case 102: + message.messageStubType = 102; + break; + case "BLUE_MSG_TO_SELF_FB": + case 103: + message.messageStubType = 103; + break; + case "BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED": + case 104: + message.messageStubType = 104; + break; + case "BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED": + case 105: + message.messageStubType = 105; + break; + case "BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED": + case 106: + message.messageStubType = 106; + break; + case "BLUE_MSG_UNVERIFIED_TO_VERIFIED": + case 107: + message.messageStubType = 107; + break; + case "BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED": + case 108: + message.messageStubType = 108; + break; + case "BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED": + case 109: + message.messageStubType = 109; + break; + case "BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED": + case 110: + message.messageStubType = 110; + break; + case "BLUE_MSG_VERIFIED_TO_UNVERIFIED": + case 111: + message.messageStubType = 111; + break; + case "BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED": + case 112: + message.messageStubType = 112; + break; + case "BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED": + case 113: + message.messageStubType = 113; + break; + case "BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED": + case 114: + message.messageStubType = 114; + break; + case "BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED": + case 115: + message.messageStubType = 115; + break; + case "BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED": + case 116: + message.messageStubType = 116; + break; + case "BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED": + case 117: + message.messageStubType = 117; + break; + case "E2E_IDENTITY_UNAVAILABLE": + case 118: + message.messageStubType = 118; + break; + case "GROUP_CREATING": + case 119: + message.messageStubType = 119; + break; + case "GROUP_CREATE_FAILED": + case 120: + message.messageStubType = 120; + break; + case "GROUP_BOUNCED": + case 121: + message.messageStubType = 121; + break; + case "BLOCK_CONTACT": + case 122: + message.messageStubType = 122; + break; + case "EPHEMERAL_SETTING_NOT_APPLIED": + case 123: + message.messageStubType = 123; + break; + case "SYNC_FAILED": + case 124: + message.messageStubType = 124; + break; + case "SYNCING": + case 125: + message.messageStubType = 125; + break; + case "BIZ_PRIVACY_MODE_INIT_FB": + case 126: + message.messageStubType = 126; + break; + case "BIZ_PRIVACY_MODE_INIT_BSP": + case 127: + message.messageStubType = 127; + break; + case "BIZ_PRIVACY_MODE_TO_FB": + case 128: + message.messageStubType = 128; + break; + case "BIZ_PRIVACY_MODE_TO_BSP": + case 129: + message.messageStubType = 129; + break; + case "DISAPPEARING_MODE": + case 130: + message.messageStubType = 130; + break; + case "E2E_DEVICE_FETCH_FAILED": + case 131: + message.messageStubType = 131; + break; + case "ADMIN_REVOKE": + case 132: + message.messageStubType = 132; + break; + case "GROUP_INVITE_LINK_GROWTH_LOCKED": + case 133: + message.messageStubType = 133; + break; + case "COMMUNITY_LINK_PARENT_GROUP": + case 134: + message.messageStubType = 134; + break; + case "COMMUNITY_LINK_SIBLING_GROUP": + case 135: + message.messageStubType = 135; + break; + case "COMMUNITY_LINK_SUB_GROUP": + case 136: + message.messageStubType = 136; + break; + case "COMMUNITY_UNLINK_PARENT_GROUP": + case 137: + message.messageStubType = 137; + break; + case "COMMUNITY_UNLINK_SIBLING_GROUP": + case 138: + message.messageStubType = 138; + break; + case "COMMUNITY_UNLINK_SUB_GROUP": + case 139: + message.messageStubType = 139; + break; + case "GROUP_PARTICIPANT_ACCEPT": + case 140: + message.messageStubType = 140; + break; + case "GROUP_PARTICIPANT_LINKED_GROUP_JOIN": + case 141: + message.messageStubType = 141; + break; + case "COMMUNITY_CREATE": + case 142: + message.messageStubType = 142; + break; + case "EPHEMERAL_KEEP_IN_CHAT": + case 143: + message.messageStubType = 143; + break; + case "GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST": + case 144: + message.messageStubType = 144; + break; + case "GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE": + case 145: + message.messageStubType = 145; + break; + case "INTEGRITY_UNLINK_PARENT_GROUP": + case 146: + message.messageStubType = 146; + break; + case "COMMUNITY_PARTICIPANT_PROMOTE": + case 147: + message.messageStubType = 147; + break; + case "COMMUNITY_PARTICIPANT_DEMOTE": + case 148: + message.messageStubType = 148; + break; + case "COMMUNITY_PARENT_GROUP_DELETED": + case 149: + message.messageStubType = 149; + break; + case "COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL": + case 150: + message.messageStubType = 150; + break; + case "GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP": + case 151: + message.messageStubType = 151; + break; + case "MASKED_THREAD_CREATED": + case 152: + message.messageStubType = 152; + break; + case "MASKED_THREAD_UNMASKED": + case 153: + message.messageStubType = 153; + break; + case "BIZ_CHAT_ASSIGNMENT": + case 154: + message.messageStubType = 154; + break; + case "CHAT_PSA": + case 155: + message.messageStubType = 155; + break; + case "CHAT_POLL_CREATION_MESSAGE": + case 156: + message.messageStubType = 156; + break; + case "CAG_MASKED_THREAD_CREATED": + case 157: + message.messageStubType = 157; + break; + case "COMMUNITY_PARENT_GROUP_SUBJECT_CHANGED": + case 158: + message.messageStubType = 158; + break; + case "CAG_INVITE_AUTO_ADD": + case 159: + message.messageStubType = 159; + break; + case "BIZ_CHAT_ASSIGNMENT_UNASSIGN": + case 160: + message.messageStubType = 160; + break; + case "CAG_INVITE_AUTO_JOINED": + case 161: + message.messageStubType = 161; + break; + } + if (object.clearMedia != null) + message.clearMedia = Boolean(object.clearMedia); + if (object.messageStubParameters) { + if (!Array.isArray(object.messageStubParameters)) + throw TypeError(".proto.WebMessageInfo.messageStubParameters: array expected"); + message.messageStubParameters = []; + for (var i = 0; i < object.messageStubParameters.length; ++i) + message.messageStubParameters[i] = String(object.messageStubParameters[i]); + } + if (object.duration != null) + message.duration = object.duration >>> 0; + if (object.labels) { + if (!Array.isArray(object.labels)) + throw TypeError(".proto.WebMessageInfo.labels: array expected"); + message.labels = []; + for (var i = 0; i < object.labels.length; ++i) + message.labels[i] = String(object.labels[i]); + } + if (object.paymentInfo != null) { + if (typeof object.paymentInfo !== "object") + throw TypeError(".proto.WebMessageInfo.paymentInfo: object expected"); + message.paymentInfo = $root.proto.PaymentInfo.fromObject(object.paymentInfo); + } + if (object.finalLiveLocation != null) { + if (typeof object.finalLiveLocation !== "object") + throw TypeError(".proto.WebMessageInfo.finalLiveLocation: object expected"); + message.finalLiveLocation = $root.proto.Message.LiveLocationMessage.fromObject(object.finalLiveLocation); + } + if (object.quotedPaymentInfo != null) { + if (typeof object.quotedPaymentInfo !== "object") + throw TypeError(".proto.WebMessageInfo.quotedPaymentInfo: object expected"); + message.quotedPaymentInfo = $root.proto.PaymentInfo.fromObject(object.quotedPaymentInfo); + } + if (object.ephemeralStartTimestamp != null) + if ($util.Long) + (message.ephemeralStartTimestamp = $util.Long.fromValue(object.ephemeralStartTimestamp)).unsigned = true; + else if (typeof object.ephemeralStartTimestamp === "string") + message.ephemeralStartTimestamp = parseInt(object.ephemeralStartTimestamp, 10); + else if (typeof object.ephemeralStartTimestamp === "number") + message.ephemeralStartTimestamp = object.ephemeralStartTimestamp; + else if (typeof object.ephemeralStartTimestamp === "object") + message.ephemeralStartTimestamp = new $util.LongBits(object.ephemeralStartTimestamp.low >>> 0, object.ephemeralStartTimestamp.high >>> 0).toNumber(true); + if (object.ephemeralDuration != null) + message.ephemeralDuration = object.ephemeralDuration >>> 0; + if (object.ephemeralOffToOn != null) + message.ephemeralOffToOn = Boolean(object.ephemeralOffToOn); + if (object.ephemeralOutOfSync != null) + message.ephemeralOutOfSync = Boolean(object.ephemeralOutOfSync); + switch (object.bizPrivacyStatus) { + case "E2EE": + case 0: + message.bizPrivacyStatus = 0; + break; + case "FB": + case 2: + message.bizPrivacyStatus = 2; + break; + case "BSP": + case 1: + message.bizPrivacyStatus = 1; + break; + case "BSP_AND_FB": + case 3: + message.bizPrivacyStatus = 3; + break; + } + if (object.verifiedBizName != null) + message.verifiedBizName = String(object.verifiedBizName); + if (object.mediaData != null) { + if (typeof object.mediaData !== "object") + throw TypeError(".proto.WebMessageInfo.mediaData: object expected"); + message.mediaData = $root.proto.MediaData.fromObject(object.mediaData); + } + if (object.photoChange != null) { + if (typeof object.photoChange !== "object") + throw TypeError(".proto.WebMessageInfo.photoChange: object expected"); + message.photoChange = $root.proto.PhotoChange.fromObject(object.photoChange); + } + if (object.userReceipt) { + if (!Array.isArray(object.userReceipt)) + throw TypeError(".proto.WebMessageInfo.userReceipt: array expected"); + message.userReceipt = []; + for (var i = 0; i < object.userReceipt.length; ++i) { + if (typeof object.userReceipt[i] !== "object") + throw TypeError(".proto.WebMessageInfo.userReceipt: object expected"); + message.userReceipt[i] = $root.proto.UserReceipt.fromObject(object.userReceipt[i]); + } + } + if (object.reactions) { + if (!Array.isArray(object.reactions)) + throw TypeError(".proto.WebMessageInfo.reactions: array expected"); + message.reactions = []; + for (var i = 0; i < object.reactions.length; ++i) { + if (typeof object.reactions[i] !== "object") + throw TypeError(".proto.WebMessageInfo.reactions: object expected"); + message.reactions[i] = $root.proto.Reaction.fromObject(object.reactions[i]); + } + } + if (object.quotedStickerData != null) { + if (typeof object.quotedStickerData !== "object") + throw TypeError(".proto.WebMessageInfo.quotedStickerData: object expected"); + message.quotedStickerData = $root.proto.MediaData.fromObject(object.quotedStickerData); + } + if (object.futureproofData != null) + if (typeof object.futureproofData === "string") + $util.base64.decode(object.futureproofData, message.futureproofData = $util.newBuffer($util.base64.length(object.futureproofData)), 0); + else if (object.futureproofData.length) + message.futureproofData = object.futureproofData; + if (object.statusPsa != null) { + if (typeof object.statusPsa !== "object") + throw TypeError(".proto.WebMessageInfo.statusPsa: object expected"); + message.statusPsa = $root.proto.StatusPSA.fromObject(object.statusPsa); + } + if (object.pollUpdates) { + if (!Array.isArray(object.pollUpdates)) + throw TypeError(".proto.WebMessageInfo.pollUpdates: array expected"); + message.pollUpdates = []; + for (var i = 0; i < object.pollUpdates.length; ++i) { + if (typeof object.pollUpdates[i] !== "object") + throw TypeError(".proto.WebMessageInfo.pollUpdates: object expected"); + message.pollUpdates[i] = $root.proto.PollUpdate.fromObject(object.pollUpdates[i]); + } + } + if (object.pollAdditionalMetadata != null) { + if (typeof object.pollAdditionalMetadata !== "object") + throw TypeError(".proto.WebMessageInfo.pollAdditionalMetadata: object expected"); + message.pollAdditionalMetadata = $root.proto.PollAdditionalMetadata.fromObject(object.pollAdditionalMetadata); + } + if (object.agentId != null) + message.agentId = String(object.agentId); + if (object.statusAlreadyViewed != null) + message.statusAlreadyViewed = Boolean(object.statusAlreadyViewed); + if (object.messageSecret != null) + if (typeof object.messageSecret === "string") + $util.base64.decode(object.messageSecret, message.messageSecret = $util.newBuffer($util.base64.length(object.messageSecret)), 0); + else if (object.messageSecret.length) + message.messageSecret = object.messageSecret; + if (object.keepInChat != null) { + if (typeof object.keepInChat !== "object") + throw TypeError(".proto.WebMessageInfo.keepInChat: object expected"); + message.keepInChat = $root.proto.KeepInChat.fromObject(object.keepInChat); + } + if (object.originalSelfAuthorUserJidString != null) + message.originalSelfAuthorUserJidString = String(object.originalSelfAuthorUserJidString); + if (object.revokeMessageTimestamp != null) + if ($util.Long) + (message.revokeMessageTimestamp = $util.Long.fromValue(object.revokeMessageTimestamp)).unsigned = true; + else if (typeof object.revokeMessageTimestamp === "string") + message.revokeMessageTimestamp = parseInt(object.revokeMessageTimestamp, 10); + else if (typeof object.revokeMessageTimestamp === "number") + message.revokeMessageTimestamp = object.revokeMessageTimestamp; + else if (typeof object.revokeMessageTimestamp === "object") + message.revokeMessageTimestamp = new $util.LongBits(object.revokeMessageTimestamp.low >>> 0, object.revokeMessageTimestamp.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a WebMessageInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.WebMessageInfo + * @static + * @param {proto.WebMessageInfo} message WebMessageInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WebMessageInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) { + object.messageStubParameters = []; + object.labels = []; + object.userReceipt = []; + object.reactions = []; + object.pollUpdates = []; + } + if (options.defaults) { + object.key = null; + object.message = null; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.messageTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.messageTimestamp = options.longs === String ? "0" : 0; + object.status = options.enums === String ? "ERROR" : 0; + object.participant = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.messageC2STimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.messageC2STimestamp = options.longs === String ? "0" : 0; + object.ignore = false; + object.starred = false; + object.broadcast = false; + object.pushName = ""; + if (options.bytes === String) + object.mediaCiphertextSha256 = ""; + else { + object.mediaCiphertextSha256 = []; + if (options.bytes !== Array) + object.mediaCiphertextSha256 = $util.newBuffer(object.mediaCiphertextSha256); + } + object.multicast = false; + object.urlText = false; + object.urlNumber = false; + object.messageStubType = options.enums === String ? "UNKNOWN" : 0; + object.clearMedia = false; + object.duration = 0; + object.paymentInfo = null; + object.finalLiveLocation = null; + object.quotedPaymentInfo = null; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.ephemeralStartTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.ephemeralStartTimestamp = options.longs === String ? "0" : 0; + object.ephemeralDuration = 0; + object.ephemeralOffToOn = false; + object.ephemeralOutOfSync = false; + object.bizPrivacyStatus = options.enums === String ? "E2EE" : 0; + object.verifiedBizName = ""; + object.mediaData = null; + object.photoChange = null; + object.quotedStickerData = null; + if (options.bytes === String) + object.futureproofData = ""; + else { + object.futureproofData = []; + if (options.bytes !== Array) + object.futureproofData = $util.newBuffer(object.futureproofData); + } + object.statusPsa = null; + object.pollAdditionalMetadata = null; + object.agentId = ""; + object.statusAlreadyViewed = false; + if (options.bytes === String) + object.messageSecret = ""; + else { + object.messageSecret = []; + if (options.bytes !== Array) + object.messageSecret = $util.newBuffer(object.messageSecret); + } + object.keepInChat = null; + object.originalSelfAuthorUserJidString = ""; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.revokeMessageTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.revokeMessageTimestamp = options.longs === String ? "0" : 0; + } + if (message.key != null && message.hasOwnProperty("key")) + object.key = $root.proto.MessageKey.toObject(message.key, options); + if (message.message != null && message.hasOwnProperty("message")) + object.message = $root.proto.Message.toObject(message.message, options); + if (message.messageTimestamp != null && message.hasOwnProperty("messageTimestamp")) + if (typeof message.messageTimestamp === "number") + object.messageTimestamp = options.longs === String ? String(message.messageTimestamp) : message.messageTimestamp; + else + object.messageTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.messageTimestamp) : options.longs === Number ? new $util.LongBits(message.messageTimestamp.low >>> 0, message.messageTimestamp.high >>> 0).toNumber(true) : message.messageTimestamp; + if (message.status != null && message.hasOwnProperty("status")) + object.status = options.enums === String ? $root.proto.WebMessageInfo.Status[message.status] : message.status; + if (message.participant != null && message.hasOwnProperty("participant")) + object.participant = message.participant; + if (message.messageC2STimestamp != null && message.hasOwnProperty("messageC2STimestamp")) + if (typeof message.messageC2STimestamp === "number") + object.messageC2STimestamp = options.longs === String ? String(message.messageC2STimestamp) : message.messageC2STimestamp; + else + object.messageC2STimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.messageC2STimestamp) : options.longs === Number ? new $util.LongBits(message.messageC2STimestamp.low >>> 0, message.messageC2STimestamp.high >>> 0).toNumber(true) : message.messageC2STimestamp; + if (message.ignore != null && message.hasOwnProperty("ignore")) + object.ignore = message.ignore; + if (message.starred != null && message.hasOwnProperty("starred")) + object.starred = message.starred; + if (message.broadcast != null && message.hasOwnProperty("broadcast")) + object.broadcast = message.broadcast; + if (message.pushName != null && message.hasOwnProperty("pushName")) + object.pushName = message.pushName; + if (message.mediaCiphertextSha256 != null && message.hasOwnProperty("mediaCiphertextSha256")) + object.mediaCiphertextSha256 = options.bytes === String ? $util.base64.encode(message.mediaCiphertextSha256, 0, message.mediaCiphertextSha256.length) : options.bytes === Array ? Array.prototype.slice.call(message.mediaCiphertextSha256) : message.mediaCiphertextSha256; + if (message.multicast != null && message.hasOwnProperty("multicast")) + object.multicast = message.multicast; + if (message.urlText != null && message.hasOwnProperty("urlText")) + object.urlText = message.urlText; + if (message.urlNumber != null && message.hasOwnProperty("urlNumber")) + object.urlNumber = message.urlNumber; + if (message.messageStubType != null && message.hasOwnProperty("messageStubType")) + object.messageStubType = options.enums === String ? $root.proto.WebMessageInfo.StubType[message.messageStubType] : message.messageStubType; + if (message.clearMedia != null && message.hasOwnProperty("clearMedia")) + object.clearMedia = message.clearMedia; + if (message.messageStubParameters && message.messageStubParameters.length) { + object.messageStubParameters = []; + for (var j = 0; j < message.messageStubParameters.length; ++j) + object.messageStubParameters[j] = message.messageStubParameters[j]; + } + if (message.duration != null && message.hasOwnProperty("duration")) + object.duration = message.duration; + if (message.labels && message.labels.length) { + object.labels = []; + for (var j = 0; j < message.labels.length; ++j) + object.labels[j] = message.labels[j]; + } + if (message.paymentInfo != null && message.hasOwnProperty("paymentInfo")) + object.paymentInfo = $root.proto.PaymentInfo.toObject(message.paymentInfo, options); + if (message.finalLiveLocation != null && message.hasOwnProperty("finalLiveLocation")) + object.finalLiveLocation = $root.proto.Message.LiveLocationMessage.toObject(message.finalLiveLocation, options); + if (message.quotedPaymentInfo != null && message.hasOwnProperty("quotedPaymentInfo")) + object.quotedPaymentInfo = $root.proto.PaymentInfo.toObject(message.quotedPaymentInfo, options); + if (message.ephemeralStartTimestamp != null && message.hasOwnProperty("ephemeralStartTimestamp")) + if (typeof message.ephemeralStartTimestamp === "number") + object.ephemeralStartTimestamp = options.longs === String ? String(message.ephemeralStartTimestamp) : message.ephemeralStartTimestamp; + else + object.ephemeralStartTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.ephemeralStartTimestamp) : options.longs === Number ? new $util.LongBits(message.ephemeralStartTimestamp.low >>> 0, message.ephemeralStartTimestamp.high >>> 0).toNumber(true) : message.ephemeralStartTimestamp; + if (message.ephemeralDuration != null && message.hasOwnProperty("ephemeralDuration")) + object.ephemeralDuration = message.ephemeralDuration; + if (message.ephemeralOffToOn != null && message.hasOwnProperty("ephemeralOffToOn")) + object.ephemeralOffToOn = message.ephemeralOffToOn; + if (message.ephemeralOutOfSync != null && message.hasOwnProperty("ephemeralOutOfSync")) + object.ephemeralOutOfSync = message.ephemeralOutOfSync; + if (message.bizPrivacyStatus != null && message.hasOwnProperty("bizPrivacyStatus")) + object.bizPrivacyStatus = options.enums === String ? $root.proto.WebMessageInfo.BizPrivacyStatus[message.bizPrivacyStatus] : message.bizPrivacyStatus; + if (message.verifiedBizName != null && message.hasOwnProperty("verifiedBizName")) + object.verifiedBizName = message.verifiedBizName; + if (message.mediaData != null && message.hasOwnProperty("mediaData")) + object.mediaData = $root.proto.MediaData.toObject(message.mediaData, options); + if (message.photoChange != null && message.hasOwnProperty("photoChange")) + object.photoChange = $root.proto.PhotoChange.toObject(message.photoChange, options); + if (message.userReceipt && message.userReceipt.length) { + object.userReceipt = []; + for (var j = 0; j < message.userReceipt.length; ++j) + object.userReceipt[j] = $root.proto.UserReceipt.toObject(message.userReceipt[j], options); + } + if (message.reactions && message.reactions.length) { + object.reactions = []; + for (var j = 0; j < message.reactions.length; ++j) + object.reactions[j] = $root.proto.Reaction.toObject(message.reactions[j], options); + } + if (message.quotedStickerData != null && message.hasOwnProperty("quotedStickerData")) + object.quotedStickerData = $root.proto.MediaData.toObject(message.quotedStickerData, options); + if (message.futureproofData != null && message.hasOwnProperty("futureproofData")) + object.futureproofData = options.bytes === String ? $util.base64.encode(message.futureproofData, 0, message.futureproofData.length) : options.bytes === Array ? Array.prototype.slice.call(message.futureproofData) : message.futureproofData; + if (message.statusPsa != null && message.hasOwnProperty("statusPsa")) + object.statusPsa = $root.proto.StatusPSA.toObject(message.statusPsa, options); + if (message.pollUpdates && message.pollUpdates.length) { + object.pollUpdates = []; + for (var j = 0; j < message.pollUpdates.length; ++j) + object.pollUpdates[j] = $root.proto.PollUpdate.toObject(message.pollUpdates[j], options); + } + if (message.pollAdditionalMetadata != null && message.hasOwnProperty("pollAdditionalMetadata")) + object.pollAdditionalMetadata = $root.proto.PollAdditionalMetadata.toObject(message.pollAdditionalMetadata, options); + if (message.agentId != null && message.hasOwnProperty("agentId")) + object.agentId = message.agentId; + if (message.statusAlreadyViewed != null && message.hasOwnProperty("statusAlreadyViewed")) + object.statusAlreadyViewed = message.statusAlreadyViewed; + if (message.messageSecret != null && message.hasOwnProperty("messageSecret")) + object.messageSecret = options.bytes === String ? $util.base64.encode(message.messageSecret, 0, message.messageSecret.length) : options.bytes === Array ? Array.prototype.slice.call(message.messageSecret) : message.messageSecret; + if (message.keepInChat != null && message.hasOwnProperty("keepInChat")) + object.keepInChat = $root.proto.KeepInChat.toObject(message.keepInChat, options); + if (message.originalSelfAuthorUserJidString != null && message.hasOwnProperty("originalSelfAuthorUserJidString")) + object.originalSelfAuthorUserJidString = message.originalSelfAuthorUserJidString; + if (message.revokeMessageTimestamp != null && message.hasOwnProperty("revokeMessageTimestamp")) + if (typeof message.revokeMessageTimestamp === "number") + object.revokeMessageTimestamp = options.longs === String ? String(message.revokeMessageTimestamp) : message.revokeMessageTimestamp; + else + object.revokeMessageTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.revokeMessageTimestamp) : options.longs === Number ? new $util.LongBits(message.revokeMessageTimestamp.low >>> 0, message.revokeMessageTimestamp.high >>> 0).toNumber(true) : message.revokeMessageTimestamp; + return object; + }; + + /** + * Converts this WebMessageInfo to JSON. + * @function toJSON + * @memberof proto.WebMessageInfo + * @instance + * @returns {Object.} JSON object + */ + WebMessageInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * BizPrivacyStatus enum. + * @name proto.WebMessageInfo.BizPrivacyStatus + * @enum {number} + * @property {number} E2EE=0 E2EE value + * @property {number} FB=2 FB value + * @property {number} BSP=1 BSP value + * @property {number} BSP_AND_FB=3 BSP_AND_FB value + */ + WebMessageInfo.BizPrivacyStatus = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "E2EE"] = 0; + values[valuesById[2] = "FB"] = 2; + values[valuesById[1] = "BSP"] = 1; + values[valuesById[3] = "BSP_AND_FB"] = 3; + return values; + })(); + + /** + * Status enum. + * @name proto.WebMessageInfo.Status + * @enum {number} + * @property {number} ERROR=0 ERROR value + * @property {number} PENDING=1 PENDING value + * @property {number} SERVER_ACK=2 SERVER_ACK value + * @property {number} DELIVERY_ACK=3 DELIVERY_ACK value + * @property {number} READ=4 READ value + * @property {number} PLAYED=5 PLAYED value + */ + WebMessageInfo.Status = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ERROR"] = 0; + values[valuesById[1] = "PENDING"] = 1; + values[valuesById[2] = "SERVER_ACK"] = 2; + values[valuesById[3] = "DELIVERY_ACK"] = 3; + values[valuesById[4] = "READ"] = 4; + values[valuesById[5] = "PLAYED"] = 5; + return values; + })(); + + /** + * StubType enum. + * @name proto.WebMessageInfo.StubType + * @enum {number} + * @property {number} UNKNOWN=0 UNKNOWN value + * @property {number} REVOKE=1 REVOKE value + * @property {number} CIPHERTEXT=2 CIPHERTEXT value + * @property {number} FUTUREPROOF=3 FUTUREPROOF value + * @property {number} NON_VERIFIED_TRANSITION=4 NON_VERIFIED_TRANSITION value + * @property {number} UNVERIFIED_TRANSITION=5 UNVERIFIED_TRANSITION value + * @property {number} VERIFIED_TRANSITION=6 VERIFIED_TRANSITION value + * @property {number} VERIFIED_LOW_UNKNOWN=7 VERIFIED_LOW_UNKNOWN value + * @property {number} VERIFIED_HIGH=8 VERIFIED_HIGH value + * @property {number} VERIFIED_INITIAL_UNKNOWN=9 VERIFIED_INITIAL_UNKNOWN value + * @property {number} VERIFIED_INITIAL_LOW=10 VERIFIED_INITIAL_LOW value + * @property {number} VERIFIED_INITIAL_HIGH=11 VERIFIED_INITIAL_HIGH value + * @property {number} VERIFIED_TRANSITION_ANY_TO_NONE=12 VERIFIED_TRANSITION_ANY_TO_NONE value + * @property {number} VERIFIED_TRANSITION_ANY_TO_HIGH=13 VERIFIED_TRANSITION_ANY_TO_HIGH value + * @property {number} VERIFIED_TRANSITION_HIGH_TO_LOW=14 VERIFIED_TRANSITION_HIGH_TO_LOW value + * @property {number} VERIFIED_TRANSITION_HIGH_TO_UNKNOWN=15 VERIFIED_TRANSITION_HIGH_TO_UNKNOWN value + * @property {number} VERIFIED_TRANSITION_UNKNOWN_TO_LOW=16 VERIFIED_TRANSITION_UNKNOWN_TO_LOW value + * @property {number} VERIFIED_TRANSITION_LOW_TO_UNKNOWN=17 VERIFIED_TRANSITION_LOW_TO_UNKNOWN value + * @property {number} VERIFIED_TRANSITION_NONE_TO_LOW=18 VERIFIED_TRANSITION_NONE_TO_LOW value + * @property {number} VERIFIED_TRANSITION_NONE_TO_UNKNOWN=19 VERIFIED_TRANSITION_NONE_TO_UNKNOWN value + * @property {number} GROUP_CREATE=20 GROUP_CREATE value + * @property {number} GROUP_CHANGE_SUBJECT=21 GROUP_CHANGE_SUBJECT value + * @property {number} GROUP_CHANGE_ICON=22 GROUP_CHANGE_ICON value + * @property {number} GROUP_CHANGE_INVITE_LINK=23 GROUP_CHANGE_INVITE_LINK value + * @property {number} GROUP_CHANGE_DESCRIPTION=24 GROUP_CHANGE_DESCRIPTION value + * @property {number} GROUP_CHANGE_RESTRICT=25 GROUP_CHANGE_RESTRICT value + * @property {number} GROUP_CHANGE_ANNOUNCE=26 GROUP_CHANGE_ANNOUNCE value + * @property {number} GROUP_PARTICIPANT_ADD=27 GROUP_PARTICIPANT_ADD value + * @property {number} GROUP_PARTICIPANT_REMOVE=28 GROUP_PARTICIPANT_REMOVE value + * @property {number} GROUP_PARTICIPANT_PROMOTE=29 GROUP_PARTICIPANT_PROMOTE value + * @property {number} GROUP_PARTICIPANT_DEMOTE=30 GROUP_PARTICIPANT_DEMOTE value + * @property {number} GROUP_PARTICIPANT_INVITE=31 GROUP_PARTICIPANT_INVITE value + * @property {number} GROUP_PARTICIPANT_LEAVE=32 GROUP_PARTICIPANT_LEAVE value + * @property {number} GROUP_PARTICIPANT_CHANGE_NUMBER=33 GROUP_PARTICIPANT_CHANGE_NUMBER value + * @property {number} BROADCAST_CREATE=34 BROADCAST_CREATE value + * @property {number} BROADCAST_ADD=35 BROADCAST_ADD value + * @property {number} BROADCAST_REMOVE=36 BROADCAST_REMOVE value + * @property {number} GENERIC_NOTIFICATION=37 GENERIC_NOTIFICATION value + * @property {number} E2E_IDENTITY_CHANGED=38 E2E_IDENTITY_CHANGED value + * @property {number} E2E_ENCRYPTED=39 E2E_ENCRYPTED value + * @property {number} CALL_MISSED_VOICE=40 CALL_MISSED_VOICE value + * @property {number} CALL_MISSED_VIDEO=41 CALL_MISSED_VIDEO value + * @property {number} INDIVIDUAL_CHANGE_NUMBER=42 INDIVIDUAL_CHANGE_NUMBER value + * @property {number} GROUP_DELETE=43 GROUP_DELETE value + * @property {number} GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE=44 GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE value + * @property {number} CALL_MISSED_GROUP_VOICE=45 CALL_MISSED_GROUP_VOICE value + * @property {number} CALL_MISSED_GROUP_VIDEO=46 CALL_MISSED_GROUP_VIDEO value + * @property {number} PAYMENT_CIPHERTEXT=47 PAYMENT_CIPHERTEXT value + * @property {number} PAYMENT_FUTUREPROOF=48 PAYMENT_FUTUREPROOF value + * @property {number} PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED=49 PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED value + * @property {number} PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED=50 PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED value + * @property {number} PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED=51 PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED value + * @property {number} PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP=52 PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP value + * @property {number} PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP=53 PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP value + * @property {number} PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER=54 PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER value + * @property {number} PAYMENT_ACTION_SEND_PAYMENT_REMINDER=55 PAYMENT_ACTION_SEND_PAYMENT_REMINDER value + * @property {number} PAYMENT_ACTION_SEND_PAYMENT_INVITATION=56 PAYMENT_ACTION_SEND_PAYMENT_INVITATION value + * @property {number} PAYMENT_ACTION_REQUEST_DECLINED=57 PAYMENT_ACTION_REQUEST_DECLINED value + * @property {number} PAYMENT_ACTION_REQUEST_EXPIRED=58 PAYMENT_ACTION_REQUEST_EXPIRED value + * @property {number} PAYMENT_ACTION_REQUEST_CANCELLED=59 PAYMENT_ACTION_REQUEST_CANCELLED value + * @property {number} BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM=60 BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM value + * @property {number} BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP=61 BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP value + * @property {number} BIZ_INTRO_TOP=62 BIZ_INTRO_TOP value + * @property {number} BIZ_INTRO_BOTTOM=63 BIZ_INTRO_BOTTOM value + * @property {number} BIZ_NAME_CHANGE=64 BIZ_NAME_CHANGE value + * @property {number} BIZ_MOVE_TO_CONSUMER_APP=65 BIZ_MOVE_TO_CONSUMER_APP value + * @property {number} BIZ_TWO_TIER_MIGRATION_TOP=66 BIZ_TWO_TIER_MIGRATION_TOP value + * @property {number} BIZ_TWO_TIER_MIGRATION_BOTTOM=67 BIZ_TWO_TIER_MIGRATION_BOTTOM value + * @property {number} OVERSIZED=68 OVERSIZED value + * @property {number} GROUP_CHANGE_NO_FREQUENTLY_FORWARDED=69 GROUP_CHANGE_NO_FREQUENTLY_FORWARDED value + * @property {number} GROUP_V4_ADD_INVITE_SENT=70 GROUP_V4_ADD_INVITE_SENT value + * @property {number} GROUP_PARTICIPANT_ADD_REQUEST_JOIN=71 GROUP_PARTICIPANT_ADD_REQUEST_JOIN value + * @property {number} CHANGE_EPHEMERAL_SETTING=72 CHANGE_EPHEMERAL_SETTING value + * @property {number} E2E_DEVICE_CHANGED=73 E2E_DEVICE_CHANGED value + * @property {number} VIEWED_ONCE=74 VIEWED_ONCE value + * @property {number} E2E_ENCRYPTED_NOW=75 E2E_ENCRYPTED_NOW value + * @property {number} BLUE_MSG_BSP_FB_TO_BSP_PREMISE=76 BLUE_MSG_BSP_FB_TO_BSP_PREMISE value + * @property {number} BLUE_MSG_BSP_FB_TO_SELF_FB=77 BLUE_MSG_BSP_FB_TO_SELF_FB value + * @property {number} BLUE_MSG_BSP_FB_TO_SELF_PREMISE=78 BLUE_MSG_BSP_FB_TO_SELF_PREMISE value + * @property {number} BLUE_MSG_BSP_FB_UNVERIFIED=79 BLUE_MSG_BSP_FB_UNVERIFIED value + * @property {number} BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED=80 BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_BSP_FB_VERIFIED=81 BLUE_MSG_BSP_FB_VERIFIED value + * @property {number} BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED=82 BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE=83 BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE value + * @property {number} BLUE_MSG_BSP_PREMISE_UNVERIFIED=84 BLUE_MSG_BSP_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED=85 BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_BSP_PREMISE_VERIFIED=86 BLUE_MSG_BSP_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED=87 BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED=88 BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED value + * @property {number} BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED=89 BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED=90 BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED value + * @property {number} BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED=91 BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_SELF_FB_TO_BSP_PREMISE=92 BLUE_MSG_SELF_FB_TO_BSP_PREMISE value + * @property {number} BLUE_MSG_SELF_FB_TO_SELF_PREMISE=93 BLUE_MSG_SELF_FB_TO_SELF_PREMISE value + * @property {number} BLUE_MSG_SELF_FB_UNVERIFIED=94 BLUE_MSG_SELF_FB_UNVERIFIED value + * @property {number} BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED=95 BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_SELF_FB_VERIFIED=96 BLUE_MSG_SELF_FB_VERIFIED value + * @property {number} BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED=97 BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE=98 BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE value + * @property {number} BLUE_MSG_SELF_PREMISE_UNVERIFIED=99 BLUE_MSG_SELF_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_SELF_PREMISE_VERIFIED=100 BLUE_MSG_SELF_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_TO_BSP_FB=101 BLUE_MSG_TO_BSP_FB value + * @property {number} BLUE_MSG_TO_CONSUMER=102 BLUE_MSG_TO_CONSUMER value + * @property {number} BLUE_MSG_TO_SELF_FB=103 BLUE_MSG_TO_SELF_FB value + * @property {number} BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED=104 BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED value + * @property {number} BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED=105 BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED=106 BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED value + * @property {number} BLUE_MSG_UNVERIFIED_TO_VERIFIED=107 BLUE_MSG_UNVERIFIED_TO_VERIFIED value + * @property {number} BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED=108 BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED value + * @property {number} BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED=109 BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED=110 BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED value + * @property {number} BLUE_MSG_VERIFIED_TO_UNVERIFIED=111 BLUE_MSG_VERIFIED_TO_UNVERIFIED value + * @property {number} BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED=112 BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED=113 BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED value + * @property {number} BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED=114 BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED value + * @property {number} BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED=115 BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED value + * @property {number} BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED=116 BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED value + * @property {number} BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED=117 BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED value + * @property {number} E2E_IDENTITY_UNAVAILABLE=118 E2E_IDENTITY_UNAVAILABLE value + * @property {number} GROUP_CREATING=119 GROUP_CREATING value + * @property {number} GROUP_CREATE_FAILED=120 GROUP_CREATE_FAILED value + * @property {number} GROUP_BOUNCED=121 GROUP_BOUNCED value + * @property {number} BLOCK_CONTACT=122 BLOCK_CONTACT value + * @property {number} EPHEMERAL_SETTING_NOT_APPLIED=123 EPHEMERAL_SETTING_NOT_APPLIED value + * @property {number} SYNC_FAILED=124 SYNC_FAILED value + * @property {number} SYNCING=125 SYNCING value + * @property {number} BIZ_PRIVACY_MODE_INIT_FB=126 BIZ_PRIVACY_MODE_INIT_FB value + * @property {number} BIZ_PRIVACY_MODE_INIT_BSP=127 BIZ_PRIVACY_MODE_INIT_BSP value + * @property {number} BIZ_PRIVACY_MODE_TO_FB=128 BIZ_PRIVACY_MODE_TO_FB value + * @property {number} BIZ_PRIVACY_MODE_TO_BSP=129 BIZ_PRIVACY_MODE_TO_BSP value + * @property {number} DISAPPEARING_MODE=130 DISAPPEARING_MODE value + * @property {number} E2E_DEVICE_FETCH_FAILED=131 E2E_DEVICE_FETCH_FAILED value + * @property {number} ADMIN_REVOKE=132 ADMIN_REVOKE value + * @property {number} GROUP_INVITE_LINK_GROWTH_LOCKED=133 GROUP_INVITE_LINK_GROWTH_LOCKED value + * @property {number} COMMUNITY_LINK_PARENT_GROUP=134 COMMUNITY_LINK_PARENT_GROUP value + * @property {number} COMMUNITY_LINK_SIBLING_GROUP=135 COMMUNITY_LINK_SIBLING_GROUP value + * @property {number} COMMUNITY_LINK_SUB_GROUP=136 COMMUNITY_LINK_SUB_GROUP value + * @property {number} COMMUNITY_UNLINK_PARENT_GROUP=137 COMMUNITY_UNLINK_PARENT_GROUP value + * @property {number} COMMUNITY_UNLINK_SIBLING_GROUP=138 COMMUNITY_UNLINK_SIBLING_GROUP value + * @property {number} COMMUNITY_UNLINK_SUB_GROUP=139 COMMUNITY_UNLINK_SUB_GROUP value + * @property {number} GROUP_PARTICIPANT_ACCEPT=140 GROUP_PARTICIPANT_ACCEPT value + * @property {number} GROUP_PARTICIPANT_LINKED_GROUP_JOIN=141 GROUP_PARTICIPANT_LINKED_GROUP_JOIN value + * @property {number} COMMUNITY_CREATE=142 COMMUNITY_CREATE value + * @property {number} EPHEMERAL_KEEP_IN_CHAT=143 EPHEMERAL_KEEP_IN_CHAT value + * @property {number} GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST=144 GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST value + * @property {number} GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE=145 GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE value + * @property {number} INTEGRITY_UNLINK_PARENT_GROUP=146 INTEGRITY_UNLINK_PARENT_GROUP value + * @property {number} COMMUNITY_PARTICIPANT_PROMOTE=147 COMMUNITY_PARTICIPANT_PROMOTE value + * @property {number} COMMUNITY_PARTICIPANT_DEMOTE=148 COMMUNITY_PARTICIPANT_DEMOTE value + * @property {number} COMMUNITY_PARENT_GROUP_DELETED=149 COMMUNITY_PARENT_GROUP_DELETED value + * @property {number} COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL=150 COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL value + * @property {number} GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP=151 GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP value + * @property {number} MASKED_THREAD_CREATED=152 MASKED_THREAD_CREATED value + * @property {number} MASKED_THREAD_UNMASKED=153 MASKED_THREAD_UNMASKED value + * @property {number} BIZ_CHAT_ASSIGNMENT=154 BIZ_CHAT_ASSIGNMENT value + * @property {number} CHAT_PSA=155 CHAT_PSA value + * @property {number} CHAT_POLL_CREATION_MESSAGE=156 CHAT_POLL_CREATION_MESSAGE value + * @property {number} CAG_MASKED_THREAD_CREATED=157 CAG_MASKED_THREAD_CREATED value + * @property {number} COMMUNITY_PARENT_GROUP_SUBJECT_CHANGED=158 COMMUNITY_PARENT_GROUP_SUBJECT_CHANGED value + * @property {number} CAG_INVITE_AUTO_ADD=159 CAG_INVITE_AUTO_ADD value + * @property {number} BIZ_CHAT_ASSIGNMENT_UNASSIGN=160 BIZ_CHAT_ASSIGNMENT_UNASSIGN value + * @property {number} CAG_INVITE_AUTO_JOINED=161 CAG_INVITE_AUTO_JOINED value + */ + WebMessageInfo.StubType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "UNKNOWN"] = 0; + values[valuesById[1] = "REVOKE"] = 1; + values[valuesById[2] = "CIPHERTEXT"] = 2; + values[valuesById[3] = "FUTUREPROOF"] = 3; + values[valuesById[4] = "NON_VERIFIED_TRANSITION"] = 4; + values[valuesById[5] = "UNVERIFIED_TRANSITION"] = 5; + values[valuesById[6] = "VERIFIED_TRANSITION"] = 6; + values[valuesById[7] = "VERIFIED_LOW_UNKNOWN"] = 7; + values[valuesById[8] = "VERIFIED_HIGH"] = 8; + values[valuesById[9] = "VERIFIED_INITIAL_UNKNOWN"] = 9; + values[valuesById[10] = "VERIFIED_INITIAL_LOW"] = 10; + values[valuesById[11] = "VERIFIED_INITIAL_HIGH"] = 11; + values[valuesById[12] = "VERIFIED_TRANSITION_ANY_TO_NONE"] = 12; + values[valuesById[13] = "VERIFIED_TRANSITION_ANY_TO_HIGH"] = 13; + values[valuesById[14] = "VERIFIED_TRANSITION_HIGH_TO_LOW"] = 14; + values[valuesById[15] = "VERIFIED_TRANSITION_HIGH_TO_UNKNOWN"] = 15; + values[valuesById[16] = "VERIFIED_TRANSITION_UNKNOWN_TO_LOW"] = 16; + values[valuesById[17] = "VERIFIED_TRANSITION_LOW_TO_UNKNOWN"] = 17; + values[valuesById[18] = "VERIFIED_TRANSITION_NONE_TO_LOW"] = 18; + values[valuesById[19] = "VERIFIED_TRANSITION_NONE_TO_UNKNOWN"] = 19; + values[valuesById[20] = "GROUP_CREATE"] = 20; + values[valuesById[21] = "GROUP_CHANGE_SUBJECT"] = 21; + values[valuesById[22] = "GROUP_CHANGE_ICON"] = 22; + values[valuesById[23] = "GROUP_CHANGE_INVITE_LINK"] = 23; + values[valuesById[24] = "GROUP_CHANGE_DESCRIPTION"] = 24; + values[valuesById[25] = "GROUP_CHANGE_RESTRICT"] = 25; + values[valuesById[26] = "GROUP_CHANGE_ANNOUNCE"] = 26; + values[valuesById[27] = "GROUP_PARTICIPANT_ADD"] = 27; + values[valuesById[28] = "GROUP_PARTICIPANT_REMOVE"] = 28; + values[valuesById[29] = "GROUP_PARTICIPANT_PROMOTE"] = 29; + values[valuesById[30] = "GROUP_PARTICIPANT_DEMOTE"] = 30; + values[valuesById[31] = "GROUP_PARTICIPANT_INVITE"] = 31; + values[valuesById[32] = "GROUP_PARTICIPANT_LEAVE"] = 32; + values[valuesById[33] = "GROUP_PARTICIPANT_CHANGE_NUMBER"] = 33; + values[valuesById[34] = "BROADCAST_CREATE"] = 34; + values[valuesById[35] = "BROADCAST_ADD"] = 35; + values[valuesById[36] = "BROADCAST_REMOVE"] = 36; + values[valuesById[37] = "GENERIC_NOTIFICATION"] = 37; + values[valuesById[38] = "E2E_IDENTITY_CHANGED"] = 38; + values[valuesById[39] = "E2E_ENCRYPTED"] = 39; + values[valuesById[40] = "CALL_MISSED_VOICE"] = 40; + values[valuesById[41] = "CALL_MISSED_VIDEO"] = 41; + values[valuesById[42] = "INDIVIDUAL_CHANGE_NUMBER"] = 42; + values[valuesById[43] = "GROUP_DELETE"] = 43; + values[valuesById[44] = "GROUP_ANNOUNCE_MODE_MESSAGE_BOUNCE"] = 44; + values[valuesById[45] = "CALL_MISSED_GROUP_VOICE"] = 45; + values[valuesById[46] = "CALL_MISSED_GROUP_VIDEO"] = 46; + values[valuesById[47] = "PAYMENT_CIPHERTEXT"] = 47; + values[valuesById[48] = "PAYMENT_FUTUREPROOF"] = 48; + values[valuesById[49] = "PAYMENT_TRANSACTION_STATUS_UPDATE_FAILED"] = 49; + values[valuesById[50] = "PAYMENT_TRANSACTION_STATUS_UPDATE_REFUNDED"] = 50; + values[valuesById[51] = "PAYMENT_TRANSACTION_STATUS_UPDATE_REFUND_FAILED"] = 51; + values[valuesById[52] = "PAYMENT_TRANSACTION_STATUS_RECEIVER_PENDING_SETUP"] = 52; + values[valuesById[53] = "PAYMENT_TRANSACTION_STATUS_RECEIVER_SUCCESS_AFTER_HICCUP"] = 53; + values[valuesById[54] = "PAYMENT_ACTION_ACCOUNT_SETUP_REMINDER"] = 54; + values[valuesById[55] = "PAYMENT_ACTION_SEND_PAYMENT_REMINDER"] = 55; + values[valuesById[56] = "PAYMENT_ACTION_SEND_PAYMENT_INVITATION"] = 56; + values[valuesById[57] = "PAYMENT_ACTION_REQUEST_DECLINED"] = 57; + values[valuesById[58] = "PAYMENT_ACTION_REQUEST_EXPIRED"] = 58; + values[valuesById[59] = "PAYMENT_ACTION_REQUEST_CANCELLED"] = 59; + values[valuesById[60] = "BIZ_VERIFIED_TRANSITION_TOP_TO_BOTTOM"] = 60; + values[valuesById[61] = "BIZ_VERIFIED_TRANSITION_BOTTOM_TO_TOP"] = 61; + values[valuesById[62] = "BIZ_INTRO_TOP"] = 62; + values[valuesById[63] = "BIZ_INTRO_BOTTOM"] = 63; + values[valuesById[64] = "BIZ_NAME_CHANGE"] = 64; + values[valuesById[65] = "BIZ_MOVE_TO_CONSUMER_APP"] = 65; + values[valuesById[66] = "BIZ_TWO_TIER_MIGRATION_TOP"] = 66; + values[valuesById[67] = "BIZ_TWO_TIER_MIGRATION_BOTTOM"] = 67; + values[valuesById[68] = "OVERSIZED"] = 68; + values[valuesById[69] = "GROUP_CHANGE_NO_FREQUENTLY_FORWARDED"] = 69; + values[valuesById[70] = "GROUP_V4_ADD_INVITE_SENT"] = 70; + values[valuesById[71] = "GROUP_PARTICIPANT_ADD_REQUEST_JOIN"] = 71; + values[valuesById[72] = "CHANGE_EPHEMERAL_SETTING"] = 72; + values[valuesById[73] = "E2E_DEVICE_CHANGED"] = 73; + values[valuesById[74] = "VIEWED_ONCE"] = 74; + values[valuesById[75] = "E2E_ENCRYPTED_NOW"] = 75; + values[valuesById[76] = "BLUE_MSG_BSP_FB_TO_BSP_PREMISE"] = 76; + values[valuesById[77] = "BLUE_MSG_BSP_FB_TO_SELF_FB"] = 77; + values[valuesById[78] = "BLUE_MSG_BSP_FB_TO_SELF_PREMISE"] = 78; + values[valuesById[79] = "BLUE_MSG_BSP_FB_UNVERIFIED"] = 79; + values[valuesById[80] = "BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED"] = 80; + values[valuesById[81] = "BLUE_MSG_BSP_FB_VERIFIED"] = 81; + values[valuesById[82] = "BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED"] = 82; + values[valuesById[83] = "BLUE_MSG_BSP_PREMISE_TO_SELF_PREMISE"] = 83; + values[valuesById[84] = "BLUE_MSG_BSP_PREMISE_UNVERIFIED"] = 84; + values[valuesById[85] = "BLUE_MSG_BSP_PREMISE_UNVERIFIED_TO_SELF_PREMISE_VERIFIED"] = 85; + values[valuesById[86] = "BLUE_MSG_BSP_PREMISE_VERIFIED"] = 86; + values[valuesById[87] = "BLUE_MSG_BSP_PREMISE_VERIFIED_TO_SELF_PREMISE_UNVERIFIED"] = 87; + values[valuesById[88] = "BLUE_MSG_CONSUMER_TO_BSP_FB_UNVERIFIED"] = 88; + values[valuesById[89] = "BLUE_MSG_CONSUMER_TO_BSP_PREMISE_UNVERIFIED"] = 89; + values[valuesById[90] = "BLUE_MSG_CONSUMER_TO_SELF_FB_UNVERIFIED"] = 90; + values[valuesById[91] = "BLUE_MSG_CONSUMER_TO_SELF_PREMISE_UNVERIFIED"] = 91; + values[valuesById[92] = "BLUE_MSG_SELF_FB_TO_BSP_PREMISE"] = 92; + values[valuesById[93] = "BLUE_MSG_SELF_FB_TO_SELF_PREMISE"] = 93; + values[valuesById[94] = "BLUE_MSG_SELF_FB_UNVERIFIED"] = 94; + values[valuesById[95] = "BLUE_MSG_SELF_FB_UNVERIFIED_TO_SELF_PREMISE_VERIFIED"] = 95; + values[valuesById[96] = "BLUE_MSG_SELF_FB_VERIFIED"] = 96; + values[valuesById[97] = "BLUE_MSG_SELF_FB_VERIFIED_TO_SELF_PREMISE_UNVERIFIED"] = 97; + values[valuesById[98] = "BLUE_MSG_SELF_PREMISE_TO_BSP_PREMISE"] = 98; + values[valuesById[99] = "BLUE_MSG_SELF_PREMISE_UNVERIFIED"] = 99; + values[valuesById[100] = "BLUE_MSG_SELF_PREMISE_VERIFIED"] = 100; + values[valuesById[101] = "BLUE_MSG_TO_BSP_FB"] = 101; + values[valuesById[102] = "BLUE_MSG_TO_CONSUMER"] = 102; + values[valuesById[103] = "BLUE_MSG_TO_SELF_FB"] = 103; + values[valuesById[104] = "BLUE_MSG_UNVERIFIED_TO_BSP_FB_VERIFIED"] = 104; + values[valuesById[105] = "BLUE_MSG_UNVERIFIED_TO_BSP_PREMISE_VERIFIED"] = 105; + values[valuesById[106] = "BLUE_MSG_UNVERIFIED_TO_SELF_FB_VERIFIED"] = 106; + values[valuesById[107] = "BLUE_MSG_UNVERIFIED_TO_VERIFIED"] = 107; + values[valuesById[108] = "BLUE_MSG_VERIFIED_TO_BSP_FB_UNVERIFIED"] = 108; + values[valuesById[109] = "BLUE_MSG_VERIFIED_TO_BSP_PREMISE_UNVERIFIED"] = 109; + values[valuesById[110] = "BLUE_MSG_VERIFIED_TO_SELF_FB_UNVERIFIED"] = 110; + values[valuesById[111] = "BLUE_MSG_VERIFIED_TO_UNVERIFIED"] = 111; + values[valuesById[112] = "BLUE_MSG_BSP_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED"] = 112; + values[valuesById[113] = "BLUE_MSG_BSP_FB_UNVERIFIED_TO_SELF_FB_VERIFIED"] = 113; + values[valuesById[114] = "BLUE_MSG_BSP_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED"] = 114; + values[valuesById[115] = "BLUE_MSG_BSP_FB_VERIFIED_TO_SELF_FB_UNVERIFIED"] = 115; + values[valuesById[116] = "BLUE_MSG_SELF_FB_UNVERIFIED_TO_BSP_PREMISE_VERIFIED"] = 116; + values[valuesById[117] = "BLUE_MSG_SELF_FB_VERIFIED_TO_BSP_PREMISE_UNVERIFIED"] = 117; + values[valuesById[118] = "E2E_IDENTITY_UNAVAILABLE"] = 118; + values[valuesById[119] = "GROUP_CREATING"] = 119; + values[valuesById[120] = "GROUP_CREATE_FAILED"] = 120; + values[valuesById[121] = "GROUP_BOUNCED"] = 121; + values[valuesById[122] = "BLOCK_CONTACT"] = 122; + values[valuesById[123] = "EPHEMERAL_SETTING_NOT_APPLIED"] = 123; + values[valuesById[124] = "SYNC_FAILED"] = 124; + values[valuesById[125] = "SYNCING"] = 125; + values[valuesById[126] = "BIZ_PRIVACY_MODE_INIT_FB"] = 126; + values[valuesById[127] = "BIZ_PRIVACY_MODE_INIT_BSP"] = 127; + values[valuesById[128] = "BIZ_PRIVACY_MODE_TO_FB"] = 128; + values[valuesById[129] = "BIZ_PRIVACY_MODE_TO_BSP"] = 129; + values[valuesById[130] = "DISAPPEARING_MODE"] = 130; + values[valuesById[131] = "E2E_DEVICE_FETCH_FAILED"] = 131; + values[valuesById[132] = "ADMIN_REVOKE"] = 132; + values[valuesById[133] = "GROUP_INVITE_LINK_GROWTH_LOCKED"] = 133; + values[valuesById[134] = "COMMUNITY_LINK_PARENT_GROUP"] = 134; + values[valuesById[135] = "COMMUNITY_LINK_SIBLING_GROUP"] = 135; + values[valuesById[136] = "COMMUNITY_LINK_SUB_GROUP"] = 136; + values[valuesById[137] = "COMMUNITY_UNLINK_PARENT_GROUP"] = 137; + values[valuesById[138] = "COMMUNITY_UNLINK_SIBLING_GROUP"] = 138; + values[valuesById[139] = "COMMUNITY_UNLINK_SUB_GROUP"] = 139; + values[valuesById[140] = "GROUP_PARTICIPANT_ACCEPT"] = 140; + values[valuesById[141] = "GROUP_PARTICIPANT_LINKED_GROUP_JOIN"] = 141; + values[valuesById[142] = "COMMUNITY_CREATE"] = 142; + values[valuesById[143] = "EPHEMERAL_KEEP_IN_CHAT"] = 143; + values[valuesById[144] = "GROUP_MEMBERSHIP_JOIN_APPROVAL_REQUEST"] = 144; + values[valuesById[145] = "GROUP_MEMBERSHIP_JOIN_APPROVAL_MODE"] = 145; + values[valuesById[146] = "INTEGRITY_UNLINK_PARENT_GROUP"] = 146; + values[valuesById[147] = "COMMUNITY_PARTICIPANT_PROMOTE"] = 147; + values[valuesById[148] = "COMMUNITY_PARTICIPANT_DEMOTE"] = 148; + values[valuesById[149] = "COMMUNITY_PARENT_GROUP_DELETED"] = 149; + values[valuesById[150] = "COMMUNITY_LINK_PARENT_GROUP_MEMBERSHIP_APPROVAL"] = 150; + values[valuesById[151] = "GROUP_PARTICIPANT_JOINED_GROUP_AND_PARENT_GROUP"] = 151; + values[valuesById[152] = "MASKED_THREAD_CREATED"] = 152; + values[valuesById[153] = "MASKED_THREAD_UNMASKED"] = 153; + values[valuesById[154] = "BIZ_CHAT_ASSIGNMENT"] = 154; + values[valuesById[155] = "CHAT_PSA"] = 155; + values[valuesById[156] = "CHAT_POLL_CREATION_MESSAGE"] = 156; + values[valuesById[157] = "CAG_MASKED_THREAD_CREATED"] = 157; + values[valuesById[158] = "COMMUNITY_PARENT_GROUP_SUBJECT_CHANGED"] = 158; + values[valuesById[159] = "CAG_INVITE_AUTO_ADD"] = 159; + values[valuesById[160] = "BIZ_CHAT_ASSIGNMENT_UNASSIGN"] = 160; + values[valuesById[161] = "CAG_INVITE_AUTO_JOINED"] = 161; + return values; + })(); + + return WebMessageInfo; + })(); + + proto.WebNotificationsInfo = (function() { + + /** + * Properties of a WebNotificationsInfo. + * @memberof proto + * @interface IWebNotificationsInfo + * @property {number|Long|null} [timestamp] WebNotificationsInfo timestamp + * @property {number|null} [unreadChats] WebNotificationsInfo unreadChats + * @property {number|null} [notifyMessageCount] WebNotificationsInfo notifyMessageCount + * @property {Array.|null} [notifyMessages] WebNotificationsInfo notifyMessages + */ + + /** + * Constructs a new WebNotificationsInfo. + * @memberof proto + * @classdesc Represents a WebNotificationsInfo. + * @implements IWebNotificationsInfo + * @constructor + * @param {proto.IWebNotificationsInfo=} [properties] Properties to set + */ + function WebNotificationsInfo(properties) { + this.notifyMessages = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * WebNotificationsInfo timestamp. + * @member {number|Long} timestamp + * @memberof proto.WebNotificationsInfo + * @instance + */ + WebNotificationsInfo.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * WebNotificationsInfo unreadChats. + * @member {number} unreadChats + * @memberof proto.WebNotificationsInfo + * @instance + */ + WebNotificationsInfo.prototype.unreadChats = 0; + + /** + * WebNotificationsInfo notifyMessageCount. + * @member {number} notifyMessageCount + * @memberof proto.WebNotificationsInfo + * @instance + */ + WebNotificationsInfo.prototype.notifyMessageCount = 0; + + /** + * WebNotificationsInfo notifyMessages. + * @member {Array.} notifyMessages + * @memberof proto.WebNotificationsInfo + * @instance + */ + WebNotificationsInfo.prototype.notifyMessages = $util.emptyArray; + + /** + * Creates a new WebNotificationsInfo instance using the specified properties. + * @function create + * @memberof proto.WebNotificationsInfo + * @static + * @param {proto.IWebNotificationsInfo=} [properties] Properties to set + * @returns {proto.WebNotificationsInfo} WebNotificationsInfo instance + */ + WebNotificationsInfo.create = function create(properties) { + return new WebNotificationsInfo(properties); + }; + + /** + * Encodes the specified WebNotificationsInfo message. Does not implicitly {@link proto.WebNotificationsInfo.verify|verify} messages. + * @function encode + * @memberof proto.WebNotificationsInfo + * @static + * @param {proto.IWebNotificationsInfo} message WebNotificationsInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebNotificationsInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.timestamp); + if (message.unreadChats != null && Object.hasOwnProperty.call(message, "unreadChats")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.unreadChats); + if (message.notifyMessageCount != null && Object.hasOwnProperty.call(message, "notifyMessageCount")) + writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.notifyMessageCount); + if (message.notifyMessages != null && message.notifyMessages.length) + for (var i = 0; i < message.notifyMessages.length; ++i) + $root.proto.WebMessageInfo.encode(message.notifyMessages[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified WebNotificationsInfo message, length delimited. Does not implicitly {@link proto.WebNotificationsInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof proto.WebNotificationsInfo + * @static + * @param {proto.IWebNotificationsInfo} message WebNotificationsInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + WebNotificationsInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a WebNotificationsInfo message from the specified reader or buffer. + * @function decode + * @memberof proto.WebNotificationsInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {proto.WebNotificationsInfo} WebNotificationsInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebNotificationsInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.proto.WebNotificationsInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 2: + message.timestamp = reader.uint64(); + break; + case 3: + message.unreadChats = reader.uint32(); + break; + case 4: + message.notifyMessageCount = reader.uint32(); + break; + case 5: + if (!(message.notifyMessages && message.notifyMessages.length)) + message.notifyMessages = []; + message.notifyMessages.push($root.proto.WebMessageInfo.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a WebNotificationsInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof proto.WebNotificationsInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {proto.WebNotificationsInfo} WebNotificationsInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + WebNotificationsInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a WebNotificationsInfo message. + * @function verify + * @memberof proto.WebNotificationsInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + WebNotificationsInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + if (message.unreadChats != null && message.hasOwnProperty("unreadChats")) + if (!$util.isInteger(message.unreadChats)) + return "unreadChats: integer expected"; + if (message.notifyMessageCount != null && message.hasOwnProperty("notifyMessageCount")) + if (!$util.isInteger(message.notifyMessageCount)) + return "notifyMessageCount: integer expected"; + if (message.notifyMessages != null && message.hasOwnProperty("notifyMessages")) { + if (!Array.isArray(message.notifyMessages)) + return "notifyMessages: array expected"; + for (var i = 0; i < message.notifyMessages.length; ++i) { + var error = $root.proto.WebMessageInfo.verify(message.notifyMessages[i]); + if (error) + return "notifyMessages." + error; + } + } + return null; + }; + + /** + * Creates a WebNotificationsInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof proto.WebNotificationsInfo + * @static + * @param {Object.} object Plain object + * @returns {proto.WebNotificationsInfo} WebNotificationsInfo + */ + WebNotificationsInfo.fromObject = function fromObject(object) { + if (object instanceof $root.proto.WebNotificationsInfo) + return object; + var message = new $root.proto.WebNotificationsInfo(); + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = true; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true); + if (object.unreadChats != null) + message.unreadChats = object.unreadChats >>> 0; + if (object.notifyMessageCount != null) + message.notifyMessageCount = object.notifyMessageCount >>> 0; + if (object.notifyMessages) { + if (!Array.isArray(object.notifyMessages)) + throw TypeError(".proto.WebNotificationsInfo.notifyMessages: array expected"); + message.notifyMessages = []; + for (var i = 0; i < object.notifyMessages.length; ++i) { + if (typeof object.notifyMessages[i] !== "object") + throw TypeError(".proto.WebNotificationsInfo.notifyMessages: object expected"); + message.notifyMessages[i] = $root.proto.WebMessageInfo.fromObject(object.notifyMessages[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a WebNotificationsInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof proto.WebNotificationsInfo + * @static + * @param {proto.WebNotificationsInfo} message WebNotificationsInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + WebNotificationsInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.notifyMessages = []; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + object.unreadChats = 0; + object.notifyMessageCount = 0; + } + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp; + if (message.unreadChats != null && message.hasOwnProperty("unreadChats")) + object.unreadChats = message.unreadChats; + if (message.notifyMessageCount != null && message.hasOwnProperty("notifyMessageCount")) + object.notifyMessageCount = message.notifyMessageCount; + if (message.notifyMessages && message.notifyMessages.length) { + object.notifyMessages = []; + for (var j = 0; j < message.notifyMessages.length; ++j) + object.notifyMessages[j] = $root.proto.WebMessageInfo.toObject(message.notifyMessages[j], options); + } + return object; + }; + + /** + * Converts this WebNotificationsInfo to JSON. + * @function toJSON + * @memberof proto.WebNotificationsInfo + * @instance + * @returns {Object.} JSON object + */ + WebNotificationsInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return WebNotificationsInfo; + })(); + + return proto; +})(); + +module.exports = $root; diff --git a/whatsapp_addon/Baileys/WASignalGroup/GroupProtocol.js b/whatsapp_addon/Baileys/WASignalGroup/GroupProtocol.js new file mode 100644 index 0000000..efa722a --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/GroupProtocol.js @@ -0,0 +1,1697 @@ +/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ +"use strict"; + +var $protobuf = require("protobufjs/minimal"); + +// Common aliases +var $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; + +// Exported root namespace +var $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); + +$root.groupproto = (function() { + + /** + * Namespace groupproto. + * @exports groupproto + * @namespace + */ + var groupproto = {}; + + groupproto.SenderKeyMessage = (function() { + + /** + * Properties of a SenderKeyMessage. + * @memberof groupproto + * @interface ISenderKeyMessage + * @property {number|null} [id] SenderKeyMessage id + * @property {number|null} [iteration] SenderKeyMessage iteration + * @property {Uint8Array|null} [ciphertext] SenderKeyMessage ciphertext + */ + + /** + * Constructs a new SenderKeyMessage. + * @memberof groupproto + * @classdesc Represents a SenderKeyMessage. + * @implements ISenderKeyMessage + * @constructor + * @param {groupproto.ISenderKeyMessage=} [properties] Properties to set + */ + function SenderKeyMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderKeyMessage id. + * @member {number} id + * @memberof groupproto.SenderKeyMessage + * @instance + */ + SenderKeyMessage.prototype.id = 0; + + /** + * SenderKeyMessage iteration. + * @member {number} iteration + * @memberof groupproto.SenderKeyMessage + * @instance + */ + SenderKeyMessage.prototype.iteration = 0; + + /** + * SenderKeyMessage ciphertext. + * @member {Uint8Array} ciphertext + * @memberof groupproto.SenderKeyMessage + * @instance + */ + SenderKeyMessage.prototype.ciphertext = $util.newBuffer([]); + + /** + * Creates a new SenderKeyMessage instance using the specified properties. + * @function create + * @memberof groupproto.SenderKeyMessage + * @static + * @param {groupproto.ISenderKeyMessage=} [properties] Properties to set + * @returns {groupproto.SenderKeyMessage} SenderKeyMessage instance + */ + SenderKeyMessage.create = function create(properties) { + return new SenderKeyMessage(properties); + }; + + /** + * Encodes the specified SenderKeyMessage message. Does not implicitly {@link groupproto.SenderKeyMessage.verify|verify} messages. + * @function encode + * @memberof groupproto.SenderKeyMessage + * @static + * @param {groupproto.ISenderKeyMessage} message SenderKeyMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id); + if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.iteration); + if (message.ciphertext != null && Object.hasOwnProperty.call(message, "ciphertext")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.ciphertext); + return writer; + }; + + /** + * Encodes the specified SenderKeyMessage message, length delimited. Does not implicitly {@link groupproto.SenderKeyMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof groupproto.SenderKeyMessage + * @static + * @param {groupproto.ISenderKeyMessage} message SenderKeyMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderKeyMessage message from the specified reader or buffer. + * @function decode + * @memberof groupproto.SenderKeyMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {groupproto.SenderKeyMessage} SenderKeyMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.groupproto.SenderKeyMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.uint32(); + break; + case 2: + message.iteration = reader.uint32(); + break; + case 3: + message.ciphertext = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderKeyMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof groupproto.SenderKeyMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {groupproto.SenderKeyMessage} SenderKeyMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderKeyMessage message. + * @function verify + * @memberof groupproto.SenderKeyMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderKeyMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isInteger(message.id)) + return "id: integer expected"; + if (message.iteration != null && message.hasOwnProperty("iteration")) + if (!$util.isInteger(message.iteration)) + return "iteration: integer expected"; + if (message.ciphertext != null && message.hasOwnProperty("ciphertext")) + if (!(message.ciphertext && typeof message.ciphertext.length === "number" || $util.isString(message.ciphertext))) + return "ciphertext: buffer expected"; + return null; + }; + + /** + * Creates a SenderKeyMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof groupproto.SenderKeyMessage + * @static + * @param {Object.} object Plain object + * @returns {groupproto.SenderKeyMessage} SenderKeyMessage + */ + SenderKeyMessage.fromObject = function fromObject(object) { + if (object instanceof $root.groupproto.SenderKeyMessage) + return object; + var message = new $root.groupproto.SenderKeyMessage(); + if (object.id != null) + message.id = object.id >>> 0; + if (object.iteration != null) + message.iteration = object.iteration >>> 0; + if (object.ciphertext != null) + if (typeof object.ciphertext === "string") + $util.base64.decode(object.ciphertext, message.ciphertext = $util.newBuffer($util.base64.length(object.ciphertext)), 0); + else if (object.ciphertext.length) + message.ciphertext = object.ciphertext; + return message; + }; + + /** + * Creates a plain object from a SenderKeyMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof groupproto.SenderKeyMessage + * @static + * @param {groupproto.SenderKeyMessage} message SenderKeyMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderKeyMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.id = 0; + object.iteration = 0; + if (options.bytes === String) + object.ciphertext = ""; + else { + object.ciphertext = []; + if (options.bytes !== Array) + object.ciphertext = $util.newBuffer(object.ciphertext); + } + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.iteration != null && message.hasOwnProperty("iteration")) + object.iteration = message.iteration; + if (message.ciphertext != null && message.hasOwnProperty("ciphertext")) + object.ciphertext = options.bytes === String ? $util.base64.encode(message.ciphertext, 0, message.ciphertext.length) : options.bytes === Array ? Array.prototype.slice.call(message.ciphertext) : message.ciphertext; + return object; + }; + + /** + * Converts this SenderKeyMessage to JSON. + * @function toJSON + * @memberof groupproto.SenderKeyMessage + * @instance + * @returns {Object.} JSON object + */ + SenderKeyMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderKeyMessage; + })(); + + groupproto.SenderKeyDistributionMessage = (function() { + + /** + * Properties of a SenderKeyDistributionMessage. + * @memberof groupproto + * @interface ISenderKeyDistributionMessage + * @property {number|null} [id] SenderKeyDistributionMessage id + * @property {number|null} [iteration] SenderKeyDistributionMessage iteration + * @property {Uint8Array|null} [chainKey] SenderKeyDistributionMessage chainKey + * @property {Uint8Array|null} [signingKey] SenderKeyDistributionMessage signingKey + */ + + /** + * Constructs a new SenderKeyDistributionMessage. + * @memberof groupproto + * @classdesc Represents a SenderKeyDistributionMessage. + * @implements ISenderKeyDistributionMessage + * @constructor + * @param {groupproto.ISenderKeyDistributionMessage=} [properties] Properties to set + */ + function SenderKeyDistributionMessage(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderKeyDistributionMessage id. + * @member {number} id + * @memberof groupproto.SenderKeyDistributionMessage + * @instance + */ + SenderKeyDistributionMessage.prototype.id = 0; + + /** + * SenderKeyDistributionMessage iteration. + * @member {number} iteration + * @memberof groupproto.SenderKeyDistributionMessage + * @instance + */ + SenderKeyDistributionMessage.prototype.iteration = 0; + + /** + * SenderKeyDistributionMessage chainKey. + * @member {Uint8Array} chainKey + * @memberof groupproto.SenderKeyDistributionMessage + * @instance + */ + SenderKeyDistributionMessage.prototype.chainKey = $util.newBuffer([]); + + /** + * SenderKeyDistributionMessage signingKey. + * @member {Uint8Array} signingKey + * @memberof groupproto.SenderKeyDistributionMessage + * @instance + */ + SenderKeyDistributionMessage.prototype.signingKey = $util.newBuffer([]); + + /** + * Creates a new SenderKeyDistributionMessage instance using the specified properties. + * @function create + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {groupproto.ISenderKeyDistributionMessage=} [properties] Properties to set + * @returns {groupproto.SenderKeyDistributionMessage} SenderKeyDistributionMessage instance + */ + SenderKeyDistributionMessage.create = function create(properties) { + return new SenderKeyDistributionMessage(properties); + }; + + /** + * Encodes the specified SenderKeyDistributionMessage message. Does not implicitly {@link groupproto.SenderKeyDistributionMessage.verify|verify} messages. + * @function encode + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {groupproto.ISenderKeyDistributionMessage} message SenderKeyDistributionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyDistributionMessage.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.id != null && Object.hasOwnProperty.call(message, "id")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id); + if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.iteration); + if (message.chainKey != null && Object.hasOwnProperty.call(message, "chainKey")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.chainKey); + if (message.signingKey != null && Object.hasOwnProperty.call(message, "signingKey")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.signingKey); + return writer; + }; + + /** + * Encodes the specified SenderKeyDistributionMessage message, length delimited. Does not implicitly {@link groupproto.SenderKeyDistributionMessage.verify|verify} messages. + * @function encodeDelimited + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {groupproto.ISenderKeyDistributionMessage} message SenderKeyDistributionMessage message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyDistributionMessage.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderKeyDistributionMessage message from the specified reader or buffer. + * @function decode + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {groupproto.SenderKeyDistributionMessage} SenderKeyDistributionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyDistributionMessage.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.groupproto.SenderKeyDistributionMessage(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.id = reader.uint32(); + break; + case 2: + message.iteration = reader.uint32(); + break; + case 3: + message.chainKey = reader.bytes(); + break; + case 4: + message.signingKey = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderKeyDistributionMessage message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {groupproto.SenderKeyDistributionMessage} SenderKeyDistributionMessage + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyDistributionMessage.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderKeyDistributionMessage message. + * @function verify + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderKeyDistributionMessage.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.id != null && message.hasOwnProperty("id")) + if (!$util.isInteger(message.id)) + return "id: integer expected"; + if (message.iteration != null && message.hasOwnProperty("iteration")) + if (!$util.isInteger(message.iteration)) + return "iteration: integer expected"; + if (message.chainKey != null && message.hasOwnProperty("chainKey")) + if (!(message.chainKey && typeof message.chainKey.length === "number" || $util.isString(message.chainKey))) + return "chainKey: buffer expected"; + if (message.signingKey != null && message.hasOwnProperty("signingKey")) + if (!(message.signingKey && typeof message.signingKey.length === "number" || $util.isString(message.signingKey))) + return "signingKey: buffer expected"; + return null; + }; + + /** + * Creates a SenderKeyDistributionMessage message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {Object.} object Plain object + * @returns {groupproto.SenderKeyDistributionMessage} SenderKeyDistributionMessage + */ + SenderKeyDistributionMessage.fromObject = function fromObject(object) { + if (object instanceof $root.groupproto.SenderKeyDistributionMessage) + return object; + var message = new $root.groupproto.SenderKeyDistributionMessage(); + if (object.id != null) + message.id = object.id >>> 0; + if (object.iteration != null) + message.iteration = object.iteration >>> 0; + if (object.chainKey != null) + if (typeof object.chainKey === "string") + $util.base64.decode(object.chainKey, message.chainKey = $util.newBuffer($util.base64.length(object.chainKey)), 0); + else if (object.chainKey.length) + message.chainKey = object.chainKey; + if (object.signingKey != null) + if (typeof object.signingKey === "string") + $util.base64.decode(object.signingKey, message.signingKey = $util.newBuffer($util.base64.length(object.signingKey)), 0); + else if (object.signingKey.length) + message.signingKey = object.signingKey; + return message; + }; + + /** + * Creates a plain object from a SenderKeyDistributionMessage message. Also converts values to other types if specified. + * @function toObject + * @memberof groupproto.SenderKeyDistributionMessage + * @static + * @param {groupproto.SenderKeyDistributionMessage} message SenderKeyDistributionMessage + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderKeyDistributionMessage.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.id = 0; + object.iteration = 0; + if (options.bytes === String) + object.chainKey = ""; + else { + object.chainKey = []; + if (options.bytes !== Array) + object.chainKey = $util.newBuffer(object.chainKey); + } + if (options.bytes === String) + object.signingKey = ""; + else { + object.signingKey = []; + if (options.bytes !== Array) + object.signingKey = $util.newBuffer(object.signingKey); + } + } + if (message.id != null && message.hasOwnProperty("id")) + object.id = message.id; + if (message.iteration != null && message.hasOwnProperty("iteration")) + object.iteration = message.iteration; + if (message.chainKey != null && message.hasOwnProperty("chainKey")) + object.chainKey = options.bytes === String ? $util.base64.encode(message.chainKey, 0, message.chainKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.chainKey) : message.chainKey; + if (message.signingKey != null && message.hasOwnProperty("signingKey")) + object.signingKey = options.bytes === String ? $util.base64.encode(message.signingKey, 0, message.signingKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.signingKey) : message.signingKey; + return object; + }; + + /** + * Converts this SenderKeyDistributionMessage to JSON. + * @function toJSON + * @memberof groupproto.SenderKeyDistributionMessage + * @instance + * @returns {Object.} JSON object + */ + SenderKeyDistributionMessage.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderKeyDistributionMessage; + })(); + + groupproto.SenderChainKey = (function() { + + /** + * Properties of a SenderChainKey. + * @memberof groupproto + * @interface ISenderChainKey + * @property {number|null} [iteration] SenderChainKey iteration + * @property {Uint8Array|null} [seed] SenderChainKey seed + */ + + /** + * Constructs a new SenderChainKey. + * @memberof groupproto + * @classdesc Represents a SenderChainKey. + * @implements ISenderChainKey + * @constructor + * @param {groupproto.ISenderChainKey=} [properties] Properties to set + */ + function SenderChainKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderChainKey iteration. + * @member {number} iteration + * @memberof groupproto.SenderChainKey + * @instance + */ + SenderChainKey.prototype.iteration = 0; + + /** + * SenderChainKey seed. + * @member {Uint8Array} seed + * @memberof groupproto.SenderChainKey + * @instance + */ + SenderChainKey.prototype.seed = $util.newBuffer([]); + + /** + * Creates a new SenderChainKey instance using the specified properties. + * @function create + * @memberof groupproto.SenderChainKey + * @static + * @param {groupproto.ISenderChainKey=} [properties] Properties to set + * @returns {groupproto.SenderChainKey} SenderChainKey instance + */ + SenderChainKey.create = function create(properties) { + return new SenderChainKey(properties); + }; + + /** + * Encodes the specified SenderChainKey message. Does not implicitly {@link groupproto.SenderChainKey.verify|verify} messages. + * @function encode + * @memberof groupproto.SenderChainKey + * @static + * @param {groupproto.ISenderChainKey} message SenderChainKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderChainKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.iteration); + if (message.seed != null && Object.hasOwnProperty.call(message, "seed")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.seed); + return writer; + }; + + /** + * Encodes the specified SenderChainKey message, length delimited. Does not implicitly {@link groupproto.SenderChainKey.verify|verify} messages. + * @function encodeDelimited + * @memberof groupproto.SenderChainKey + * @static + * @param {groupproto.ISenderChainKey} message SenderChainKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderChainKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderChainKey message from the specified reader or buffer. + * @function decode + * @memberof groupproto.SenderChainKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {groupproto.SenderChainKey} SenderChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderChainKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.groupproto.SenderChainKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.iteration = reader.uint32(); + break; + case 2: + message.seed = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderChainKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof groupproto.SenderChainKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {groupproto.SenderChainKey} SenderChainKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderChainKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderChainKey message. + * @function verify + * @memberof groupproto.SenderChainKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderChainKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.iteration != null && message.hasOwnProperty("iteration")) + if (!$util.isInteger(message.iteration)) + return "iteration: integer expected"; + if (message.seed != null && message.hasOwnProperty("seed")) + if (!(message.seed && typeof message.seed.length === "number" || $util.isString(message.seed))) + return "seed: buffer expected"; + return null; + }; + + /** + * Creates a SenderChainKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof groupproto.SenderChainKey + * @static + * @param {Object.} object Plain object + * @returns {groupproto.SenderChainKey} SenderChainKey + */ + SenderChainKey.fromObject = function fromObject(object) { + if (object instanceof $root.groupproto.SenderChainKey) + return object; + var message = new $root.groupproto.SenderChainKey(); + if (object.iteration != null) + message.iteration = object.iteration >>> 0; + if (object.seed != null) + if (typeof object.seed === "string") + $util.base64.decode(object.seed, message.seed = $util.newBuffer($util.base64.length(object.seed)), 0); + else if (object.seed.length) + message.seed = object.seed; + return message; + }; + + /** + * Creates a plain object from a SenderChainKey message. Also converts values to other types if specified. + * @function toObject + * @memberof groupproto.SenderChainKey + * @static + * @param {groupproto.SenderChainKey} message SenderChainKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderChainKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.iteration = 0; + if (options.bytes === String) + object.seed = ""; + else { + object.seed = []; + if (options.bytes !== Array) + object.seed = $util.newBuffer(object.seed); + } + } + if (message.iteration != null && message.hasOwnProperty("iteration")) + object.iteration = message.iteration; + if (message.seed != null && message.hasOwnProperty("seed")) + object.seed = options.bytes === String ? $util.base64.encode(message.seed, 0, message.seed.length) : options.bytes === Array ? Array.prototype.slice.call(message.seed) : message.seed; + return object; + }; + + /** + * Converts this SenderChainKey to JSON. + * @function toJSON + * @memberof groupproto.SenderChainKey + * @instance + * @returns {Object.} JSON object + */ + SenderChainKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderChainKey; + })(); + + groupproto.SenderMessageKey = (function() { + + /** + * Properties of a SenderMessageKey. + * @memberof groupproto + * @interface ISenderMessageKey + * @property {number|null} [iteration] SenderMessageKey iteration + * @property {Uint8Array|null} [seed] SenderMessageKey seed + */ + + /** + * Constructs a new SenderMessageKey. + * @memberof groupproto + * @classdesc Represents a SenderMessageKey. + * @implements ISenderMessageKey + * @constructor + * @param {groupproto.ISenderMessageKey=} [properties] Properties to set + */ + function SenderMessageKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderMessageKey iteration. + * @member {number} iteration + * @memberof groupproto.SenderMessageKey + * @instance + */ + SenderMessageKey.prototype.iteration = 0; + + /** + * SenderMessageKey seed. + * @member {Uint8Array} seed + * @memberof groupproto.SenderMessageKey + * @instance + */ + SenderMessageKey.prototype.seed = $util.newBuffer([]); + + /** + * Creates a new SenderMessageKey instance using the specified properties. + * @function create + * @memberof groupproto.SenderMessageKey + * @static + * @param {groupproto.ISenderMessageKey=} [properties] Properties to set + * @returns {groupproto.SenderMessageKey} SenderMessageKey instance + */ + SenderMessageKey.create = function create(properties) { + return new SenderMessageKey(properties); + }; + + /** + * Encodes the specified SenderMessageKey message. Does not implicitly {@link groupproto.SenderMessageKey.verify|verify} messages. + * @function encode + * @memberof groupproto.SenderMessageKey + * @static + * @param {groupproto.ISenderMessageKey} message SenderMessageKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderMessageKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.iteration != null && Object.hasOwnProperty.call(message, "iteration")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.iteration); + if (message.seed != null && Object.hasOwnProperty.call(message, "seed")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.seed); + return writer; + }; + + /** + * Encodes the specified SenderMessageKey message, length delimited. Does not implicitly {@link groupproto.SenderMessageKey.verify|verify} messages. + * @function encodeDelimited + * @memberof groupproto.SenderMessageKey + * @static + * @param {groupproto.ISenderMessageKey} message SenderMessageKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderMessageKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderMessageKey message from the specified reader or buffer. + * @function decode + * @memberof groupproto.SenderMessageKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {groupproto.SenderMessageKey} SenderMessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderMessageKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.groupproto.SenderMessageKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.iteration = reader.uint32(); + break; + case 2: + message.seed = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderMessageKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof groupproto.SenderMessageKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {groupproto.SenderMessageKey} SenderMessageKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderMessageKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderMessageKey message. + * @function verify + * @memberof groupproto.SenderMessageKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderMessageKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.iteration != null && message.hasOwnProperty("iteration")) + if (!$util.isInteger(message.iteration)) + return "iteration: integer expected"; + if (message.seed != null && message.hasOwnProperty("seed")) + if (!(message.seed && typeof message.seed.length === "number" || $util.isString(message.seed))) + return "seed: buffer expected"; + return null; + }; + + /** + * Creates a SenderMessageKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof groupproto.SenderMessageKey + * @static + * @param {Object.} object Plain object + * @returns {groupproto.SenderMessageKey} SenderMessageKey + */ + SenderMessageKey.fromObject = function fromObject(object) { + if (object instanceof $root.groupproto.SenderMessageKey) + return object; + var message = new $root.groupproto.SenderMessageKey(); + if (object.iteration != null) + message.iteration = object.iteration >>> 0; + if (object.seed != null) + if (typeof object.seed === "string") + $util.base64.decode(object.seed, message.seed = $util.newBuffer($util.base64.length(object.seed)), 0); + else if (object.seed.length) + message.seed = object.seed; + return message; + }; + + /** + * Creates a plain object from a SenderMessageKey message. Also converts values to other types if specified. + * @function toObject + * @memberof groupproto.SenderMessageKey + * @static + * @param {groupproto.SenderMessageKey} message SenderMessageKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderMessageKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.iteration = 0; + if (options.bytes === String) + object.seed = ""; + else { + object.seed = []; + if (options.bytes !== Array) + object.seed = $util.newBuffer(object.seed); + } + } + if (message.iteration != null && message.hasOwnProperty("iteration")) + object.iteration = message.iteration; + if (message.seed != null && message.hasOwnProperty("seed")) + object.seed = options.bytes === String ? $util.base64.encode(message.seed, 0, message.seed.length) : options.bytes === Array ? Array.prototype.slice.call(message.seed) : message.seed; + return object; + }; + + /** + * Converts this SenderMessageKey to JSON. + * @function toJSON + * @memberof groupproto.SenderMessageKey + * @instance + * @returns {Object.} JSON object + */ + SenderMessageKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderMessageKey; + })(); + + groupproto.SenderSigningKey = (function() { + + /** + * Properties of a SenderSigningKey. + * @memberof groupproto + * @interface ISenderSigningKey + * @property {Uint8Array|null} ["public"] SenderSigningKey public + * @property {Uint8Array|null} ["private"] SenderSigningKey private + */ + + /** + * Constructs a new SenderSigningKey. + * @memberof groupproto + * @classdesc Represents a SenderSigningKey. + * @implements ISenderSigningKey + * @constructor + * @param {groupproto.ISenderSigningKey=} [properties] Properties to set + */ + function SenderSigningKey(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderSigningKey public. + * @member {Uint8Array} public + * @memberof groupproto.SenderSigningKey + * @instance + */ + SenderSigningKey.prototype["public"] = $util.newBuffer([]); + + /** + * SenderSigningKey private. + * @member {Uint8Array} private + * @memberof groupproto.SenderSigningKey + * @instance + */ + SenderSigningKey.prototype["private"] = $util.newBuffer([]); + + /** + * Creates a new SenderSigningKey instance using the specified properties. + * @function create + * @memberof groupproto.SenderSigningKey + * @static + * @param {groupproto.ISenderSigningKey=} [properties] Properties to set + * @returns {groupproto.SenderSigningKey} SenderSigningKey instance + */ + SenderSigningKey.create = function create(properties) { + return new SenderSigningKey(properties); + }; + + /** + * Encodes the specified SenderSigningKey message. Does not implicitly {@link groupproto.SenderSigningKey.verify|verify} messages. + * @function encode + * @memberof groupproto.SenderSigningKey + * @static + * @param {groupproto.ISenderSigningKey} message SenderSigningKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderSigningKey.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message["public"] != null && Object.hasOwnProperty.call(message, "public")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message["public"]); + if (message["private"] != null && Object.hasOwnProperty.call(message, "private")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message["private"]); + return writer; + }; + + /** + * Encodes the specified SenderSigningKey message, length delimited. Does not implicitly {@link groupproto.SenderSigningKey.verify|verify} messages. + * @function encodeDelimited + * @memberof groupproto.SenderSigningKey + * @static + * @param {groupproto.ISenderSigningKey} message SenderSigningKey message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderSigningKey.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderSigningKey message from the specified reader or buffer. + * @function decode + * @memberof groupproto.SenderSigningKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {groupproto.SenderSigningKey} SenderSigningKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderSigningKey.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.groupproto.SenderSigningKey(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message["public"] = reader.bytes(); + break; + case 2: + message["private"] = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderSigningKey message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof groupproto.SenderSigningKey + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {groupproto.SenderSigningKey} SenderSigningKey + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderSigningKey.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderSigningKey message. + * @function verify + * @memberof groupproto.SenderSigningKey + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderSigningKey.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message["public"] != null && message.hasOwnProperty("public")) + if (!(message["public"] && typeof message["public"].length === "number" || $util.isString(message["public"]))) + return "public: buffer expected"; + if (message["private"] != null && message.hasOwnProperty("private")) + if (!(message["private"] && typeof message["private"].length === "number" || $util.isString(message["private"]))) + return "private: buffer expected"; + return null; + }; + + /** + * Creates a SenderSigningKey message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof groupproto.SenderSigningKey + * @static + * @param {Object.} object Plain object + * @returns {groupproto.SenderSigningKey} SenderSigningKey + */ + SenderSigningKey.fromObject = function fromObject(object) { + if (object instanceof $root.groupproto.SenderSigningKey) + return object; + var message = new $root.groupproto.SenderSigningKey(); + if (object["public"] != null) + if (typeof object["public"] === "string") + $util.base64.decode(object["public"], message["public"] = $util.newBuffer($util.base64.length(object["public"])), 0); + else if (object["public"].length) + message["public"] = object["public"]; + if (object["private"] != null) + if (typeof object["private"] === "string") + $util.base64.decode(object["private"], message["private"] = $util.newBuffer($util.base64.length(object["private"])), 0); + else if (object["private"].length) + message["private"] = object["private"]; + return message; + }; + + /** + * Creates a plain object from a SenderSigningKey message. Also converts values to other types if specified. + * @function toObject + * @memberof groupproto.SenderSigningKey + * @static + * @param {groupproto.SenderSigningKey} message SenderSigningKey + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderSigningKey.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object["public"] = ""; + else { + object["public"] = []; + if (options.bytes !== Array) + object["public"] = $util.newBuffer(object["public"]); + } + if (options.bytes === String) + object["private"] = ""; + else { + object["private"] = []; + if (options.bytes !== Array) + object["private"] = $util.newBuffer(object["private"]); + } + } + if (message["public"] != null && message.hasOwnProperty("public")) + object["public"] = options.bytes === String ? $util.base64.encode(message["public"], 0, message["public"].length) : options.bytes === Array ? Array.prototype.slice.call(message["public"]) : message["public"]; + if (message["private"] != null && message.hasOwnProperty("private")) + object["private"] = options.bytes === String ? $util.base64.encode(message["private"], 0, message["private"].length) : options.bytes === Array ? Array.prototype.slice.call(message["private"]) : message["private"]; + return object; + }; + + /** + * Converts this SenderSigningKey to JSON. + * @function toJSON + * @memberof groupproto.SenderSigningKey + * @instance + * @returns {Object.} JSON object + */ + SenderSigningKey.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderSigningKey; + })(); + + groupproto.SenderKeyStateStructure = (function() { + + /** + * Properties of a SenderKeyStateStructure. + * @memberof groupproto + * @interface ISenderKeyStateStructure + * @property {number|null} [senderKeyId] SenderKeyStateStructure senderKeyId + * @property {groupproto.ISenderChainKey|null} [senderChainKey] SenderKeyStateStructure senderChainKey + * @property {groupproto.ISenderSigningKey|null} [senderSigningKey] SenderKeyStateStructure senderSigningKey + * @property {Array.|null} [senderMessageKeys] SenderKeyStateStructure senderMessageKeys + */ + + /** + * Constructs a new SenderKeyStateStructure. + * @memberof groupproto + * @classdesc Represents a SenderKeyStateStructure. + * @implements ISenderKeyStateStructure + * @constructor + * @param {groupproto.ISenderKeyStateStructure=} [properties] Properties to set + */ + function SenderKeyStateStructure(properties) { + this.senderMessageKeys = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderKeyStateStructure senderKeyId. + * @member {number} senderKeyId + * @memberof groupproto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderKeyId = 0; + + /** + * SenderKeyStateStructure senderChainKey. + * @member {groupproto.ISenderChainKey|null|undefined} senderChainKey + * @memberof groupproto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderChainKey = null; + + /** + * SenderKeyStateStructure senderSigningKey. + * @member {groupproto.ISenderSigningKey|null|undefined} senderSigningKey + * @memberof groupproto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderSigningKey = null; + + /** + * SenderKeyStateStructure senderMessageKeys. + * @member {Array.} senderMessageKeys + * @memberof groupproto.SenderKeyStateStructure + * @instance + */ + SenderKeyStateStructure.prototype.senderMessageKeys = $util.emptyArray; + + /** + * Creates a new SenderKeyStateStructure instance using the specified properties. + * @function create + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {groupproto.ISenderKeyStateStructure=} [properties] Properties to set + * @returns {groupproto.SenderKeyStateStructure} SenderKeyStateStructure instance + */ + SenderKeyStateStructure.create = function create(properties) { + return new SenderKeyStateStructure(properties); + }; + + /** + * Encodes the specified SenderKeyStateStructure message. Does not implicitly {@link groupproto.SenderKeyStateStructure.verify|verify} messages. + * @function encode + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {groupproto.ISenderKeyStateStructure} message SenderKeyStateStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyStateStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.senderKeyId != null && Object.hasOwnProperty.call(message, "senderKeyId")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.senderKeyId); + if (message.senderChainKey != null && Object.hasOwnProperty.call(message, "senderChainKey")) + $root.groupproto.SenderChainKey.encode(message.senderChainKey, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.senderSigningKey != null && Object.hasOwnProperty.call(message, "senderSigningKey")) + $root.groupproto.SenderSigningKey.encode(message.senderSigningKey, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.senderMessageKeys != null && message.senderMessageKeys.length) + for (var i = 0; i < message.senderMessageKeys.length; ++i) + $root.groupproto.SenderMessageKey.encode(message.senderMessageKeys[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SenderKeyStateStructure message, length delimited. Does not implicitly {@link groupproto.SenderKeyStateStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {groupproto.ISenderKeyStateStructure} message SenderKeyStateStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyStateStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderKeyStateStructure message from the specified reader or buffer. + * @function decode + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {groupproto.SenderKeyStateStructure} SenderKeyStateStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyStateStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.groupproto.SenderKeyStateStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.senderKeyId = reader.uint32(); + break; + case 2: + message.senderChainKey = $root.groupproto.SenderChainKey.decode(reader, reader.uint32()); + break; + case 3: + message.senderSigningKey = $root.groupproto.SenderSigningKey.decode(reader, reader.uint32()); + break; + case 4: + if (!(message.senderMessageKeys && message.senderMessageKeys.length)) + message.senderMessageKeys = []; + message.senderMessageKeys.push($root.groupproto.SenderMessageKey.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderKeyStateStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {groupproto.SenderKeyStateStructure} SenderKeyStateStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyStateStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderKeyStateStructure message. + * @function verify + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderKeyStateStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.senderKeyId != null && message.hasOwnProperty("senderKeyId")) + if (!$util.isInteger(message.senderKeyId)) + return "senderKeyId: integer expected"; + if (message.senderChainKey != null && message.hasOwnProperty("senderChainKey")) { + var error = $root.groupproto.SenderChainKey.verify(message.senderChainKey); + if (error) + return "senderChainKey." + error; + } + if (message.senderSigningKey != null && message.hasOwnProperty("senderSigningKey")) { + var error = $root.groupproto.SenderSigningKey.verify(message.senderSigningKey); + if (error) + return "senderSigningKey." + error; + } + if (message.senderMessageKeys != null && message.hasOwnProperty("senderMessageKeys")) { + if (!Array.isArray(message.senderMessageKeys)) + return "senderMessageKeys: array expected"; + for (var i = 0; i < message.senderMessageKeys.length; ++i) { + var error = $root.groupproto.SenderMessageKey.verify(message.senderMessageKeys[i]); + if (error) + return "senderMessageKeys." + error; + } + } + return null; + }; + + /** + * Creates a SenderKeyStateStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {Object.} object Plain object + * @returns {groupproto.SenderKeyStateStructure} SenderKeyStateStructure + */ + SenderKeyStateStructure.fromObject = function fromObject(object) { + if (object instanceof $root.groupproto.SenderKeyStateStructure) + return object; + var message = new $root.groupproto.SenderKeyStateStructure(); + if (object.senderKeyId != null) + message.senderKeyId = object.senderKeyId >>> 0; + if (object.senderChainKey != null) { + if (typeof object.senderChainKey !== "object") + throw TypeError(".groupproto.SenderKeyStateStructure.senderChainKey: object expected"); + message.senderChainKey = $root.groupproto.SenderChainKey.fromObject(object.senderChainKey); + } + if (object.senderSigningKey != null) { + if (typeof object.senderSigningKey !== "object") + throw TypeError(".groupproto.SenderKeyStateStructure.senderSigningKey: object expected"); + message.senderSigningKey = $root.groupproto.SenderSigningKey.fromObject(object.senderSigningKey); + } + if (object.senderMessageKeys) { + if (!Array.isArray(object.senderMessageKeys)) + throw TypeError(".groupproto.SenderKeyStateStructure.senderMessageKeys: array expected"); + message.senderMessageKeys = []; + for (var i = 0; i < object.senderMessageKeys.length; ++i) { + if (typeof object.senderMessageKeys[i] !== "object") + throw TypeError(".groupproto.SenderKeyStateStructure.senderMessageKeys: object expected"); + message.senderMessageKeys[i] = $root.groupproto.SenderMessageKey.fromObject(object.senderMessageKeys[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a SenderKeyStateStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof groupproto.SenderKeyStateStructure + * @static + * @param {groupproto.SenderKeyStateStructure} message SenderKeyStateStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderKeyStateStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.senderMessageKeys = []; + if (options.defaults) { + object.senderKeyId = 0; + object.senderChainKey = null; + object.senderSigningKey = null; + } + if (message.senderKeyId != null && message.hasOwnProperty("senderKeyId")) + object.senderKeyId = message.senderKeyId; + if (message.senderChainKey != null && message.hasOwnProperty("senderChainKey")) + object.senderChainKey = $root.groupproto.SenderChainKey.toObject(message.senderChainKey, options); + if (message.senderSigningKey != null && message.hasOwnProperty("senderSigningKey")) + object.senderSigningKey = $root.groupproto.SenderSigningKey.toObject(message.senderSigningKey, options); + if (message.senderMessageKeys && message.senderMessageKeys.length) { + object.senderMessageKeys = []; + for (var j = 0; j < message.senderMessageKeys.length; ++j) + object.senderMessageKeys[j] = $root.groupproto.SenderMessageKey.toObject(message.senderMessageKeys[j], options); + } + return object; + }; + + /** + * Converts this SenderKeyStateStructure to JSON. + * @function toJSON + * @memberof groupproto.SenderKeyStateStructure + * @instance + * @returns {Object.} JSON object + */ + SenderKeyStateStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderKeyStateStructure; + })(); + + groupproto.SenderKeyRecordStructure = (function() { + + /** + * Properties of a SenderKeyRecordStructure. + * @memberof groupproto + * @interface ISenderKeyRecordStructure + * @property {Array.|null} [senderKeyStates] SenderKeyRecordStructure senderKeyStates + */ + + /** + * Constructs a new SenderKeyRecordStructure. + * @memberof groupproto + * @classdesc Represents a SenderKeyRecordStructure. + * @implements ISenderKeyRecordStructure + * @constructor + * @param {groupproto.ISenderKeyRecordStructure=} [properties] Properties to set + */ + function SenderKeyRecordStructure(properties) { + this.senderKeyStates = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SenderKeyRecordStructure senderKeyStates. + * @member {Array.} senderKeyStates + * @memberof groupproto.SenderKeyRecordStructure + * @instance + */ + SenderKeyRecordStructure.prototype.senderKeyStates = $util.emptyArray; + + /** + * Creates a new SenderKeyRecordStructure instance using the specified properties. + * @function create + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {groupproto.ISenderKeyRecordStructure=} [properties] Properties to set + * @returns {groupproto.SenderKeyRecordStructure} SenderKeyRecordStructure instance + */ + SenderKeyRecordStructure.create = function create(properties) { + return new SenderKeyRecordStructure(properties); + }; + + /** + * Encodes the specified SenderKeyRecordStructure message. Does not implicitly {@link groupproto.SenderKeyRecordStructure.verify|verify} messages. + * @function encode + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {groupproto.ISenderKeyRecordStructure} message SenderKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyRecordStructure.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.senderKeyStates != null && message.senderKeyStates.length) + for (var i = 0; i < message.senderKeyStates.length; ++i) + $root.groupproto.SenderKeyStateStructure.encode(message.senderKeyStates[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified SenderKeyRecordStructure message, length delimited. Does not implicitly {@link groupproto.SenderKeyRecordStructure.verify|verify} messages. + * @function encodeDelimited + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {groupproto.ISenderKeyRecordStructure} message SenderKeyRecordStructure message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SenderKeyRecordStructure.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SenderKeyRecordStructure message from the specified reader or buffer. + * @function decode + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {groupproto.SenderKeyRecordStructure} SenderKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyRecordStructure.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.groupproto.SenderKeyRecordStructure(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.senderKeyStates && message.senderKeyStates.length)) + message.senderKeyStates = []; + message.senderKeyStates.push($root.groupproto.SenderKeyStateStructure.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SenderKeyRecordStructure message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {groupproto.SenderKeyRecordStructure} SenderKeyRecordStructure + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SenderKeyRecordStructure.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SenderKeyRecordStructure message. + * @function verify + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SenderKeyRecordStructure.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.senderKeyStates != null && message.hasOwnProperty("senderKeyStates")) { + if (!Array.isArray(message.senderKeyStates)) + return "senderKeyStates: array expected"; + for (var i = 0; i < message.senderKeyStates.length; ++i) { + var error = $root.groupproto.SenderKeyStateStructure.verify(message.senderKeyStates[i]); + if (error) + return "senderKeyStates." + error; + } + } + return null; + }; + + /** + * Creates a SenderKeyRecordStructure message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {Object.} object Plain object + * @returns {groupproto.SenderKeyRecordStructure} SenderKeyRecordStructure + */ + SenderKeyRecordStructure.fromObject = function fromObject(object) { + if (object instanceof $root.groupproto.SenderKeyRecordStructure) + return object; + var message = new $root.groupproto.SenderKeyRecordStructure(); + if (object.senderKeyStates) { + if (!Array.isArray(object.senderKeyStates)) + throw TypeError(".groupproto.SenderKeyRecordStructure.senderKeyStates: array expected"); + message.senderKeyStates = []; + for (var i = 0; i < object.senderKeyStates.length; ++i) { + if (typeof object.senderKeyStates[i] !== "object") + throw TypeError(".groupproto.SenderKeyRecordStructure.senderKeyStates: object expected"); + message.senderKeyStates[i] = $root.groupproto.SenderKeyStateStructure.fromObject(object.senderKeyStates[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a SenderKeyRecordStructure message. Also converts values to other types if specified. + * @function toObject + * @memberof groupproto.SenderKeyRecordStructure + * @static + * @param {groupproto.SenderKeyRecordStructure} message SenderKeyRecordStructure + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + SenderKeyRecordStructure.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.senderKeyStates = []; + if (message.senderKeyStates && message.senderKeyStates.length) { + object.senderKeyStates = []; + for (var j = 0; j < message.senderKeyStates.length; ++j) + object.senderKeyStates[j] = $root.groupproto.SenderKeyStateStructure.toObject(message.senderKeyStates[j], options); + } + return object; + }; + + /** + * Converts this SenderKeyRecordStructure to JSON. + * @function toJSON + * @memberof groupproto.SenderKeyRecordStructure + * @instance + * @returns {Object.} JSON object + */ + SenderKeyRecordStructure.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SenderKeyRecordStructure; + })(); + + return groupproto; +})(); + +module.exports = $root; diff --git a/whatsapp_addon/Baileys/WASignalGroup/ciphertext_message.js b/whatsapp_addon/Baileys/WASignalGroup/ciphertext_message.js new file mode 100644 index 0000000..f9bb771 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/ciphertext_message.js @@ -0,0 +1,16 @@ +class CiphertextMessage { + UNSUPPORTED_VERSION = 1; + + CURRENT_VERSION = 3; + + WHISPER_TYPE = 2; + + PREKEY_TYPE = 3; + + SENDERKEY_TYPE = 4; + + SENDERKEY_DISTRIBUTION_TYPE = 5; + + ENCRYPTED_MESSAGE_OVERHEAD = 53; +} +module.exports = CiphertextMessage; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/generate-proto.sh b/whatsapp_addon/Baileys/WASignalGroup/generate-proto.sh new file mode 100644 index 0000000..051876d --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/generate-proto.sh @@ -0,0 +1 @@ +yarn pbjs -t static-module -w commonjs -o ./WASignalGroup/GroupProtocol.js ./WASignalGroup/group.proto \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/group.proto b/whatsapp_addon/Baileys/WASignalGroup/group.proto new file mode 100644 index 0000000..e6f549b --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/group.proto @@ -0,0 +1,42 @@ +package groupproto; + +message SenderKeyMessage { + optional uint32 id = 1; + optional uint32 iteration = 2; + optional bytes ciphertext = 3; + } + + message SenderKeyDistributionMessage { + optional uint32 id = 1; + optional uint32 iteration = 2; + optional bytes chainKey = 3; + optional bytes signingKey = 4; + } + + message SenderChainKey { + optional uint32 iteration = 1; + optional bytes seed = 2; +} + +message SenderMessageKey { + optional uint32 iteration = 1; + optional bytes seed = 2; +} + +message SenderSigningKey { + optional bytes public = 1; + optional bytes private = 2; +} + +message SenderKeyStateStructure { + + + optional uint32 senderKeyId = 1; + optional SenderChainKey senderChainKey = 2; + optional SenderSigningKey senderSigningKey = 3; + repeated SenderMessageKey senderMessageKeys = 4; +} + +message SenderKeyRecordStructure { + repeated SenderKeyStateStructure senderKeyStates = 1; +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/group_cipher.js b/whatsapp_addon/Baileys/WASignalGroup/group_cipher.js new file mode 100644 index 0000000..a10de25 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/group_cipher.js @@ -0,0 +1,106 @@ +const SenderKeyMessage = require('./sender_key_message'); +const crypto = require('libsignal/src/crypto'); + +class GroupCipher { + constructor(senderKeyStore, senderKeyName) { + this.senderKeyStore = senderKeyStore; + this.senderKeyName = senderKeyName; + } + + async encrypt(paddedPlaintext) { + try { + const record = await this.senderKeyStore.loadSenderKey(this.senderKeyName); + const senderKeyState = record.getSenderKeyState(); + const senderKey = senderKeyState.getSenderChainKey().getSenderMessageKey(); + + const ciphertext = await this.getCipherText( + senderKey.getIv(), + senderKey.getCipherKey(), + paddedPlaintext + ); + + const senderKeyMessage = new SenderKeyMessage( + senderKeyState.getKeyId(), + senderKey.getIteration(), + ciphertext, + senderKeyState.getSigningKeyPrivate() + ); + senderKeyState.setSenderChainKey(senderKeyState.getSenderChainKey().getNext()); + await this.senderKeyStore.storeSenderKey(this.senderKeyName, record); + return senderKeyMessage.serialize(); + } catch (e) { + //console.log(e.stack); + throw new Error('NoSessionException'); + } + } + + async decrypt(senderKeyMessageBytes) { + const record = await this.senderKeyStore.loadSenderKey(this.senderKeyName); + if (!record) throw new Error(`No sender key for: ${this.senderKeyName}`); + + const senderKeyMessage = new SenderKeyMessage(null, null, null, null, senderKeyMessageBytes); + + const senderKeyState = record.getSenderKeyState(senderKeyMessage.getKeyId()); + //senderKeyMessage.verifySignature(senderKeyState.getSigningKeyPublic()); + const senderKey = this.getSenderKey(senderKeyState, senderKeyMessage.getIteration()); + // senderKeyState.senderKeyStateStructure.senderSigningKey.private = + + const plaintext = await this.getPlainText( + senderKey.getIv(), + senderKey.getCipherKey(), + senderKeyMessage.getCipherText() + ); + + await this.senderKeyStore.storeSenderKey(this.senderKeyName, record); + + return plaintext; + } + + getSenderKey(senderKeyState, iteration) { + let senderChainKey = senderKeyState.getSenderChainKey(); + if (senderChainKey.getIteration() > iteration) { + if (senderKeyState.hasSenderMessageKey(iteration)) { + return senderKeyState.removeSenderMessageKey(iteration); + } + throw new Error( + `Received message with old counter: ${senderChainKey.getIteration()}, ${iteration}` + ); + } + + if (senderChainKey.getIteration() - iteration > 2000) { + throw new Error('Over 2000 messages into the future!'); + } + + while (senderChainKey.getIteration() < iteration) { + senderKeyState.addSenderMessageKey(senderChainKey.getSenderMessageKey()); + senderChainKey = senderChainKey.getNext(); + } + + senderKeyState.setSenderChainKey(senderChainKey.getNext()); + return senderChainKey.getSenderMessageKey(); + } + + getPlainText(iv, key, ciphertext) { + try { + const plaintext = crypto.decrypt(key, ciphertext, iv); + return plaintext; + } catch (e) { + //console.log(e.stack); + throw new Error('InvalidMessageException'); + } + } + + getCipherText(iv, key, plaintext) { + try { + iv = typeof iv === 'string' ? Buffer.from(iv, 'base64') : iv; + key = typeof key === 'string' ? Buffer.from(key, 'base64') : key; + const crypted = crypto.encrypt(key, Buffer.from(plaintext), iv); + return crypted; + } catch (e) { + //console.log(e.stack); + throw new Error('InvalidMessageException'); + } + } +} + +module.exports = GroupCipher; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/group_session_builder.js b/whatsapp_addon/Baileys/WASignalGroup/group_session_builder.js new file mode 100644 index 0000000..24c84a2 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/group_session_builder.js @@ -0,0 +1,46 @@ +//const utils = require('../../common/utils'); +const SenderKeyDistributionMessage = require('./sender_key_distribution_message'); + +const keyhelper = require("./keyhelper"); +class GroupSessionBuilder { + constructor(senderKeyStore) { + this.senderKeyStore = senderKeyStore; + } + + async process(senderKeyName, senderKeyDistributionMessage) { + //console.log('GroupSessionBuilder process', senderKeyName, senderKeyDistributionMessage); + const senderKeyRecord = await this.senderKeyStore.loadSenderKey(senderKeyName); + senderKeyRecord.addSenderKeyState( + senderKeyDistributionMessage.getId(), + senderKeyDistributionMessage.getIteration(), + senderKeyDistributionMessage.getChainKey(), + senderKeyDistributionMessage.getSignatureKey() + ); + await this.senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord); + } + + // [{"senderKeyId":1742199468,"senderChainKey":{"iteration":0,"seed":"yxMY9VFQcXEP34olRAcGCtsgx1XoKsHfDIh+1ea4HAQ="},"senderSigningKey":{"public":""}}] + async create(senderKeyName) { + const senderKeyRecord = await this.senderKeyStore.loadSenderKey(senderKeyName); + //console.log('GroupSessionBuilder create session', senderKeyName, senderKeyRecord); + + if (senderKeyRecord.isEmpty()) { + const keyId = keyhelper.generateSenderKeyId(); + const senderKey = keyhelper.generateSenderKey(); + const signingKey = keyhelper.generateSenderSigningKey(); + + senderKeyRecord.setSenderKeyState(keyId, 0, senderKey, signingKey); + await this.senderKeyStore.storeSenderKey(senderKeyName, senderKeyRecord); + } + + const state = senderKeyRecord.getSenderKeyState(); + + return new SenderKeyDistributionMessage( + state.getKeyId(), + state.getSenderChainKey().getIteration(), + state.getSenderChainKey().getSeed(), + state.getSigningKeyPublic() + ); + } +} +module.exports = GroupSessionBuilder; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/index.js b/whatsapp_addon/Baileys/WASignalGroup/index.js new file mode 100644 index 0000000..69b935d --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/index.js @@ -0,0 +1,5 @@ +module.exports.GroupSessionBuilder = require('./group_session_builder') +module.exports.SenderKeyDistributionMessage = require('./sender_key_distribution_message') +module.exports.SenderKeyRecord = require('./sender_key_record') +module.exports.SenderKeyName = require('./sender_key_name') +module.exports.GroupCipher = require('./group_cipher') \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/keyhelper.js b/whatsapp_addon/Baileys/WASignalGroup/keyhelper.js new file mode 100644 index 0000000..a244581 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/keyhelper.js @@ -0,0 +1,21 @@ +const curve = require('libsignal/src/curve'); +const nodeCrypto = require('crypto'); + +exports.generateSenderKey = function() { + return nodeCrypto.randomBytes(32); +} + +exports.generateSenderKeyId = function() { + return nodeCrypto.randomInt(2147483647); +} + +exports.generateSenderSigningKey = function(key) { + if (!key) { + key = curve.generateKeyPair(); + } + + return { + public: key.pubKey, + private: key.privKey, + }; +} diff --git a/whatsapp_addon/Baileys/WASignalGroup/protobufs.js b/whatsapp_addon/Baileys/WASignalGroup/protobufs.js new file mode 100644 index 0000000..76daa5c --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/protobufs.js @@ -0,0 +1,3 @@ +const { groupproto } = require('./GroupProtocol') + +module.exports = groupproto \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/readme.md b/whatsapp_addon/Baileys/WASignalGroup/readme.md new file mode 100644 index 0000000..8290d9c --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/readme.md @@ -0,0 +1,6 @@ +# Signal-Group + +This contains the code to decrypt/encrypt WA group messages. +Originally from [pokearaujo/libsignal-node](https://github.com/pokearaujo/libsignal-node) + +The code has been moved outside the signal package as I felt it didn't belong in ths signal package, as it isn't inherently a part of signal but of WA. \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/sender_chain_key.js b/whatsapp_addon/Baileys/WASignalGroup/sender_chain_key.js new file mode 100644 index 0000000..9a3125b --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/sender_chain_key.js @@ -0,0 +1,50 @@ +const SenderMessageKey = require('./sender_message_key'); +//const HKDF = require('./hkdf'); +const crypto = require('libsignal/src/crypto'); + +class SenderChainKey { + MESSAGE_KEY_SEED = Buffer.from([0x01]); + + CHAIN_KEY_SEED = Buffer.from([0x02]); + + iteration = 0; + + chainKey = Buffer.alloc(0); + + constructor(iteration, chainKey) { + this.iteration = iteration; + this.chainKey = chainKey; + } + + getIteration() { + return this.iteration; + } + + getSenderMessageKey() { + return new SenderMessageKey( + this.iteration, + this.getDerivative(this.MESSAGE_KEY_SEED, this.chainKey) + ); + } + + getNext() { + return new SenderChainKey( + this.iteration + 1, + this.getDerivative(this.CHAIN_KEY_SEED, this.chainKey) + ); + } + + getSeed() { + return typeof this.chainKey === 'string' ? Buffer.from(this.chainKey, 'base64') : this.chainKey; + } + + getDerivative(seed, key) { + key = typeof key === 'string' ? Buffer.from(key, 'base64') : key; + const hash = crypto.calculateMAC(key, seed); + //const hash = new Hash().hmac_hash(key, seed, 'sha256', ''); + + return hash; + } +} + +module.exports = SenderChainKey; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/sender_key_distribution_message.js b/whatsapp_addon/Baileys/WASignalGroup/sender_key_distribution_message.js new file mode 100644 index 0000000..9c1400f --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/sender_key_distribution_message.js @@ -0,0 +1,78 @@ +const CiphertextMessage = require('./ciphertext_message'); +const protobufs = require('./protobufs'); + +class SenderKeyDistributionMessage extends CiphertextMessage { + constructor( + id = null, + iteration = null, + chainKey = null, + signatureKey = null, + serialized = null + ) { + super(); + if (serialized) { + try { + const version = serialized[0]; + const message = serialized.slice(1); + + const distributionMessage = protobufs.SenderKeyDistributionMessage.decode( + message + ).toJSON(); + this.serialized = serialized; + this.id = distributionMessage.id; + this.iteration = distributionMessage.iteration; + this.chainKey = distributionMessage.chainKey; + this.signatureKey = distributionMessage.signingKey; + } catch (e) { + throw new Error(e); + } + } else { + const version = this.intsToByteHighAndLow(this.CURRENT_VERSION, this.CURRENT_VERSION); + this.id = id; + this.iteration = iteration; + this.chainKey = chainKey; + this.signatureKey = signatureKey; + const message = protobufs.SenderKeyDistributionMessage.encode( + protobufs.SenderKeyDistributionMessage.create({ + id, + iteration, + chainKey, + signingKey: this.signatureKey, + }) + ).finish(); + this.serialized = Buffer.concat([Buffer.from([version]), message]); + } + } + + intsToByteHighAndLow(highValue, lowValue) { + return (((highValue << 4) | lowValue) & 0xff) % 256; + } + + serialize() { + return this.serialized; + } + + getType() { + return this.SENDERKEY_DISTRIBUTION_TYPE; + } + + getIteration() { + return this.iteration; + } + + getChainKey() { + return typeof this.chainKey === 'string' ? Buffer.from(this.chainKey, 'base64') : this.chainKey; + } + + getSignatureKey() { + return typeof this.signatureKey === 'string' + ? Buffer.from(this.signatureKey, 'base64') + : this.signatureKey; + } + + getId() { + return this.id; + } +} + +module.exports = SenderKeyDistributionMessage; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/sender_key_message.js b/whatsapp_addon/Baileys/WASignalGroup/sender_key_message.js new file mode 100644 index 0000000..80683a6 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/sender_key_message.js @@ -0,0 +1,92 @@ +const CiphertextMessage = require('./ciphertext_message'); +const curve = require('libsignal/src/curve'); +const protobufs = require('./protobufs'); + +class SenderKeyMessage extends CiphertextMessage { + SIGNATURE_LENGTH = 64; + + constructor( + keyId = null, + iteration = null, + ciphertext = null, + signatureKey = null, + serialized = null + ) { + super(); + if (serialized) { + const version = serialized[0]; + const message = serialized.slice(1, serialized.length - this.SIGNATURE_LENGTH); + const signature = serialized.slice(-1 * this.SIGNATURE_LENGTH); + const senderKeyMessage = protobufs.SenderKeyMessage.decode(message).toJSON(); + senderKeyMessage.ciphertext = Buffer.from(senderKeyMessage.ciphertext, 'base64'); + + this.serialized = serialized; + this.messageVersion = (version & 0xff) >> 4; + + this.keyId = senderKeyMessage.id; + this.iteration = senderKeyMessage.iteration; + this.ciphertext = senderKeyMessage.ciphertext; + this.signature = signature; + } else { + const version = (((this.CURRENT_VERSION << 4) | this.CURRENT_VERSION) & 0xff) % 256; + ciphertext = Buffer.from(ciphertext); // .toString('base64'); + const message = protobufs.SenderKeyMessage.encode( + protobufs.SenderKeyMessage.create({ + id: keyId, + iteration, + ciphertext, + }) + ).finish(); + + const signature = this.getSignature( + signatureKey, + Buffer.concat([Buffer.from([version]), message]) + ); + this.serialized = Buffer.concat([Buffer.from([version]), message, Buffer.from(signature)]); + this.messageVersion = this.CURRENT_VERSION; + this.keyId = keyId; + this.iteration = iteration; + this.ciphertext = ciphertext; + this.signature = signature; + } + } + + getKeyId() { + return this.keyId; + } + + getIteration() { + return this.iteration; + } + + getCipherText() { + return this.ciphertext; + } + + verifySignature(signatureKey) { + const part1 = this.serialized.slice(0, this.serialized.length - this.SIGNATURE_LENGTH + 1); + const part2 = this.serialized.slice(-1 * this.SIGNATURE_LENGTH); + const res = curve.verifySignature(signatureKey, part1, part2); + if (!res) throw new Error('Invalid signature!'); + } + + getSignature(signatureKey, serialized) { + const signature = Buffer.from( + curve.calculateSignature( + signatureKey, + serialized + ) + ); + return signature; + } + + serialize() { + return this.serialized; + } + + getType() { + return 4; + } +} + +module.exports = SenderKeyMessage; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/sender_key_name.js b/whatsapp_addon/Baileys/WASignalGroup/sender_key_name.js new file mode 100644 index 0000000..e7f5290 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/sender_key_name.js @@ -0,0 +1,70 @@ +function isNull(str) { + return str === null || str.value === ''; +} + +/** + * java String hashCode 的实现 + * @param strKey + * @return intValue + */ +function intValue(num) { + const MAX_VALUE = 0x7fffffff; + const MIN_VALUE = -0x80000000; + if (num > MAX_VALUE || num < MIN_VALUE) { + // eslint-disable-next-line + return (num &= 0xffffffff); + } + return num; +} + +function hashCode(strKey) { + let hash = 0; + if (!isNull(strKey)) { + for (let i = 0; i < strKey.length; i++) { + hash = hash * 31 + strKey.charCodeAt(i); + hash = intValue(hash); + } + } + return hash; +} + +/** + * 将js页面的number类型转换为java的int类型 + * @param num + * @return intValue + */ + +class SenderKeyName { + constructor(groupId, sender) { + this.groupId = groupId; + this.sender = sender; + } + + getGroupId() { + return this.groupId; + } + + getSender() { + return this.sender; + } + + serialize() { + return `${this.groupId}::${this.sender.id}::${this.sender.deviceId}`; + } + + toString() { + return this.serialize(); + } + + equals(other) { + if (other === null) return false; + if (!(other instanceof SenderKeyName)) return false; + return this.groupId === other.groupId && this.sender.toString() === other.sender.toString(); + } + + hashCode() { + return hashCode(this.groupId) ^ hashCode(this.sender.toString()); + } +} + +module.exports = SenderKeyName; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/sender_key_record.js b/whatsapp_addon/Baileys/WASignalGroup/sender_key_record.js new file mode 100644 index 0000000..e17f290 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/sender_key_record.js @@ -0,0 +1,54 @@ +const SenderKeyState = require('./sender_key_state'); + +class SenderKeyRecord { + MAX_STATES = 5; + + constructor(serialized) { + this.senderKeyStates = []; + + if (serialized) { + const list = serialized; + for (let i = 0; i < list.length; i++) { + const structure = list[i]; + this.senderKeyStates.push( + new SenderKeyState(null, null, null, null, null, null, structure) + ); + } + } + } + + isEmpty() { + return this.senderKeyStates.length === 0; + } + + getSenderKeyState(keyId) { + if (!keyId && this.senderKeyStates.length) return this.senderKeyStates[0]; + for (let i = 0; i < this.senderKeyStates.length; i++) { + const state = this.senderKeyStates[i]; + if (state.getKeyId() === keyId) { + return state; + } + } + throw new Error(`No keys for: ${keyId}`); + } + + addSenderKeyState(id, iteration, chainKey, signatureKey) { + this.senderKeyStates.push(new SenderKeyState(id, iteration, chainKey, null, signatureKey)); + } + + setSenderKeyState(id, iteration, chainKey, keyPair) { + this.senderKeyStates.length = 0; + this.senderKeyStates.push(new SenderKeyState(id, iteration, chainKey, keyPair)); + } + + serialize() { + const recordStructure = []; + for (let i = 0; i < this.senderKeyStates.length; i++) { + const senderKeyState = this.senderKeyStates[i]; + recordStructure.push(senderKeyState.getStructure()); + } + return recordStructure; + } + } + + module.exports = SenderKeyRecord; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/sender_key_state.js b/whatsapp_addon/Baileys/WASignalGroup/sender_key_state.js new file mode 100644 index 0000000..c3e0fc9 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/sender_key_state.js @@ -0,0 +1,129 @@ +const SenderChainKey = require('./sender_chain_key'); +const SenderMessageKey = require('./sender_message_key'); + +const protobufs = require('./protobufs'); + +class SenderKeyState { + MAX_MESSAGE_KEYS = 2000; + + constructor( + id = null, + iteration = null, + chainKey = null, + signatureKeyPair = null, + signatureKeyPublic = null, + signatureKeyPrivate = null, + senderKeyStateStructure = null + ) { + if (senderKeyStateStructure) { + this.senderKeyStateStructure = senderKeyStateStructure; + } else { + if (signatureKeyPair) { + signatureKeyPublic = signatureKeyPair.public; + signatureKeyPrivate = signatureKeyPair.private; + } + + chainKey = typeof chainKey === 'string' ? Buffer.from(chainKey, 'base64') : chainKey; + this.senderKeyStateStructure = protobufs.SenderKeyStateStructure.create(); + const senderChainKeyStructure = protobufs.SenderChainKey.create(); + senderChainKeyStructure.iteration = iteration; + senderChainKeyStructure.seed = chainKey; + this.senderKeyStateStructure.senderChainKey = senderChainKeyStructure; + + const signingKeyStructure = protobufs.SenderSigningKey.create(); + signingKeyStructure.public = + typeof signatureKeyPublic === 'string' ? + Buffer.from(signatureKeyPublic, 'base64') : + signatureKeyPublic; + if (signatureKeyPrivate) { + signingKeyStructure.private = + typeof signatureKeyPrivate === 'string' ? + Buffer.from(signatureKeyPrivate, 'base64') : + signatureKeyPrivate; + } + this.senderKeyStateStructure.senderKeyId = id; + this.senderChainKey = senderChainKeyStructure; + this.senderKeyStateStructure.senderSigningKey = signingKeyStructure; + } + this.senderKeyStateStructure.senderMessageKeys = + this.senderKeyStateStructure.senderMessageKeys || []; + } + + SenderKeyState(senderKeyStateStructure) { + this.senderKeyStateStructure = senderKeyStateStructure; + } + + getKeyId() { + return this.senderKeyStateStructure.senderKeyId; + } + + getSenderChainKey() { + return new SenderChainKey( + this.senderKeyStateStructure.senderChainKey.iteration, + this.senderKeyStateStructure.senderChainKey.seed + ); + } + + setSenderChainKey(chainKey) { + const senderChainKeyStructure = protobufs.SenderChainKey.create({ + iteration: chainKey.getIteration(), + seed: chainKey.getSeed(), + }); + this.senderKeyStateStructure.senderChainKey = senderChainKeyStructure; + } + + getSigningKeyPublic() { + return typeof this.senderKeyStateStructure.senderSigningKey.public === 'string' ? + Buffer.from(this.senderKeyStateStructure.senderSigningKey.public, 'base64') : + this.senderKeyStateStructure.senderSigningKey.public; + } + + getSigningKeyPrivate() { + return typeof this.senderKeyStateStructure.senderSigningKey.private === 'string' ? + Buffer.from(this.senderKeyStateStructure.senderSigningKey.private, 'base64') : + this.senderKeyStateStructure.senderSigningKey.private; + } + + hasSenderMessageKey(iteration) { + const list = this.senderKeyStateStructure.senderMessageKeys; + for (let o = 0; o < list.length; o++) { + const senderMessageKey = list[o]; + if (senderMessageKey.iteration === iteration) return true; + } + return false; + } + + addSenderMessageKey(senderMessageKey) { + const senderMessageKeyStructure = protobufs.SenderKeyStateStructure.create({ + iteration: senderMessageKey.getIteration(), + seed: senderMessageKey.getSeed(), + }); + this.senderKeyStateStructure.senderMessageKeys.push(senderMessageKeyStructure); + + if (this.senderKeyStateStructure.senderMessageKeys.length > this.MAX_MESSAGE_KEYS) { + this.senderKeyStateStructure.senderMessageKeys.shift(); + } + } + + removeSenderMessageKey(iteration) { + let result = null; + + this.senderKeyStateStructure.senderMessageKeys = this.senderKeyStateStructure.senderMessageKeys.filter( + senderMessageKey => { + if (senderMessageKey.iteration === iteration) result = senderMessageKey; + return senderMessageKey.iteration !== iteration; + } + ); + + if (result != null) { + return new SenderMessageKey(result.iteration, result.seed); + } + return null; + } + + getStructure() { + return this.senderKeyStateStructure; + } +} + +module.exports = SenderKeyState; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/WASignalGroup/sender_message_key.js b/whatsapp_addon/Baileys/WASignalGroup/sender_message_key.js new file mode 100644 index 0000000..7639704 --- /dev/null +++ b/whatsapp_addon/Baileys/WASignalGroup/sender_message_key.js @@ -0,0 +1,39 @@ +const { deriveSecrets } = require('libsignal/src/crypto'); +class SenderMessageKey { + iteration = 0; + + iv = Buffer.alloc(0); + + cipherKey = Buffer.alloc(0); + + seed = Buffer.alloc(0); + + constructor(iteration, seed) { + const derivative = deriveSecrets(seed, Buffer.alloc(32), Buffer.from('WhisperGroup')); + const keys = new Uint8Array(32); + keys.set(new Uint8Array(derivative[0].slice(16))); + keys.set(new Uint8Array(derivative[1].slice(0, 16)), 16); + this.iv = Buffer.from(derivative[0].slice(0, 16)); + this.cipherKey = Buffer.from(keys.buffer); + + this.iteration = iteration; + this.seed = seed; + } + + getIteration() { + return this.iteration; + } + + getIv() { + return this.iv; + } + + getCipherKey() { + return this.cipherKey; + } + + getSeed() { + return this.seed; + } +} +module.exports = SenderMessageKey; \ No newline at end of file diff --git a/whatsapp_addon/Baileys/jest.config.js b/whatsapp_addon/Baileys/jest.config.js new file mode 100644 index 0000000..af9e3d4 --- /dev/null +++ b/whatsapp_addon/Baileys/jest.config.js @@ -0,0 +1,11 @@ +module.exports = { + "roots": [ + "/src" + ], + "testMatch": [ + "**/Tests/test.*.+(ts|tsx|js)", + ], + "transform": { + "^.+\\.(ts|tsx)$": "ts-jest" + }, +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/package.json b/whatsapp_addon/Baileys/package.json new file mode 100644 index 0000000..aa56ec3 --- /dev/null +++ b/whatsapp_addon/Baileys/package.json @@ -0,0 +1,94 @@ +{ + "name": "@adiwajshing/baileys", + "version": "5.0.0", + "description": "WhatsApp API", + "homepage": "https://github.com/adiwajshing/Baileys", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "keywords": [ + "whatsapp", + "js-whatsapp", + "whatsapp-api", + "whatsapp-web", + "whatsapp", + "whatsapp-chat", + "whatsapp-group", + "automation", + "multi-device" + ], + "scripts": { + "test": "jest", + "prepare": "tsc", + "build:all": "tsc && typedoc", + "build:docs": "typedoc", + "build:tsc": "tsc", + "example": "node --inspect -r ts-node/register Example/example.ts", + "gen:protobuf": "sh WAProto/GenerateStatics.sh", + "lint": "eslint ./src --ext .js,.ts,.jsx,.tsx", + "lint:fix": "eslint ./src --fix --ext .js,.ts,.jsx,.tsx" + }, + "author": "Adhiraj Singh", + "license": "MIT", + "repository": { + "url": "git@github.com:adiwajshing/baileys.git" + }, + "dependencies": { + "@hapi/boom": "^9.1.3", + "axios": "^0.24.0", + "futoin-hkdf": "^1.5.1", + "libsignal": "git+https://github.com/giuseppecastaldo/libsignal-node", + "music-metadata": "^7.12.3", + "node-cache": "^5.1.2", + "pino": "^7.0.0", + "protobufjs": "^6.11.3", + "ws": "^8.0.0" + }, + "peerDependencies": { + "@adiwajshing/keyed-db": "^0.2.4", + "jimp": "^0.16.1", + "link-preview-js": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "sharp": "^0.30.5" + }, + "peerDependenciesMeta": { + "@adiwajshing/keyed-db": { + "optional": true + }, + "jimp": { + "optional": true + }, + "qrcode-terminal": { + "optional": true + }, + "sharp": { + "optional": true + }, + "link-preview-js": { + "optional": true + } + }, + "files": [ + "lib/*", + "WAProto/*", + "WASignalGroup/*.js" + ], + "devDependencies": { + "@adiwajshing/eslint-config": "git+https://github.com/adiwajshing/eslint-config", + "@adiwajshing/keyed-db": "^0.2.4", + "@types/got": "^9.6.11", + "@types/jest": "^27.5.1", + "@types/node": "^16.0.0", + "@types/sharp": "^0.29.4", + "@types/ws": "^8.0.0", + "eslint": "^8.0.0", + "jest": "^27.0.6", + "jimp": "^0.16.1", + "link-preview-js": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "sharp": "^0.30.5", + "ts-jest": "^27.0.3", + "ts-node": "^10.8.1", + "typedoc": "^0.22.0", + "typescript": "^4.0.0" + } +} diff --git a/whatsapp_addon/Baileys/proto-extract/.gitignore b/whatsapp_addon/Baileys/proto-extract/.gitignore new file mode 100644 index 0000000..28f1ba7 --- /dev/null +++ b/whatsapp_addon/Baileys/proto-extract/.gitignore @@ -0,0 +1,2 @@ +node_modules +.DS_Store \ No newline at end of file diff --git a/whatsapp_addon/Baileys/proto-extract/README.md b/whatsapp_addon/Baileys/proto-extract/README.md new file mode 100644 index 0000000..fc9e603 --- /dev/null +++ b/whatsapp_addon/Baileys/proto-extract/README.md @@ -0,0 +1,8 @@ +# Proto Extract + +Derived initially from `whatseow`'s proto extract, this version generates a predictable diff friendly protobuf. It also does not rely on a hardcoded set of modules to look for but finds all proto modules on its own and extracts the proto from there. + +## Usage +1. Install dependencies with `yarn` (or `npm install`) +2. `yarn start` +3. The script will update `../WAProto/WAProto.proto` (except if something is broken) diff --git a/whatsapp_addon/Baileys/proto-extract/index.js b/whatsapp_addon/Baileys/proto-extract/index.js new file mode 100644 index 0000000..02dc143 --- /dev/null +++ b/whatsapp_addon/Baileys/proto-extract/index.js @@ -0,0 +1,368 @@ +const request = require('request-promise-native') +const acorn = require('acorn') +const walk = require('acorn-walk') +const fs = require('fs/promises') + +const addPrefix = (lines, prefix) => lines.map(line => prefix + line) + +const extractAllExpressions = (node) => { + const expressions = [node] + const exp = node.expression + if(exp) { + expressions.push(exp) + } + + if(node.expression?.expressions?.length) { + for(const exp of node.expression?.expressions) { + expressions.push(...extractAllExpressions(exp)) + } + } + + return expressions +} + +async function findAppModules() { + const ua = { + headers: { + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0', + 'Sec-Fetch-Dest': 'script', + 'Sec-Fetch-Mode': 'no-cors', + 'Sec-Fetch-Site': 'same-origin', + 'Referer': 'https://web.whatsapp.com/', + 'Accept': '*/*', + 'Accept-Language': 'Accept-Language: en-US,en;q=0.5', + } + } + const baseURL = 'https://web.whatsapp.com' + const index = await request.get(baseURL, ua) + const bootstrapQRID = index.match(/src="\/bootstrap_qr.([0-9a-z]{10,}).js"/)[1] + const bootstrapQRURL = baseURL + '/bootstrap_qr.' + bootstrapQRID + '.js' + + console.error('Found bootstrap_qr.js URL:', bootstrapQRURL) + + const qrData = await request.get(bootstrapQRURL, ua) + const waVersion = qrData.match(/appVersion:"(\d\.\d+\.\d+)"/)[1] + console.log('Current version:', waVersion) + // This one list of types is so long that it's split into two JavaScript declarations. + // The module finder below can't handle it, so just patch it manually here. + const patchedQrData = qrData.replace('t.ActionLinkSpec=void 0,t.TemplateButtonSpec', 't.ActionLinkSpec=t.TemplateButtonSpec') + //const patchedQrData = qrData.replace("Spec=void 0,t.", "Spec=t.") + const qrModules = acorn.parse(patchedQrData).body[0].expression.arguments[0].elements[1].properties + + const result = qrModules.filter(m => { + const hasProto = !!m.value.body.body.find(b => { + const expressions = extractAllExpressions(b) + return expressions?.find(e => e?.left?.property?.name === 'internalSpec') + }) + if(hasProto) { + return true + } + }) + + return result +} + +(async() => { + const unspecName = name => name.endsWith('Spec') ? name.slice(0, -4) : name + const unnestName = name => name.split('$').slice(-1)[0] + const getNesting = name => name.split('$').slice(0, -1).join('$') + const makeRenameFunc = () => ( + name => { + name = unspecName(name) + return name// .replaceAll('$', '__') + // return renames[name] ?? unnestName(name) + } + ) + // The constructor IDs that can be used for enum types + // const enumConstructorIDs = [76672, 54302] + + const modules = await findAppModules() + + // Sort modules so that whatsapp module id changes don't change the order in the output protobuf schema + // const modules = [] + // for (const mod of wantedModules) { + // modules.push(unsortedModules.find(node => node.key.value === mod)) + // } + + // find aliases of cross references between the wanted modules + const modulesInfo = {} + const moduleIndentationMap = {} + modules.forEach(({ key, value }) => { + const requiringParam = value.params[2].name + modulesInfo[key.value] = { crossRefs: [] } + walk.simple(value, { + VariableDeclarator(node) { + if(node.init && node.init.type === 'CallExpression' && node.init.callee.name === requiringParam && node.init.arguments.length === 1) { + modulesInfo[key.value].crossRefs.push({ alias: node.id.name, module: node.init.arguments[0].value }) + } + } + }) + }) + + // find all identifiers and, for enums, their array of values + for(const mod of modules) { + const modInfo = modulesInfo[mod.key.value] + const rename = makeRenameFunc(mod.key.value) + + // all identifiers will be initialized to "void 0" (i.e. "undefined") at the start, so capture them here + walk.ancestor(mod, { + UnaryExpression(node, anc) { + if(!modInfo.identifiers && node.operator === 'void') { + const assignments = [] + let i = 1 + anc.reverse() + while(anc[i].type === 'AssignmentExpression') { + assignments.push(anc[i++].left) + } + + const makeBlankIdent = a => { + const key = rename(a.property.name) + const indentation = getNesting(key) + const value = { name: key } + + moduleIndentationMap[key] = moduleIndentationMap[key] || { } + moduleIndentationMap[key].indentation = indentation + + if(indentation.length) { + moduleIndentationMap[indentation] = moduleIndentationMap[indentation] || { } + moduleIndentationMap[indentation].members = moduleIndentationMap[indentation].members || new Set() + moduleIndentationMap[indentation].members.add(key) + } + + return [key, value] + } + + modInfo.identifiers = Object.fromEntries(assignments.map(makeBlankIdent).reverse()) + + } + } + }) + const enumAliases = {} + // enums are defined directly, and both enums and messages get a one-letter alias + walk.simple(mod, { + VariableDeclarator(node) { + if( + node.init?.type === 'CallExpression' + // && enumConstructorIDs.includes(node.init.callee?.arguments?.[0]?.value) + && !!node.init.arguments.length + && node.init.arguments[0].type === 'ObjectExpression' + && node.init.arguments[0].properties.length + ) { + const values = node.init.arguments[0].properties.map(p => ({ + name: p.key.name, + id: p.value.value + })) + enumAliases[node.id.name] = values + } + }, + AssignmentExpression(node) { + if(node.left.type === 'MemberExpression' && modInfo.identifiers[rename(node.left.property.name)]) { + const ident = modInfo.identifiers[rename(node.left.property.name)] + ident.alias = node.right.name + // enumAliases[ident.alias] = enumAliases[ident.alias] || [] + ident.enumValues = enumAliases[ident.alias] + } + }, + }) + } + + // find the contents for all protobuf messages + for(const mod of modules) { + const modInfo = modulesInfo[mod.key.value] + const rename = makeRenameFunc(mod.key.value) + + // message specifications are stored in a "internalSpec" attribute of the respective identifier alias + walk.simple(mod, { + AssignmentExpression(node) { + if(node.left.type === 'MemberExpression' && node.left.property.name === 'internalSpec' && node.right.type === 'ObjectExpression') { + const targetIdent = Object.values(modInfo.identifiers).find(v => v.alias === node.left.object.name) + if(!targetIdent) { + console.warn(`found message specification for unknown identifier alias: ${node.left.object.name}`) + return + } + + // partition spec properties by normal members and constraints (like "__oneofs__") which will be processed afterwards + const constraints = [] + let members = [] + for(const p of node.right.properties) { + p.key.name = p.key.type === 'Identifier' ? p.key.name : p.key.value + const arr = p.key.name.substr(0, 2) === '__' ? constraints : members + arr.push(p) + } + + members = members.map(({ key: { name }, value: { elements } }) => { + let type + const flags = [] + const unwrapBinaryOr = n => (n.type === 'BinaryExpression' && n.operator === '|') ? [].concat(unwrapBinaryOr(n.left), unwrapBinaryOr(n.right)) : [n] + + // find type and flags + unwrapBinaryOr(elements[1]).forEach(m => { + if(m.type === 'MemberExpression' && m.object.type === 'MemberExpression') { + if(m.object.property.name === 'TYPES') { + type = m.property.name.toLowerCase() + } else if(m.object.property.name === 'FLAGS') { + flags.push(m.property.name.toLowerCase()) + } + } + }) + + // determine cross reference name from alias if this member has type "message" or "enum" + if(type === 'message' || type === 'enum') { + const currLoc = ` from member '${name}' of message '${targetIdent.name}'` + if(elements[2].type === 'Identifier') { + type = Object.values(modInfo.identifiers).find(v => v.alias === elements[2].name)?.name + if(!type) { + console.warn(`unable to find reference of alias '${elements[2].name}'` + currLoc) + } + } else if(elements[2].type === 'MemberExpression') { + const crossRef = modInfo.crossRefs.find(r => r.alias === elements[2].object.name) + if(crossRef && modulesInfo[crossRef.module].identifiers[rename(elements[2].property.name)]) { + type = rename(elements[2].property.name) + } else { + console.warn(`unable to find reference of alias to other module '${elements[2].object.name}' or to message ${elements[2].property.name} of this module` + currLoc) + } + } + } + + return { name, id: elements[0].value, type, flags } + }) + + // resolve constraints for members + constraints.forEach(c => { + if(c.key.name === '__oneofs__' && c.value.type === 'ObjectExpression') { + const newOneOfs = c.value.properties.map(p => ({ + name: p.key.name, + type: '__oneof__', + members: p.value.elements.map(e => { + const idx = members.findIndex(m => m.name === e.value) + const member = members[idx] + members.splice(idx, 1) + return member + }) + })) + members.push(...newOneOfs) + } + }) + + targetIdent.members = members + } + } + }) + } + + const decodedProtoMap = { } + const spaceIndent = ' '.repeat(4) + for(const mod of modules) { + const modInfo = modulesInfo[mod.key.value] + const identifiers = Object.values(modInfo.identifiers) + + // enum stringifying function + const stringifyEnum = (ident, overrideName = null) => [].concat( + [`enum ${overrideName || ident.displayName || ident.name} {`], + addPrefix(ident.enumValues.map(v => `${v.name} = ${v.id};`), spaceIndent), + ['}'] + ) + + // message specification member stringifying function + const stringifyMessageSpecMember = (info, completeFlags, parentName = undefined) => { + if(info.type === '__oneof__') { + return [].concat( + [`oneof ${info.name} {`], + addPrefix([].concat(...info.members.map(m => stringifyMessageSpecMember(m, false))), spaceIndent), + ['}'] + ) + } else { + if(info.flags.includes('packed')) { + info.flags.splice(info.flags.indexOf('packed')) + info.packed = ' [packed=true]' + } + + if(completeFlags && info.flags.length === 0) { + info.flags.push('optional') + } + + const ret = [] + const indentation = moduleIndentationMap[info.type]?.indentation + let typeName = unnestName(info.type) + if(indentation !== parentName && indentation) { + typeName = `${indentation.replaceAll('$', '.')}.${typeName}` + } + + // if(info.enumValues) { + // // typeName = unnestName(info.type) + // ret = stringifyEnum(info, typeName) + // } + + ret.push(`${info.flags.join(' ') + (info.flags.length === 0 ? '' : ' ')}${typeName} ${info.name} = ${info.id}${info.packed || ''};`) + return ret + } + } + + // message specification stringifying function + const stringifyMessageSpec = (ident) => { + const members = moduleIndentationMap[ident.name]?.members + const result = [] + result.push( + `message ${ident.displayName || ident.name} {`, + ...addPrefix([].concat(...ident.members.map(m => stringifyMessageSpecMember(m, true, ident.name))), spaceIndent), + ) + + if(members?.size) { + const sortedMembers = Array.from(members).sort() + for(const memberName of sortedMembers) { + let entity = modInfo.identifiers[memberName] + if(entity) { + const displayName = entity.name.slice(ident.name.length + 1) + entity = { ...entity, displayName } + result.push(...addPrefix(getEntity(entity), spaceIndent)) + } else { + console.log('missing nested entity ', memberName) + } + } + } + + result.push('}') + result.push('') + + return result + } + + const getEntity = (v) => { + let result + if(v.members) { + result = stringifyMessageSpec(v) + } else if(v.enumValues?.length) { + result = stringifyEnum(v) + } else { + result = ['// Unknown entity ' + v.name] + } + + return result + } + + const stringifyEntity = v => { + return { + content: getEntity(v).join('\n'), + name: v.name + } + } + + for(const value of identifiers) { + const { name, content } = stringifyEntity(value) + if(!moduleIndentationMap[name]?.indentation?.length) { + decodedProtoMap[name] = content + } + // decodedProtoMap[name] = content + } + } + + // console.log(moduleIndentationMap) + const decodedProto = Object.keys(decodedProtoMap).sort() + const sortedStr = decodedProto.map(d => decodedProtoMap[d]).join('\n') + + const decodedProtoStr = `syntax = "proto2";\npackage proto;\n\n${sortedStr}` + const destinationPath = '../WAProto/WAProto.proto' + await fs.writeFile(destinationPath, decodedProtoStr) + + console.log(`Extracted protobuf schema to "${destinationPath}"`) +})() diff --git a/whatsapp_addon/Baileys/proto-extract/package.json b/whatsapp_addon/Baileys/proto-extract/package.json new file mode 100644 index 0000000..97ed950 --- /dev/null +++ b/whatsapp_addon/Baileys/proto-extract/package.json @@ -0,0 +1,15 @@ +{ + "name": "whatsapp-web-protobuf-extractor", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "dependencies": { + "acorn": "^6.4.1", + "acorn-walk": "^6.1.1", + "request": "^2.88.0", + "request-promise-core": "^1.1.2", + "request-promise-native": "^1.0.7" + } +} diff --git a/whatsapp_addon/Baileys/proto-extract/yarn.lock b/whatsapp_addon/Baileys/proto-extract/yarn.lock new file mode 100644 index 0000000..ca6342c --- /dev/null +++ b/whatsapp_addon/Baileys/proto-extract/yarn.lock @@ -0,0 +1,357 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +acorn-walk@^6.1.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +lodash@^4.17.19: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +mime-db@1.50.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== + dependencies: + mime-db "1.50.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +request-promise-core@1.1.4, request-promise-core@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" diff --git a/whatsapp_addon/Baileys/src/Defaults/baileys-version.json b/whatsapp_addon/Baileys/src/Defaults/baileys-version.json new file mode 100644 index 0000000..71f7efc --- /dev/null +++ b/whatsapp_addon/Baileys/src/Defaults/baileys-version.json @@ -0,0 +1,3 @@ +{ + "version": [2, 2243, 7] +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Defaults/index.ts b/whatsapp_addon/Baileys/src/Defaults/index.ts new file mode 100644 index 0000000..498216d --- /dev/null +++ b/whatsapp_addon/Baileys/src/Defaults/index.ts @@ -0,0 +1,102 @@ +import { proto } from '../../WAProto' +import type { MediaType, SocketConfig } from '../Types' +import { Browsers } from '../Utils' +import logger from '../Utils/logger' +import { version } from './baileys-version.json' + +export const UNAUTHORIZED_CODES = [401, 403, 419] + +export const DEFAULT_ORIGIN = 'https://web.whatsapp.com' +export const DEF_CALLBACK_PREFIX = 'CB:' +export const DEF_TAG_PREFIX = 'TAG:' +export const PHONE_CONNECTION_CB = 'CB:Pong' + +export const WA_DEFAULT_EPHEMERAL = 7 * 24 * 60 * 60 + +export const NOISE_MODE = 'Noise_XX_25519_AESGCM_SHA256\0\0\0\0' +export const DICT_VERSION = 2 +export const KEY_BUNDLE_TYPE = Buffer.from([5]) +export const NOISE_WA_HEADER = Buffer.from( + [ 87, 65, 6, DICT_VERSION ] +) // last is "DICT_VERSION" +/** from: https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url */ +export const URL_REGEX = /(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/ +export const URL_EXCLUDE_REGEX = /.*@.*/ + +export const WA_CERT_DETAILS = { + SERIAL: 0, +} + +export const PROCESSABLE_HISTORY_TYPES = [ + proto.Message.HistorySyncNotification.HistorySyncType.INITIAL_BOOTSTRAP, + proto.Message.HistorySyncNotification.HistorySyncType.PUSH_NAME, + proto.Message.HistorySyncNotification.HistorySyncType.RECENT, + proto.Message.HistorySyncNotification.HistorySyncType.FULL +] + +export const DEFAULT_CONNECTION_CONFIG: SocketConfig = { + version: version as any, + browser: Browsers.baileys('Chrome'), + waWebSocketUrl: 'wss://web.whatsapp.com/ws/chat', + connectTimeoutMs: 20_000, + keepAliveIntervalMs: 15_000, + logger: logger.child({ class: 'baileys' }), + printQRInTerminal: false, + emitOwnEvents: true, + defaultQueryTimeoutMs: 60_000, + customUploadHosts: [], + retryRequestDelayMs: 250, + fireInitQueries: true, + auth: undefined as any, + markOnlineOnConnect: true, + syncFullHistory: false, + patchMessageBeforeSending: msg => msg, + shouldSyncHistoryMessage: () => true, + shouldIgnoreJid: () => false, + linkPreviewImageThumbnailWidth: 192, + transactionOpts: { maxCommitRetries: 10, delayBetweenTriesMs: 3000 }, + generateHighQualityLinkPreview: false, + options: { }, + appStateMacVerification: { + patch: false, + snapshot: false, + }, + getMessage: async() => undefined +} + +export const MEDIA_PATH_MAP: { [T in MediaType]?: string } = { + image: '/mms/image', + video: '/mms/video', + document: '/mms/document', + audio: '/mms/audio', + sticker: '/mms/image', + 'thumbnail-link': '/mms/image', + 'product-catalog-image': '/product/image', + 'md-app-state': '' +} + +export const MEDIA_HKDF_KEY_MAPPING = { + 'audio': 'Audio', + 'document': 'Document', + 'gif': 'Video', + 'image': 'Image', + 'ppic': '', + 'product': 'Image', + 'ptt': 'Audio', + 'sticker': 'Image', + 'video': 'Video', + 'thumbnail-document': 'Document Thumbnail', + 'thumbnail-image': 'Image Thumbnail', + 'thumbnail-video': 'Video Thumbnail', + 'thumbnail-link': 'Link Thumbnail', + 'md-msg-hist': 'History', + 'md-app-state': 'App State', + 'product-catalog-image': '', + 'payment-bg-image': 'Payment Background', +} + +export const MEDIA_KEYS = Object.keys(MEDIA_PATH_MAP) as MediaType[] + +export const MIN_PREKEY_COUNT = 5 + +export const INITIAL_PREKEY_COUNT = 30 \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Socket/business.ts b/whatsapp_addon/Baileys/src/Socket/business.ts new file mode 100644 index 0000000..457701e --- /dev/null +++ b/whatsapp_addon/Baileys/src/Socket/business.ts @@ -0,0 +1,280 @@ +import { GetCatalogOptions, ProductCreate, ProductUpdate, SocketConfig } from '../Types' +import { parseCatalogNode, parseCollectionsNode, parseOrderDetailsNode, parseProductNode, toProductNode, uploadingNecessaryImagesOfProduct } from '../Utils/business' +import { BinaryNode, jidNormalizedUser, S_WHATSAPP_NET } from '../WABinary' +import { getBinaryNodeChild } from '../WABinary/generic-utils' +import { makeMessagesRecvSocket } from './messages-recv' + +export const makeBusinessSocket = (config: SocketConfig) => { + const sock = makeMessagesRecvSocket(config) + const { + authState, + query, + waUploadToServer + } = sock + + const getCatalog = async({ jid, limit, cursor }: GetCatalogOptions) => { + jid = jid || authState.creds.me?.id + jid = jidNormalizedUser(jid!) + + const queryParamNodes: BinaryNode[] = [ + { + tag: 'limit', + attrs: { }, + content: Buffer.from((limit || 10).toString()) + }, + { + tag: 'width', + attrs: { }, + content: Buffer.from('100') + }, + { + tag: 'height', + attrs: { }, + content: Buffer.from('100') + }, + ] + + if(cursor) { + queryParamNodes.push({ + tag: 'after', + attrs: { }, + content: cursor + }) + } + + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'get', + xmlns: 'w:biz:catalog' + }, + content: [ + { + tag: 'product_catalog', + attrs: { + jid, + allow_shop_source: 'true' + }, + content: queryParamNodes + } + ] + }) + return parseCatalogNode(result) + } + + const getCollections = async(jid?: string, limit = 51) => { + jid = jid || authState.creds.me?.id + jid = jidNormalizedUser(jid!) + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'get', + xmlns: 'w:biz:catalog', + smax_id: '35' + }, + content: [ + { + tag: 'collections', + attrs: { + biz_jid: jid, + }, + content: [ + { + tag: 'collection_limit', + attrs: { }, + content: Buffer.from(limit.toString()) + }, + { + tag: 'item_limit', + attrs: { }, + content: Buffer.from(limit.toString()) + }, + { + tag: 'width', + attrs: { }, + content: Buffer.from('100') + }, + { + tag: 'height', + attrs: { }, + content: Buffer.from('100') + } + ] + } + ] + }) + + return parseCollectionsNode(result) + } + + const getOrderDetails = async(orderId: string, tokenBase64: string) => { + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'get', + xmlns: 'fb:thrift_iq', + smax_id: '5' + }, + content: [ + { + tag: 'order', + attrs: { + op: 'get', + id: orderId + }, + content: [ + { + tag: 'image_dimensions', + attrs: { }, + content: [ + { + tag: 'width', + attrs: { }, + content: Buffer.from('100') + }, + { + tag: 'height', + attrs: { }, + content: Buffer.from('100') + } + ] + }, + { + tag: 'token', + attrs: { }, + content: Buffer.from(tokenBase64) + } + ] + } + ] + }) + + return parseOrderDetailsNode(result) + } + + const productUpdate = async(productId: string, update: ProductUpdate) => { + update = await uploadingNecessaryImagesOfProduct(update, waUploadToServer) + const editNode = toProductNode(productId, update) + + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'w:biz:catalog' + }, + content: [ + { + tag: 'product_catalog_edit', + attrs: { v: '1' }, + content: [ + editNode, + { + tag: 'width', + attrs: { }, + content: '100' + }, + { + tag: 'height', + attrs: { }, + content: '100' + } + ] + } + ] + }) + + const productCatalogEditNode = getBinaryNodeChild(result, 'product_catalog_edit') + const productNode = getBinaryNodeChild(productCatalogEditNode, 'product') + + return parseProductNode(productNode!) + } + + const productCreate = async(create: ProductCreate) => { + // ensure isHidden is defined + create.isHidden = !!create.isHidden + create = await uploadingNecessaryImagesOfProduct(create, waUploadToServer) + const createNode = toProductNode(undefined, create) + + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'w:biz:catalog' + }, + content: [ + { + tag: 'product_catalog_add', + attrs: { v: '1' }, + content: [ + createNode, + { + tag: 'width', + attrs: { }, + content: '100' + }, + { + tag: 'height', + attrs: { }, + content: '100' + } + ] + } + ] + }) + + const productCatalogAddNode = getBinaryNodeChild(result, 'product_catalog_add') + const productNode = getBinaryNodeChild(productCatalogAddNode, 'product') + + return parseProductNode(productNode!) + } + + const productDelete = async(productIds: string[]) => { + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'w:biz:catalog' + }, + content: [ + { + tag: 'product_catalog_delete', + attrs: { v: '1' }, + content: productIds.map( + id => ({ + tag: 'product', + attrs: { }, + content: [ + { + tag: 'id', + attrs: { }, + content: Buffer.from(id) + } + ] + }) + ) + } + ] + }) + + const productCatalogDelNode = getBinaryNodeChild(result, 'product_catalog_delete') + return { + deleted: +(productCatalogDelNode?.attrs.deleted_count || 0) + } + } + + return { + ...sock, + getOrderDetails, + getCatalog, + getCollections, + productCreate, + productDelete, + productUpdate + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Socket/chats.ts b/whatsapp_addon/Baileys/src/Socket/chats.ts new file mode 100644 index 0000000..ee34528 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Socket/chats.ts @@ -0,0 +1,864 @@ +import { Boom } from '@hapi/boom' +import { proto } from '../../WAProto' +import { PROCESSABLE_HISTORY_TYPES } from '../Defaults' +import { ALL_WA_PATCH_NAMES, ChatModification, ChatMutation, LTHashState, MessageUpsertType, PresenceData, SocketConfig, WABusinessHoursConfig, WABusinessProfile, WAMediaUpload, WAMessage, WAPatchCreate, WAPatchName, WAPresence } from '../Types' +import { chatModificationToAppPatch, ChatMutationMap, decodePatches, decodeSyncdSnapshot, encodeSyncdPatch, extractSyncdPatches, generateProfilePicture, getHistoryMsg, newLTHashState, processSyncAction } from '../Utils' +import { makeMutex } from '../Utils/make-mutex' +import processMessage from '../Utils/process-message' +import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, jidNormalizedUser, reduceBinaryNodeToDictionary, S_WHATSAPP_NET } from '../WABinary' +import { makeSocket } from './socket' + +const MAX_SYNC_ATTEMPTS = 2 + +export const makeChatsSocket = (config: SocketConfig) => { + const { + logger, + markOnlineOnConnect, + fireInitQueries, + appStateMacVerification, + shouldIgnoreJid, + shouldSyncHistoryMessage, + } = config + const sock = makeSocket(config) + const { + ev, + ws, + authState, + generateMessageTag, + sendNode, + query, + onUnexpectedError, + } = sock + + let privacySettings: { [_: string]: string } | undefined + let needToFlushWithAppStateSync = false + let pendingAppStateSync = false + /** this mutex ensures that the notifications (receipts, messages etc.) are processed in order */ + const processingMutex = makeMutex() + + /** helper function to fetch the given app state sync key */ + const getAppStateSyncKey = async(keyId: string) => { + const { [keyId]: key } = await authState.keys.get('app-state-sync-key', [keyId]) + return key + } + + const fetchPrivacySettings = async(force: boolean = false) => { + if(!privacySettings || force) { + const { content } = await query({ + tag: 'iq', + attrs: { + xmlns: 'privacy', + to: S_WHATSAPP_NET, + type: 'get' + }, + content: [ + { tag: 'privacy', attrs: { } } + ] + }) + privacySettings = reduceBinaryNodeToDictionary(content?.[0] as BinaryNode, 'category') + } + + return privacySettings + } + + /** helper function to run a generic IQ query */ + const interactiveQuery = async(userNodes: BinaryNode[], queryNode: BinaryNode) => { + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'get', + xmlns: 'usync', + }, + content: [ + { + tag: 'usync', + attrs: { + sid: generateMessageTag(), + mode: 'query', + last: 'true', + index: '0', + context: 'interactive', + }, + content: [ + { + tag: 'query', + attrs: { }, + content: [ queryNode ] + }, + { + tag: 'list', + attrs: { }, + content: userNodes + } + ] + } + ], + }) + + const usyncNode = getBinaryNodeChild(result, 'usync') + const listNode = getBinaryNodeChild(usyncNode, 'list') + const users = getBinaryNodeChildren(listNode, 'user') + + return users + } + + const onWhatsApp = async(...jids: string[]) => { + const results = await interactiveQuery( + [ + { + tag: 'user', + attrs: { }, + content: jids.map( + jid => ({ + tag: 'contact', + attrs: { }, + content: `+${jid}` + }) + ) + } + ], + { tag: 'contact', attrs: { } } + ) + + return results.map(user => { + const contact = getBinaryNodeChild(user, 'contact') + return { exists: contact?.attrs.type === 'in', jid: user.attrs.jid } + }).filter(item => item.exists) + } + + const fetchStatus = async(jid: string) => { + const [result] = await interactiveQuery( + [{ tag: 'user', attrs: { jid } }], + { tag: 'status', attrs: { } } + ) + if(result) { + const status = getBinaryNodeChild(result, 'status') + return { + status: status?.content!.toString(), + setAt: new Date(+(status?.attrs.t || 0) * 1000) + } + } + } + + /** update the profile picture for yourself or a group */ + const updateProfilePicture = async(jid: string, content: WAMediaUpload) => { + const { img } = await generateProfilePicture(content) + await query({ + tag: 'iq', + attrs: { + to: jidNormalizedUser(jid), + type: 'set', + xmlns: 'w:profile:picture' + }, + content: [ + { + tag: 'picture', + attrs: { type: 'image' }, + content: img + } + ] + }) + } + + /** update the profile status for yourself */ + const updateProfileStatus = async(status: string) => { + await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'status' + }, + content: [ + { + tag: 'status', + attrs: { }, + content: Buffer.from(status, 'utf-8') + } + ] + }) + } + + const updateProfileName = async(name: string) => { + await chatModify({ pushNameSetting: name }, '') + } + + const fetchBlocklist = async() => { + const result = await query({ + tag: 'iq', + attrs: { + xmlns: 'blocklist', + to: S_WHATSAPP_NET, + type: 'get' + } + }) + + const listNode = getBinaryNodeChild(result, 'list') + return getBinaryNodeChildren(listNode, 'item') + .map(n => n.attrs.jid) + } + + const updateBlockStatus = async(jid: string, action: 'block' | 'unblock') => { + await query({ + tag: 'iq', + attrs: { + xmlns: 'blocklist', + to: S_WHATSAPP_NET, + type: 'set' + }, + content: [ + { + tag: 'item', + attrs: { + action, + jid + } + } + ] + }) + } + + const getBusinessProfile = async(jid: string): Promise => { + const results = await query({ + tag: 'iq', + attrs: { + to: 's.whatsapp.net', + xmlns: 'w:biz', + type: 'get' + }, + content: [{ + tag: 'business_profile', + attrs: { v: '244' }, + content: [{ + tag: 'profile', + attrs: { jid } + }] + }] + }) + + const profileNode = getBinaryNodeChild(results, 'business_profile') + const profiles = getBinaryNodeChild(profileNode, 'profile') + if(profiles) { + const address = getBinaryNodeChild(profiles, 'address') + const description = getBinaryNodeChild(profiles, 'description') + const website = getBinaryNodeChild(profiles, 'website') + const email = getBinaryNodeChild(profiles, 'email') + const category = getBinaryNodeChild(getBinaryNodeChild(profiles, 'categories'), 'category') + const business_hours = getBinaryNodeChild(profiles, 'business_hours') + const business_hours_config = business_hours && getBinaryNodeChildren(business_hours, 'business_hours_config') + const websiteStr = website?.content?.toString() + return { + wid: profiles.attrs?.jid, + address: address?.content?.toString(), + description: description?.content?.toString() || '', + website: websiteStr ? [websiteStr] : [], + email: email?.content?.toString(), + category: category?.content?.toString(), + business_hours: { + timezone: business_hours?.attrs?.timezone, + business_config: business_hours_config?.map(({ attrs }) => attrs as unknown as WABusinessHoursConfig) + } + } + } + } + + const updateAccountSyncTimestamp = async(fromTimestamp: number | string) => { + logger.info({ fromTimestamp }, 'requesting account sync') + await sendNode({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'urn:xmpp:whatsapp:dirty', + id: generateMessageTag(), + }, + content: [ + { + tag: 'clean', + attrs: { + type: 'account_sync', + timestamp: fromTimestamp.toString(), + } + } + ] + }) + } + + const newAppStateChunkHandler = (isInitialSync: boolean) => { + return { + onMutation(mutation: ChatMutation) { + processSyncAction( + mutation, + ev, + authState.creds.me!, + isInitialSync ? { accountSettings: authState.creds.accountSettings } : undefined, + logger + ) + } + } + } + + const resyncAppState = ev.createBufferedFunction(async(collections: readonly WAPatchName[], isInitialSync: boolean) => { + // we use this to determine which events to fire + // otherwise when we resync from scratch -- all notifications will fire + const initialVersionMap: { [T in WAPatchName]?: number } = { } + const globalMutationMap: ChatMutationMap = { } + + await authState.keys.transaction( + async() => { + const collectionsToHandle = new Set(collections) + // in case something goes wrong -- ensure we don't enter a loop that cannot be exited from + const attemptsMap: { [T in WAPatchName]?: number } = { } + // keep executing till all collections are done + // sometimes a single patch request will not return all the patches (God knows why) + // so we fetch till they're all done (this is determined by the "has_more_patches" flag) + while(collectionsToHandle.size) { + const states = { } as { [T in WAPatchName]: LTHashState } + const nodes: BinaryNode[] = [] + + for(const name of collectionsToHandle) { + const result = await authState.keys.get('app-state-sync-version', [name]) + let state = result[name] + + if(state) { + if(typeof initialVersionMap[name] === 'undefined') { + initialVersionMap[name] = state.version + } + } else { + state = newLTHashState() + } + + states[name] = state + + logger.info(`resyncing ${name} from v${state.version}`) + + nodes.push({ + tag: 'collection', + attrs: { + name, + version: state.version.toString(), + // return snapshot if being synced from scratch + return_snapshot: (!state.version).toString() + } + }) + } + + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + xmlns: 'w:sync:app:state', + type: 'set' + }, + content: [ + { + tag: 'sync', + attrs: { }, + content: nodes + } + ] + }) + + // extract from binary node + const decoded = await extractSyncdPatches(result, config?.options) + for(const key in decoded) { + const name = key as WAPatchName + const { patches, hasMorePatches, snapshot } = decoded[name] + try { + if(snapshot) { + const { state: newState, mutationMap } = await decodeSyncdSnapshot( + name, + snapshot, + getAppStateSyncKey, + initialVersionMap[name], + appStateMacVerification.snapshot + ) + states[name] = newState + Object.assign(globalMutationMap, mutationMap) + + logger.info(`restored state of ${name} from snapshot to v${newState.version} with mutations`) + + await authState.keys.set({ 'app-state-sync-version': { [name]: newState } }) + } + + // only process if there are syncd patches + if(patches.length) { + const { state: newState, mutationMap } = await decodePatches( + name, + patches, + states[name], + getAppStateSyncKey, + config.options, + initialVersionMap[name], + logger, + appStateMacVerification.patch + ) + + await authState.keys.set({ 'app-state-sync-version': { [name]: newState } }) + + logger.info(`synced ${name} to v${newState.version}`) + initialVersionMap[name] = newState.version + + Object.assign(globalMutationMap, mutationMap) + } + + if(hasMorePatches) { + logger.info(`${name} has more patches...`) + } else { // collection is done with sync + collectionsToHandle.delete(name) + } + } catch(error) { + // if retry attempts overshoot + // or key not found + const isIrrecoverableError = attemptsMap[name]! >= MAX_SYNC_ATTEMPTS + || error.output?.statusCode === 404 + || error.name === 'TypeError' + logger.info( + { name, error: error.stack }, + `failed to sync state from version${isIrrecoverableError ? '' : ', removing and trying from scratch'}` + ) + await authState.keys.set({ 'app-state-sync-version': { [name]: null } }) + // increment number of retries + attemptsMap[name] = (attemptsMap[name] || 0) + 1 + + if(isIrrecoverableError) { + // stop retrying + collectionsToHandle.delete(name) + } + } + } + } + } + ) + + const { onMutation } = newAppStateChunkHandler(isInitialSync) + for(const key in globalMutationMap) { + onMutation(globalMutationMap[key]) + } + }) + + /** + * fetch the profile picture of a user/group + * type = "preview" for a low res picture + * type = "image for the high res picture" + */ + const profilePictureUrl = async(jid: string, type: 'preview' | 'image' = 'preview', timeoutMs?: number) => { + jid = jidNormalizedUser(jid) + const result = await query({ + tag: 'iq', + attrs: { + to: jid, + type: 'get', + xmlns: 'w:profile:picture' + }, + content: [ + { tag: 'picture', attrs: { type, query: 'url' } } + ] + }, timeoutMs) + const child = getBinaryNodeChild(result, 'picture') + return child?.attrs?.url + } + + const sendPresenceUpdate = async(type: WAPresence, toJid?: string) => { + const me = authState.creds.me! + if(type === 'available' || type === 'unavailable') { + if(!me!.name) { + logger.warn('no name present, ignoring presence update request...') + return + } + + ev.emit('connection.update', { isOnline: type === 'available' }) + + await sendNode({ + tag: 'presence', + attrs: { + name: me!.name, + type + } + }) + } else { + await sendNode({ + tag: 'chatstate', + attrs: { + from: me!.id!, + to: toJid!, + }, + content: [ + { + tag: type === 'recording' ? 'composing' : type, + attrs: type === 'recording' ? { media : 'audio' } : {} + } + ] + }) + } + } + + /** + * @param toJid the jid to subscribe to + * @param tcToken token for subscription, use if present + */ + const presenceSubscribe = (toJid: string, tcToken?: Buffer) => ( + sendNode({ + tag: 'presence', + attrs: { + to: toJid, + id: generateMessageTag(), + type: 'subscribe' + }, + content: tcToken + ? [ + { + tag: 'tctoken', + attrs: { }, + content: tcToken + } + ] + : undefined + }) + ) + + const handlePresenceUpdate = ({ tag, attrs, content }: BinaryNode) => { + let presence: PresenceData | undefined + const jid = attrs.from + const participant = attrs.participant || attrs.from + + if(shouldIgnoreJid(jid)) { + return + } + + if(tag === 'presence') { + presence = { + lastKnownPresence: attrs.type === 'unavailable' ? 'unavailable' : 'available', + lastSeen: attrs.last && attrs.last !== 'deny' ? +attrs.last : undefined + } + } else if(Array.isArray(content)) { + const [firstChild] = content + let type = firstChild.tag as WAPresence + if(type === 'paused') { + type = 'available' + } + + if(firstChild.attrs?.media === 'audio') { + type = 'recording' + } + + presence = { lastKnownPresence: type } + } else { + logger.error({ tag, attrs, content }, 'recv invalid presence node') + } + + if(presence) { + ev.emit('presence.update', { id: jid, presences: { [participant]: presence } }) + } + } + + const appPatch = async(patchCreate: WAPatchCreate) => { + const name = patchCreate.type + const myAppStateKeyId = authState.creds.myAppStateKeyId + if(!myAppStateKeyId) { + throw new Boom('App state key not present!', { statusCode: 400 }) + } + + let initial: LTHashState + let encodeResult: { patch: proto.ISyncdPatch, state: LTHashState } + + await processingMutex.mutex( + async() => { + await authState.keys.transaction( + async() => { + logger.debug({ patch: patchCreate }, 'applying app patch') + + await resyncAppState([name], false) + + const { [name]: currentSyncVersion } = await authState.keys.get('app-state-sync-version', [name]) + initial = currentSyncVersion || newLTHashState() + + encodeResult = await encodeSyncdPatch( + patchCreate, + myAppStateKeyId, + initial, + getAppStateSyncKey, + ) + const { patch, state } = encodeResult + + const node: BinaryNode = { + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'w:sync:app:state' + }, + content: [ + { + tag: 'sync', + attrs: { }, + content: [ + { + tag: 'collection', + attrs: { + name, + version: (state.version - 1).toString(), + return_snapshot: 'false' + }, + content: [ + { + tag: 'patch', + attrs: { }, + content: proto.SyncdPatch.encode(patch).finish() + } + ] + } + ] + } + ] + } + await query(node) + + await authState.keys.set({ 'app-state-sync-version': { [name]: state } }) + } + ) + } + ) + + if(config.emitOwnEvents) { + const { onMutation } = newAppStateChunkHandler(false) + const { mutationMap } = await decodePatches( + name, + [{ ...encodeResult!.patch, version: { version: encodeResult!.state.version }, }], + initial!, + getAppStateSyncKey, + config.options, + undefined, + logger, + ) + for(const key in mutationMap) { + onMutation(mutationMap[key]) + } + } + } + + /** sending abt props may fix QR scan fail if server expects */ + const fetchAbt = async() => { + const abtNode = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + xmlns: 'abt', + type: 'get', + }, + content: [ + { tag: 'props', attrs: { protocol: '1' } } + ] + }) + + const propsNode = getBinaryNodeChild(abtNode, 'props') + + let props: { [_: string]: string } = { } + if(propsNode) { + props = reduceBinaryNodeToDictionary(propsNode, 'prop') + } + + logger.debug('fetched abt') + + return props + } + + /** sending non-abt props may fix QR scan fail if server expects */ + const fetchProps = async() => { + const resultNode = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + xmlns: 'w', + type: 'get', + }, + content: [ + { tag: 'props', attrs: { } } + ] + }) + + const propsNode = getBinaryNodeChild(resultNode, 'props') + + let props: { [_: string]: string } = { } + if(propsNode) { + props = reduceBinaryNodeToDictionary(propsNode, 'prop') + } + + logger.debug('fetched props') + + return props + } + + /** + * modify a chat -- mark unread, read etc. + * lastMessages must be sorted in reverse chronologically + * requires the last messages till the last message received; required for archive & unread + */ + const chatModify = (mod: ChatModification, jid: string) => { + const patch = chatModificationToAppPatch(mod, jid) + return appPatch(patch) + } + + /** + * queries need to be fired on connection open + * help ensure parity with WA Web + * */ + const executeInitQueries = async() => { + await Promise.all([ + fetchAbt(), + fetchProps(), + fetchBlocklist(), + fetchPrivacySettings(), + ]) + } + + const upsertMessage = ev.createBufferedFunction(async(msg: WAMessage, type: MessageUpsertType) => { + ev.emit('messages.upsert', { messages: [msg], type }) + + if(!!msg.pushName) { + let jid = msg.key.fromMe ? authState.creds.me!.id : (msg.key.participant || msg.key.remoteJid) + jid = jidNormalizedUser(jid!) + + if(!msg.key.fromMe) { + ev.emit('contacts.update', [{ id: jid, notify: msg.pushName, verifiedName: msg.verifiedBizName! }]) + } + + // update our pushname too + if(msg.key.fromMe && msg.pushName && authState.creds.me?.name !== msg.pushName) { + ev.emit('creds.update', { me: { ...authState.creds.me!, name: msg.pushName! } }) + } + } + + const historyMsg = getHistoryMsg(msg.message!) + const shouldProcessHistoryMsg = historyMsg + ? ( + shouldSyncHistoryMessage(historyMsg) + && PROCESSABLE_HISTORY_TYPES.includes(historyMsg.syncType!) + ) + : false + + if(historyMsg && !authState.creds.myAppStateKeyId) { + logger.warn('skipping app state sync, as myAppStateKeyId is not set') + pendingAppStateSync = true + } + + await Promise.all([ + (async() => { + if( + historyMsg + && authState.creds.myAppStateKeyId + ) { + pendingAppStateSync = false + await doAppStateSync() + } + })(), + processMessage( + msg, + { + shouldProcessHistoryMsg, + ev, + creds: authState.creds, + keyStore: authState.keys, + logger, + options: config.options, + } + ) + ]) + + if( + msg.message?.protocolMessage?.appStateSyncKeyShare + && pendingAppStateSync + ) { + await doAppStateSync() + pendingAppStateSync = false + } + + async function doAppStateSync() { + if(!authState.creds.accountSyncCounter) { + logger.info('doing initial app state sync') + await resyncAppState(ALL_WA_PATCH_NAMES, true) + + const accountSyncCounter = (authState.creds.accountSyncCounter || 0) + 1 + ev.emit('creds.update', { accountSyncCounter }) + + if(needToFlushWithAppStateSync) { + logger.debug('flushing with app state sync') + ev.flush() + } + } + } + }) + + ws.on('CB:presence', handlePresenceUpdate) + ws.on('CB:chatstate', handlePresenceUpdate) + + ws.on('CB:ib,,dirty', async(node: BinaryNode) => { + const { attrs } = getBinaryNodeChild(node, 'dirty')! + const type = attrs.type + switch (type) { + case 'account_sync': + if(attrs.timestamp) { + let { lastAccountSyncTimestamp } = authState.creds + if(lastAccountSyncTimestamp) { + await updateAccountSyncTimestamp(lastAccountSyncTimestamp) + } + + lastAccountSyncTimestamp = +attrs.timestamp + ev.emit('creds.update', { lastAccountSyncTimestamp }) + } + + break + default: + logger.info({ node }, 'received unknown sync') + break + } + }) + + ev.on('connection.update', ({ connection, receivedPendingNotifications }) => { + if(connection === 'open') { + if(fireInitQueries) { + executeInitQueries() + .catch( + error => onUnexpectedError(error, 'init queries') + ) + } + + sendPresenceUpdate(markOnlineOnConnect ? 'available' : 'unavailable') + .catch( + error => onUnexpectedError(error, 'presence update requests') + ) + } + + if(receivedPendingNotifications) { + // if we don't have the app state key + // we keep buffering events until we finally have + // the key and can sync the messages + if(!authState.creds?.myAppStateKeyId) { + ev.buffer() + needToFlushWithAppStateSync = true + } + } + }) + + return { + ...sock, + processingMutex, + fetchPrivacySettings, + upsertMessage, + appPatch, + sendPresenceUpdate, + presenceSubscribe, + profilePictureUrl, + onWhatsApp, + fetchBlocklist, + fetchStatus, + updateProfilePicture, + updateProfileStatus, + updateProfileName, + updateBlockStatus, + getBusinessProfile, + resyncAppState, + chatModify + } +} diff --git a/whatsapp_addon/Baileys/src/Socket/groups.ts b/whatsapp_addon/Baileys/src/Socket/groups.ts new file mode 100644 index 0000000..1c8dbcd --- /dev/null +++ b/whatsapp_addon/Baileys/src/Socket/groups.ts @@ -0,0 +1,288 @@ +import { proto } from '../../WAProto' +import { GroupMetadata, ParticipantAction, SocketConfig, WAMessageKey, WAMessageStubType } from '../Types' +import { generateMessageID, unixTimestampSeconds } from '../Utils' +import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString, jidEncode, jidNormalizedUser } from '../WABinary' +import { makeChatsSocket } from './chats' + +export const makeGroupsSocket = (config: SocketConfig) => { + const sock = makeChatsSocket(config) + const { authState, ev, query, upsertMessage } = sock + + const groupQuery = async(jid: string, type: 'get' | 'set', content: BinaryNode[]) => ( + query({ + tag: 'iq', + attrs: { + type, + xmlns: 'w:g2', + to: jid, + }, + content + }) + ) + + const groupMetadata = async(jid: string) => { + const result = await groupQuery( + jid, + 'get', + [ { tag: 'query', attrs: { request: 'interactive' } } ] + ) + return extractGroupMetadata(result) + } + + return { + ...sock, + groupMetadata, + groupCreate: async(subject: string, participants: string[]) => { + const key = generateMessageID() + const result = await groupQuery( + '@g.us', + 'set', + [ + { + tag: 'create', + attrs: { + subject, + key + }, + content: participants.map(jid => ({ + tag: 'participant', + attrs: { jid } + })) + } + ] + ) + return extractGroupMetadata(result) + }, + groupLeave: async(id: string) => { + await groupQuery( + '@g.us', + 'set', + [ + { + tag: 'leave', + attrs: { }, + content: [ + { tag: 'group', attrs: { id } } + ] + } + ] + ) + }, + groupUpdateSubject: async(jid: string, subject: string) => { + await groupQuery( + jid, + 'set', + [ + { + tag: 'subject', + attrs: { }, + content: Buffer.from(subject, 'utf-8') + } + ] + ) + }, + groupParticipantsUpdate: async( + jid: string, + participants: string[], + action: ParticipantAction + ) => { + const result = await groupQuery( + jid, + 'set', + [ + { + tag: action, + attrs: { }, + content: participants.map(jid => ({ + tag: 'participant', + attrs: { jid } + })) + } + ] + ) + const node = getBinaryNodeChild(result, action) + const participantsAffected = getBinaryNodeChildren(node!, 'participant') + return participantsAffected.map(p => { + return { status: p.attrs.error || '200', jid: p.attrs.jid } + }) + }, + groupUpdateDescription: async(jid: string, description?: string) => { + const metadata = await groupMetadata(jid) + const prev = metadata.descId ?? null + + await groupQuery( + jid, + 'set', + [ + { + tag: 'description', + attrs: { + ...(description ? { id: generateMessageID() } : { delete: 'true' }), + ...(prev ? { prev } : {}) + }, + content: description ? [ + { tag: 'body', attrs: {}, content: Buffer.from(description, 'utf-8') } + ] : undefined + } + ] + ) + }, + groupInviteCode: async(jid: string) => { + const result = await groupQuery(jid, 'get', [{ tag: 'invite', attrs: {} }]) + const inviteNode = getBinaryNodeChild(result, 'invite') + return inviteNode?.attrs.code + }, + groupRevokeInvite: async(jid: string) => { + const result = await groupQuery(jid, 'set', [{ tag: 'invite', attrs: {} }]) + const inviteNode = getBinaryNodeChild(result, 'invite') + return inviteNode?.attrs.code + }, + groupAcceptInvite: async(code: string) => { + const results = await groupQuery('@g.us', 'set', [{ tag: 'invite', attrs: { code } }]) + const result = getBinaryNodeChild(results, 'group') + return result?.attrs.jid + }, + /** + * accept a GroupInviteMessage + * @param key the key of the invite message, or optionally only provide the jid of the person who sent the invite + * @param inviteMessage the message to accept + */ + groupAcceptInviteV4: ev.createBufferedFunction(async(key: string | WAMessageKey, inviteMessage: proto.Message.IGroupInviteMessage) => { + key = typeof key === 'string' ? { remoteJid: key } : key + const results = await groupQuery(inviteMessage.groupJid!, 'set', [{ + tag: 'accept', + attrs: { + code: inviteMessage.inviteCode!, + expiration: inviteMessage.inviteExpiration!.toString(), + admin: key.remoteJid! + } + }]) + + // if we have the full message key + // update the invite message to be expired + if(key.id) { + // create new invite message that is expired + inviteMessage = proto.Message.GroupInviteMessage.fromObject(inviteMessage) + inviteMessage.inviteExpiration = 0 + inviteMessage.inviteCode = '' + ev.emit('messages.update', [ + { + key, + update: { + message: { + groupInviteMessage: inviteMessage + } + } + } + ]) + } + + // generate the group add message + await upsertMessage( + { + key: { + remoteJid: inviteMessage.groupJid, + id: generateMessageID(), + fromMe: false, + participant: key.remoteJid, + }, + messageStubType: WAMessageStubType.GROUP_PARTICIPANT_ADD, + messageStubParameters: [ + authState.creds.me!.id + ], + participant: key.remoteJid, + messageTimestamp: unixTimestampSeconds() + }, + 'notify' + ) + + return results.attrs.from + }), + groupGetInviteInfo: async(code: string) => { + const results = await groupQuery('@g.us', 'get', [{ tag: 'invite', attrs: { code } }]) + return extractGroupMetadata(results) + }, + groupToggleEphemeral: async(jid: string, ephemeralExpiration: number) => { + const content: BinaryNode = ephemeralExpiration ? + { tag: 'ephemeral', attrs: { expiration: ephemeralExpiration.toString() } } : + { tag: 'not_ephemeral', attrs: { } } + await groupQuery(jid, 'set', [content]) + }, + groupSettingUpdate: async(jid: string, setting: 'announcement' | 'not_announcement' | 'locked' | 'unlocked') => { + await groupQuery(jid, 'set', [ { tag: setting, attrs: { } } ]) + }, + groupFetchAllParticipating: async() => { + const result = await query({ + tag: 'iq', + attrs: { + to: '@g.us', + xmlns: 'w:g2', + type: 'get', + }, + content: [ + { + tag: 'participating', + attrs: { }, + content: [ + { tag: 'participants', attrs: { } }, + { tag: 'description', attrs: { } } + ] + } + ] + }) + const data: { [_: string]: GroupMetadata } = { } + const groupsChild = getBinaryNodeChild(result, 'groups') + if(groupsChild) { + const groups = getBinaryNodeChildren(groupsChild, 'group') + for(const groupNode of groups) { + const meta = extractGroupMetadata({ + tag: 'result', + attrs: { }, + content: [groupNode] + }) + data[meta.id] = meta + } + } + + return data + } + } +} + + +export const extractGroupMetadata = (result: BinaryNode) => { + const group = getBinaryNodeChild(result, 'group')! + const descChild = getBinaryNodeChild(group, 'description') + let desc: string | undefined + let descId: string | undefined + if(descChild) { + desc = getBinaryNodeChildString(descChild, 'body') + descId = descChild.attrs.id + } + + const groupId = group.attrs.id.includes('@') ? group.attrs.id : jidEncode(group.attrs.id, 'g.us') + const eph = getBinaryNodeChild(group, 'ephemeral')?.attrs.expiration + const metadata: GroupMetadata = { + id: groupId, + subject: group.attrs.subject, + subjectOwner: group.attrs.s_o, + subjectTime: +group.attrs.s_t, + size: +group.attrs.size, + creation: +group.attrs.creation, + owner: group.attrs.creator ? jidNormalizedUser(group.attrs.creator) : undefined, + desc, + descId, + restrict: !!getBinaryNodeChild(group, 'locked'), + announce: !!getBinaryNodeChild(group, 'announcement'), + participants: getBinaryNodeChildren(group, 'participant').map( + ({ attrs }) => { + return { + id: attrs.jid, + admin: attrs.type || null as any, + } + } + ), + ephemeralDuration: eph ? +eph : undefined + } + return metadata +} diff --git a/whatsapp_addon/Baileys/src/Socket/index.ts b/whatsapp_addon/Baileys/src/Socket/index.ts new file mode 100644 index 0000000..7efebf0 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Socket/index.ts @@ -0,0 +1,13 @@ +import { DEFAULT_CONNECTION_CONFIG } from '../Defaults' +import { UserFacingSocketConfig } from '../Types' +import { makeBusinessSocket as _makeSocket } from './business' + +// export the last socket layer +const makeWASocket = (config: UserFacingSocketConfig) => ( + _makeSocket({ + ...DEFAULT_CONNECTION_CONFIG, + ...config + }) +) + +export default makeWASocket \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Socket/messages-recv.ts b/whatsapp_addon/Baileys/src/Socket/messages-recv.ts new file mode 100644 index 0000000..7310b4d --- /dev/null +++ b/whatsapp_addon/Baileys/src/Socket/messages-recv.ts @@ -0,0 +1,734 @@ + +import { proto } from '../../WAProto' +import { KEY_BUNDLE_TYPE, MIN_PREKEY_COUNT } from '../Defaults' +import { MessageReceiptType, MessageRelayOptions, MessageUserReceipt, SocketConfig, WACallEvent, WAMessageKey, WAMessageStubType, WAPatchName } from '../Types' +import { decodeMediaRetryNode, decodeMessageStanza, delay, encodeBigEndian, encodeSignedDeviceIdentity, getCallStatusFromNode, getHistoryMsg, getNextPreKeys, getStatusFromReceiptType, unixTimestampSeconds, xmppPreKey, xmppSignedPreKey } from '../Utils' +import { makeMutex } from '../Utils/make-mutex' +import { cleanMessage } from '../Utils/process-message' +import { areJidsSameUser, BinaryNode, getAllBinaryNodeChildren, getBinaryNodeChild, getBinaryNodeChildren, isJidGroup, isJidUser, jidDecode, jidNormalizedUser, S_WHATSAPP_NET } from '../WABinary' +import { extractGroupMetadata } from './groups' +import { makeMessagesSocket } from './messages-send' + +export const makeMessagesRecvSocket = (config: SocketConfig) => { + const { + logger, + retryRequestDelayMs, + getMessage, + shouldIgnoreJid + } = config + const sock = makeMessagesSocket(config) + const { + ev, + authState, + ws, + query, + processingMutex, + upsertMessage, + resyncAppState, + onUnexpectedError, + assertSessions, + sendNode, + relayMessage, + sendReceipt, + uploadPreKeys, + } = sock + + /** this mutex ensures that each retryRequest will wait for the previous one to finish */ + const retryMutex = makeMutex() + + const msgRetryMap = config.msgRetryCounterMap || { } + const callOfferData: { [id: string]: WACallEvent } = { } + + let sendActiveReceipts = false + + const sendMessageAck = async({ tag, attrs }: BinaryNode) => { + const stanza: BinaryNode = { + tag: 'ack', + attrs: { + id: attrs.id, + to: attrs.from, + class: tag, + } + } + + if(!!attrs.participant) { + stanza.attrs.participant = attrs.participant + } + + if(!!attrs.recipient) { + stanza.attrs.recipient = attrs.recipient + } + + if(tag !== 'message' && attrs.type) { + stanza.attrs.type = attrs.type + } + + logger.debug({ recv: { tag, attrs }, sent: stanza.attrs }, 'sent ack') + await sendNode(stanza) + } + + const rejectCall = async(callId: string, callFrom: string) => { + const stanza: BinaryNode = ({ + tag: 'call', + attrs: { + from: authState.creds.me!.id, + to: callFrom, + }, + content: [{ + tag: 'reject', + attrs: { + 'call-id': callId, + 'call-creator': callFrom, + count: '0', + }, + content: undefined, + }], + }) + await query(stanza) + } + + const sendRetryRequest = async(node: BinaryNode, forceIncludeKeys = false) => { + const msgId = node.attrs.id + + let retryCount = msgRetryMap[msgId] || 0 + if(retryCount >= 5) { + logger.debug({ retryCount, msgId }, 'reached retry limit, clearing') + delete msgRetryMap[msgId] + return + } + + retryCount += 1 + msgRetryMap[msgId] = retryCount + + const { account, signedPreKey, signedIdentityKey: identityKey } = authState.creds + + const deviceIdentity = encodeSignedDeviceIdentity(account!, true) + await authState.keys.transaction( + async() => { + const receipt: BinaryNode = { + tag: 'receipt', + attrs: { + id: msgId, + type: 'retry', + to: node.attrs.from + }, + content: [ + { + tag: 'retry', + attrs: { + count: retryCount.toString(), + id: node.attrs.id, + t: node.attrs.t, + v: '1' + } + }, + { + tag: 'registration', + attrs: { }, + content: encodeBigEndian(authState.creds.registrationId) + } + ] + } + + if(node.attrs.recipient) { + receipt.attrs.recipient = node.attrs.recipient + } + + if(node.attrs.participant) { + receipt.attrs.participant = node.attrs.participant + } + + if(retryCount > 1 || forceIncludeKeys) { + const { update, preKeys } = await getNextPreKeys(authState, 1) + + const [keyId] = Object.keys(preKeys) + const key = preKeys[+keyId] + + const content = receipt.content! as BinaryNode[] + content.push({ + tag: 'keys', + attrs: { }, + content: [ + { tag: 'type', attrs: { }, content: Buffer.from(KEY_BUNDLE_TYPE) }, + { tag: 'identity', attrs: { }, content: identityKey.public }, + xmppPreKey(key, +keyId), + xmppSignedPreKey(signedPreKey), + { tag: 'device-identity', attrs: { }, content: deviceIdentity } + ] + }) + + ev.emit('creds.update', update) + } + + await sendNode(receipt) + + logger.info({ msgAttrs: node.attrs, retryCount }, 'sent retry receipt') + } + ) + } + + const handleEncryptNotification = async(node: BinaryNode) => { + const from = node.attrs.from + if(from === S_WHATSAPP_NET) { + const countChild = getBinaryNodeChild(node, 'count') + const count = +countChild!.attrs.value + const shouldUploadMorePreKeys = count < MIN_PREKEY_COUNT + + logger.debug({ count, shouldUploadMorePreKeys }, 'recv pre-key count') + if(shouldUploadMorePreKeys) { + await uploadPreKeys() + } + } else { + const identityNode = getBinaryNodeChild(node, 'identity') + if(identityNode) { + logger.info({ jid: from }, 'identity changed') + // not handling right now + // signal will override new identity anyway + } else { + logger.info({ node }, 'unknown encrypt notification') + } + } + } + + const handleGroupNotification = ( + participant: string, + child: BinaryNode, + msg: Partial + ) => { + switch (child?.tag) { + case 'create': + const metadata = extractGroupMetadata(child) + + msg.messageStubType = WAMessageStubType.GROUP_CREATE + msg.messageStubParameters = [metadata.subject] + msg.key = { participant: metadata.owner } + + ev.emit('chats.upsert', [{ + id: metadata.id, + name: metadata.subject, + conversationTimestamp: metadata.creation, + }]) + ev.emit('groups.upsert', [metadata]) + break + case 'ephemeral': + case 'not_ephemeral': + msg.message = { + protocolMessage: { + type: proto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING, + ephemeralExpiration: +(child.attrs.expiration || 0) + } + } + break + case 'promote': + case 'demote': + case 'remove': + case 'add': + case 'leave': + const stubType = `GROUP_PARTICIPANT_${child.tag!.toUpperCase()}` + msg.messageStubType = WAMessageStubType[stubType] + + const participants = getBinaryNodeChildren(child, 'participant').map(p => p.attrs.jid) + if( + participants.length === 1 && + // if recv. "remove" message and sender removed themselves + // mark as left + areJidsSameUser(participants[0], participant) && + child.tag === 'remove' + ) { + msg.messageStubType = WAMessageStubType.GROUP_PARTICIPANT_LEAVE + } + + msg.messageStubParameters = participants + break + case 'subject': + msg.messageStubType = WAMessageStubType.GROUP_CHANGE_SUBJECT + msg.messageStubParameters = [ child.attrs.subject ] + break + case 'announcement': + case 'not_announcement': + msg.messageStubType = WAMessageStubType.GROUP_CHANGE_ANNOUNCE + msg.messageStubParameters = [ (child.tag === 'announcement') ? 'on' : 'off' ] + break + case 'locked': + case 'unlocked': + msg.messageStubType = WAMessageStubType.GROUP_CHANGE_RESTRICT + msg.messageStubParameters = [ (child.tag === 'locked') ? 'on' : 'off' ] + break + case 'invite': + msg.messageStubType = WAMessageStubType.GROUP_CHANGE_INVITE_LINK + msg.messageStubParameters = [ child.attrs.code ] + break + } + } + + const processNotification = async(node: BinaryNode) => { + const result: Partial = { } + const [child] = getAllBinaryNodeChildren(node) + const nodeType = node.attrs.type + const from = jidNormalizedUser(node.attrs.from) + + switch (nodeType) { + case 'privacy_token': + const tokenList = getBinaryNodeChildren(child, 'token') + for(const { attrs, content } of tokenList) { + const jid = attrs.jid + ev.emit('chats.update', [ + { + id: jid, + tcToken: content as Buffer + } + ]) + + logger.debug({ jid }, 'got privacy token update') + } + + break + case 'w:gp2': + handleGroupNotification(node.attrs.participant, child, result) + break + case 'mediaretry': + const event = decodeMediaRetryNode(node) + ev.emit('messages.media-update', [event]) + break + case 'encrypt': + await handleEncryptNotification(node) + break + case 'devices': + const devices = getBinaryNodeChildren(child, 'device') + if(areJidsSameUser(child.attrs.jid, authState.creds!.me!.id)) { + const deviceJids = devices.map(d => d.attrs.jid) + logger.info({ deviceJids }, 'got my own devices') + } + + break + case 'server_sync': + const update = getBinaryNodeChild(node, 'collection') + if(update) { + const name = update.attrs.name as WAPatchName + await resyncAppState([name], false) + } + + break + case 'picture': + const setPicture = getBinaryNodeChild(node, 'set') + const delPicture = getBinaryNodeChild(node, 'delete') + + ev.emit('contacts.update', [{ + id: from, + imgUrl: setPicture ? 'changed' : null + }]) + + if(isJidGroup(from)) { + const node = setPicture || delPicture + result.messageStubType = WAMessageStubType.GROUP_CHANGE_ICON + + if(setPicture) { + result.messageStubParameters = [ setPicture.attrs.id ] + } + + result.participant = node?.attrs.author + result.key = { + ...result.key || {}, + participant: setPicture?.attrs.author + } + } + + break + case 'account_sync': + if(child.tag === 'disappearing_mode') { + const newDuration = +child.attrs.duration + const timestamp = +child.attrs.t + + logger.info({ newDuration }, 'updated account disappearing mode') + + ev.emit('creds.update', { + accountSettings: { + ...authState.creds.accountSettings, + defaultDisappearingMode: { + ephemeralExpiration: newDuration, + ephemeralSettingTimestamp: timestamp, + }, + } + }) + } + + break + } + + if(Object.keys(result).length) { + return result + } + } + + const willSendMessageAgain = (id: string, participant: string) => { + const key = `${id}:${participant}` + const retryCount = msgRetryMap[key] || 0 + return retryCount < 5 + } + + const updateSendMessageAgainCount = (id: string, participant: string) => { + const key = `${id}:${participant}` + msgRetryMap[key] = (msgRetryMap[key] || 0) + 1 + } + + const sendMessagesAgain = async( + key: proto.IMessageKey, + ids: string[], + retryNode: BinaryNode + ) => { + const msgs = await Promise.all(ids.map(id => getMessage({ ...key, id }))) + const remoteJid = key.remoteJid! + const participant = key.participant || remoteJid + // if it's the primary jid sending the request + // just re-send the message to everyone + // prevents the first message decryption failure + const sendToAll = !jidDecode(participant)?.device + await assertSessions([participant], true) + + if(isJidGroup(remoteJid)) { + await authState.keys.set({ 'sender-key-memory': { [remoteJid]: null } }) + } + + logger.debug({ participant, sendToAll }, 'forced new session for retry recp') + + for(let i = 0; i < msgs.length;i++) { + const msg = msgs[i] + if(msg) { + updateSendMessageAgainCount(ids[i], participant) + const msgRelayOpts: MessageRelayOptions = { messageId: ids[i] } + + if(sendToAll) { + msgRelayOpts.useUserDevicesCache = false + } else { + msgRelayOpts.participant = { + jid: participant, + count: +retryNode.attrs.count + } + } + + await relayMessage(key.remoteJid!, msg, msgRelayOpts) + } else { + logger.debug({ jid: key.remoteJid, id: ids[i] }, 'recv retry request, but message not available') + } + } + } + + const handleReceipt = async(node: BinaryNode) => { + const { attrs, content } = node + const isNodeFromMe = areJidsSameUser(attrs.participant || attrs.from, authState.creds.me?.id) + const remoteJid = !isNodeFromMe || isJidGroup(attrs.from) ? attrs.from : attrs.recipient + const fromMe = !attrs.recipient || (attrs.type === 'retry' && isNodeFromMe) + + const key: proto.IMessageKey = { + remoteJid, + id: '', + fromMe, + participant: attrs.participant + } + + if(shouldIgnoreJid(remoteJid)) { + logger.debug({ remoteJid }, 'ignoring receipt from jid') + await sendMessageAck(node) + return + } + + const ids = [attrs.id] + if(Array.isArray(content)) { + const items = getBinaryNodeChildren(content[0], 'item') + ids.push(...items.map(i => i.attrs.id)) + } + + await Promise.all([ + processingMutex.mutex( + async() => { + const status = getStatusFromReceiptType(attrs.type) + if( + typeof status !== 'undefined' && + ( + // basically, we only want to know when a message from us has been delivered to/read by the other person + // or another device of ours has read some messages + status > proto.WebMessageInfo.Status.DELIVERY_ACK || + !isNodeFromMe + ) + ) { + if(isJidGroup(remoteJid)) { + if(attrs.participant) { + const updateKey: keyof MessageUserReceipt = status === proto.WebMessageInfo.Status.DELIVERY_ACK ? 'receiptTimestamp' : 'readTimestamp' + ev.emit( + 'message-receipt.update', + ids.map(id => ({ + key: { ...key, id }, + receipt: { + userJid: jidNormalizedUser(attrs.participant), + [updateKey]: +attrs.t + } + })) + ) + } + } else { + ev.emit( + 'messages.update', + ids.map(id => ({ + key: { ...key, id }, + update: { status } + })) + ) + } + } + + if(attrs.type === 'retry') { + // correctly set who is asking for the retry + key.participant = key.participant || attrs.from + const retryNode = getBinaryNodeChild(node, 'retry') + if(willSendMessageAgain(ids[0], key.participant)) { + if(key.fromMe) { + try { + logger.debug({ attrs, key }, 'recv retry request') + await sendMessagesAgain(key, ids, retryNode!) + } catch(error) { + logger.error({ key, ids, trace: error.stack }, 'error in sending message again') + } + } else { + logger.info({ attrs, key }, 'recv retry for not fromMe message') + } + } else { + logger.info({ attrs, key }, 'will not send message again, as sent too many times') + } + } + } + ), + sendMessageAck(node) + ]) + } + + const handleNotification = async(node: BinaryNode) => { + const remoteJid = node.attrs.from + if(shouldIgnoreJid(remoteJid)) { + logger.debug({ remoteJid, id: node.attrs.id }, 'ignored notification') + await sendMessageAck(node) + return + } + + await Promise.all([ + processingMutex.mutex( + async() => { + const msg = await processNotification(node) + if(msg) { + const fromMe = areJidsSameUser(node.attrs.participant || remoteJid, authState.creds.me!.id) + msg.key = { + remoteJid, + fromMe, + participant: node.attrs.participant, + id: node.attrs.id, + ...(msg.key || {}) + } + msg.participant ??= node.attrs.participant + msg.messageTimestamp = +node.attrs.t + + const fullMsg = proto.WebMessageInfo.fromObject(msg) + await upsertMessage(fullMsg, 'append') + } + } + ), + sendMessageAck(node) + ]) + } + + const handleMessage = async(node: BinaryNode) => { + const { fullMessage: msg, category, author, decrypt } = decodeMessageStanza(node, authState) + if(shouldIgnoreJid(msg.key.remoteJid!)) { + logger.debug({ key: msg.key }, 'ignored message') + await sendMessageAck(node) + return + } + + await Promise.all([ + processingMutex.mutex( + async() => { + await decrypt() + // message failed to decrypt + if(msg.messageStubType === proto.WebMessageInfo.StubType.CIPHERTEXT) { + logger.error( + { key: msg.key, params: msg.messageStubParameters }, + 'failure in decrypting message' + ) + retryMutex.mutex( + async() => { + if(ws.readyState === ws.OPEN) { + const encNode = getBinaryNodeChild(node, 'enc') + await sendRetryRequest(node, !encNode) + if(retryRequestDelayMs) { + await delay(retryRequestDelayMs) + } + } else { + logger.debug({ node }, 'connection closed, ignoring retry req') + } + } + ) + } else { + // no type in the receipt => message delivered + let type: MessageReceiptType = undefined + let participant = msg.key.participant + if(category === 'peer') { // special peer message + type = 'peer_msg' + } else if(msg.key.fromMe) { // message was sent by us from a different device + type = 'sender' + // need to specially handle this case + if(isJidUser(msg.key.remoteJid!)) { + participant = author + } + } else if(!sendActiveReceipts) { + type = 'inactive' + } + + await sendReceipt(msg.key.remoteJid!, participant!, [msg.key.id!], type) + + // send ack for history message + const isAnyHistoryMsg = getHistoryMsg(msg.message!) + if(isAnyHistoryMsg) { + const jid = jidNormalizedUser(msg.key.remoteJid!) + await sendReceipt(jid, undefined, [msg.key.id!], 'hist_sync') + } + } + + cleanMessage(msg, authState.creds.me!.id) + + await upsertMessage(msg, node.attrs.offline ? 'append' : 'notify') + } + ), + sendMessageAck(node) + ]) + } + + const handleCall = async(node: BinaryNode) => { + const { attrs } = node + const [infoChild] = getAllBinaryNodeChildren(node) + const callId = infoChild.attrs['call-id'] + const from = infoChild.attrs.from || infoChild.attrs['call-creator'] + const status = getCallStatusFromNode(infoChild) + const call: WACallEvent = { + chatId: attrs.from, + from, + id: callId, + date: new Date(+attrs.t * 1000), + offline: !!attrs.offline, + status, + } + + if(status === 'offer') { + call.isVideo = !!getBinaryNodeChild(infoChild, 'video') + call.isGroup = infoChild.attrs.type === 'group' + callOfferData[call.id] = call + } + + // use existing call info to populate this event + if(callOfferData[call.id]) { + call.isVideo = callOfferData[call.id].isVideo + call.isGroup = callOfferData[call.id].isGroup + } + + // delete data once call has ended + if(status === 'reject' || status === 'accept' || status === 'timeout') { + delete callOfferData[call.id] + } + + ev.emit('call', [call]) + + await sendMessageAck(node) + } + + const handleBadAck = async({ attrs }: BinaryNode) => { + // current hypothesis is that if pash is sent in the ack + // it means -- the message hasn't reached all devices yet + // we'll retry sending the message here + if(attrs.phash) { + logger.info({ attrs }, 'received phash in ack, resending message...') + const key: WAMessageKey = { remoteJid: attrs.from, fromMe: true, id: attrs.id } + const msg = await getMessage(key) + if(msg) { + await relayMessage(key.remoteJid!, msg, { messageId: key.id!, useUserDevicesCache: false }) + } else { + logger.warn({ attrs }, 'could not send message again, as it was not found') + } + } + } + + /// processes a node with the given function + /// and adds the task to the existing buffer if we're buffering events + const processNodeWithBuffer = async( + node: BinaryNode, + identifier: string, + exec: (node: BinaryNode) => Promise + ) => { + ev.buffer() + await execTask() + ev.flush() + + function execTask() { + return exec(node) + .catch(err => onUnexpectedError(err, identifier)) + } + } + + // recv a message + ws.on('CB:message', (node: BinaryNode) => { + processNodeWithBuffer(node, 'processing message', handleMessage) + }) + + ws.on('CB:call', async(node: BinaryNode) => { + processNodeWithBuffer(node, 'handling call', handleCall) + }) + + ws.on('CB:receipt', node => { + processNodeWithBuffer(node, 'handling receipt', handleReceipt) + }) + + ws.on('CB:notification', async(node: BinaryNode) => { + processNodeWithBuffer(node, 'handling notification', handleNotification) + }) + + ws.on('CB:ack,class:message', (node: BinaryNode) => { + handleBadAck(node) + .catch(error => onUnexpectedError(error, 'handling bad ack')) + }) + + ev.on('call', ([ call ]) => { + // missed call + group call notification message generation + if(call.status === 'timeout' || (call.status === 'offer' && call.isGroup)) { + const msg: proto.IWebMessageInfo = { + key: { + remoteJid: call.chatId, + id: call.id, + fromMe: false + }, + messageTimestamp: unixTimestampSeconds(call.date), + } + if(call.status === 'timeout') { + if(call.isGroup) { + msg.messageStubType = call.isVideo ? WAMessageStubType.CALL_MISSED_GROUP_VIDEO : WAMessageStubType.CALL_MISSED_GROUP_VOICE + } else { + msg.messageStubType = call.isVideo ? WAMessageStubType.CALL_MISSED_VIDEO : WAMessageStubType.CALL_MISSED_VOICE + } + } else { + msg.message = { call: { callKey: Buffer.from(call.id) } } + } + + const protoMsg = proto.WebMessageInfo.fromObject(msg) + upsertMessage(protoMsg, call.offline ? 'append' : 'notify') + } + }) + + ev.on('connection.update', ({ isOnline }) => { + if(typeof isOnline !== 'undefined') { + sendActiveReceipts = isOnline + logger.trace(`sendActiveReceipts set to "${sendActiveReceipts}"`) + } + }) + + return { + ...sock, + sendMessageAck, + sendRetryRequest, + rejectCall + } +} diff --git a/whatsapp_addon/Baileys/src/Socket/messages-send.ts b/whatsapp_addon/Baileys/src/Socket/messages-send.ts new file mode 100644 index 0000000..2368994 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Socket/messages-send.ts @@ -0,0 +1,667 @@ + +import { Boom } from '@hapi/boom' +import NodeCache from 'node-cache' +import { proto } from '../../WAProto' +import { WA_DEFAULT_EPHEMERAL } from '../Defaults' +import { AnyMessageContent, MediaConnInfo, MessageReceiptType, MessageRelayOptions, MiscMessageGenerationOptions, SocketConfig, WAMessageKey } from '../Types' +import { aggregateMessageKeysNotFromMe, assertMediaContent, bindWaitForEvent, decryptMediaRetryData, encodeSignedDeviceIdentity, encodeWAMessage, encryptMediaRetryRequest, encryptSenderKeyMsgSignalProto, encryptSignalProto, extractDeviceJids, generateMessageID, generateWAMessage, getStatusCodeForMediaRetry, getUrlFromDirectPath, getWAUploadToServer, jidToSignalProtocolAddress, parseAndInjectE2ESessions, unixTimestampSeconds } from '../Utils' +import { getUrlInfo } from '../Utils/link-preview' +import { areJidsSameUser, BinaryNode, BinaryNodeAttributes, getBinaryNodeChild, getBinaryNodeChildren, isJidGroup, isJidUser, jidDecode, jidEncode, jidNormalizedUser, JidWithDevice, S_WHATSAPP_NET } from '../WABinary' +import { makeGroupsSocket } from './groups' + +export const makeMessagesSocket = (config: SocketConfig) => { + const { + logger, + linkPreviewImageThumbnailWidth, + generateHighQualityLinkPreview, + options: axiosOptions, + patchMessageBeforeSending, + } = config + const sock = makeGroupsSocket(config) + const { + ev, + authState, + processingMutex, + upsertMessage, + query, + fetchPrivacySettings, + generateMessageTag, + sendNode, + groupMetadata, + groupToggleEphemeral + } = sock + + const userDevicesCache = config.userDevicesCache || new NodeCache({ + stdTTL: 300, // 5 minutes + useClones: false + }) + + let mediaConn: Promise + const refreshMediaConn = async(forceGet = false) => { + const media = await mediaConn + if(!media || forceGet || (new Date().getTime() - media.fetchDate.getTime()) > media.ttl * 1000) { + mediaConn = (async() => { + const result = await query({ + tag: 'iq', + attrs: { + type: 'set', + xmlns: 'w:m', + to: S_WHATSAPP_NET, + }, + content: [ { tag: 'media_conn', attrs: { } } ] + }) + const mediaConnNode = getBinaryNodeChild(result, 'media_conn') + const node: MediaConnInfo = { + hosts: getBinaryNodeChildren(mediaConnNode, 'host').map( + item => item.attrs as any + ), + auth: mediaConnNode!.attrs.auth, + ttl: +mediaConnNode!.attrs.ttl, + fetchDate: new Date() + } + logger.debug('fetched media conn') + return node + })() + } + + return mediaConn + } + + /** + * generic send receipt function + * used for receipts of phone call, read, delivery etc. + * */ + const sendReceipt = async(jid: string, participant: string | undefined, messageIds: string[], type: MessageReceiptType) => { + const node: BinaryNode = { + tag: 'receipt', + attrs: { + id: messageIds[0], + }, + } + const isReadReceipt = type === 'read' || type === 'read-self' + if(isReadReceipt) { + node.attrs.t = unixTimestampSeconds().toString() + } + + if(type === 'sender' && isJidUser(jid)) { + node.attrs.recipient = jid + node.attrs.to = participant! + } else { + node.attrs.to = jid + if(participant) { + node.attrs.participant = participant + } + } + + if(type) { + node.attrs.type = type + } + + const remainingMessageIds = messageIds.slice(1) + if(remainingMessageIds.length) { + node.content = [ + { + tag: 'list', + attrs: { }, + content: remainingMessageIds.map(id => ({ + tag: 'item', + attrs: { id } + })) + } + ] + } + + logger.debug({ attrs: node.attrs, messageIds }, 'sending receipt for messages') + await sendNode(node) + } + + /** Correctly bulk send receipts to multiple chats, participants */ + const sendReceipts = async(keys: WAMessageKey[], type: MessageReceiptType) => { + const recps = aggregateMessageKeysNotFromMe(keys) + for(const { jid, participant, messageIds } of recps) { + await sendReceipt(jid, participant, messageIds, type) + } + } + + /** Bulk read messages. Keys can be from different chats & participants */ + const readMessages = async(keys: WAMessageKey[]) => { + const privacySettings = await fetchPrivacySettings() + // based on privacy settings, we have to change the read type + const readType = privacySettings.readreceipts === 'all' ? 'read' : 'read-self' + await sendReceipts(keys, readType) + } + + /** Fetch all the devices we've to send a message to */ + const getUSyncDevices = async(jids: string[], useCache: boolean, ignoreZeroDevices: boolean) => { + const deviceResults: JidWithDevice[] = [] + + if(!useCache) { + logger.debug('not using cache for devices') + } + + const users: BinaryNode[] = [] + jids = Array.from(new Set(jids)) + for(let jid of jids) { + const user = jidDecode(jid)?.user + jid = jidNormalizedUser(jid) + if(userDevicesCache.has(user!) && useCache) { + const devices = userDevicesCache.get(user!)! + deviceResults.push(...devices) + + logger.trace({ user }, 'using cache for devices') + } else { + users.push({ tag: 'user', attrs: { jid } }) + } + } + + const iq: BinaryNode = { + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'get', + xmlns: 'usync', + }, + content: [ + { + tag: 'usync', + attrs: { + sid: generateMessageTag(), + mode: 'query', + last: 'true', + index: '0', + context: 'message', + }, + content: [ + { + tag: 'query', + attrs: { }, + content: [ + { + tag: 'devices', + attrs: { version: '2' } + } + ] + }, + { tag: 'list', attrs: { }, content: users } + ] + }, + ], + } + const result = await query(iq) + const extracted = extractDeviceJids(result, authState.creds.me!.id, ignoreZeroDevices) + const deviceMap: { [_: string]: JidWithDevice[] } = {} + + for(const item of extracted) { + deviceMap[item.user] = deviceMap[item.user] || [] + deviceMap[item.user].push(item) + + deviceResults.push(item) + } + + for(const key in deviceMap) { + userDevicesCache.set(key, deviceMap[key]) + } + + return deviceResults + } + + const assertSessions = async(jids: string[], force: boolean) => { + let didFetchNewSession = false + let jidsRequiringFetch: string[] = [] + if(force) { + jidsRequiringFetch = jids + } else { + const addrs = jids.map(jid => jidToSignalProtocolAddress(jid).toString()) + const sessions = await authState.keys.get('session', addrs) + for(const jid of jids) { + const signalId = jidToSignalProtocolAddress(jid).toString() + if(!sessions[signalId]) { + jidsRequiringFetch.push(jid) + } + } + } + + if(jidsRequiringFetch.length) { + logger.debug({ jidsRequiringFetch }, 'fetching sessions') + const result = await query({ + tag: 'iq', + attrs: { + xmlns: 'encrypt', + type: 'get', + to: S_WHATSAPP_NET, + }, + content: [ + { + tag: 'key', + attrs: { }, + content: jidsRequiringFetch.map( + jid => ({ + tag: 'user', + attrs: { jid }, + }) + ) + } + ] + }) + await parseAndInjectE2ESessions(result, authState) + + didFetchNewSession = true + } + + return didFetchNewSession + } + + const createParticipantNodes = async( + jids: string[], + message: proto.IMessage, + extraAttrs?: BinaryNode['attrs'] + ) => { + const patched = await patchMessageBeforeSending(message, jids) + const bytes = encodeWAMessage(patched) + + let shouldIncludeDeviceIdentity = false + const nodes = await Promise.all( + jids.map( + async jid => { + const { type, ciphertext } = await encryptSignalProto(jid, bytes, authState) + if(type === 'pkmsg') { + shouldIncludeDeviceIdentity = true + } + + const node: BinaryNode = { + tag: 'to', + attrs: { jid }, + content: [{ + tag: 'enc', + attrs: { + v: '2', + type, + ...extraAttrs || {} + }, + content: ciphertext + }] + } + return node + } + ) + ) + return { nodes, shouldIncludeDeviceIdentity } + } + + const relayMessage = async( + jid: string, + message: proto.IMessage, + { messageId: msgId, participant, additionalAttributes, useUserDevicesCache, cachedGroupMetadata }: MessageRelayOptions + ) => { + const meId = authState.creds.me!.id + + let shouldIncludeDeviceIdentity = false + + const { user, server } = jidDecode(jid)! + const isGroup = server === 'g.us' + msgId = msgId || generateMessageID() + useUserDevicesCache = useUserDevicesCache !== false + + const participants: BinaryNode[] = [] + const destinationJid = jidEncode(user, isGroup ? 'g.us' : 's.whatsapp.net') + const binaryNodeContent: BinaryNode[] = [] + const devices: JidWithDevice[] = [] + + const meMsg: proto.IMessage = { + deviceSentMessage: { + destinationJid, + message + } + } + + if(participant) { + // when the retry request is not for a group + // only send to the specific device that asked for a retry + // otherwise the message is sent out to every device that should be a recipient + if(!isGroup) { + additionalAttributes = { ...additionalAttributes, device_fanout: 'false' } + } + + const { user, device } = jidDecode(participant.jid)! + devices.push({ user, device }) + } + + await authState.keys.transaction( + async() => { + if(isGroup) { + const [groupData, senderKeyMap] = await Promise.all([ + (async() => { + let groupData = cachedGroupMetadata ? await cachedGroupMetadata(jid) : undefined + if(groupData) { + logger.trace({ jid, participants: groupData.participants.length }, 'using cached group metadata') + } + + if(!groupData) { + groupData = await groupMetadata(jid) + } + + return groupData + })(), + (async() => { + if(!participant) { + const result = await authState.keys.get('sender-key-memory', [jid]) + return result[jid] || { } + } + + return { } + })() + ]) + + if(!participant) { + const participantsList = groupData.participants.map(p => p.id) + const additionalDevices = await getUSyncDevices(participantsList, !!useUserDevicesCache, false) + devices.push(...additionalDevices) + } + + const patched = await patchMessageBeforeSending(message, devices.map(d => jidEncode(d.user, 's.whatsapp.net', d.device))) + const bytes = encodeWAMessage(patched) + + const { ciphertext, senderKeyDistributionMessageKey } = await encryptSenderKeyMsgSignalProto( + destinationJid, + bytes, + meId, + authState + ) + + const senderKeyJids: string[] = [] + // ensure a connection is established with every device + for(const { user, device } of devices) { + const jid = jidEncode(user, 's.whatsapp.net', device) + if(!senderKeyMap[jid] || !!participant) { + senderKeyJids.push(jid) + // store that this person has had the sender keys sent to them + senderKeyMap[jid] = true + } + } + + // if there are some participants with whom the session has not been established + // if there are, we re-send the senderkey + if(senderKeyJids.length) { + logger.debug({ senderKeyJids }, 'sending new sender key') + + const senderKeyMsg: proto.IMessage = { + senderKeyDistributionMessage: { + axolotlSenderKeyDistributionMessage: senderKeyDistributionMessageKey, + groupId: destinationJid + } + } + + await assertSessions(senderKeyJids, false) + + const result = await createParticipantNodes(senderKeyJids, senderKeyMsg) + shouldIncludeDeviceIdentity = shouldIncludeDeviceIdentity || result.shouldIncludeDeviceIdentity + + participants.push(...result.nodes) + } + + binaryNodeContent.push({ + tag: 'enc', + attrs: { v: '2', type: 'skmsg' }, + content: ciphertext + }) + + await authState.keys.set({ 'sender-key-memory': { [jid]: senderKeyMap } }) + } else { + const { user: meUser } = jidDecode(meId)! + + if(!participant) { + devices.push({ user }) + devices.push({ user: meUser }) + + const additionalDevices = await getUSyncDevices([ meId, jid ], !!useUserDevicesCache, true) + devices.push(...additionalDevices) + } + + const allJids: string[] = [] + const meJids: string[] = [] + const otherJids: string[] = [] + for(const { user, device } of devices) { + const jid = jidEncode(user, 's.whatsapp.net', device) + const isMe = user === meUser + if(isMe) { + meJids.push(jid) + } else { + otherJids.push(jid) + } + + allJids.push(jid) + } + + await assertSessions(allJids, false) + + const [ + { nodes: meNodes, shouldIncludeDeviceIdentity: s1 }, + { nodes: otherNodes, shouldIncludeDeviceIdentity: s2 } + ] = await Promise.all([ + createParticipantNodes(meJids, meMsg), + createParticipantNodes(otherJids, message) + ]) + participants.push(...meNodes) + participants.push(...otherNodes) + + shouldIncludeDeviceIdentity = shouldIncludeDeviceIdentity || s1 || s2 + } + + if(participants.length) { + binaryNodeContent.push({ + tag: 'participants', + attrs: { }, + content: participants + }) + } + + const stanza: BinaryNode = { + tag: 'message', + attrs: { + id: msgId!, + type: 'text', + ...(additionalAttributes || {}) + }, + content: binaryNodeContent + } + // if the participant to send to is explicitly specified (generally retry recp) + // ensure the message is only sent to that person + // if a retry receipt is sent to everyone -- it'll fail decryption for everyone else who received the msg + if(participant) { + if(isJidGroup(destinationJid)) { + stanza.attrs.to = destinationJid + stanza.attrs.participant = participant.jid + } else if(areJidsSameUser(participant.jid, meId)) { + stanza.attrs.to = participant.jid + stanza.attrs.recipient = destinationJid + } else { + stanza.attrs.to = participant.jid + } + } else { + stanza.attrs.to = destinationJid + } + + if(shouldIncludeDeviceIdentity) { + (stanza.content as BinaryNode[]).push({ + tag: 'device-identity', + attrs: { }, + content: encodeSignedDeviceIdentity(authState.creds.account!, true) + }) + + logger.debug({ jid }, 'adding device identity') + } + + logger.debug({ msgId }, `sending message to ${participants.length} devices`) + + await sendNode(stanza) + } + ) + + return msgId + } + + const getPrivacyTokens = async(jids: string[]) => { + const t = unixTimestampSeconds().toString() + const result = await query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + xmlns: 'privacy' + }, + content: [ + { + tag: 'tokens', + attrs: { }, + content: jids.map( + jid => ({ + tag: 'token', + attrs: { + jid: jidNormalizedUser(jid), + t, + type: 'trusted_contact' + } + }) + ) + } + ] + }) + + return result + } + + const waUploadToServer = getWAUploadToServer(config, refreshMediaConn) + + const waitForMsgMediaUpdate = bindWaitForEvent(ev, 'messages.media-update') + + return { + ...sock, + getPrivacyTokens, + assertSessions, + relayMessage, + sendReceipt, + sendReceipts, + readMessages, + refreshMediaConn, + waUploadToServer, + fetchPrivacySettings, + updateMediaMessage: async(message: proto.IWebMessageInfo) => { + const content = assertMediaContent(message.message) + const mediaKey = content.mediaKey! + const meId = authState.creds.me!.id + const node = encryptMediaRetryRequest(message.key, mediaKey, meId) + + let error: Error | undefined = undefined + await Promise.all( + [ + sendNode(node), + waitForMsgMediaUpdate(update => { + const result = update.find(c => c.key.id === message.key.id) + if(result) { + if(result.error) { + error = result.error + } else { + try { + const media = decryptMediaRetryData(result.media!, mediaKey, result.key.id!) + if(media.result !== proto.MediaRetryNotification.ResultType.SUCCESS) { + const resultStr = proto.MediaRetryNotification.ResultType[media.result] + throw new Boom( + `Media re-upload failed by device (${resultStr})`, + { data: media, statusCode: getStatusCodeForMediaRetry(media.result) || 404 } + ) + } + + content.directPath = media.directPath + content.url = getUrlFromDirectPath(content.directPath!) + + logger.debug({ directPath: media.directPath, key: result.key }, 'media update successful') + } catch(err) { + error = err + } + } + + return true + } + }) + ] + ) + + if(error) { + throw error + } + + ev.emit('messages.update', [ + { key: message.key, update: { message: message.message } } + ]) + + return message + }, + sendMessage: async( + jid: string, + content: AnyMessageContent, + options: MiscMessageGenerationOptions = { } + ) => { + const userJid = authState.creds.me!.id + if( + typeof content === 'object' && + 'disappearingMessagesInChat' in content && + typeof content['disappearingMessagesInChat'] !== 'undefined' && + isJidGroup(jid) + ) { + const { disappearingMessagesInChat } = content + const value = typeof disappearingMessagesInChat === 'boolean' ? + (disappearingMessagesInChat ? WA_DEFAULT_EPHEMERAL : 0) : + disappearingMessagesInChat + await groupToggleEphemeral(jid, value) + } else { + const fullMsg = await generateWAMessage( + jid, + content, + { + logger, + userJid, + getUrlInfo: text => getUrlInfo( + text, + { + thumbnailWidth: linkPreviewImageThumbnailWidth, + fetchOpts: { + timeout: 3_000, + ...axiosOptions || { } + }, + logger, + uploadImage: generateHighQualityLinkPreview + ? waUploadToServer + : undefined + }, + ), + upload: waUploadToServer, + mediaCache: config.mediaCache, + ...options, + } + ) + const isDeleteMsg = 'delete' in content && !!content.delete + const additionalAttributes: BinaryNodeAttributes = { } + // required for delete + if(isDeleteMsg) { + // if the chat is a group, and I am not the author, then delete the message as an admin + if(isJidGroup(content.delete?.remoteJid as string) && !content.delete?.fromMe) { + additionalAttributes.edit = '8' + } else { + additionalAttributes.edit = '7' + } + } + + await relayMessage(jid, fullMsg.message!, { messageId: fullMsg.key.id!, cachedGroupMetadata: options.cachedGroupMetadata, additionalAttributes }) + if(config.emitOwnEvents) { + process.nextTick(() => { + processingMutex.mutex(() => ( + upsertMessage(fullMsg, 'append') + )) + }) + } + + return fullMsg + } + } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Socket/socket.ts b/whatsapp_addon/Baileys/src/Socket/socket.ts new file mode 100644 index 0000000..fbbb6e3 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Socket/socket.ts @@ -0,0 +1,607 @@ +import { Boom } from '@hapi/boom' +import { promisify } from 'util' +import WebSocket from 'ws' +import { proto } from '../../WAProto' +import { DEF_CALLBACK_PREFIX, DEF_TAG_PREFIX, DEFAULT_ORIGIN, INITIAL_PREKEY_COUNT, MIN_PREKEY_COUNT } from '../Defaults' +import { DisconnectReason, SocketConfig } from '../Types' +import { addTransactionCapability, bindWaitForConnectionUpdate, configureSuccessfulPairing, Curve, generateLoginNode, generateMdTagPrefix, generateRegistrationNode, getCodeFromWSError, getErrorCodeFromStreamError, getNextPreKeysNode, makeNoiseHandler, printQRIfNecessaryListener, promiseTimeout } from '../Utils' +import { makeEventBuffer } from '../Utils/event-buffer' +import { assertNodeErrorFree, BinaryNode, encodeBinaryNode, getBinaryNodeChild, getBinaryNodeChildren, S_WHATSAPP_NET } from '../WABinary' + +/** + * Connects to WA servers and performs: + * - simple queries (no retry mechanism, wait for connection establishment) + * - listen to messages and emit events + * - query phone connection + */ +export const makeSocket = ({ + waWebSocketUrl, + connectTimeoutMs, + logger, + agent, + keepAliveIntervalMs, + version, + browser, + auth: authState, + printQRInTerminal, + defaultQueryTimeoutMs, + syncFullHistory, + transactionOpts, + qrTimeout, + options, +}: SocketConfig) => { + const ws = new WebSocket(waWebSocketUrl, undefined, { + origin: DEFAULT_ORIGIN, + headers: options.headers, + handshakeTimeout: connectTimeoutMs, + timeout: connectTimeoutMs, + agent + }) + ws.setMaxListeners(0) + const ev = makeEventBuffer(logger) + /** ephemeral key pair used to encrypt/decrypt communication. Unique for each connection */ + const ephemeralKeyPair = Curve.generateKeyPair() + /** WA noise protocol wrapper */ + const noise = makeNoiseHandler(ephemeralKeyPair, logger) + + const { creds } = authState + // add transaction capability + const keys = addTransactionCapability(authState.keys, logger, transactionOpts) + + let lastDateRecv: Date + let epoch = 1 + let keepAliveReq: NodeJS.Timeout + let qrTimer: NodeJS.Timeout + let closed = false + + const uqTagId = generateMdTagPrefix() + const generateMessageTag = () => `${uqTagId}${epoch++}` + + const sendPromise = promisify(ws.send) + /** send a raw buffer */ + const sendRawMessage = async(data: Uint8Array | Buffer) => { + if(ws.readyState !== ws.OPEN) { + throw new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed }) + } + + const bytes = noise.encodeFrame(data) + await sendPromise.call(ws, bytes) as Promise + } + + /** send a binary node */ + const sendNode = (frame: BinaryNode) => { + if(logger.level === 'trace') { + logger.trace({ msgId: frame.attrs.id, fromMe: true, frame }, 'communication') + } + + const buff = encodeBinaryNode(frame) + return sendRawMessage(buff) + } + + /** log & process any unexpected errors */ + const onUnexpectedError = (error: Error, msg: string) => { + logger.error( + { trace: error.stack, output: (error as any).output }, + `unexpected error in '${msg}'` + ) + } + + /** await the next incoming message */ + const awaitNextMessage = async(sendMsg?: Uint8Array) => { + if(ws.readyState !== ws.OPEN) { + throw new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed }) + } + + let onOpen: (data: any) => void + let onClose: (err: Error) => void + + const result = promiseTimeout(connectTimeoutMs, (resolve, reject) => { + onOpen = (data: any) => resolve(data) + onClose = reject + ws.on('frame', onOpen) + ws.on('close', onClose) + ws.on('error', onClose) + }) + .finally(() => { + ws.off('frame', onOpen) + ws.off('close', onClose) + ws.off('error', onClose) + }) + + if(sendMsg) { + sendRawMessage(sendMsg).catch(onClose!) + } + + return result + } + + /** + * Wait for a message with a certain tag to be received + * @param tag the message tag to await + * @param json query that was sent + * @param timeoutMs timeout after which the promise will reject + */ + const waitForMessage = async(msgId: string, timeoutMs = defaultQueryTimeoutMs) => { + let onRecv: (json) => void + let onErr: (err) => void + try { + const result = await promiseTimeout(timeoutMs, + (resolve, reject) => { + onRecv = resolve + onErr = err => { + reject(err || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed })) + } + + ws.on(`TAG:${msgId}`, onRecv) + ws.on('close', onErr) // if the socket closes, you'll never receive the message + ws.off('error', onErr) + }, + ) + return result as any + } finally { + ws.off(`TAG:${msgId}`, onRecv!) + ws.off('close', onErr!) // if the socket closes, you'll never receive the message + ws.off('error', onErr!) + } + } + + /** send a query, and wait for its response. auto-generates message ID if not provided */ + const query = async(node: BinaryNode, timeoutMs?: number) => { + if(!node.attrs.id) { + node.attrs.id = generateMessageTag() + } + + const msgId = node.attrs.id + const wait = waitForMessage(msgId, timeoutMs) + + await sendNode(node) + + const result = await (wait as Promise) + if('tag' in result) { + assertNodeErrorFree(result) + } + + return result + } + + /** connection handshake */ + const validateConnection = async() => { + let helloMsg: proto.IHandshakeMessage = { + clientHello: { ephemeral: ephemeralKeyPair.public } + } + helloMsg = proto.HandshakeMessage.fromObject(helloMsg) + + logger.info({ browser, helloMsg }, 'connected to WA Web') + + const init = proto.HandshakeMessage.encode(helloMsg).finish() + + const result = await awaitNextMessage(init) + const handshake = proto.HandshakeMessage.decode(result) + + logger.trace({ handshake }, 'handshake recv from WA Web') + + const keyEnc = noise.processHandshake(handshake, creds.noiseKey) + + const config = { version, browser, syncFullHistory } + + let node: proto.IClientPayload + if(!creds.me) { + node = generateRegistrationNode(creds, config) + logger.info({ node }, 'not logged in, attempting registration...') + } else { + node = generateLoginNode(creds.me!.id, config) + logger.info({ node }, 'logging in...') + } + + const payloadEnc = noise.encrypt( + proto.ClientPayload.encode(node).finish() + ) + await sendRawMessage( + proto.HandshakeMessage.encode({ + clientFinish: { + static: keyEnc, + payload: payloadEnc, + }, + }).finish() + ) + noise.finishInit() + startKeepAliveRequest() + } + + const getAvailablePreKeysOnServer = async() => { + const result = await query({ + tag: 'iq', + attrs: { + id: generateMessageTag(), + xmlns: 'encrypt', + type: 'get', + to: S_WHATSAPP_NET + }, + content: [ + { tag: 'count', attrs: { } } + ] + }) + const countChild = getBinaryNodeChild(result, 'count') + return +countChild!.attrs.value + } + + /** generates and uploads a set of pre-keys to the server */ + const uploadPreKeys = async(count = INITIAL_PREKEY_COUNT) => { + await keys.transaction( + async() => { + logger.info({ count }, 'uploading pre-keys') + const { update, node } = await getNextPreKeysNode({ creds, keys }, count) + + await query(node) + ev.emit('creds.update', update) + + logger.info({ count }, 'uploaded pre-keys') + } + ) + } + + const uploadPreKeysToServerIfRequired = async() => { + const preKeyCount = await getAvailablePreKeysOnServer() + logger.info(`${preKeyCount} pre-keys found on server`) + if(preKeyCount <= MIN_PREKEY_COUNT) { + await uploadPreKeys() + } + } + + const onMessageRecieved = (data: Buffer) => { + noise.decodeFrame(data, frame => { + // reset ping timeout + lastDateRecv = new Date() + + let anyTriggered = false + + anyTriggered = ws.emit('frame', frame) + // if it's a binary node + if(!(frame instanceof Uint8Array)) { + const msgId = frame.attrs.id + + if(logger.level === 'trace') { + logger.trace({ msgId, fromMe: false, frame }, 'communication') + } + + /* Check if this is a response to a message we sent */ + anyTriggered = ws.emit(`${DEF_TAG_PREFIX}${msgId}`, frame) || anyTriggered + /* Check if this is a response to a message we are expecting */ + const l0 = frame.tag + const l1 = frame.attrs || { } + const l2 = Array.isArray(frame.content) ? frame.content[0]?.tag : '' + + Object.keys(l1).forEach(key => { + anyTriggered = ws.emit(`${DEF_CALLBACK_PREFIX}${l0},${key}:${l1[key]},${l2}`, frame) || anyTriggered + anyTriggered = ws.emit(`${DEF_CALLBACK_PREFIX}${l0},${key}:${l1[key]}`, frame) || anyTriggered + anyTriggered = ws.emit(`${DEF_CALLBACK_PREFIX}${l0},${key}`, frame) || anyTriggered + }) + anyTriggered = ws.emit(`${DEF_CALLBACK_PREFIX}${l0},,${l2}`, frame) || anyTriggered + anyTriggered = ws.emit(`${DEF_CALLBACK_PREFIX}${l0}`, frame) || anyTriggered + + if(!anyTriggered && logger.level === 'debug') { + logger.debug({ unhandled: true, msgId, fromMe: false, frame }, 'communication recv') + } + } + }) + } + + const end = (error: Error | undefined) => { + if(closed) { + logger.trace({ trace: error?.stack }, 'connection already closed') + return + } + + closed = true + logger.info( + { trace: error?.stack }, + error ? 'connection errored' : 'connection closed' + ) + + clearInterval(keepAliveReq) + clearTimeout(qrTimer) + + ws.removeAllListeners('close') + ws.removeAllListeners('error') + ws.removeAllListeners('open') + ws.removeAllListeners('message') + + if(ws.readyState !== ws.CLOSED && ws.readyState !== ws.CLOSING) { + try { + ws.close() + } catch{ } + } + + ev.emit('connection.update', { + connection: 'close', + lastDisconnect: { + error, + date: new Date() + } + }) + ev.removeAllListeners('connection.update') + } + + const waitForSocketOpen = async() => { + if(ws.readyState === ws.OPEN) { + return + } + + if(ws.readyState === ws.CLOSED || ws.readyState === ws.CLOSING) { + throw new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed }) + } + + let onOpen: () => void + let onClose: (err: Error) => void + await new Promise((resolve, reject) => { + onOpen = () => resolve(undefined) + onClose = reject + ws.on('open', onOpen) + ws.on('close', onClose) + ws.on('error', onClose) + }) + .finally(() => { + ws.off('open', onOpen) + ws.off('close', onClose) + ws.off('error', onClose) + }) + } + + const startKeepAliveRequest = () => ( + keepAliveReq = setInterval(() => { + if(!lastDateRecv) { + lastDateRecv = new Date() + } + + const diff = Date.now() - lastDateRecv.getTime() + /* + check if it's been a suspicious amount of time since the server responded with our last seen + it could be that the network is down + */ + if(diff > keepAliveIntervalMs + 5000) { + end(new Boom('Connection was lost', { statusCode: DisconnectReason.connectionLost })) + } else if(ws.readyState === ws.OPEN) { + // if its all good, send a keep alive request + query( + { + tag: 'iq', + attrs: { + id: generateMessageTag(), + to: S_WHATSAPP_NET, + type: 'get', + xmlns: 'w:p', + }, + content: [{ tag: 'ping', attrs: { } }] + } + ) + .catch(err => { + logger.error({ trace: err.stack }, 'error in sending keep alive') + }) + } else { + logger.warn('keep alive called when WS not open') + } + }, keepAliveIntervalMs) + ) + /** i have no idea why this exists. pls enlighten me */ + const sendPassiveIq = (tag: 'passive' | 'active') => ( + query({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + xmlns: 'passive', + type: 'set', + }, + content: [ + { tag, attrs: { } } + ] + }) + ) + + /** logout & invalidate connection */ + const logout = async(msg?: string) => { + const jid = authState.creds.me?.id + if(jid) { + await sendNode({ + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'set', + id: generateMessageTag(), + xmlns: 'md' + }, + content: [ + { + tag: 'remove-companion-device', + attrs: { + jid, + reason: 'user_initiated' + } + } + ] + }) + } + + end(new Boom(msg || 'Intentional Logout', { statusCode: DisconnectReason.loggedOut })) + } + + ws.on('message', onMessageRecieved) + ws.on('open', async() => { + try { + await validateConnection() + } catch(err) { + logger.error({ err }, 'error in validating connection') + end(err) + } + }) + ws.on('error', error => end( + new Boom( + `WebSocket Error (${error.message})`, + { statusCode: getCodeFromWSError(error), data: error } + ) + )) + ws.on('close', () => end(new Boom('Connection Terminated', { statusCode: DisconnectReason.connectionClosed }))) + // the server terminated the connection + ws.on('CB:xmlstreamend', () => end(new Boom('Connection Terminated by Server', { statusCode: DisconnectReason.connectionClosed }))) + // QR gen + ws.on('CB:iq,type:set,pair-device', async(stanza: BinaryNode) => { + const iq: BinaryNode = { + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'result', + id: stanza.attrs.id, + } + } + await sendNode(iq) + + const pairDeviceNode = getBinaryNodeChild(stanza, 'pair-device') + const refNodes = getBinaryNodeChildren(pairDeviceNode, 'ref') + const noiseKeyB64 = Buffer.from(creds.noiseKey.public).toString('base64') + const identityKeyB64 = Buffer.from(creds.signedIdentityKey.public).toString('base64') + const advB64 = creds.advSecretKey + + let qrMs = qrTimeout || 60_000 // time to let a QR live + const genPairQR = () => { + if(ws.readyState !== ws.OPEN) { + return + } + + const refNode = refNodes.shift() + if(!refNode) { + end(new Boom('QR refs attempts ended', { statusCode: DisconnectReason.timedOut })) + return + } + + const ref = (refNode.content as Buffer).toString('utf-8') + const qr = [ref, noiseKeyB64, identityKeyB64, advB64].join(',') + + ev.emit('connection.update', { qr }) + + qrTimer = setTimeout(genPairQR, qrMs) + qrMs = qrTimeout || 20_000 // shorter subsequent qrs + } + + genPairQR() + }) + // device paired for the first time + // if device pairs successfully, the server asks to restart the connection + ws.on('CB:iq,,pair-success', async(stanza: BinaryNode) => { + logger.debug('pair success recv') + try { + const { reply, creds: updatedCreds } = configureSuccessfulPairing(stanza, creds) + + logger.info( + { me: updatedCreds.me, platform: updatedCreds.platform }, + 'pairing configured successfully, expect to restart the connection...' + ) + + ev.emit('creds.update', updatedCreds) + ev.emit('connection.update', { isNewLogin: true, qr: undefined }) + + await sendNode(reply) + } catch(error) { + logger.info({ trace: error.stack }, 'error in pairing') + end(error) + } + }) + // login complete + ws.on('CB:success', async() => { + await uploadPreKeysToServerIfRequired() + await sendPassiveIq('active') + + logger.info('opened connection to WA') + clearTimeout(qrTimer) // will never happen in all likelyhood -- but just in case WA sends success on first try + + ev.emit('connection.update', { connection: 'open' }) + }) + + ws.on('CB:stream:error', (node: BinaryNode) => { + logger.error({ node }, 'stream errored out') + + const { reason, statusCode } = getErrorCodeFromStreamError(node) + + end(new Boom(`Stream Errored (${reason})`, { statusCode, data: node })) + }) + // stream fail, possible logout + ws.on('CB:failure', (node: BinaryNode) => { + const reason = +(node.attrs.reason || 500) + end(new Boom('Connection Failure', { statusCode: reason, data: node.attrs })) + }) + + ws.on('CB:ib,,downgrade_webclient', () => { + end(new Boom('Multi-device beta not joined', { statusCode: DisconnectReason.multideviceMismatch })) + }) + + let didStartBuffer = false + process.nextTick(() => { + if(creds.me?.id) { + // start buffering important events + // if we're logged in + ev.buffer() + didStartBuffer = true + } + + ev.emit('connection.update', { connection: 'connecting', receivedPendingNotifications: false, qr: undefined }) + }) + + // called when all offline notifs are handled + ws.on('CB:ib,,offline', (node: BinaryNode) => { + const child = getBinaryNodeChild(node, 'offline') + const offlineNotifs = +(child?.attrs.count || 0) + + logger.info(`handled ${offlineNotifs} offline messages/notifications`) + if(didStartBuffer) { + ev.flush() + logger.trace('flushed events for initial buffer') + } + + ev.emit('connection.update', { receivedPendingNotifications: true }) + }) + + // update credentials when required + ev.on('creds.update', update => { + const name = update.me?.name + // if name has just been received + if(creds.me?.name !== name) { + logger.debug({ name }, 'updated pushName') + sendNode({ + tag: 'presence', + attrs: { name: name! } + }) + .catch(err => { + logger.warn({ trace: err.stack }, 'error in sending presence update on name change') + }) + } + + Object.assign(creds, update) + }) + + if(printQRInTerminal) { + printQRIfNecessaryListener(ev, logger) + } + + return { + type: 'md' as 'md', + ws, + ev, + authState: { creds, keys }, + get user() { + return authState.creds.me + }, + generateMessageTag, + query, + waitForMessage, + waitForSocketOpen, + sendRawMessage, + sendNode, + logout, + end, + onUnexpectedError, + uploadPreKeys, + uploadPreKeysToServerIfRequired, + /** Waits for the connection to WA to reach a state */ + waitForConnectionUpdate: bindWaitForConnectionUpdate(ev), + } +} + +export type Socket = ReturnType diff --git a/whatsapp_addon/Baileys/src/Store/index.ts b/whatsapp_addon/Baileys/src/Store/index.ts new file mode 100644 index 0000000..f744671 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Store/index.ts @@ -0,0 +1,2 @@ +import makeInMemoryStore from './make-in-memory-store' +export { makeInMemoryStore } \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Store/make-in-memory-store.ts b/whatsapp_addon/Baileys/src/Store/make-in-memory-store.ts new file mode 100644 index 0000000..f8d7a6b --- /dev/null +++ b/whatsapp_addon/Baileys/src/Store/make-in-memory-store.ts @@ -0,0 +1,358 @@ +import type KeyedDB from '@adiwajshing/keyed-db' +import type { Comparable } from '@adiwajshing/keyed-db/lib/Types' +import type { Logger } from 'pino' +import { proto } from '../../WAProto' +import { DEFAULT_CONNECTION_CONFIG } from '../Defaults' +import type makeMDSocket from '../Socket' +import type { BaileysEventEmitter, Chat, ConnectionState, Contact, GroupMetadata, PresenceData, WAMessage, WAMessageCursor, WAMessageKey } from '../Types' +import { toNumber, updateMessageWithReaction, updateMessageWithReceipt } from '../Utils' +import { jidNormalizedUser } from '../WABinary' +import makeOrderedDictionary from './make-ordered-dictionary' + +type WASocket = ReturnType + +export const waChatKey = (pin: boolean) => ({ + key: (c: Chat) => (pin ? (c.pinned ? '1' : '0') : '') + (c.archived ? '0' : '1') + (c.conversationTimestamp ? c.conversationTimestamp.toString(16).padStart(8, '0') : '') + c.id, + compare: (k1: string, k2: string) => k2.localeCompare (k1) +}) + +export const waMessageID = (m: WAMessage) => m.key.id || '' + +export type BaileysInMemoryStoreConfig = { + chatKey?: Comparable + logger?: Logger +} + +const makeMessagesDictionary = () => makeOrderedDictionary(waMessageID) + +export default ( + { logger: _logger, chatKey }: BaileysInMemoryStoreConfig +) => { + const logger = _logger || DEFAULT_CONNECTION_CONFIG.logger.child({ stream: 'in-mem-store' }) + chatKey = chatKey || waChatKey(true) + const KeyedDB = require('@adiwajshing/keyed-db').default as new (...args: any[]) => KeyedDB + + const chats = new KeyedDB(chatKey, c => c.id) + const messages: { [_: string]: ReturnType } = { } + const contacts: { [_: string]: Contact } = { } + const groupMetadata: { [_: string]: GroupMetadata } = { } + const presences: { [id: string]: { [participant: string]: PresenceData } } = { } + const state: ConnectionState = { connection: 'close' } + + const assertMessageList = (jid: string) => { + if(!messages[jid]) { + messages[jid] = makeMessagesDictionary() + } + + return messages[jid] + } + + const contactsUpsert = (newContacts: Contact[]) => { + const oldContacts = new Set(Object.keys(contacts)) + for(const contact of newContacts) { + oldContacts.delete(contact.id) + contacts[contact.id] = Object.assign( + contacts[contact.id] || {}, + contact + ) + } + + return oldContacts + } + + /** + * binds to a BaileysEventEmitter. + * It listens to all events and constructs a state that you can query accurate data from. + * Eg. can use the store to fetch chats, contacts, messages etc. + * @param ev typically the event emitter from the socket connection + */ + const bind = (ev: BaileysEventEmitter) => { + ev.on('connection.update', update => { + Object.assign(state, update) + }) + + ev.on('messaging-history.set', ({ + chats: newChats, + contacts: newContacts, + messages: newMessages, + isLatest + }) => { + if(isLatest) { + chats.clear() + + for(const id in messages) { + delete messages[id] + } + } + + const chatsAdded = chats.insertIfAbsent(...newChats).length + logger.debug({ chatsAdded }, 'synced chats') + + const oldContacts = contactsUpsert(newContacts) + for(const jid of oldContacts) { + delete contacts[jid] + } + + logger.debug({ deletedContacts: oldContacts.size, newContacts }, 'synced contacts') + + for(const msg of newMessages) { + const jid = msg.key.remoteJid! + const list = assertMessageList(jid) + list.upsert(msg, 'prepend') + } + + logger.debug({ messages: newMessages.length }, 'synced messages') + }) + + ev.on('contacts.update', updates => { + for(const update of updates) { + if(contacts[update.id!]) { + Object.assign(contacts[update.id!], update) + } else { + logger.debug({ update }, 'got update for non-existant contact') + } + } + }) + ev.on('chats.upsert', newChats => { + chats.upsert(...newChats) + }) + ev.on('chats.update', updates => { + for(let update of updates) { + const result = chats.update(update.id!, chat => { + if(update.unreadCount! > 0) { + update = { ...update } + update.unreadCount = (chat.unreadCount || 0) + update.unreadCount! + } + + Object.assign(chat, update) + }) + if(!result) { + logger.debug({ update }, 'got update for non-existant chat') + } + } + }) + ev.on('presence.update', ({ id, presences: update }) => { + presences[id] = presences[id] || {} + Object.assign(presences[id], update) + }) + ev.on('chats.delete', deletions => { + for(const item of deletions) { + chats.deleteById(item) + } + }) + ev.on('messages.upsert', ({ messages: newMessages, type }) => { + switch (type) { + case 'append': + case 'notify': + for(const msg of newMessages) { + const jid = jidNormalizedUser(msg.key.remoteJid!) + const list = assertMessageList(jid) + list.upsert(msg, 'append') + + if(type === 'notify') { + if(!chats.get(jid)) { + ev.emit('chats.upsert', [ + { + id: jid, + conversationTimestamp: toNumber(msg.messageTimestamp), + unreadCount: 1 + } + ]) + } + } + } + + break + } + }) + ev.on('messages.update', updates => { + for(const { update, key } of updates) { + const list = assertMessageList(key.remoteJid!) + const result = list.updateAssign(key.id!, update) + if(!result) { + logger.debug({ update }, 'got update for non-existent message') + } + } + }) + ev.on('messages.delete', item => { + if('all' in item) { + const list = messages[item.jid] + list?.clear() + } else { + const jid = item.keys[0].remoteJid! + const list = messages[jid] + if(list) { + const idSet = new Set(item.keys.map(k => k.id)) + list.filter(m => !idSet.has(m.key.id)) + } + } + }) + + ev.on('groups.update', updates => { + for(const update of updates) { + const id = update.id! + if(groupMetadata[id]) { + Object.assign(groupMetadata[id], update) + } else { + logger.debug({ update }, 'got update for non-existant group metadata') + } + } + }) + + ev.on('group-participants.update', ({ id, participants, action }) => { + const metadata = groupMetadata[id] + if(metadata) { + switch (action) { + case 'add': + metadata.participants.push(...participants.map(id => ({ id, isAdmin: false, isSuperAdmin: false }))) + break + case 'demote': + case 'promote': + for(const participant of metadata.participants) { + if(participants.includes(participant.id)) { + participant.isAdmin = action === 'promote' + } + } + + break + case 'remove': + metadata.participants = metadata.participants.filter(p => !participants.includes(p.id)) + break + } + } + }) + + ev.on('message-receipt.update', updates => { + for(const { key, receipt } of updates) { + const obj = messages[key.remoteJid!] + const msg = obj?.get(key.id!) + if(msg) { + updateMessageWithReceipt(msg, receipt) + } + } + }) + + ev.on('messages.reaction', (reactions) => { + for(const { key, reaction } of reactions) { + const obj = messages[key.remoteJid!] + const msg = obj?.get(key.id!) + if(msg) { + updateMessageWithReaction(msg, reaction) + } + } + }) + } + + const toJSON = () => ({ + chats, + contacts, + messages + }) + + const fromJSON = (json: { chats: Chat[], contacts: { [id: string]: Contact }, messages: { [id: string]: WAMessage[] } }) => { + chats.upsert(...json.chats) + contactsUpsert(Object.values(json.contacts)) + for(const jid in json.messages) { + const list = assertMessageList(jid) + for(const msg of json.messages[jid]) { + list.upsert(proto.WebMessageInfo.fromObject(msg), 'append') + } + } + } + + + return { + chats, + contacts, + messages, + groupMetadata, + state, + presences, + bind, + /** loads messages from the store, if not found -- uses the legacy connection */ + loadMessages: async(jid: string, count: number, cursor: WAMessageCursor) => { + const list = assertMessageList(jid) + const mode = !cursor || 'before' in cursor ? 'before' : 'after' + const cursorKey = !!cursor ? ('before' in cursor ? cursor.before : cursor.after) : undefined + const cursorValue = cursorKey ? list.get(cursorKey.id!) : undefined + + let messages: WAMessage[] + if(list && mode === 'before' && (!cursorKey || cursorValue)) { + if(cursorValue) { + const msgIdx = list.array.findIndex(m => m.key.id === cursorKey?.id) + messages = list.array.slice(0, msgIdx) + } else { + messages = list.array + } + + const diff = count - messages.length + if(diff < 0) { + messages = messages.slice(-count) // get the last X messages + } + } else { + messages = [] + } + + return messages + }, + loadMessage: async(jid: string, id: string) => messages[jid]?.get(id), + mostRecentMessage: async(jid: string) => { + const message: WAMessage | undefined = messages[jid]?.array.slice(-1)[0] + return message + }, + fetchImageUrl: async(jid: string, sock: WASocket | undefined) => { + const contact = contacts[jid] + if(!contact) { + return sock?.profilePictureUrl(jid) + } + + if(typeof contact.imgUrl === 'undefined') { + contact.imgUrl = await sock?.profilePictureUrl(jid) + } + + return contact.imgUrl + }, + fetchGroupMetadata: async(jid: string, sock: WASocket | undefined) => { + if(!groupMetadata[jid]) { + const metadata = await sock?.groupMetadata(jid) + if(metadata) { + groupMetadata[jid] = metadata + } + } + + return groupMetadata[jid] + }, + // fetchBroadcastListInfo: async(jid: string, sock: WASocket | undefined) => { + // if(!groupMetadata[jid]) { + // const metadata = await sock?.getBroadcastListInfo(jid) + // if(metadata) { + // groupMetadata[jid] = metadata + // } + // } + + // return groupMetadata[jid] + // }, + fetchMessageReceipts: async({ remoteJid, id }: WAMessageKey) => { + const list = messages[remoteJid!] + const msg = list?.get(id!) + return msg?.userReceipt + }, + toJSON, + fromJSON, + writeToFile: (path: string) => { + // require fs here so that in case "fs" is not available -- the app does not crash + const { writeFileSync } = require('fs') + writeFileSync(path, JSON.stringify(toJSON())) + }, + readFromFile: (path: string) => { + // require fs here so that in case "fs" is not available -- the app does not crash + const { readFileSync, existsSync } = require('fs') + if(existsSync(path)) { + logger.debug({ path }, 'reading from file') + const jsonStr = readFileSync(path, { encoding: 'utf-8' }) + const json = JSON.parse(jsonStr) + fromJSON(json) + } + } + } +} diff --git a/whatsapp_addon/Baileys/src/Store/make-ordered-dictionary.ts b/whatsapp_addon/Baileys/src/Store/make-ordered-dictionary.ts new file mode 100644 index 0000000..83b8f51 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Store/make-ordered-dictionary.ts @@ -0,0 +1,86 @@ +function makeOrderedDictionary(idGetter: (item: T) => string) { + const array: T[] = [] + const dict: { [_: string]: T } = { } + + const get = (id: string): T | undefined => dict[id] + + const update = (item: T) => { + const id = idGetter(item) + const idx = array.findIndex(i => idGetter(i) === id) + if(idx >= 0) { + array[idx] = item + dict[id] = item + } + + return false + } + + const upsert = (item: T, mode: 'append' | 'prepend') => { + const id = idGetter(item) + if(get(id)) { + update(item) + } else { + if(mode === 'append') { + array.push(item) + } else { + array.splice(0, 0, item) + } + + dict[id] = item + } + } + + const remove = (item: T) => { + const id = idGetter(item) + const idx = array.findIndex(i => idGetter(i) === id) + if(idx >= 0) { + array.splice(idx, 1) + delete dict[id] + return true + } + + return false + } + + return { + array, + get, + upsert, + update, + remove, + updateAssign: (id: string, update: Partial) => { + const item = get(id) + if(item) { + Object.assign(item, update) + delete dict[id] + dict[idGetter(item)] = item + return true + } + + return false + }, + clear: () => { + array.splice(0, array.length) + Object.keys(dict).forEach(key => { + delete dict[key] + }) + }, + filter: (contain: (item: T) => boolean) => { + let i = 0 + while(i < array.length) { + if(!contain(array[i])) { + delete dict[idGetter(array[i])] + array.splice(i, 1) + } else { + i += 1 + } + } + }, + toJSON: () => array, + fromJSON: (newItems: T[]) => { + array.splice(0, array.length, ...newItems) + } + } +} + +export default makeOrderedDictionary \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Tests/test.app-state-sync.ts b/whatsapp_addon/Baileys/src/Tests/test.app-state-sync.ts new file mode 100644 index 0000000..14f925e --- /dev/null +++ b/whatsapp_addon/Baileys/src/Tests/test.app-state-sync.ts @@ -0,0 +1,207 @@ +import { AccountSettings, ChatMutation, Contact, InitialAppStateSyncOptions } from '../Types' +import { unixTimestampSeconds } from '../Utils' +import { processSyncAction } from '../Utils/chat-utils' +import logger from '../Utils/logger' + +describe('App State Sync Tests', () => { + + const me: Contact = { id: randomJid() } + // case when initial sync is off + it('should return archive=false event', () => { + const jid = randomJid() + const index = ['archive', jid] + + const CASES: ChatMutation[][] = [ + [ + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: false, + messageRange: { + lastMessageTimestamp: unixTimestampSeconds() + } + } + } + } + } + ], + [ + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: true, + messageRange: { + lastMessageTimestamp: unixTimestampSeconds() + } + } + } + } + }, + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: false, + messageRange: { + lastMessageTimestamp: unixTimestampSeconds() + } + } + } + } + } + ] + ] + + for(const mutations of CASES) { + const events = processSyncAction(mutations, me, undefined, logger) + expect(events['chats.update']).toHaveLength(1) + const event = events['chats.update']?.[0] + expect(event.archive).toEqual(false) + } + }) + // case when initial sync is on + // and unarchiveChats = true + it('should not fire any archive event', () => { + const jid = randomJid() + const index = ['archive', jid] + const now = unixTimestampSeconds() + + const CASES: ChatMutation[][] = [ + [ + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: true, + messageRange: { + lastMessageTimestamp: now - 1 + } + } + } + } + } + ], + [ + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: false, + messageRange: { + lastMessageTimestamp: now + 10 + } + } + } + } + } + ], + [ + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: true, + messageRange: { + lastMessageTimestamp: now + 10 + } + } + } + } + }, + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: false, + messageRange: { + lastMessageTimestamp: now + 11 + } + } + } + } + } + ], + ] + + const ctx: InitialAppStateSyncOptions = { + recvChats: { + [jid]: { lastMsgRecvTimestamp: now } + }, + accountSettings: { unarchiveChats: true } + } + + for(const mutations of CASES) { + const events = processSyncActions(mutations, me, ctx, logger) + expect(events['chats.update']?.length).toBeFalsy() + } + }) + + // case when initial sync is on + // with unarchiveChats = true & unarchiveChats = false + it('should fire archive=true events', () => { + const jid = randomJid() + const index = ['archive', jid] + const now = unixTimestampSeconds() + + const CASES: { settings: AccountSettings, mutations: ChatMutation[] }[] = [ + { + settings: { unarchiveChats: true }, + mutations: [ + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: true, + messageRange: { + lastMessageTimestamp: now + } + } + } + } + } + ], + }, + { + settings: { unarchiveChats: false }, + mutations: [ + { + index, + syncAction: { + value: { + archiveChatAction: { + archived: true, + messageRange: { + lastMessageTimestamp: now - 10 + } + } + } + } + } + ], + } + ] + + for(const { mutations, settings } of CASES) { + const ctx: InitialAppStateSyncOptions = { + recvChats: { + [jid]: { lastMsgRecvTimestamp: now } + }, + accountSettings: settings + } + const events = processSyncActions(mutations, me, ctx, logger) + expect(events['chats.update']).toHaveLength(1) + const event = events['chats.update']?.[0] + expect(event.archive).toEqual(true) + } + }) +}) \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Tests/test.event-buffer.ts b/whatsapp_addon/Baileys/src/Tests/test.event-buffer.ts new file mode 100644 index 0000000..e2453e1 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Tests/test.event-buffer.ts @@ -0,0 +1,319 @@ +import { proto } from '../../WAProto' +import { Chat, WAMessageKey, WAMessageStatus, WAMessageStubType, WAMessageUpdate } from '../Types' +import { delay, generateMessageID, makeEventBuffer, toNumber, unixTimestampSeconds } from '../Utils' +import logger from '../Utils/logger' +import { randomJid } from './utils' + +describe('Event Buffer Tests', () => { + + let ev: ReturnType + beforeEach(() => { + const _logger = logger.child({ }) + _logger.level = 'trace' + ev = makeEventBuffer(_logger) + }) + + it('should buffer a chat upsert & update event', async() => { + const chatId = randomJid() + + const chats: Chat[] = [] + + ev.on('chats.upsert', c => chats.push(...c)) + ev.on('chats.update', () => fail('should not emit update event')) + + ev.buffer() + await Promise.all([ + (async() => { + ev.buffer() + await delay(100) + ev.emit('chats.upsert', [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }]) + const flushed = ev.flush() + expect(flushed).toBeFalsy() + })(), + (async() => { + ev.buffer() + await delay(200) + ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 124, unreadCount: 1 }]) + const flushed = ev.flush() + expect(flushed).toBeFalsy() + })() + ]) + + const flushed = ev.flush() + expect(flushed).toBeTruthy() + + expect(chats).toHaveLength(1) + expect(chats[0].conversationTimestamp).toEqual(124) + expect(chats[0].unreadCount).toEqual(2) + }) + + it('should overwrite a chats.delete event', async() => { + const chatId = randomJid() + const chats: Partial[] = [] + + ev.on('chats.update', c => chats.push(...c)) + ev.on('chats.delete', () => fail('not should have emitted')) + + ev.buffer() + + ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }]) + ev.emit('chats.delete', [chatId]) + ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 124, unreadCount: 1 }]) + + ev.flush() + + expect(chats).toHaveLength(1) + }) + + it('should overwrite a chats.update event', async() => { + const chatId = randomJid() + const chatsDeleted: string[] = [] + + ev.on('chats.delete', c => chatsDeleted.push(...c)) + ev.on('chats.update', () => fail('not should have emitted')) + + ev.buffer() + + ev.emit('chats.update', [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }]) + ev.emit('chats.delete', [chatId]) + + ev.flush() + + expect(chatsDeleted).toHaveLength(1) + }) + + it('should release a conditional update at the right time', async() => { + const chatId = randomJid() + const chatId2 = randomJid() + const chatsUpserted: Chat[] = [] + const chatsSynced: Chat[] = [] + + ev.on('chats.upsert', c => chatsUpserted.push(...c)) + ev.on('messaging-history.set', c => chatsSynced.push(...c.chats)) + ev.on('chats.update', () => fail('not should have emitted')) + + ev.buffer() + ev.emit('chats.update', [{ + id: chatId, + archived: true, + conditional(buff) { + if(buff.chatUpserts[chatId]) { + return true + } + } + }]) + ev.emit('chats.update', [{ + id: chatId2, + archived: true, + conditional(buff) { + if(buff.historySets.chats[chatId2]) { + return true + } + } + }]) + + ev.flush() + + ev.buffer() + ev.emit('chats.upsert', [{ + id: chatId, + conversationTimestamp: 123, + unreadCount: 1, + muteEndTime: 123 + }]) + ev.emit('messaging-history.set', { + chats: [{ + id: chatId2, + conversationTimestamp: 123, + unreadCount: 1, + muteEndTime: 123 + }], + contacts: [], + messages: [], + isLatest: false + }) + ev.flush() + + expect(chatsUpserted).toHaveLength(1) + expect(chatsUpserted[0].id).toEqual(chatId) + expect(chatsUpserted[0].archived).toEqual(true) + expect(chatsUpserted[0].muteEndTime).toEqual(123) + + expect(chatsSynced).toHaveLength(1) + expect(chatsSynced[0].id).toEqual(chatId2) + expect(chatsSynced[0].archived).toEqual(true) + }) + + it('should discard a conditional update', async() => { + const chatId = randomJid() + const chatsUpserted: Chat[] = [] + + ev.on('chats.upsert', c => chatsUpserted.push(...c)) + ev.on('chats.update', () => fail('not should have emitted')) + + ev.buffer() + ev.emit('chats.update', [{ + id: chatId, + archived: true, + conditional(buff) { + if(buff.chatUpserts[chatId]) { + return false + } + } + }]) + ev.emit('chats.upsert', [{ + id: chatId, + conversationTimestamp: 123, + unreadCount: 1, + muteEndTime: 123 + }]) + + ev.flush() + + expect(chatsUpserted).toHaveLength(1) + expect(chatsUpserted[0].archived).toBeUndefined() + }) + + it('should overwrite a chats.update event with a history event', async() => { + const chatId = randomJid() + let chatRecv: Chat | undefined + + ev.on('messaging-history.set', ({ chats }) => { + chatRecv = chats[0] + }) + ev.on('chats.update', () => fail('not should have emitted')) + + ev.buffer() + + ev.emit('messaging-history.set', { + chats: [{ id: chatId, conversationTimestamp: 123, unreadCount: 1 }], + messages: [], + contacts: [], + isLatest: true + }) + ev.emit('chats.update', [{ id: chatId, archived: true }]) + + ev.flush() + + expect(chatRecv).toBeDefined() + expect(chatRecv?.archived).toBeTruthy() + }) + + it('should buffer message upsert events', async() => { + const messageTimestamp = unixTimestampSeconds() + const msg: proto.IWebMessageInfo = { + key: { + remoteJid: randomJid(), + id: generateMessageID(), + fromMe: false + }, + messageStubType: WAMessageStubType.CIPHERTEXT, + messageTimestamp + } + + const msgs: proto.IWebMessageInfo[] = [] + + ev.on('messages.upsert', c => { + msgs.push(...c.messages) + expect(c.type).toEqual('notify') + }) + + ev.buffer() + ev.emit('messages.upsert', { messages: [proto.WebMessageInfo.fromObject(msg)], type: 'notify' }) + + msg.messageTimestamp = unixTimestampSeconds() + 1 + msg.messageStubType = undefined + msg.message = { conversation: 'Test' } + ev.emit('messages.upsert', { messages: [proto.WebMessageInfo.fromObject(msg)], type: 'notify' }) + ev.emit('messages.update', [{ key: msg.key, update: { status: WAMessageStatus.READ } }]) + + ev.flush() + + expect(msgs).toHaveLength(1) + expect(msgs[0].message).toBeTruthy() + expect(toNumber(msgs[0].messageTimestamp!)).toEqual(messageTimestamp) + expect(msgs[0].status).toEqual(WAMessageStatus.READ) + }) + + it('should buffer a message receipt update', async() => { + const msg: proto.IWebMessageInfo = { + key: { + remoteJid: randomJid(), + id: generateMessageID(), + fromMe: false + }, + messageStubType: WAMessageStubType.CIPHERTEXT, + messageTimestamp: unixTimestampSeconds() + } + + const msgs: proto.IWebMessageInfo[] = [] + + ev.on('messages.upsert', c => msgs.push(...c.messages)) + ev.on('message-receipt.update', () => fail('should not emit')) + + ev.buffer() + ev.emit('messages.upsert', { messages: [proto.WebMessageInfo.fromObject(msg)], type: 'notify' }) + ev.emit('message-receipt.update', [ + { + key: msg.key, + receipt: { + userJid: randomJid(), + readTimestamp: unixTimestampSeconds() + } + } + ]) + + ev.flush() + + expect(msgs).toHaveLength(1) + expect(msgs[0].userReceipt).toHaveLength(1) + }) + + it('should buffer multiple status updates', async() => { + const key: WAMessageKey = { + remoteJid: randomJid(), + id: generateMessageID(), + fromMe: false + } + + const msgs: WAMessageUpdate[] = [] + + ev.on('messages.update', c => msgs.push(...c)) + + ev.buffer() + ev.emit('messages.update', [{ key, update: { status: WAMessageStatus.DELIVERY_ACK } }]) + ev.emit('messages.update', [{ key, update: { status: WAMessageStatus.READ } }]) + + ev.flush() + + expect(msgs).toHaveLength(1) + expect(msgs[0].update.status).toEqual(WAMessageStatus.READ) + }) + + it('should remove chat unread counter', async() => { + const msg: proto.IWebMessageInfo = { + key: { + remoteJid: '12345@s.whatsapp.net', + id: generateMessageID(), + fromMe: false + }, + message: { + conversation: 'abcd' + }, + messageTimestamp: unixTimestampSeconds() + } + + const chats: Partial[] = [] + + ev.on('chats.update', c => chats.push(...c)) + + ev.buffer() + ev.emit('messages.upsert', { messages: [proto.WebMessageInfo.fromObject(msg)], type: 'notify' }) + ev.emit('chats.update', [{ id: msg.key.remoteJid!, unreadCount: 1, conversationTimestamp: msg.messageTimestamp }]) + ev.emit('messages.update', [{ key: msg.key, update: { status: WAMessageStatus.READ } }]) + + ev.flush() + + expect(chats[0].unreadCount).toBeUndefined() + }) +}) \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Tests/test.media-download.ts b/whatsapp_addon/Baileys/src/Tests/test.media-download.ts new file mode 100644 index 0000000..f00638c --- /dev/null +++ b/whatsapp_addon/Baileys/src/Tests/test.media-download.ts @@ -0,0 +1,76 @@ +import { readFileSync } from 'fs' +import { proto } from '../../WAProto' +import { DownloadableMessage, MediaType } from '../Types' +import { downloadContentFromMessage } from '../Utils' + +jest.setTimeout(20_000) + +type TestVector = { + type: MediaType + message: DownloadableMessage + plaintext: Buffer +} + +const TEST_VECTORS: TestVector[] = [ + { + type: 'image', + message: proto.Message.ImageMessage.decode( + Buffer.from( + 'Ck1odHRwczovL21tZy53aGF0c2FwcC5uZXQvZC9mL0FwaHR4WG9fWXZZcDZlUVNSa0tjOHE5d2ozVUpleWdoY3poM3ExX3I0ektnLmVuYxIKaW1hZ2UvanBlZyIgKTuVFyxDc6mTm4GXPlO3Z911Wd8RBeTrPLSWAEdqW8MomcUBQiB7wH5a4nXMKyLOT0A2nFgnnM/DUH8YjQf8QtkCIekaSkogTB+BXKCWDFrmNzozY0DCPn0L4VKd7yG1ZbZwbgRhzVc=', + 'base64' + ) + ), + plaintext: readFileSync('./Media/cat.jpeg') + }, + { + type: 'image', + message: proto.Message.ImageMessage.decode( + Buffer.from( + 'Ck1odHRwczovL21tZy53aGF0c2FwcC5uZXQvZC9mL0Ftb2tnWkphNWF6QWZxa3dVRzc0eUNUdTlGeWpjMmd5akpqcXNmMUFpZEU5LmVuYxIKaW1hZ2UvanBlZyIg8IS5TQzdzcuvcR7F8HMhWnXmlsV+GOo9JE1/t2k+o9Yoz6o6QiA7kDk8j5KOEQC0kDFE1qW7lBBDYhm5z06N3SirfUj3CUog/CjYF8e670D5wUJwWv2B2mKzDEo8IJLStDv76YmtPfs=', + 'base64' + ) + ), + plaintext: readFileSync('./Media/icon.png') + }, +] + +describe('Media Download Tests', () => { + + it('should download a full encrypted media correctly', async() => { + for(const { type, message, plaintext } of TEST_VECTORS) { + const readPipe = await downloadContentFromMessage(message, type) + + let buffer = Buffer.alloc(0) + for await (const read of readPipe) { + buffer = Buffer.concat([ buffer, read ]) + } + + expect(buffer).toEqual(plaintext) + } + }) + + it('should download an encrypted media correctly piece', async() => { + for(const { type, message, plaintext } of TEST_VECTORS) { + // check all edge cases + const ranges = [ + { startByte: 51, endByte: plaintext.length - 100 }, // random numbers + { startByte: 1024, endByte: 2038 }, // larger random multiples of 16 + { startByte: 1, endByte: plaintext.length - 1 } // borders + ] + for(const range of ranges) { + const readPipe = await downloadContentFromMessage(message, type, range) + + let buffer = Buffer.alloc(0) + for await (const read of readPipe) { + buffer = Buffer.concat([ buffer, read ]) + } + + const hex = buffer.toString('hex') + const expectedHex = plaintext.slice(range.startByte || 0, range.endByte || undefined).toString('hex') + expect(hex).toBe(expectedHex) + + console.log('success on ', range) + } + } + }) +}) \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Tests/test.messages.ts b/whatsapp_addon/Baileys/src/Tests/test.messages.ts new file mode 100644 index 0000000..7f51f39 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Tests/test.messages.ts @@ -0,0 +1,37 @@ +import { WAMessageContent } from '../Types' +import { normalizeMessageContent } from '../Utils' + +describe('Messages Tests', () => { + + it('should correctly unwrap messages', () => { + const CONTENT = { imageMessage: { } } + expectRightContent(CONTENT) + expectRightContent({ + ephemeralMessage: { message: CONTENT } + }) + expectRightContent({ + viewOnceMessage: { + message: { + ephemeralMessage: { message: CONTENT } + } + } + }) + expectRightContent({ + viewOnceMessage: { + message: { + viewOnceMessageV2: { + message: { + ephemeralMessage: { message: CONTENT } + } + } + } + } + }) + + function expectRightContent(content: WAMessageContent) { + expect( + normalizeMessageContent(content) + ).toHaveProperty('imageMessage') + } + }) +}) \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Tests/utils.ts b/whatsapp_addon/Baileys/src/Tests/utils.ts new file mode 100644 index 0000000..9d5ce04 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Tests/utils.ts @@ -0,0 +1,6 @@ +import { jidEncode } from '../WABinary' + + +export function randomJid() { + return jidEncode(Math.floor(Math.random() * 1000000), Math.random() < 0.5 ? 's.whatsapp.net' : 'g.us') +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/Auth.ts b/whatsapp_addon/Baileys/src/Types/Auth.ts new file mode 100644 index 0000000..1010da6 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Auth.ts @@ -0,0 +1,96 @@ +import type { proto } from '../../WAProto' +import type { Contact } from './Contact' +import type { MinimalMessage } from './Message' + +export type KeyPair = { public: Uint8Array, private: Uint8Array } +export type SignedKeyPair = { keyPair: KeyPair, signature: Uint8Array, keyId: number } + +export type ProtocolAddress = { + name: string // jid + deviceId: number +} +export type SignalIdentity = { + identifier: ProtocolAddress + identifierKey: Uint8Array +} + +export type LTHashState = { + version: number + hash: Buffer + indexValueMap: { + [indexMacBase64: string]: { valueMac: Uint8Array | Buffer } + } +} + +export type SignalCreds = { + readonly signedIdentityKey: KeyPair + readonly signedPreKey: SignedKeyPair + readonly registrationId: number +} + +export type AccountSettings = { + /** unarchive chats when a new message is received */ + unarchiveChats: boolean + /** the default mode to start new conversations with */ + defaultDisappearingMode?: Pick +} + +export type AuthenticationCreds = SignalCreds & { + readonly noiseKey: KeyPair + readonly advSecretKey: string + + me?: Contact + account?: proto.IADVSignedDeviceIdentity + signalIdentities?: SignalIdentity[] + myAppStateKeyId?: string + firstUnuploadedPreKeyId: number + nextPreKeyId: number + + lastAccountSyncTimestamp?: number + platform?: string + + processedHistoryMessages: MinimalMessage[] + /** number of times history & app state has been synced */ + accountSyncCounter: number + accountSettings: AccountSettings +} + +export type SignalDataTypeMap = { + 'pre-key': KeyPair + 'session': any + 'sender-key': any + 'sender-key-memory': { [jid: string]: boolean } + 'app-state-sync-key': proto.Message.IAppStateSyncKeyData + 'app-state-sync-version': LTHashState +} + +export type SignalDataSet = { [T in keyof SignalDataTypeMap]?: { [id: string]: SignalDataTypeMap[T] | null } } + +type Awaitable = T | Promise + +export type SignalKeyStore = { + get(type: T, ids: string[]): Awaitable<{ [id: string]: SignalDataTypeMap[T] }> + set(data: SignalDataSet): Awaitable + /** clear all the data in the store */ + clear?(): Awaitable +} + +export type SignalKeyStoreWithTransaction = SignalKeyStore & { + isInTransaction: () => boolean + transaction(exec: () => Promise): Promise +} + +export type TransactionCapabilityOptions = { + maxCommitRetries: number + delayBetweenTriesMs: number +} + +export type SignalAuthState = { + creds: SignalCreds + keys: SignalKeyStore +} + +export type AuthenticationState = { + creds: AuthenticationCreds + keys: SignalKeyStore +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/Call.ts b/whatsapp_addon/Baileys/src/Types/Call.ts new file mode 100644 index 0000000..cea184a --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Call.ts @@ -0,0 +1,14 @@ + +export type WACallUpdateType = 'offer' | 'ringing' | 'timeout' | 'reject' | 'accept' + +export type WACallEvent = { + chatId: string + from: string + isGroup?: boolean + id: string + date: Date + isVideo?: boolean + status: WACallUpdateType + offline: boolean + latencyMs?: number +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/Chat.ts b/whatsapp_addon/Baileys/src/Types/Chat.ts new file mode 100644 index 0000000..cd29cba --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Chat.ts @@ -0,0 +1,98 @@ +import type { proto } from '../../WAProto' +import type { AccountSettings } from './Auth' +import type { BufferedEventData } from './Events' +import type { MinimalMessage } from './Message' + +/** set of statuses visible to other people; see updatePresence() in WhatsAppWeb.Send */ +export type WAPresence = 'unavailable' | 'available' | 'composing' | 'recording' | 'paused' + +export const ALL_WA_PATCH_NAMES = [ + 'critical_block', + 'critical_unblock_low', + 'regular_high', + 'regular_low', + 'regular' +] as const + +export type WAPatchName = typeof ALL_WA_PATCH_NAMES[number] + +export interface PresenceData { + lastKnownPresence: WAPresence + lastSeen?: number +} + +export type ChatMutation = { + syncAction: proto.ISyncActionData + index: string[] +} + +export type WAPatchCreate = { + syncAction: proto.ISyncActionValue + index: string[] + type: WAPatchName + apiVersion: number + operation: proto.SyncdMutation.SyncdOperation +} + +export type Chat = proto.IConversation & { + /** unix timestamp of when the last message was received in the chat */ + lastMessageRecvTimestamp?: number +} + +export type ChatUpdate = Partial boolean | undefined +}> + +/** + * the last messages in a chat, sorted reverse-chronologically. That is, the latest message should be first in the chat + * for MD modifications, the last message in the array (i.e. the earlist message) must be the last message recv in the chat + * */ +export type LastMessageList = MinimalMessage[] | proto.SyncActionValue.ISyncActionMessageRange + +export type ChatModification = + { + archive: boolean + lastMessages: LastMessageList + } + | { pushNameSetting: string } + | { pin: boolean } + | { + /** mute for duration, or provide timestamp of mute to remove*/ + mute: number | null + } + | { + clear: 'all' | { messages: {id: string, fromMe?: boolean, timestamp: number}[] } + } + | { + star: { + messages: { id: string, fromMe?: boolean }[], + star: boolean + } + } + | { + markRead: boolean + lastMessages: LastMessageList + } + | { delete: true, lastMessages: LastMessageList } + +export type InitialReceivedChatsState = { + [jid: string]: { + /** the last message received from the other party */ + lastMsgRecvTimestamp?: number + /** the absolute last message in the chat */ + lastMsgTimestamp: number + } +} + +export type InitialAppStateSyncOptions = { + accountSettings: AccountSettings +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/Contact.ts b/whatsapp_addon/Baileys/src/Types/Contact.ts new file mode 100644 index 0000000..5da78e8 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Contact.ts @@ -0,0 +1,19 @@ +export interface Contact { + id: string + /** name of the contact, you have saved on your WA */ + name?: string + /** name of the contact, the contact has set on their own on WA */ + notify?: string + /** I have no idea */ + verifiedName?: string + // Baileys Added + /** + * Url of the profile picture of the contact + * + * 'changed' => if the profile picture has changed + * null => if the profile picture has not been set (default profile picture) + * any other string => url of the profile picture + */ + imgUrl?: string | null | 'changed' + status?: string +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/Events.ts b/whatsapp_addon/Baileys/src/Types/Events.ts new file mode 100644 index 0000000..4e1866e --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Events.ts @@ -0,0 +1,87 @@ +import type { Boom } from '@hapi/boom' +import { proto } from '../../WAProto' +import { AuthenticationCreds } from './Auth' +import { WACallEvent } from './Call' +import { Chat, ChatUpdate, PresenceData } from './Chat' +import { Contact } from './Contact' +import { GroupMetadata, ParticipantAction } from './GroupMetadata' +import { MessageUpsertType, MessageUserReceiptUpdate, WAMessage, WAMessageKey, WAMessageUpdate } from './Message' +import { ConnectionState } from './State' + +export type BaileysEventMap = { + /** connection state has been updated -- WS closed, opened, connecting etc. */ + 'connection.update': Partial + /** credentials updated -- some metadata, keys or something */ + 'creds.update': Partial + /** set chats (history sync), everything is reverse chronologically sorted */ + 'messaging-history.set': { + chats: Chat[] + contacts: Contact[] + messages: WAMessage[] + isLatest: boolean + } + /** upsert chats */ + 'chats.upsert': Chat[] + /** update the given chats */ + 'chats.update': ChatUpdate[] + /** delete chats with given ID */ + 'chats.delete': string[] + /** presence of contact in a chat updated */ + 'presence.update': { id: string, presences: { [participant: string]: PresenceData } } + + 'contacts.upsert': Contact[] + 'contacts.update': Partial[] + + 'messages.delete': { keys: WAMessageKey[] } | { jid: string, all: true } + 'messages.update': WAMessageUpdate[] + 'messages.media-update': { key: WAMessageKey, media?: { ciphertext: Uint8Array, iv: Uint8Array }, error?: Boom }[] + /** + * add/update the given messages. If they were received while the connection was online, + * the update will have type: "notify" + * */ + 'messages.upsert': { messages: WAMessage[], type: MessageUpsertType } + /** message was reacted to. If reaction was removed -- then "reaction.text" will be falsey */ + 'messages.reaction': { key: WAMessageKey, reaction: proto.IReaction }[] + + 'message-receipt.update': MessageUserReceiptUpdate[] + + 'groups.upsert': GroupMetadata[] + 'groups.update': Partial[] + /** apply an action to participants in a group */ + 'group-participants.update': { id: string, participants: string[], action: ParticipantAction } + + 'blocklist.set': { blocklist: string[] } + 'blocklist.update': { blocklist: string[], type: 'add' | 'remove' } + /** Receive an update on a call, including when the call was received, rejected, accepted */ + 'call': WACallEvent[] +} + +export type BufferedEventData = { + historySets: { + chats: { [jid: string]: Chat } + contacts: { [jid: string]: Contact } + messages: { [uqId: string]: WAMessage } + empty: boolean + isLatest: boolean + } + chatUpserts: { [jid: string]: Chat } + chatUpdates: { [jid: string]: ChatUpdate } + chatDeletes: Set + contactUpserts: { [jid: string]: Contact } + contactUpdates: { [jid: string]: Partial } + messageUpserts: { [key: string]: { type: MessageUpsertType, message: WAMessage } } + messageUpdates: { [key: string]: WAMessageUpdate } + messageDeletes: { [key: string]: WAMessageKey } + messageReactions: { [key: string]: { key: WAMessageKey, reactions: proto.IReaction[] } } + messageReceipts: { [key: string]: { key: WAMessageKey, userReceipt: proto.IUserReceipt[] } }, + groupUpdates: { [jid: string]: Partial } +} + +export type BaileysEvent = keyof BaileysEventMap + +export interface BaileysEventEmitter { + on(event: T, listener: (arg: BaileysEventMap[T]) => void): void + off(event: T, listener: (arg: BaileysEventMap[T]) => void): void + removeAllListeners(event: T): void + emit(event: T, arg: BaileysEventMap[T]): boolean +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/GroupMetadata.ts b/whatsapp_addon/Baileys/src/Types/GroupMetadata.ts new file mode 100644 index 0000000..8a47fc7 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/GroupMetadata.ts @@ -0,0 +1,41 @@ +import { Contact } from './Contact' + +export type GroupParticipant = (Contact & { isAdmin?: boolean; isSuperAdmin?: boolean, admin?: 'admin' | 'superadmin' | null }) + +export type ParticipantAction = 'add' | 'remove' | 'promote' | 'demote' + +export interface GroupMetadata { + id: string + owner: string | undefined + subject: string + /** group subject owner */ + subjectOwner?: string + /** group subject modification date */ + subjectTime?: number + creation?: number + desc?: string + descOwner?: string + descId?: string + /** is set when the group only allows admins to change group settings */ + restrict?: boolean + /** is set when the group only allows admins to write messages */ + announce?: boolean + /** number of group participants */ + size?: number + // Baileys modified array + participants: GroupParticipant[] + ephemeralDuration?: number + inviteCode?: string +} + + +export interface WAGroupCreateResponse { + status: number + gid?: string + participants?: [{ [key: string]: any }] +} + +export interface GroupModificationResponse { + status: number + participants?: { [key: string]: any } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/Message.ts b/whatsapp_addon/Baileys/src/Types/Message.ts new file mode 100644 index 0000000..3000e51 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Message.ts @@ -0,0 +1,234 @@ +import type NodeCache from 'node-cache' +import type { Logger } from 'pino' +import type { Readable } from 'stream' +import type { URL } from 'url' +import { proto } from '../../WAProto' +import { MEDIA_HKDF_KEY_MAPPING } from '../Defaults' +import type { GroupMetadata } from './GroupMetadata' + +// export the WAMessage Prototypes +export { proto as WAProto } +export type WAMessage = proto.IWebMessageInfo +export type WAMessageContent = proto.IMessage +export type WAContactMessage = proto.Message.IContactMessage +export type WAContactsArrayMessage = proto.Message.IContactsArrayMessage +export type WAMessageKey = proto.IMessageKey +export type WATextMessage = proto.Message.IExtendedTextMessage +export type WAContextInfo = proto.IContextInfo +export type WALocationMessage = proto.Message.ILocationMessage +export type WAGenericMediaMessage = proto.Message.IVideoMessage | proto.Message.IImageMessage | proto.Message.IAudioMessage | proto.Message.IDocumentMessage | proto.Message.IStickerMessage +// eslint-disable-next-line no-unused-vars +export import WAMessageStubType = proto.WebMessageInfo.StubType +// eslint-disable-next-line no-unused-vars +export import WAMessageStatus = proto.WebMessageInfo.Status +export type WAMediaUpload = Buffer | { url: URL | string } | { stream: Readable } +/** Set of message types that are supported by the library */ +export type MessageType = keyof proto.Message + +export type DownloadableMessage = { mediaKey?: Uint8Array | null, directPath?: string | null, url?: string | null } + +export type MessageReceiptType = 'read' | 'read-self' | 'hist_sync' | 'peer_msg' | 'sender' | 'inactive' | 'played' | undefined + +export type MediaConnInfo = { + auth: string + ttl: number + hosts: { hostname: string, maxContentLengthBytes: number }[] + fetchDate: Date +} + +export interface WAUrlInfo { + 'canonical-url': string + 'matched-text': string + title: string + description?: string + jpegThumbnail?: Buffer + highQualityThumbnail?: proto.Message.IImageMessage + originalThumbnailUrl?: string +} + +// types to generate WA messages +type Mentionable = { + /** list of jids that are mentioned in the accompanying text */ + mentions?: string[] +} +type ViewOnce = { + viewOnce?: boolean +} +type Buttonable = { + /** add buttons to the message */ + buttons?: proto.Message.ButtonsMessage.IButton[] +} +type Templatable = { + /** add buttons to the message (conflicts with normal buttons)*/ + templateButtons?: proto.IHydratedTemplateButton[] + + footer?: string +} +type Listable = { + /** Sections of the List */ + sections?: proto.Message.ListMessage.ISection[] + + /** Title of a List Message only */ + title?: string + + /** Text of the bnutton on the list (required) */ + buttonText?: string +} +type WithDimensions = { + width?: number + height?: number +} + +export type MediaType = keyof typeof MEDIA_HKDF_KEY_MAPPING +export type AnyMediaMessageContent = ( + ({ + image: WAMediaUpload + caption?: string + jpegThumbnail?: string + } & Mentionable & Buttonable & Templatable & WithDimensions) + | ({ + video: WAMediaUpload + caption?: string + gifPlayback?: boolean + jpegThumbnail?: string + } & Mentionable & Buttonable & Templatable & WithDimensions) + | { + audio: WAMediaUpload + /** if set to true, will send as a `voice note` */ + ptt?: boolean + /** optionally tell the duration of the audio */ + seconds?: number + } + | ({ + sticker: WAMediaUpload + isAnimated?: boolean + } & WithDimensions) | ({ + document: WAMediaUpload + mimetype: string + fileName?: string + caption?: string + } & Buttonable & Templatable)) + & { mimetype?: string } + +export type ButtonReplyInfo = { + displayText: string + id: string + index: number +} + +export type WASendableProduct = Omit & { + productImage: WAMediaUpload +} + +export type AnyRegularMessageContent = ( + ({ + text: string + linkPreview?: WAUrlInfo | null + } + & Mentionable & Buttonable & Templatable & Listable) + | AnyMediaMessageContent + | { + contacts: { + displayName?: string + contacts: proto.Message.IContactMessage[] + } + } + | { + location: WALocationMessage + } + | { react: proto.Message.IReactionMessage } + | { + buttonReply: ButtonReplyInfo + type: 'template' | 'plain' + } + | { + listReply: Omit + } + | { + product: WASendableProduct, + businessOwnerJid?: string + body?: string + footer?: string + } +) & ViewOnce + +export type AnyMessageContent = AnyRegularMessageContent | { + forward: WAMessage + force?: boolean +} | { + /** Delete your message or anyone's message in a group (admin required) */ + delete: WAMessageKey +} | { + disappearingMessagesInChat: boolean | number +} + +export type GroupMetadataParticipants = Pick + +type MinimalRelayOptions = { + /** override the message ID with a custom provided string */ + messageId?: string + /** cached group metadata, use to prevent redundant requests to WA & speed up msg sending */ + cachedGroupMetadata?: (jid: string) => Promise +} + +export type MessageRelayOptions = MinimalRelayOptions & { + /** only send to a specific participant; used when a message decryption fails for a single user */ + participant?: { jid: string, count: number } + /** additional attributes to add to the WA binary node */ + additionalAttributes?: { [_: string]: string } + /** should we use the devices cache, or fetch afresh from the server; default assumed to be "true" */ + useUserDevicesCache?: boolean +} + +export type MiscMessageGenerationOptions = MinimalRelayOptions & { + /** optional, if you want to manually set the timestamp of the message */ + timestamp?: Date + /** the message you want to quote */ + quoted?: WAMessage + /** disappearing messages settings */ + ephemeralExpiration?: number | string + /** timeout for media upload to WA server */ + mediaUploadTimeoutMs?: number +} +export type MessageGenerationOptionsFromContent = MiscMessageGenerationOptions & { + userJid: string +} + +export type WAMediaUploadFunction = (readStream: Readable, opts: { fileEncSha256B64: string, mediaType: MediaType, timeoutMs?: number }) => Promise<{ mediaUrl: string, directPath: string }> + +export type MediaGenerationOptions = { + logger?: Logger + mediaTypeOverride?: MediaType + upload: WAMediaUploadFunction + /** cache media so it does not have to be uploaded again */ + mediaCache?: NodeCache + + mediaUploadTimeoutMs?: number +} +export type MessageContentGenerationOptions = MediaGenerationOptions & { + getUrlInfo?: (text: string) => Promise +} +export type MessageGenerationOptions = MessageContentGenerationOptions & MessageGenerationOptionsFromContent + +/** + * Type of message upsert + * 1. notify => notify the user, this message was just received + * 2. append => append the message to the chat history, no notification required + */ +export type MessageUpsertType = 'append' | 'notify' + +export type MessageUserReceipt = proto.IUserReceipt + +export type WAMessageUpdate = { update: Partial, key: proto.IMessageKey } + +export type WAMessageCursor = { before: WAMessageKey | undefined } | { after: WAMessageKey | undefined } + +export type MessageUserReceiptUpdate = { key: proto.IMessageKey, receipt: MessageUserReceipt } + +export type MediaDecryptionKeyInfo = { + iv: Buffer + cipherKey: Buffer + macKey?: Buffer +} + +export type MinimalMessage = Pick diff --git a/whatsapp_addon/Baileys/src/Types/Product.ts b/whatsapp_addon/Baileys/src/Types/Product.ts new file mode 100644 index 0000000..4fcb0fc --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Product.ts @@ -0,0 +1,84 @@ +import { WAMediaUpload } from './Message' + +export type CatalogResult = { + data: { + paging: { cursors: { before: string, after: string } }, + data: any[] + } +} + +export type ProductCreateResult = { + data: { product: any } +} + +export type CatalogStatus = { + status: string + canAppeal: boolean +} + +export type CatalogCollection = { + id: string + name: string + products: Product[] + + status: CatalogStatus +} + +export type ProductAvailability = 'in stock' + +export type ProductBase = { + name: string + retailerId?: string + url?: string + description: string + price: number + currency: string + isHidden?: boolean +} + +export type ProductCreate = ProductBase & { + /** ISO country code for product origin. Set to undefined for no country */ + originCountryCode: string | undefined + /** images of the product */ + images: WAMediaUpload[] +} + +export type ProductUpdate = Omit + +export type Product = ProductBase & { + id: string + imageUrls: { [_: string]: string } + reviewStatus: { [_: string]: string } + availability: ProductAvailability +} + +export type OrderPrice = { + currency: string + total: number +} + +export type OrderProduct = { + id: string + imageUrl: string + name: string + quantity: number + + currency: string + price: number +} + +export type OrderDetails = { + price: OrderPrice + products: OrderProduct[] +} + +export type CatalogCursor = string + +export type GetCatalogOptions = { + /** cursor to start from */ + cursor?: CatalogCursor + /** number of products to fetch */ + limit?: number + + jid?: string +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/Socket.ts b/whatsapp_addon/Baileys/src/Types/Socket.ts new file mode 100644 index 0000000..5144fdd --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/Socket.ts @@ -0,0 +1,101 @@ + +import { AxiosRequestConfig } from 'axios' +import type { Agent } from 'https' +import type NodeCache from 'node-cache' +import type { Logger } from 'pino' +import type { URL } from 'url' +import { proto } from '../../WAProto' +import { AuthenticationState, TransactionCapabilityOptions } from './Auth' +import { MediaConnInfo } from './Message' + +export type WAVersion = [number, number, number] +export type WABrowserDescription = [string, string, string] + +export type MessageRetryMap = { [msgId: string]: number } + +export type SocketConfig = { + /** the WS url to connect to WA */ + waWebSocketUrl: string | URL + /** Fails the connection if the socket times out in this interval */ + connectTimeoutMs: number + /** Default timeout for queries, undefined for no timeout */ + defaultQueryTimeoutMs: number | undefined + /** ping-pong interval for WS connection */ + keepAliveIntervalMs: number + /** proxy agent */ + agent?: Agent + /** pino logger */ + logger: Logger + /** version to connect with */ + version: WAVersion + /** override browser config */ + browser: WABrowserDescription + /** agent used for fetch requests -- uploading/downloading media */ + fetchAgent?: Agent + /** should the QR be printed in the terminal */ + printQRInTerminal: boolean + /** should events be emitted for actions done by this socket connection */ + emitOwnEvents: boolean + /** provide a cache to store media, so does not have to be re-uploaded */ + mediaCache?: NodeCache + /** custom upload hosts to upload media to */ + customUploadHosts: MediaConnInfo['hosts'] + /** time to wait between sending new retry requests */ + retryRequestDelayMs: number + /** time to wait for the generation of the next QR in ms */ + qrTimeout?: number; + /** provide an auth state object to maintain the auth state */ + auth: AuthenticationState + /** manage history processing with this control; by default will sync up everything */ + shouldSyncHistoryMessage: (msg: proto.Message.IHistorySyncNotification) => boolean + /** transaction capability options for SignalKeyStore */ + transactionOpts: TransactionCapabilityOptions + /** provide a cache to store a user's device list */ + userDevicesCache?: NodeCache + /** marks the client as online whenever the socket successfully connects */ + markOnlineOnConnect: boolean + /** + * map to store the retry counts for failed messages; + * used to determine whether to retry a message or not */ + msgRetryCounterMap?: MessageRetryMap + /** width for link preview images */ + linkPreviewImageThumbnailWidth: number + /** Should Baileys ask the phone for full history, will be received async */ + syncFullHistory: boolean + /** Should baileys fire init queries automatically, default true */ + fireInitQueries: boolean + /** + * generate a high quality link preview, + * entails uploading the jpegThumbnail to WA + * */ + generateHighQualityLinkPreview: boolean + + /** + * Returns if a jid should be ignored, + * no event for that jid will be triggered. + * Messages from that jid will also not be decrypted + * */ + shouldIgnoreJid: (jid: string) => boolean | undefined + + /** + * Optionally patch the message before sending out + * */ + patchMessageBeforeSending: ( + msg: proto.IMessage, + recipientJids: string[], + ) => Promise | proto.IMessage + + /** verify app state MACs */ + appStateMacVerification: { + patch: boolean + snapshot: boolean + } + + /** options for axios */ + options: AxiosRequestConfig + /** + * fetch a message from your store + * implement this so that messages failed to send (solves the "this message can take a while" issue) can be retried + * */ + getMessage: (key: proto.IMessageKey) => Promise +} diff --git a/whatsapp_addon/Baileys/src/Types/State.ts b/whatsapp_addon/Baileys/src/Types/State.ts new file mode 100644 index 0000000..53c39b6 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/State.ts @@ -0,0 +1,29 @@ +import { Contact } from './Contact' + +export type WAConnectionState = 'open' | 'connecting' | 'close' + +export type ConnectionState = { + /** connection is now open, connecting or closed */ + connection: WAConnectionState + /** the error that caused the connection to close */ + lastDisconnect?: { + error: Error | undefined + date: Date + } + /** is this a new login */ + isNewLogin?: boolean + /** the current QR code */ + qr?: string + /** has the device received all pending notifications while it was offline */ + receivedPendingNotifications?: boolean + /** legacy connection options */ + legacy?: { + phoneConnected: boolean + user?: Contact + } + /** + * if the client is shown as an active, online client. + * If this is false, the primary phone and other devices will receive notifs + * */ + isOnline?: boolean +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Types/index.ts b/whatsapp_addon/Baileys/src/Types/index.ts new file mode 100644 index 0000000..78ea6f4 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Types/index.ts @@ -0,0 +1,55 @@ +export * from './Auth' +export * from './GroupMetadata' +export * from './Chat' +export * from './Contact' +export * from './State' +export * from './Message' +export * from './Socket' +export * from './Events' +export * from './Product' +export * from './Call' + +import { AuthenticationState } from './Auth' +import { SocketConfig } from './Socket' + +export type UserFacingSocketConfig = Partial & { auth: AuthenticationState } + +export enum DisconnectReason { + connectionClosed = 428, + connectionLost = 408, + connectionReplaced = 440, + timedOut = 408, + loggedOut = 401, + badSession = 500, + restartRequired = 515, + multideviceMismatch = 411 +} + +export type WAInitResponse = { + ref: string + ttl: number + status: 200 +} + +export type WABusinessHoursConfig = { + day_of_week: string + mode: string + open_time?: number + close_time?: number +} + +export type WABusinessProfile = { + description: string + email: string | undefined + business_hours: { + timezone?: string + config?: WABusinessHoursConfig[] + business_config?: WABusinessHoursConfig[] + } + website: string[] + category?: string + wid?: string + address?: string +} + +export type CurveKeyPair = { private: Uint8Array; public: Uint8Array } \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/auth-utils.ts b/whatsapp_addon/Baileys/src/Utils/auth-utils.ts new file mode 100644 index 0000000..f1f3393 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/auth-utils.ts @@ -0,0 +1,199 @@ +import { randomBytes } from 'crypto' +import NodeCache from 'node-cache' +import type { Logger } from 'pino' +import type { AuthenticationCreds, SignalDataSet, SignalDataTypeMap, SignalKeyStore, SignalKeyStoreWithTransaction, TransactionCapabilityOptions } from '../Types' +import { Curve, signedKeyPair } from './crypto' +import { delay, generateRegistrationId } from './generics' + +/** + * Adds caching capability to a SignalKeyStore + * @param store the store to add caching to + * @param logger to log trace events + * @param opts NodeCache options + */ +export function makeCacheableSignalKeyStore( + store: SignalKeyStore, + logger: Logger, + opts?: NodeCache.Options +): SignalKeyStore { + const cache = new NodeCache({ + ...opts || { }, + useClones: false, + }) + + function getUniqueId(type: string, id: string) { + return `${type}.${id}` + } + + return { + async get(type, ids) { + const data: { [_: string]: SignalDataTypeMap[typeof type] } = { } + const idsToFetch: string[] = [] + for(const id of ids) { + const item = cache.get(getUniqueId(type, id)) + if(typeof item !== 'undefined') { + data[id] = item + } else { + idsToFetch.push(id) + } + } + + if(idsToFetch.length) { + logger.trace({ items: idsToFetch.length }, 'loading from store') + const fetched = await store.get(type, idsToFetch) + for(const id of idsToFetch) { + const item = fetched[id] + if(item) { + data[id] = item + cache.set(getUniqueId(type, id), item) + } + } + } + + return data + }, + async set(data) { + let keys = 0 + for(const type in data) { + for(const id in data[type]) { + cache.set(getUniqueId(type, id), data[type][id]) + keys += 1 + } + } + + logger.trace({ keys }, 'updated cache') + + await store.set(data) + }, + async clear() { + cache.flushAll() + await store.clear?.() + } + } +} + +/** + * Adds DB like transaction capability (https://en.wikipedia.org/wiki/Database_transaction) to the SignalKeyStore, + * this allows batch read & write operations & improves the performance of the lib + * @param state the key store to apply this capability to + * @param logger logger to log events + * @returns SignalKeyStore with transaction capability + */ +export const addTransactionCapability = ( + state: SignalKeyStore, + logger: Logger, + { maxCommitRetries, delayBetweenTriesMs }: TransactionCapabilityOptions +): SignalKeyStoreWithTransaction => { + let inTransaction = false + // number of queries made to the DB during the transaction + // only there for logging purposes + let dbQueriesInTransaction = 0 + let transactionCache: SignalDataSet = { } + let mutations: SignalDataSet = { } + + /** + * prefetches some data and stores in memory, + * useful if these data points will be used together often + * */ + const prefetch = async(type: keyof SignalDataTypeMap, ids: string[]) => { + const dict = transactionCache[type] + const idsRequiringFetch = dict ? ids.filter(item => !(item in dict)) : ids + // only fetch if there are any items to fetch + if(idsRequiringFetch.length) { + dbQueriesInTransaction += 1 + const result = await state.get(type, idsRequiringFetch) + + transactionCache[type] = Object.assign(transactionCache[type] || { }, result) + } + } + + return { + get: async(type, ids) => { + if(inTransaction) { + await prefetch(type, ids) + return ids.reduce( + (dict, id) => { + const value = transactionCache[type]?.[id] + if(value) { + dict[id] = value + } + + return dict + }, { } + ) + } else { + return state.get(type, ids) + } + }, + set: data => { + if(inTransaction) { + logger.trace({ types: Object.keys(data) }, 'caching in transaction') + for(const key in data) { + transactionCache[key] = transactionCache[key] || { } + Object.assign(transactionCache[key], data[key]) + + mutations[key] = mutations[key] || { } + Object.assign(mutations[key], data[key]) + } + } else { + return state.set(data) + } + }, + isInTransaction: () => inTransaction, + transaction: async(work) => { + // if we're already in a transaction, + // just execute what needs to be executed -- no commit required + if(inTransaction) { + await work() + } else { + logger.trace('entering transaction') + inTransaction = true + try { + await work() + if(Object.keys(mutations).length) { + logger.trace('committing transaction') + // retry mechanism to ensure we've some recovery + // in case a transaction fails in the first attempt + let tries = maxCommitRetries + while(tries) { + tries -= 1 + try { + await state.set(mutations) + logger.trace({ dbQueriesInTransaction }, 'committed transaction') + break + } catch(error) { + logger.warn(`failed to commit ${Object.keys(mutations).length} mutations, tries left=${tries}`) + await delay(delayBetweenTriesMs) + } + } + } else { + logger.trace('no mutations in transaction') + } + } finally { + inTransaction = false + transactionCache = { } + mutations = { } + dbQueriesInTransaction = 0 + } + } + } + } +} + +export const initAuthCreds = (): AuthenticationCreds => { + const identityKey = Curve.generateKeyPair() + return { + noiseKey: Curve.generateKeyPair(), + signedIdentityKey: identityKey, + signedPreKey: signedKeyPair(identityKey, 1), + registrationId: generateRegistrationId(), + advSecretKey: randomBytes(32).toString('base64'), + processedHistoryMessages: [], + nextPreKeyId: 1, + firstUnuploadedPreKeyId: 1, + accountSyncCounter: 0, + accountSettings: { + unarchiveChats: false + } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/baileys-event-stream.ts b/whatsapp_addon/Baileys/src/Utils/baileys-event-stream.ts new file mode 100644 index 0000000..26fa610 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/baileys-event-stream.ts @@ -0,0 +1,66 @@ +import EventEmitter from 'events' +import { createReadStream } from 'fs' +import { writeFile } from 'fs/promises' +import { createInterface } from 'readline' +import type { BaileysEventEmitter } from '../Types' +import { delay } from './generics' +import { makeMutex } from './make-mutex' + +/** + * Captures events from a baileys event emitter & stores them in a file + * @param ev The event emitter to read events from + * @param filename File to save to + */ +export const captureEventStream = (ev: BaileysEventEmitter, filename: string) => { + const oldEmit = ev.emit + // write mutex so data is appended in order + const writeMutex = makeMutex() + // monkey patch eventemitter to capture all events + ev.emit = function(...args: any[]) { + const content = JSON.stringify({ timestamp: Date.now(), event: args[0], data: args[1] }) + '\n' + const result = oldEmit.apply(ev, args) + + writeMutex.mutex( + async() => { + await writeFile(filename, content, { flag: 'a' }) + } + ) + + return result + } +} + +/** + * Read event file and emit events from there + * @param filename filename containing event data + * @param delayIntervalMs delay between each event emit + */ +export const readAndEmitEventStream = (filename: string, delayIntervalMs: number = 0) => { + const ev = new EventEmitter() as BaileysEventEmitter + + const fireEvents = async() => { + // from: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js + const fileStream = createReadStream(filename) + + const rl = createInterface({ + input: fileStream, + crlfDelay: Infinity + }) + // Note: we use the crlfDelay option to recognize all instances of CR LF + // ('\r\n') in input.txt as a single line break. + for await (const line of rl) { + if(line) { + const { event, data } = JSON.parse(line) + ev.emit(event, data) + delayIntervalMs && await delay(delayIntervalMs) + } + } + + fileStream.close() + } + + return { + ev, + task: fireEvents() + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/business.ts b/whatsapp_addon/Baileys/src/Utils/business.ts new file mode 100644 index 0000000..b2fd3f4 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/business.ts @@ -0,0 +1,275 @@ +import { Boom } from '@hapi/boom' +import { createHash } from 'crypto' +import { CatalogCollection, CatalogStatus, OrderDetails, OrderProduct, Product, ProductCreate, ProductUpdate, WAMediaUpload, WAMediaUploadFunction } from '../Types' +import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString } from '../WABinary' +import { getStream, getUrlFromDirectPath, toReadable } from './messages-media' + +export const parseCatalogNode = (node: BinaryNode) => { + const catalogNode = getBinaryNodeChild(node, 'product_catalog') + const products = getBinaryNodeChildren(catalogNode, 'product').map(parseProductNode) + const paging = getBinaryNodeChild(catalogNode, 'paging') + + return { + products, + nextPageCursor: paging + ? getBinaryNodeChildString(paging, 'after') + : undefined + } +} + +export const parseCollectionsNode = (node: BinaryNode) => { + const collectionsNode = getBinaryNodeChild(node, 'collections') + const collections = getBinaryNodeChildren(collectionsNode, 'collection').map( + collectionNode => { + const id = getBinaryNodeChildString(collectionNode, 'id')! + const name = getBinaryNodeChildString(collectionNode, 'name')! + + const products = getBinaryNodeChildren(collectionNode, 'product').map(parseProductNode) + return { + id, + name, + products, + status: parseStatusInfo(collectionNode) + } + } + ) + + return { + collections + } +} + +export const parseOrderDetailsNode = (node: BinaryNode) => { + const orderNode = getBinaryNodeChild(node, 'order') + const products = getBinaryNodeChildren(orderNode, 'product').map( + productNode => { + const imageNode = getBinaryNodeChild(productNode, 'image')! + return { + id: getBinaryNodeChildString(productNode, 'id')!, + name: getBinaryNodeChildString(productNode, 'name')!, + imageUrl: getBinaryNodeChildString(imageNode, 'url')!, + price: +getBinaryNodeChildString(productNode, 'price')!, + currency: getBinaryNodeChildString(productNode, 'currency')!, + quantity: +getBinaryNodeChildString(productNode, 'quantity')! + } + } + ) + + const priceNode = getBinaryNodeChild(orderNode, 'price') + + const orderDetails: OrderDetails = { + price: { + total: +getBinaryNodeChildString(priceNode, 'total')!, + currency: getBinaryNodeChildString(priceNode, 'currency')!, + }, + products + } + + return orderDetails +} + +export const toProductNode = (productId: string | undefined, product: ProductCreate | ProductUpdate) => { + const attrs: BinaryNode['attrs'] = { } + const content: BinaryNode[] = [ ] + + if(typeof productId !== 'undefined') { + content.push({ + tag: 'id', + attrs: { }, + content: Buffer.from(productId) + }) + } + + if(typeof product.name !== 'undefined') { + content.push({ + tag: 'name', + attrs: { }, + content: Buffer.from(product.name) + }) + } + + if(typeof product.description !== 'undefined') { + content.push({ + tag: 'description', + attrs: { }, + content: Buffer.from(product.description) + }) + } + + if(typeof product.retailerId !== 'undefined') { + content.push({ + tag: 'retailer_id', + attrs: { }, + content: Buffer.from(product.retailerId) + }) + } + + if(product.images.length) { + content.push({ + tag: 'media', + attrs: { }, + content: product.images.map( + img => { + if(!('url' in img)) { + throw new Boom('Expected img for product to already be uploaded', { statusCode: 400 }) + } + + return { + tag: 'image', + attrs: { }, + content: [ + { + tag: 'url', + attrs: { }, + content: Buffer.from(img.url.toString()) + } + ] + } + } + ) + }) + } + + if(typeof product.price !== 'undefined') { + content.push({ + tag: 'price', + attrs: { }, + content: Buffer.from(product.price.toString()) + }) + } + + if(typeof product.currency !== 'undefined') { + content.push({ + tag: 'currency', + attrs: { }, + content: Buffer.from(product.currency) + }) + } + + if('originCountryCode' in product) { + if(typeof product.originCountryCode === 'undefined') { + attrs.compliance_category = 'COUNTRY_ORIGIN_EXEMPT' + } else { + content.push({ + tag: 'compliance_info', + attrs: { }, + content: [ + { + tag: 'country_code_origin', + attrs: { }, + content: Buffer.from(product.originCountryCode) + } + ] + }) + } + } + + + if(typeof product.isHidden !== 'undefined') { + attrs.is_hidden = product.isHidden.toString() + } + + const node: BinaryNode = { + tag: 'product', + attrs, + content + } + return node +} + +export const parseProductNode = (productNode: BinaryNode) => { + const isHidden = productNode.attrs.is_hidden === 'true' + const id = getBinaryNodeChildString(productNode, 'id')! + + const mediaNode = getBinaryNodeChild(productNode, 'media')! + const statusInfoNode = getBinaryNodeChild(productNode, 'status_info')! + + const product: Product = { + id, + imageUrls: parseImageUrls(mediaNode), + reviewStatus: { + whatsapp: getBinaryNodeChildString(statusInfoNode, 'status')!, + }, + availability: 'in stock', + name: getBinaryNodeChildString(productNode, 'name')!, + retailerId: getBinaryNodeChildString(productNode, 'retailer_id'), + url: getBinaryNodeChildString(productNode, 'url'), + description: getBinaryNodeChildString(productNode, 'description')!, + price: +getBinaryNodeChildString(productNode, 'price')!, + currency: getBinaryNodeChildString(productNode, 'currency')!, + isHidden, + } + + return product +} + +/** + * Uploads images not already uploaded to WA's servers + */ +export async function uploadingNecessaryImagesOfProduct(product: T, waUploadToServer: WAMediaUploadFunction, timeoutMs = 30_000) { + product = { + ...product, + images: product.images ? await uploadingNecessaryImages(product.images, waUploadToServer, timeoutMs) : product.images + } + return product +} + +/** + * Uploads images not already uploaded to WA's servers + */ +export const uploadingNecessaryImages = async( + images: WAMediaUpload[], + waUploadToServer: WAMediaUploadFunction, + timeoutMs = 30_000 +) => { + const results = await Promise.all( + images.map>( + async img => { + + if('url' in img) { + const url = img.url.toString() + if(url.includes('.whatsapp.net')) { + return { url } + } + } + + const { stream } = await getStream(img) + const hasher = createHash('sha256') + const contentBlocks: Buffer[] = [] + for await (const block of stream) { + hasher.update(block) + contentBlocks.push(block) + } + + const sha = hasher.digest('base64') + + const { directPath } = await waUploadToServer( + toReadable(Buffer.concat(contentBlocks)), + { + mediaType: 'product-catalog-image', + fileEncSha256B64: sha, + timeoutMs + } + ) + return { url: getUrlFromDirectPath(directPath) } + } + ) + ) + return results +} + +const parseImageUrls = (mediaNode: BinaryNode) => { + const imgNode = getBinaryNodeChild(mediaNode, 'image') + return { + requested: getBinaryNodeChildString(imgNode, 'request_image_url')!, + original: getBinaryNodeChildString(imgNode, 'original_image_url')! + } +} + +const parseStatusInfo = (mediaNode: BinaryNode): CatalogStatus => { + const node = getBinaryNodeChild(mediaNode, 'status_info') + return { + status: getBinaryNodeChildString(node, 'status')!, + canAppeal: getBinaryNodeChildString(node, 'can_appeal') === 'true', + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/chat-utils.ts b/whatsapp_addon/Baileys/src/Utils/chat-utils.ts new file mode 100644 index 0000000..2ce6695 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/chat-utils.ts @@ -0,0 +1,754 @@ +import { Boom } from '@hapi/boom' +import { AxiosRequestConfig } from 'axios' +import type { Logger } from 'pino' +import { proto } from '../../WAProto' +import { BaileysEventEmitter, Chat, ChatModification, ChatMutation, ChatUpdate, Contact, InitialAppStateSyncOptions, LastMessageList, LTHashState, WAPatchCreate, WAPatchName } from '../Types' +import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildren, isJidGroup, jidNormalizedUser } from '../WABinary' +import { aesDecrypt, aesEncrypt, hkdf, hmacSign } from './crypto' +import { toNumber } from './generics' +import { LT_HASH_ANTI_TAMPERING } from './lt-hash' +import { downloadContentFromMessage, } from './messages-media' + +type FetchAppStateSyncKey = (keyId: string) => Promise + +export type ChatMutationMap = { [index: string]: ChatMutation } + +const mutationKeys = (keydata: Uint8Array) => { + const expanded = hkdf(keydata, 160, { info: 'WhatsApp Mutation Keys' }) + return { + indexKey: expanded.slice(0, 32), + valueEncryptionKey: expanded.slice(32, 64), + valueMacKey: expanded.slice(64, 96), + snapshotMacKey: expanded.slice(96, 128), + patchMacKey: expanded.slice(128, 160) + } +} + +const generateMac = (operation: proto.SyncdMutation.SyncdOperation, data: Buffer, keyId: Uint8Array | string, key: Buffer) => { + const getKeyData = () => { + let r: number + switch (operation) { + case proto.SyncdMutation.SyncdOperation.SET: + r = 0x01 + break + case proto.SyncdMutation.SyncdOperation.REMOVE: + r = 0x02 + break + } + + const buff = Buffer.from([r]) + return Buffer.concat([ buff, Buffer.from(keyId as any, 'base64') ]) + } + + const keyData = getKeyData() + + const last = Buffer.alloc(8) // 8 bytes + last.set([ keyData.length ], last.length - 1) + + const total = Buffer.concat([ keyData, data, last ]) + const hmac = hmacSign(total, key, 'sha512') + + return hmac.slice(0, 32) +} + +const to64BitNetworkOrder = (e: number) => { + const buff = Buffer.alloc(8) + buff.writeUint32BE(e, 4) + return buff +} + +type Mac = { indexMac: Uint8Array, valueMac: Uint8Array, operation: proto.SyncdMutation.SyncdOperation } + +const makeLtHashGenerator = ({ indexValueMap, hash }: Pick) => { + indexValueMap = { ...indexValueMap } + const addBuffs: ArrayBuffer[] = [] + const subBuffs: ArrayBuffer[] = [] + + return { + mix: ({ indexMac, valueMac, operation }: Mac) => { + const indexMacBase64 = Buffer.from(indexMac).toString('base64') + const prevOp = indexValueMap[indexMacBase64] + if(operation === proto.SyncdMutation.SyncdOperation.REMOVE) { + if(!prevOp) { + throw new Boom('tried remove, but no previous op', { data: { indexMac, valueMac } }) + } + + // remove from index value mac, since this mutation is erased + delete indexValueMap[indexMacBase64] + } else { + addBuffs.push(new Uint8Array(valueMac).buffer) + // add this index into the history map + indexValueMap[indexMacBase64] = { valueMac } + } + + if(prevOp) { + subBuffs.push(new Uint8Array(prevOp.valueMac).buffer) + } + }, + finish: () => { + const hashArrayBuffer = new Uint8Array(hash).buffer + const result = LT_HASH_ANTI_TAMPERING.subtractThenAdd(hashArrayBuffer, addBuffs, subBuffs) + const buffer = Buffer.from(result) + + return { + hash: buffer, + indexValueMap + } + } + } +} + +const generateSnapshotMac = (lthash: Uint8Array, version: number, name: WAPatchName, key: Buffer) => { + const total = Buffer.concat([ + lthash, + to64BitNetworkOrder(version), + Buffer.from(name, 'utf-8') + ]) + return hmacSign(total, key, 'sha256') +} + +const generatePatchMac = (snapshotMac: Uint8Array, valueMacs: Uint8Array[], version: number, type: WAPatchName, key: Buffer) => { + const total = Buffer.concat([ + snapshotMac, + ...valueMacs, + to64BitNetworkOrder(version), + Buffer.from(type, 'utf-8') + ]) + return hmacSign(total, key) +} + +export const newLTHashState = (): LTHashState => ({ version: 0, hash: Buffer.alloc(128), indexValueMap: {} }) + +export const encodeSyncdPatch = async( + { type, index, syncAction, apiVersion, operation }: WAPatchCreate, + myAppStateKeyId: string, + state: LTHashState, + getAppStateSyncKey: FetchAppStateSyncKey +) => { + const key = !!myAppStateKeyId ? await getAppStateSyncKey(myAppStateKeyId) : undefined + if(!key) { + throw new Boom(`myAppStateKey ("${myAppStateKeyId}") not present`, { statusCode: 404 }) + } + + const encKeyId = Buffer.from(myAppStateKeyId, 'base64') + + state = { ...state, indexValueMap: { ...state.indexValueMap } } + + const indexBuffer = Buffer.from(JSON.stringify(index)) + const dataProto = proto.SyncActionData.fromObject({ + index: indexBuffer, + value: syncAction, + padding: new Uint8Array(0), + version: apiVersion + }) + const encoded = proto.SyncActionData.encode(dataProto).finish() + + const keyValue = mutationKeys(key!.keyData!) + + const encValue = aesEncrypt(encoded, keyValue.valueEncryptionKey) + const valueMac = generateMac(operation, encValue, encKeyId, keyValue.valueMacKey) + const indexMac = hmacSign(indexBuffer, keyValue.indexKey) + + // update LT hash + const generator = makeLtHashGenerator(state) + generator.mix({ indexMac, valueMac, operation }) + Object.assign(state, generator.finish()) + + state.version += 1 + + const snapshotMac = generateSnapshotMac(state.hash, state.version, type, keyValue.snapshotMacKey) + + const patch: proto.ISyncdPatch = { + patchMac: generatePatchMac(snapshotMac, [valueMac], state.version, type, keyValue.patchMacKey), + snapshotMac: snapshotMac, + keyId: { id: encKeyId }, + mutations: [ + { + operation: operation, + record: { + index: { + blob: indexMac + }, + value: { + blob: Buffer.concat([ encValue, valueMac ]) + }, + keyId: { id: encKeyId } + } + } + ] + } + + const base64Index = indexMac.toString('base64') + state.indexValueMap[base64Index] = { valueMac } + + return { patch, state } +} + +export const decodeSyncdMutations = async( + msgMutations: (proto.ISyncdMutation | proto.ISyncdRecord)[], + initialState: LTHashState, + getAppStateSyncKey: FetchAppStateSyncKey, + onMutation: (mutation: ChatMutation) => void, + validateMacs: boolean +) => { + const ltGenerator = makeLtHashGenerator(initialState) + // indexKey used to HMAC sign record.index.blob + // valueEncryptionKey used to AES-256-CBC encrypt record.value.blob[0:-32] + // the remaining record.value.blob[0:-32] is the mac, it the HMAC sign of key.keyId + decoded proto data + length of bytes in keyId + for(const msgMutation of msgMutations!) { + // if it's a syncdmutation, get the operation property + // otherwise, if it's only a record -- it'll be a SET mutation + const operation = 'operation' in msgMutation ? msgMutation.operation : proto.SyncdMutation.SyncdOperation.SET + const record = ('record' in msgMutation && !!msgMutation.record) ? msgMutation.record : msgMutation as proto.ISyncdRecord + + const key = await getKey(record.keyId!.id!) + const content = Buffer.from(record.value!.blob!) + const encContent = content.slice(0, -32) + const ogValueMac = content.slice(-32) + if(validateMacs) { + const contentHmac = generateMac(operation!, encContent, record.keyId!.id!, key.valueMacKey) + if(Buffer.compare(contentHmac, ogValueMac) !== 0) { + throw new Boom('HMAC content verification failed') + } + } + + const result = aesDecrypt(encContent, key.valueEncryptionKey) + const syncAction = proto.SyncActionData.decode(result) + + if(validateMacs) { + const hmac = hmacSign(syncAction.index, key.indexKey) + if(Buffer.compare(hmac, record.index!.blob!) !== 0) { + throw new Boom('HMAC index verification failed') + } + } + + const indexStr = Buffer.from(syncAction.index).toString() + onMutation({ syncAction, index: JSON.parse(indexStr) }) + + ltGenerator.mix({ + indexMac: record.index!.blob!, + valueMac: ogValueMac, + operation: operation! + }) + } + + return ltGenerator.finish() + + async function getKey(keyId: Uint8Array) { + const base64Key = Buffer.from(keyId!).toString('base64') + const keyEnc = await getAppStateSyncKey(base64Key) + if(!keyEnc) { + throw new Boom(`failed to find key "${base64Key}" to decode mutation`, { statusCode: 404, data: { msgMutations } }) + } + + return mutationKeys(keyEnc.keyData!) + } +} + +export const decodeSyncdPatch = async( + msg: proto.ISyncdPatch, + name: WAPatchName, + initialState: LTHashState, + getAppStateSyncKey: FetchAppStateSyncKey, + onMutation: (mutation: ChatMutation) => void, + validateMacs: boolean +) => { + if(validateMacs) { + const base64Key = Buffer.from(msg.keyId!.id!).toString('base64') + const mainKeyObj = await getAppStateSyncKey(base64Key) + if(!mainKeyObj) { + throw new Boom(`failed to find key "${base64Key}" to decode patch`, { statusCode: 404, data: { msg } }) + } + + const mainKey = mutationKeys(mainKeyObj.keyData!) + const mutationmacs = msg.mutations!.map(mutation => mutation.record!.value!.blob!.slice(-32)) + + const patchMac = generatePatchMac(msg.snapshotMac!, mutationmacs, toNumber(msg.version!.version!), name, mainKey.patchMacKey) + if(Buffer.compare(patchMac, msg.patchMac!) !== 0) { + throw new Boom('Invalid patch mac') + } + } + + const result = await decodeSyncdMutations(msg!.mutations!, initialState, getAppStateSyncKey, onMutation, validateMacs) + return result +} + +export const extractSyncdPatches = async( + result: BinaryNode, + options: AxiosRequestConfig +) => { + const syncNode = getBinaryNodeChild(result, 'sync') + const collectionNodes = getBinaryNodeChildren(syncNode, 'collection') + + const final = { } as { [T in WAPatchName]: { patches: proto.ISyncdPatch[], hasMorePatches: boolean, snapshot?: proto.ISyncdSnapshot } } + await Promise.all( + collectionNodes.map( + async collectionNode => { + const patchesNode = getBinaryNodeChild(collectionNode, 'patches') + + const patches = getBinaryNodeChildren(patchesNode || collectionNode, 'patch') + const snapshotNode = getBinaryNodeChild(collectionNode, 'snapshot') + + const syncds: proto.ISyncdPatch[] = [] + const name = collectionNode.attrs.name as WAPatchName + + const hasMorePatches = collectionNode.attrs.has_more_patches === 'true' + + let snapshot: proto.ISyncdSnapshot | undefined = undefined + if(snapshotNode && !!snapshotNode.content) { + if(!Buffer.isBuffer(snapshotNode)) { + snapshotNode.content = Buffer.from(Object.values(snapshotNode.content)) + } + + const blobRef = proto.ExternalBlobReference.decode( + snapshotNode.content! as Buffer + ) + const data = await downloadExternalBlob(blobRef, options) + snapshot = proto.SyncdSnapshot.decode(data) + } + + for(let { content } of patches) { + if(content) { + if(!Buffer.isBuffer(content)) { + content = Buffer.from(Object.values(content)) + } + + const syncd = proto.SyncdPatch.decode(content! as Uint8Array) + if(!syncd.version) { + syncd.version = { version: +collectionNode.attrs.version + 1 } + } + + syncds.push(syncd) + } + } + + final[name] = { patches: syncds, hasMorePatches, snapshot } + } + ) + ) + + return final +} + + +export const downloadExternalBlob = async( + blob: proto.IExternalBlobReference, + options: AxiosRequestConfig +) => { + const stream = await downloadContentFromMessage(blob, 'md-app-state', { options }) + const bufferArray: Buffer[] = [] + for await (const chunk of stream) { + bufferArray.push(chunk) + } + + return Buffer.concat(bufferArray) +} + +export const downloadExternalPatch = async( + blob: proto.IExternalBlobReference, + options: AxiosRequestConfig +) => { + const buffer = await downloadExternalBlob(blob, options) + const syncData = proto.SyncdMutations.decode(buffer) + return syncData +} + +export const decodeSyncdSnapshot = async( + name: WAPatchName, + snapshot: proto.ISyncdSnapshot, + getAppStateSyncKey: FetchAppStateSyncKey, + minimumVersionNumber: number | undefined, + validateMacs: boolean = true +) => { + const newState = newLTHashState() + newState.version = toNumber(snapshot.version!.version!) + + const mutationMap: ChatMutationMap = {} + const areMutationsRequired = typeof minimumVersionNumber === 'undefined' + || newState.version > minimumVersionNumber + + const { hash, indexValueMap } = await decodeSyncdMutations( + snapshot.records!, + newState, + getAppStateSyncKey, + areMutationsRequired + ? (mutation) => { + const index = mutation.syncAction.index?.toString() + mutationMap[index!] = mutation + } + : () => { }, + validateMacs + ) + newState.hash = hash + newState.indexValueMap = indexValueMap + + if(validateMacs) { + const base64Key = Buffer.from(snapshot.keyId!.id!).toString('base64') + const keyEnc = await getAppStateSyncKey(base64Key) + if(!keyEnc) { + throw new Boom(`failed to find key "${base64Key}" to decode mutation`) + } + + const result = mutationKeys(keyEnc.keyData!) + const computedSnapshotMac = generateSnapshotMac(newState.hash, newState.version, name, result.snapshotMacKey) + if(Buffer.compare(snapshot.mac!, computedSnapshotMac) !== 0) { + throw new Boom(`failed to verify LTHash at ${newState.version} of ${name} from snapshot`) + } + } + + return { + state: newState, + mutationMap + } +} + +export const decodePatches = async( + name: WAPatchName, + syncds: proto.ISyncdPatch[], + initial: LTHashState, + getAppStateSyncKey: FetchAppStateSyncKey, + options: AxiosRequestConfig, + minimumVersionNumber?: number, + logger?: Logger, + validateMacs: boolean = true +) => { + const newState: LTHashState = { + ...initial, + indexValueMap: { ...initial.indexValueMap } + } + + const mutationMap: ChatMutationMap = { } + + for(let i = 0;i < syncds.length;i++) { + const syncd = syncds[i] + const { version, keyId, snapshotMac } = syncd + if(syncd.externalMutations) { + logger?.trace({ name, version }, 'downloading external patch') + const ref = await downloadExternalPatch(syncd.externalMutations, options) + logger?.debug({ name, version, mutations: ref.mutations.length }, 'downloaded external patch') + syncd.mutations?.push(...ref.mutations) + } + + const patchVersion = toNumber(version!.version!) + + newState.version = patchVersion + const shouldMutate = typeof minimumVersionNumber === 'undefined' || patchVersion > minimumVersionNumber + + const decodeResult = await decodeSyncdPatch( + syncd, + name, + newState, + getAppStateSyncKey, + shouldMutate + ? mutation => { + const index = mutation.syncAction.index?.toString() + mutationMap[index!] = mutation + } + : (() => { }), + true + ) + + newState.hash = decodeResult.hash + newState.indexValueMap = decodeResult.indexValueMap + + if(validateMacs) { + const base64Key = Buffer.from(keyId!.id!).toString('base64') + const keyEnc = await getAppStateSyncKey(base64Key) + if(!keyEnc) { + throw new Boom(`failed to find key "${base64Key}" to decode mutation`) + } + + const result = mutationKeys(keyEnc.keyData!) + const computedSnapshotMac = generateSnapshotMac(newState.hash, newState.version, name, result.snapshotMacKey) + if(Buffer.compare(snapshotMac!, computedSnapshotMac) !== 0) { + throw new Boom(`failed to verify LTHash at ${newState.version} of ${name}`) + } + } + + // clear memory used up by the mutations + syncd.mutations = [] + } + + return { state: newState, mutationMap } +} + +export const chatModificationToAppPatch = ( + mod: ChatModification, + jid: string +) => { + const OP = proto.SyncdMutation.SyncdOperation + const getMessageRange = (lastMessages: LastMessageList) => { + let messageRange: proto.SyncActionValue.ISyncActionMessageRange + if(Array.isArray(lastMessages)) { + const lastMsg = lastMessages[lastMessages.length - 1] + messageRange = { + lastMessageTimestamp: lastMsg?.messageTimestamp, + messages: lastMessages?.length ? lastMessages.map( + m => { + if(!m.key?.id || !m.key?.remoteJid) { + throw new Boom('Incomplete key', { statusCode: 400, data: m }) + } + + if(isJidGroup(m.key.remoteJid) && !m.key.fromMe && !m.key.participant) { + throw new Boom('Expected not from me message to have participant', { statusCode: 400, data: m }) + } + + if(!m.messageTimestamp || !toNumber(m.messageTimestamp)) { + throw new Boom('Missing timestamp in last message list', { statusCode: 400, data: m }) + } + + if(m.key.participant) { + m.key.participant = jidNormalizedUser(m.key.participant) + } + + return m + } + ) : undefined + } + } else { + messageRange = lastMessages + } + + return messageRange + } + + let patch: WAPatchCreate + if('mute' in mod) { + patch = { + syncAction: { + muteAction: { + muted: !!mod.mute, + muteEndTimestamp: mod.mute || undefined + } + }, + index: ['mute', jid], + type: 'regular_high', + apiVersion: 2, + operation: OP.SET + } + } else if('archive' in mod) { + patch = { + syncAction: { + archiveChatAction: { + archived: !!mod.archive, + messageRange: getMessageRange(mod.lastMessages) + } + }, + index: ['archive', jid], + type: 'regular_low', + apiVersion: 3, + operation: OP.SET + } + } else if('markRead' in mod) { + patch = { + syncAction: { + markChatAsReadAction: { + read: mod.markRead, + messageRange: getMessageRange(mod.lastMessages) + } + }, + index: ['markChatAsRead', jid], + type: 'regular_low', + apiVersion: 3, + operation: OP.SET + } + } else if('clear' in mod) { + if(mod.clear === 'all') { + throw new Boom('not supported') + } else { + const key = mod.clear.messages[0] + patch = { + syncAction: { + deleteMessageForMeAction: { + deleteMedia: false, + messageTimestamp: key.timestamp + } + }, + index: ['deleteMessageForMe', jid, key.id, key.fromMe ? '1' : '0', '0'], + type: 'regular_high', + apiVersion: 3, + operation: OP.SET + } + } + } else if('pin' in mod) { + patch = { + syncAction: { + pinAction: { + pinned: !!mod.pin + } + }, + index: ['pin_v1', jid], + type: 'regular_low', + apiVersion: 5, + operation: OP.SET + } + } else if('delete' in mod) { + patch = { + syncAction: { + deleteChatAction: { + messageRange: getMessageRange(mod.lastMessages), + } + }, + index: ['deleteChat', jid, '1'], + type: 'regular_high', + apiVersion: 6, + operation: OP.SET + } + } else if('pushNameSetting' in mod) { + patch = { + syncAction: { + pushNameSetting: { + name: mod.pushNameSetting + } + }, + index: ['setting_pushName'], + type: 'critical_block', + apiVersion: 1, + operation: OP.SET, + } + } else { + throw new Boom('not supported') + } + + patch.syncAction.timestamp = Date.now() + + return patch +} + +export const processSyncAction = ( + syncAction: ChatMutation, + ev: BaileysEventEmitter, + me: Contact, + initialSyncOpts?: InitialAppStateSyncOptions, + logger?: Logger, +) => { + const isInitialSync = !!initialSyncOpts + const accountSettings = initialSyncOpts?.accountSettings + + logger?.trace({ syncAction, initialSync: !!initialSyncOpts }, 'processing sync action') + + const { + syncAction: { value: action }, + index: [type, id, msgId, fromMe] + } = syncAction + + if(action?.muteAction) { + ev.emit( + 'chats.update', + [ + { + id, + muteEndTime: action.muteAction?.muted + ? toNumber(action.muteAction!.muteEndTimestamp!) + : null, + conditional: getChatUpdateConditional(id, undefined) + } + ] + ) + } else if(action?.archiveChatAction || type === 'archive' || type === 'unarchive') { + // okay so we've to do some annoying computation here + // when we're initially syncing the app state + // there are a few cases we need to handle + // 1. if the account unarchiveChats setting is true + // a. if the chat is archived, and no further messages have been received -- simple, keep archived + // b. if the chat was archived, and the user received messages from the other person afterwards + // then the chat should be marked unarchved -- + // we compare the timestamp of latest message from the other person to determine this + // 2. if the account unarchiveChats setting is false -- then it doesn't matter, + // it'll always take an app state action to mark in unarchived -- which we'll get anyway + const archiveAction = action?.archiveChatAction + const isArchived = archiveAction + ? archiveAction.archived + : type === 'archive' + // // basically we don't need to fire an "archive" update if the chat is being marked unarchvied + // // this only applies for the initial sync + // if(isInitialSync && !isArchived) { + // isArchived = false + // } + + const msgRange = !accountSettings?.unarchiveChats ? undefined : archiveAction?.messageRange + // logger?.debug({ chat: id, syncAction }, 'message range archive') + + ev.emit('chats.update', [{ + id, + archived: isArchived, + conditional: getChatUpdateConditional(id, msgRange) + }]) + } else if(action?.markChatAsReadAction) { + const markReadAction = action.markChatAsReadAction + // basically we don't need to fire an "read" update if the chat is being marked as read + // because the chat is read by default + // this only applies for the initial sync + const isNullUpdate = isInitialSync && markReadAction.read + + ev.emit('chats.update', [{ + id, + unreadCount: isNullUpdate ? null : !!markReadAction?.read ? 0 : -1, + conditional: getChatUpdateConditional(id, markReadAction?.messageRange) + }]) + } else if(action?.deleteMessageForMeAction || type === 'deleteMessageForMe') { + ev.emit('messages.delete', { keys: [ + { + remoteJid: id, + id: msgId, + fromMe: fromMe === '1' + } + ] }) + } else if(action?.contactAction) { + ev.emit('contacts.upsert', [{ id, name: action.contactAction!.fullName! }]) + } else if(action?.pushNameSetting) { + const name = action?.pushNameSetting?.name + if(name && me?.name !== name) { + ev.emit('creds.update', { me: { ...me, name } }) + } + } else if(action?.pinAction) { + ev.emit('chats.update', [{ + id, + pinned: action.pinAction?.pinned ? toNumber(action.timestamp!) : null, + conditional: getChatUpdateConditional(id, undefined) + }]) + } else if(action?.unarchiveChatsSetting) { + const unarchiveChats = !!action.unarchiveChatsSetting.unarchiveChats + ev.emit('creds.update', { accountSettings: { unarchiveChats } }) + + logger?.info(`archive setting updated => '${action.unarchiveChatsSetting.unarchiveChats}'`) + if(accountSettings) { + accountSettings.unarchiveChats = unarchiveChats + } + } else if(action?.starAction || type === 'star') { + let starred = action?.starAction?.starred + if(typeof starred !== 'boolean') { + starred = syncAction.index[syncAction.index.length - 1] === '1' + } + + ev.emit('messages.update', [ + { + key: { remoteJid: id, id: msgId, fromMe: fromMe === '1' }, + update: { starred } + } + ]) + } else if(action?.deleteChatAction || type === 'deleteChat') { + if(!isInitialSync) { + ev.emit('chats.delete', [id]) + } + } else { + logger?.debug({ syncAction, id }, 'unprocessable update') + } + + function getChatUpdateConditional(id: string, msgRange: proto.SyncActionValue.ISyncActionMessageRange | null | undefined): ChatUpdate['conditional'] { + return isInitialSync + ? (data) => { + const chat = data.historySets.chats[id] || data.chatUpserts[id] + if(chat) { + return msgRange ? isValidPatchBasedOnMessageRange(chat, msgRange) : true + } + } + : undefined + } + + function isValidPatchBasedOnMessageRange(chat: Chat, msgRange: proto.SyncActionValue.ISyncActionMessageRange | null | undefined) { + const lastMsgTimestamp = msgRange?.lastMessageTimestamp || msgRange?.lastSystemMessageTimestamp || 0 + const chatLastMsgTimestamp = chat?.lastMessageRecvTimestamp || 0 + return lastMsgTimestamp >= chatLastMsgTimestamp + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/crypto.ts b/whatsapp_addon/Baileys/src/Utils/crypto.ts new file mode 100644 index 0000000..7855eb5 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/crypto.ts @@ -0,0 +1,113 @@ +import { createCipheriv, createDecipheriv, createHash, createHmac, randomBytes } from 'crypto' +import HKDF from 'futoin-hkdf' +import * as libsignal from 'libsignal' +import { KEY_BUNDLE_TYPE } from '../Defaults' +import { KeyPair } from '../Types' + +/** prefix version byte to the pub keys, required for some curve crypto functions */ +export const generateSignalPubKey = (pubKey: Uint8Array | Buffer) => ( + pubKey.length === 33 + ? pubKey + : Buffer.concat([ KEY_BUNDLE_TYPE, pubKey ]) +) + +export const Curve = { + generateKeyPair: (): KeyPair => { + const { pubKey, privKey } = libsignal.curve.generateKeyPair() + return { + private: Buffer.from(privKey), + // remove version byte + public: Buffer.from((pubKey as Uint8Array).slice(1)) + } + }, + sharedKey: (privateKey: Uint8Array, publicKey: Uint8Array) => { + const shared = libsignal.curve.calculateAgreement(generateSignalPubKey(publicKey), privateKey) + return Buffer.from(shared) + }, + sign: (privateKey: Uint8Array, buf: Uint8Array) => ( + libsignal.curve.calculateSignature(privateKey, buf) + ), + verify: (pubKey: Uint8Array, message: Uint8Array, signature: Uint8Array) => { + try { + libsignal.curve.verifySignature(generateSignalPubKey(pubKey), message, signature) + return true + } catch(error) { + return false + } + } +} + +export const signedKeyPair = (identityKeyPair: KeyPair, keyId: number) => { + const preKey = Curve.generateKeyPair() + const pubKey = generateSignalPubKey(preKey.public) + + const signature = Curve.sign(identityKeyPair.private, pubKey) + + return { keyPair: preKey, signature, keyId } +} + +const GCM_TAG_LENGTH = 128 >> 3 + +/** + * encrypt AES 256 GCM; + * where the tag tag is suffixed to the ciphertext + * */ +export function aesEncryptGCM(plaintext: Uint8Array, key: Uint8Array, iv: Uint8Array, additionalData: Uint8Array) { + const cipher = createCipheriv('aes-256-gcm', key, iv) + cipher.setAAD(additionalData) + return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]) +} + +/** + * decrypt AES 256 GCM; + * where the auth tag is suffixed to the ciphertext + * */ +export function aesDecryptGCM(ciphertext: Uint8Array, key: Uint8Array, iv: Uint8Array, additionalData: Uint8Array) { + const decipher = createDecipheriv('aes-256-gcm', key, iv) + // decrypt additional adata + const enc = ciphertext.slice(0, ciphertext.length - GCM_TAG_LENGTH) + const tag = ciphertext.slice(ciphertext.length - GCM_TAG_LENGTH) + // set additional data + decipher.setAAD(additionalData) + decipher.setAuthTag(tag) + + return Buffer.concat([ decipher.update(enc), decipher.final() ]) +} + +/** decrypt AES 256 CBC; where the IV is prefixed to the buffer */ +export function aesDecrypt(buffer: Buffer, key: Buffer) { + return aesDecryptWithIV(buffer.slice(16, buffer.length), key, buffer.slice(0, 16)) +} + +/** decrypt AES 256 CBC */ +export function aesDecryptWithIV(buffer: Buffer, key: Buffer, IV: Buffer) { + const aes = createDecipheriv('aes-256-cbc', key, IV) + return Buffer.concat([aes.update(buffer), aes.final()]) +} + +// encrypt AES 256 CBC; where a random IV is prefixed to the buffer +export function aesEncrypt(buffer: Buffer | Uint8Array, key: Buffer) { + const IV = randomBytes(16) + const aes = createCipheriv('aes-256-cbc', key, IV) + return Buffer.concat([IV, aes.update(buffer), aes.final()]) // prefix IV to the buffer +} + +// encrypt AES 256 CBC with a given IV +export function aesEncrypWithIV(buffer: Buffer, key: Buffer, IV: Buffer) { + const aes = createCipheriv('aes-256-cbc', key, IV) + return Buffer.concat([aes.update(buffer), aes.final()]) // prefix IV to the buffer +} + +// sign HMAC using SHA 256 +export function hmacSign(buffer: Buffer | Uint8Array, key: Buffer | Uint8Array, variant: 'sha256' | 'sha512' = 'sha256') { + return createHmac(variant, key).update(buffer).digest() +} + +export function sha256(buffer: Buffer) { + return createHash('sha256').update(buffer).digest() +} + +// HKDF key expansion +export function hkdf(buffer: Uint8Array | Buffer, expandedLength: number, info: { salt?: Buffer, info?: string }) { + return HKDF(!Buffer.isBuffer(buffer) ? Buffer.from(buffer) : buffer, expandedLength, info) +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/decode-wa-message.ts b/whatsapp_addon/Baileys/src/Utils/decode-wa-message.ts new file mode 100644 index 0000000..27e0aa6 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/decode-wa-message.ts @@ -0,0 +1,151 @@ +import { Boom } from '@hapi/boom' +import { proto } from '../../WAProto' +import { AuthenticationState, WAMessageKey } from '../Types' +import { areJidsSameUser, BinaryNode, isJidBroadcast, isJidGroup, isJidStatusBroadcast, isJidUser } from '../WABinary' +import { unpadRandomMax16 } from './generics' +import { decryptGroupSignalProto, decryptSignalProto, processSenderKeyMessage } from './signal' + +const NO_MESSAGE_FOUND_ERROR_TEXT = 'Message absent from node' + +type MessageType = 'chat' | 'peer_broadcast' | 'other_broadcast' | 'group' | 'direct_peer_status' | 'other_status' + +export const decodeMessageStanza = (stanza: BinaryNode, auth: AuthenticationState) => { + let msgType: MessageType + let chatId: string + let author: string + + const msgId = stanza.attrs.id + const from = stanza.attrs.from + const participant: string | undefined = stanza.attrs.participant + const recipient: string | undefined = stanza.attrs.recipient + + const isMe = (jid: string) => areJidsSameUser(jid, auth.creds.me!.id) + + if(isJidUser(from)) { + if(recipient) { + if(!isMe(from)) { + throw new Boom('receipient present, but msg not from me', { data: stanza }) + } + + chatId = recipient + } else { + chatId = from + } + + msgType = 'chat' + author = from + } else if(isJidGroup(from)) { + if(!participant) { + throw new Boom('No participant in group message') + } + + msgType = 'group' + author = participant + chatId = from + } else if(isJidBroadcast(from)) { + if(!participant) { + throw new Boom('No participant in group message') + } + + const isParticipantMe = isMe(participant) + if(isJidStatusBroadcast(from)) { + msgType = isParticipantMe ? 'direct_peer_status' : 'other_status' + } else { + msgType = isParticipantMe ? 'peer_broadcast' : 'other_broadcast' + } + + chatId = from + author = participant + } else { + throw new Boom('Unknown message type', { data: stanza }) + } + + const sender = msgType === 'chat' ? author : chatId + + const fromMe = isMe(stanza.attrs.participant || stanza.attrs.from) + const pushname = stanza.attrs.notify + + const key: WAMessageKey = { + remoteJid: chatId, + fromMe, + id: msgId, + participant + } + + const fullMessage: proto.IWebMessageInfo = { + key, + messageTimestamp: +stanza.attrs.t, + pushName: pushname + } + + if(key.fromMe) { + fullMessage.status = proto.WebMessageInfo.Status.SERVER_ACK + } + + return { + fullMessage, + category: stanza.attrs.category, + author, + async decrypt() { + let decryptables = 0 + if(Array.isArray(stanza.content)) { + for(const { tag, attrs, content } of stanza.content) { + if(tag === 'verified_name' && content instanceof Uint8Array) { + const cert = proto.VerifiedNameCertificate.decode(content) + const details = proto.VerifiedNameCertificate.Details.decode(cert.details) + fullMessage.verifiedBizName = details.verifiedName + } + + if(tag !== 'enc') { + continue + } + + if(!(content instanceof Uint8Array)) { + continue + } + + decryptables += 1 + + let msgBuffer: Buffer + + try { + const e2eType = attrs.type + switch (e2eType) { + case 'skmsg': + msgBuffer = await decryptGroupSignalProto(sender, author, content, auth) + break + case 'pkmsg': + case 'msg': + const user = isJidUser(sender) ? sender : author + msgBuffer = await decryptSignalProto(user, e2eType, content as Buffer, auth) + break + default: + throw new Error(`Unknown e2e type: ${e2eType}`) + } + + let msg: proto.IMessage = proto.Message.decode(unpadRandomMax16(msgBuffer)) + msg = msg.deviceSentMessage?.message || msg + if(msg.senderKeyDistributionMessage) { + await processSenderKeyMessage(author, msg.senderKeyDistributionMessage, auth) + } + + if(fullMessage.message) { + Object.assign(fullMessage.message, msg) + } else { + fullMessage.message = msg + } + } catch(error) { + fullMessage.messageStubType = proto.WebMessageInfo.StubType.CIPHERTEXT + fullMessage.messageStubParameters = [error.message] + } + } + } + + // if nothing was found to decrypt + if(!decryptables) { + fullMessage.messageStubType = proto.WebMessageInfo.StubType.CIPHERTEXT + fullMessage.messageStubParameters = [NO_MESSAGE_FOUND_ERROR_TEXT] + } + } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/event-buffer.ts b/whatsapp_addon/Baileys/src/Utils/event-buffer.ts new file mode 100644 index 0000000..63b349d --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/event-buffer.ts @@ -0,0 +1,613 @@ +import EventEmitter from 'events' +import { Logger } from 'pino' +import { proto } from '../../WAProto' +import { BaileysEvent, BaileysEventEmitter, BaileysEventMap, BufferedEventData, Chat, ChatUpdate, Contact, WAMessage, WAMessageStatus } from '../Types' +import { trimUndefineds } from './generics' +import { updateMessageWithReaction, updateMessageWithReceipt } from './messages' +import { isRealMessage, shouldIncrementChatUnread } from './process-message' + +const BUFFERABLE_EVENT = [ + 'messaging-history.set', + 'chats.upsert', + 'chats.update', + 'chats.delete', + 'contacts.upsert', + 'contacts.update', + 'messages.upsert', + 'messages.update', + 'messages.delete', + 'messages.reaction', + 'message-receipt.update', + 'groups.update', +] as const + +type BufferableEvent = typeof BUFFERABLE_EVENT[number] + +/** + * A map that contains a list of all events that have been triggered + * + * Note, this can contain different type of events + * this can make processing events extremely efficient -- since everything + * can be done in a single transaction + */ +type BaileysEventData = Partial + +const BUFFERABLE_EVENT_SET = new Set(BUFFERABLE_EVENT) + +type BaileysBufferableEventEmitter = BaileysEventEmitter & { + /** Use to process events in a batch */ + process(handler: (events: BaileysEventData) => void | Promise): (() => void) + /** + * starts buffering events, call flush() to release them + * */ + buffer(): void + /** buffers all events till the promise completes */ + createBufferedFunction
(work: (...args: A) => Promise): ((...args: A) => Promise) + /** + * flushes all buffered events + * @param force if true, will flush all data regardless of any pending buffers + * @returns returns true if the flush actually happened, otherwise false + */ + flush(force?: boolean): boolean + /** is there an ongoing buffer */ + isBuffering(): boolean +} + +/** + * The event buffer logically consolidates different events into a single event + * making the data processing more efficient. + * @param ev the baileys event emitter + */ +export const makeEventBuffer = (logger: Logger): BaileysBufferableEventEmitter => { + const ev = new EventEmitter() + const historyCache = new Set() + + let data = makeBufferData() + let buffersInProgress = 0 + + // take the generic event and fire it as a baileys event + ev.on('event', (map: BaileysEventData) => { + for(const event in map) { + ev.emit(event, map[event]) + } + }) + + function buffer() { + buffersInProgress += 1 + } + + function flush(force = false) { + // no buffer going on + if(!buffersInProgress) { + return false + } + + if(!force) { + // reduce the number of buffers in progress + buffersInProgress -= 1 + // if there are still some buffers going on + // then we don't flush now + if(buffersInProgress) { + return false + } + } + + const newData = makeBufferData() + const chatUpdates = Object.values(data.chatUpdates) + // gather the remaining conditional events so we re-queue them + let conditionalChatUpdatesLeft = 0 + for(const update of chatUpdates) { + if(update.conditional) { + conditionalChatUpdatesLeft += 1 + newData.chatUpdates[update.id!] = update + delete data.chatUpdates[update.id!] + } + } + + const consolidatedData = consolidateEvents(data) + if(Object.keys(consolidatedData).length) { + ev.emit('event', consolidatedData) + } + + data = newData + + logger.trace( + { conditionalChatUpdatesLeft }, + 'released buffered events' + ) + + return true + } + + return { + process(handler) { + const listener = (map: BaileysEventData) => { + handler(map) + } + + ev.on('event', listener) + return () => { + ev.off('event', listener) + } + }, + emit(event: BaileysEvent, evData: BaileysEventMap[T]) { + if(buffersInProgress && BUFFERABLE_EVENT_SET.has(event)) { + append(data, historyCache, event as any, evData, logger) + return true + } + + return ev.emit('event', { [event]: evData }) + }, + isBuffering() { + return buffersInProgress > 0 + }, + buffer, + flush, + createBufferedFunction(work) { + return async(...args) => { + buffer() + try { + const result = await work(...args) + return result + } finally { + flush() + } + } + }, + on: (...args) => ev.on(...args), + off: (...args) => ev.off(...args), + removeAllListeners: (...args) => ev.removeAllListeners(...args), + } +} + +const makeBufferData = (): BufferedEventData => { + return { + historySets: { + chats: { }, + messages: { }, + contacts: { }, + isLatest: false, + empty: true + }, + chatUpserts: { }, + chatUpdates: { }, + chatDeletes: new Set(), + contactUpserts: { }, + contactUpdates: { }, + messageUpserts: { }, + messageUpdates: { }, + messageReactions: { }, + messageDeletes: { }, + messageReceipts: { }, + groupUpdates: { } + } +} + +function append( + data: BufferedEventData, + historyCache: Set, + event: E, + eventData: any, + logger: Logger +) { + switch (event) { + case 'messaging-history.set': + for(const chat of eventData.chats as Chat[]) { + const existingChat = data.historySets.chats[chat.id] + if(existingChat) { + existingChat.endOfHistoryTransferType = chat.endOfHistoryTransferType + } + + if(!existingChat && !historyCache.has(chat.id)) { + data.historySets.chats[chat.id] = chat + historyCache.add(chat.id) + + absorbingChatUpdate(chat) + } + } + + for(const contact of eventData.contacts as Contact[]) { + const existingContact = data.historySets.contacts[contact.id] + if(existingContact) { + Object.assign(existingContact, trimUndefineds(contact)) + } else { + const historyContactId = `c:${contact.id}` + const hasAnyName = contact.notify || contact.name || contact.verifiedName + if(!historyCache.has(historyContactId) || hasAnyName) { + data.historySets.contacts[contact.id] = contact + historyCache.add(historyContactId) + } + } + } + + for(const message of eventData.messages as WAMessage[]) { + const key = stringifyMessageKey(message.key) + const existingMsg = data.historySets.messages[key] + if(!existingMsg && !historyCache.has(key)) { + data.historySets.messages[key] = message + historyCache.add(key) + } + } + + data.historySets.empty = false + data.historySets.isLatest = eventData.isLatest || data.historySets.isLatest + + break + case 'chats.upsert': + for(const chat of eventData as Chat[]) { + let upsert = data.chatUpserts[chat.id] + if(!upsert) { + upsert = data.historySets[chat.id] + if(upsert) { + logger.debug({ chatId: chat.id }, 'absorbed chat upsert in chat set') + } + } + + if(upsert) { + upsert = concatChats(upsert, chat) + } else { + upsert = chat + data.chatUpserts[chat.id] = upsert + } + + absorbingChatUpdate(upsert) + + if(data.chatDeletes.has(chat.id)) { + data.chatDeletes.delete(chat.id) + } + } + + break + case 'chats.update': + for(const update of eventData as ChatUpdate[]) { + const chatId = update.id! + const conditionMatches = update.conditional ? update.conditional(data) : true + if(conditionMatches) { + delete update.conditional + + // if there is an existing upsert, merge the update into it + const upsert = data.historySets.chats[chatId] || data.chatUpserts[chatId] + if(upsert) { + concatChats(upsert, update) + } else { + // merge the update into the existing update + const chatUpdate = data.chatUpdates[chatId] || { } + data.chatUpdates[chatId] = concatChats(chatUpdate, update) + } + } else if(conditionMatches === undefined) { + // condition yet to be fulfilled + data.chatUpdates[chatId] = update + } + // otherwise -- condition not met, update is invalid + + // if the chat has been updated + // ignore any existing chat delete + if(data.chatDeletes.has(chatId)) { + data.chatDeletes.delete(chatId) + } + } + + break + case 'chats.delete': + for(const chatId of eventData as string[]) { + if(!data.chatDeletes.has(chatId)) { + data.chatDeletes.add(chatId) + } + + // remove any prior updates & upserts + if(data.chatUpdates[chatId]) { + delete data.chatUpdates[chatId] + } + + if(data.chatUpserts[chatId]) { + delete data.chatUpserts[chatId] + + } + + if(data.historySets.chats[chatId]) { + delete data.historySets.chats[chatId] + } + } + + break + case 'contacts.upsert': + for(const contact of eventData as Contact[]) { + let upsert = data.contactUpserts[contact.id] + if(!upsert) { + upsert = data.historySets.contacts[contact.id] + if(upsert) { + logger.debug({ contactId: contact.id }, 'absorbed contact upsert in contact set') + } + } + + if(upsert) { + upsert = Object.assign(upsert, trimUndefineds(contact)) + } else { + upsert = contact + data.contactUpserts[contact.id] = upsert + } + + if(data.contactUpdates[contact.id]) { + upsert = Object.assign(data.contactUpdates[contact.id], trimUndefineds(contact)) + delete data.contactUpdates[contact.id] + } + } + + break + case 'contacts.update': + const contactUpdates = eventData as BaileysEventMap['contacts.update'] + for(const update of contactUpdates) { + const id = update.id! + // merge into prior upsert + const upsert = data.historySets.contacts[id] || data.contactUpserts[id] + if(upsert) { + Object.assign(upsert, update) + } else { + // merge into prior update + const contactUpdate = data.contactUpdates[id] || { } + data.contactUpdates[id] = Object.assign(contactUpdate, update) + } + } + + break + case 'messages.upsert': + const { messages, type } = eventData as BaileysEventMap['messages.upsert'] + for(const message of messages) { + const key = stringifyMessageKey(message.key) + let existing = data.messageUpserts[key]?.message + if(!existing) { + existing = data.historySets.messages[key] + if(existing) { + logger.debug({ messageId: key }, 'absorbed message upsert in message set') + } + } + + if(existing) { + message.messageTimestamp = existing.messageTimestamp + } + + if(data.messageUpdates[key]) { + logger.debug('absorbed prior message update in message upsert') + Object.assign(message, data.messageUpdates[key].update) + delete data.messageUpdates[key] + } + + if(data.historySets.messages[key]) { + data.historySets.messages[key] = message + } else { + data.messageUpserts[key] = { + message, + type: type === 'notify' || data.messageUpserts[key]?.type === 'notify' + ? 'notify' + : type + } + } + } + + break + case 'messages.update': + const msgUpdates = eventData as BaileysEventMap['messages.update'] + for(const { key, update } of msgUpdates) { + const keyStr = stringifyMessageKey(key) + const existing = data.historySets.messages[keyStr] || data.messageUpserts[keyStr]?.message + if(existing) { + Object.assign(existing, update) + // if the message was received & read by us + // the chat counter must have been incremented + // so we need to decrement it + if(update.status === WAMessageStatus.READ && !key.fromMe) { + decrementChatReadCounterIfMsgDidUnread(existing) + } + } else { + const msgUpdate = data.messageUpdates[keyStr] || { key, update: { } } + Object.assign(msgUpdate.update, update) + data.messageUpdates[keyStr] = msgUpdate + } + } + + break + case 'messages.delete': + const deleteData = eventData as BaileysEventMap['messages.delete'] + if('keys' in deleteData) { + const { keys } = deleteData + for(const key of keys) { + const keyStr = stringifyMessageKey(key) + if(!data.messageDeletes[keyStr]) { + data.messageDeletes[keyStr] = key + + } + + if(data.messageUpserts[keyStr]) { + delete data.messageUpserts[keyStr] + } + + if(data.messageUpdates[keyStr]) { + delete data.messageUpdates[keyStr] + } + } + } else { + // TODO: add support + } + + break + case 'messages.reaction': + const reactions = eventData as BaileysEventMap['messages.reaction'] + for(const { key, reaction } of reactions) { + const keyStr = stringifyMessageKey(key) + const existing = data.messageUpserts[keyStr] + if(existing) { + updateMessageWithReaction(existing.message, reaction) + } else { + data.messageReactions[keyStr] = data.messageReactions[keyStr] + || { key, reactions: [] } + updateMessageWithReaction(data.messageReactions[keyStr], reaction) + } + } + + break + case 'message-receipt.update': + const receipts = eventData as BaileysEventMap['message-receipt.update'] + for(const { key, receipt } of receipts) { + const keyStr = stringifyMessageKey(key) + const existing = data.messageUpserts[keyStr] + if(existing) { + updateMessageWithReceipt(existing.message, receipt) + } else { + data.messageReceipts[keyStr] = data.messageReceipts[keyStr] + || { key, userReceipt: [] } + updateMessageWithReceipt(data.messageReceipts[keyStr], receipt) + } + } + + break + case 'groups.update': + const groupUpdates = eventData as BaileysEventMap['groups.update'] + for(const update of groupUpdates) { + const id = update.id! + const groupUpdate = data.groupUpdates[id] || { } + if(!data.groupUpdates[id]) { + data.groupUpdates[id] = Object.assign(groupUpdate, update) + + } + } + + break + default: + throw new Error(`"${event}" cannot be buffered`) + } + + function absorbingChatUpdate(existing: Chat) { + const chatId = existing.id + const update = data.chatUpdates[chatId] + if(update) { + const conditionMatches = update.conditional ? update.conditional(data) : true + if(conditionMatches) { + delete update.conditional + logger.debug({ chatId }, 'absorbed chat update in existing chat') + Object.assign(existing, concatChats(update as Chat, existing)) + delete data.chatUpdates[chatId] + } else if(conditionMatches === false) { + logger.debug({ chatId }, 'chat update condition fail, removing') + delete data.chatUpdates[chatId] + } + } + } + + function decrementChatReadCounterIfMsgDidUnread(message: WAMessage) { + // decrement chat unread counter + // if the message has already been marked read by us + const chatId = message.key.remoteJid! + const chat = data.chatUpdates[chatId] || data.chatUpserts[chatId] + if( + isRealMessage(message, '') + && shouldIncrementChatUnread(message) + && typeof chat?.unreadCount === 'number' + && chat.unreadCount > 0 + ) { + logger.debug({ chatId: chat.id }, 'decrementing chat counter') + chat.unreadCount -= 1 + if(chat.unreadCount === 0) { + delete chat.unreadCount + } + } + } +} + +function consolidateEvents(data: BufferedEventData) { + const map: BaileysEventData = { } + + if(!data.historySets.empty) { + map['messaging-history.set'] = { + chats: Object.values(data.historySets.chats), + messages: Object.values(data.historySets.messages), + contacts: Object.values(data.historySets.contacts), + isLatest: data.historySets.isLatest + } + } + + const chatUpsertList = Object.values(data.chatUpserts) + if(chatUpsertList.length) { + map['chats.upsert'] = chatUpsertList + } + + const chatUpdateList = Object.values(data.chatUpdates) + if(chatUpdateList.length) { + map['chats.update'] = chatUpdateList + } + + const chatDeleteList = Array.from(data.chatDeletes) + if(chatDeleteList.length) { + map['chats.delete'] = chatDeleteList + } + + const messageUpsertList = Object.values(data.messageUpserts) + if(messageUpsertList.length) { + const type = messageUpsertList[0].type + map['messages.upsert'] = { + messages: messageUpsertList.map(m => m.message), + type + } + } + + const messageUpdateList = Object.values(data.messageUpdates) + if(messageUpdateList.length) { + map['messages.update'] = messageUpdateList + } + + const messageDeleteList = Object.values(data.messageDeletes) + if(messageDeleteList.length) { + map['messages.delete'] = { keys: messageDeleteList } + } + + const messageReactionList = Object.values(data.messageReactions).flatMap( + ({ key, reactions }) => reactions.flatMap(reaction => ({ key, reaction })) + ) + if(messageReactionList.length) { + map['messages.reaction'] = messageReactionList + } + + const messageReceiptList = Object.values(data.messageReceipts).flatMap( + ({ key, userReceipt }) => userReceipt.flatMap(receipt => ({ key, receipt })) + ) + if(messageReceiptList.length) { + map['message-receipt.update'] = messageReceiptList + } + + const contactUpsertList = Object.values(data.contactUpserts) + if(contactUpsertList.length) { + map['contacts.upsert'] = contactUpsertList + } + + const contactUpdateList = Object.values(data.contactUpdates) + if(contactUpdateList.length) { + map['contacts.update'] = contactUpdateList + } + + const groupUpdateList = Object.values(data.groupUpdates) + if(groupUpdateList.length) { + map['groups.update'] = groupUpdateList + } + + return map +} + +function concatChats>(a: C, b: Partial) { + if(b.unreadCount === null) { + // neutralize unread counter + if(a.unreadCount! < 0) { + a.unreadCount = undefined + b.unreadCount = undefined + } + } + + if(typeof a.unreadCount === 'number' && typeof b.unreadCount === 'number') { + b = { ...b } + if(b.unreadCount! >= 0) { + b.unreadCount = Math.max(b.unreadCount!, 0) + Math.max(a.unreadCount, 0) + } + } + + return Object.assign(a, b) +} + +const stringifyMessageKey = (key: proto.IMessageKey) => `${key.remoteJid},${key.id},${key.fromMe ? '1' : '0'}` \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/generics.ts b/whatsapp_addon/Baileys/src/Utils/generics.ts new file mode 100644 index 0000000..ea730b6 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/generics.ts @@ -0,0 +1,379 @@ +import { Boom } from '@hapi/boom' +import axios, { AxiosRequestConfig } from 'axios' +import { randomBytes } from 'crypto' +import { platform, release } from 'os' +import { Logger } from 'pino' +import { proto } from '../../WAProto' +import { version as baileysVersion } from '../Defaults/baileys-version.json' +import { BaileysEventEmitter, BaileysEventMap, DisconnectReason, WACallUpdateType, WAVersion } from '../Types' +import { BinaryNode, getAllBinaryNodeChildren } from '../WABinary' + +const PLATFORM_MAP = { + 'aix': 'AIX', + 'darwin': 'Mac OS', + 'win32': 'Windows', + 'android': 'Android' +} + +export const Browsers = { + ubuntu: browser => ['Ubuntu', browser, '20.0.04'] as [string, string, string], + macOS: browser => ['Mac OS', browser, '10.15.7'] as [string, string, string], + baileys: browser => ['Baileys', browser, '4.0.0'] as [string, string, string], + /** The appropriate browser based on your OS & release */ + appropriate: browser => [ PLATFORM_MAP[platform()] || 'Ubuntu', browser, release() ] as [string, string, string] +} + +export const BufferJSON = { + replacer: (k, value: any) => { + if(Buffer.isBuffer(value) || value instanceof Uint8Array || value?.type === 'Buffer') { + return { type: 'Buffer', data: Buffer.from(value?.data || value).toString('base64') } + } + + return value + }, + reviver: (_, value: any) => { + if(typeof value === 'object' && !!value && (value.buffer === true || value.type === 'Buffer')) { + const val = value.data || value.value + return typeof val === 'string' ? Buffer.from(val, 'base64') : Buffer.from(val || []) + } + + return value + } +} + +export const writeRandomPadMax16 = (msg: Uint8Array) => { + const pad = randomBytes(1) + pad[0] &= 0xf + if(!pad[0]) { + pad[0] = 0xf + } + + return Buffer.concat([msg, Buffer.alloc(pad[0], pad[0])]) +} + +export const unpadRandomMax16 = (e: Uint8Array | Buffer) => { + const t = new Uint8Array(e) + if(0 === t.length) { + throw new Error('unpadPkcs7 given empty bytes') + } + + var r = t[t.length - 1] + if(r > t.length) { + throw new Error(`unpad given ${t.length} bytes, but pad is ${r}`) + } + + return new Uint8Array(t.buffer, t.byteOffset, t.length - r) +} + +export const encodeWAMessage = (message: proto.IMessage) => ( + writeRandomPadMax16( + proto.Message.encode(message).finish() + ) +) + +export const generateRegistrationId = (): number => { + return Uint16Array.from(randomBytes(2))[0] & 16383 +} + +export const encodeBigEndian = (e: number, t = 4) => { + let r = e + const a = new Uint8Array(t) + for(let i = t - 1; i >= 0; i--) { + a[i] = 255 & r + r >>>= 8 + } + + return a +} + +export const toNumber = (t: Long | number | null | undefined): number => ((typeof t === 'object' && t) ? ('toNumber' in t ? t.toNumber() : (t as any).low) : t) + +/** unix timestamp of a date in seconds */ +export const unixTimestampSeconds = (date: Date = new Date()) => Math.floor(date.getTime() / 1000) + +export type DebouncedTimeout = ReturnType + +export const debouncedTimeout = (intervalMs: number = 1000, task?: () => void) => { + let timeout: NodeJS.Timeout | undefined + return { + start: (newIntervalMs?: number, newTask?: () => void) => { + task = newTask || task + intervalMs = newIntervalMs || intervalMs + timeout && clearTimeout(timeout) + timeout = setTimeout(() => task?.(), intervalMs) + }, + cancel: () => { + timeout && clearTimeout(timeout) + timeout = undefined + }, + setTask: (newTask: () => void) => task = newTask, + setInterval: (newInterval: number) => intervalMs = newInterval + } +} + +export const delay = (ms: number) => delayCancellable (ms).delay + +export const delayCancellable = (ms: number) => { + const stack = new Error().stack + let timeout: NodeJS.Timeout + let reject: (error) => void + const delay: Promise = new Promise((resolve, _reject) => { + timeout = setTimeout(resolve, ms) + reject = _reject + }) + const cancel = () => { + clearTimeout (timeout) + reject( + new Boom('Cancelled', { + statusCode: 500, + data: { + stack + } + }) + ) + } + + return { delay, cancel } +} + +export async function promiseTimeout(ms: number | undefined, promise: (resolve: (v?: T)=>void, reject: (error) => void) => void) { + if(!ms) { + return new Promise (promise) + } + + const stack = new Error().stack + // Create a promise that rejects in milliseconds + const { delay, cancel } = delayCancellable (ms) + const p = new Promise ((resolve, reject) => { + delay + .then(() => reject( + new Boom('Timed Out', { + statusCode: DisconnectReason.timedOut, + data: { + stack + } + }) + )) + .catch (err => reject(err)) + + promise (resolve, reject) + }) + .finally (cancel) + return p as Promise +} + +// generate a random ID to attach to a message +export const generateMessageID = () => 'BAE5' + randomBytes(6).toString('hex').toUpperCase() + +export function bindWaitForEvent(ev: BaileysEventEmitter, event: T) { + return async(check: (u: BaileysEventMap[T]) => boolean | undefined, timeoutMs?: number) => { + let listener: (item: BaileysEventMap[T]) => void + let closeListener: any + await ( + promiseTimeout( + timeoutMs, + (resolve, reject) => { + closeListener = ({ connection, lastDisconnect }) => { + if(connection === 'close') { + reject( + lastDisconnect?.error + || new Boom('Connection Closed', { statusCode: DisconnectReason.connectionClosed }) + ) + } + } + + ev.on('connection.update', closeListener) + listener = (update) => { + if(check(update)) { + resolve() + } + } + + ev.on(event, listener) + } + ) + .finally(() => { + ev.off(event, listener) + ev.off('connection.update', closeListener) + }) + ) + } +} + +export const bindWaitForConnectionUpdate = (ev: BaileysEventEmitter) => bindWaitForEvent(ev, 'connection.update') + +export const printQRIfNecessaryListener = (ev: BaileysEventEmitter, logger: Logger) => { + ev.on('connection.update', async({ qr }) => { + if(qr) { + const QR = await import('qrcode-terminal') + .catch(() => { + logger.error('QR code terminal not added as dependency') + }) + QR?.generate(qr, { small: true }) + } + }) +} + +/** + * utility that fetches latest baileys version from the master branch. + * Use to ensure your WA connection is always on the latest version + */ +export const fetchLatestBaileysVersion = async(options: AxiosRequestConfig = { }) => { + const URL = 'https://raw.githubusercontent.com/adiwajshing/Baileys/master/src/Defaults/baileys-version.json' + try { + const result = await axios.get<{ version: WAVersion }>( + URL, + { + ...options, + responseType: 'json' + } + ) + return { + version: result.data.version, + isLatest: true + } + } catch(error) { + return { + version: baileysVersion as WAVersion, + isLatest: false, + error + } + } +} + +/** + * A utility that fetches the latest web version of whatsapp. + * Use to ensure your WA connection is always on the latest version + */ +export const fetchLatestWaWebVersion = async(options: AxiosRequestConfig) => { + try { + const result = await axios.get( + 'https://web.whatsapp.com/check-update?version=1&platform=web', + { + ...options, + responseType: 'json' + } + ) + const version = result.data.currentVersion.split('.') + return { + version: [+version[0], +version[1], +version[2]] as WAVersion, + isLatest: true + } + } catch(error) { + return { + version: baileysVersion as WAVersion, + isLatest: false, + error + } + } +} + +/** unique message tag prefix for MD clients */ +export const generateMdTagPrefix = () => { + const bytes = randomBytes(4) + return `${bytes.readUInt16BE()}.${bytes.readUInt16BE(2)}-` +} + +const STATUS_MAP: { [_: string]: proto.WebMessageInfo.Status } = { + 'played': proto.WebMessageInfo.Status.PLAYED, + 'read': proto.WebMessageInfo.Status.READ, + 'read-self': proto.WebMessageInfo.Status.READ +} +/** + * Given a type of receipt, returns what the new status of the message should be + * @param type type from receipt + */ +export const getStatusFromReceiptType = (type: string | undefined) => { + const status = STATUS_MAP[type!] + if(typeof type === 'undefined') { + return proto.WebMessageInfo.Status.DELIVERY_ACK + } + + return status +} + +const CODE_MAP: { [_: string]: DisconnectReason } = { + conflict: DisconnectReason.connectionReplaced +} + +/** + * Stream errors generally provide a reason, map that to a baileys DisconnectReason + * @param reason the string reason given, eg. "conflict" + */ +export const getErrorCodeFromStreamError = (node: BinaryNode) => { + const [reasonNode] = getAllBinaryNodeChildren(node) + let reason = reasonNode?.tag || 'unknown' + const statusCode = +(node.attrs.code || CODE_MAP[reason] || DisconnectReason.badSession) + + if(statusCode === DisconnectReason.restartRequired) { + reason = 'restart required' + } + + return { + reason, + statusCode + } +} + +export const getCallStatusFromNode = ({ tag, attrs }: BinaryNode) => { + let status: WACallUpdateType + switch (tag) { + case 'offer': + case 'offer_notice': + status = 'offer' + break + case 'terminate': + if(attrs.reason === 'timeout') { + status = 'timeout' + } else { + status = 'reject' + } + + break + case 'reject': + status = 'reject' + break + case 'accept': + status = 'accept' + break + default: + status = 'ringing' + break + } + + return status +} + +const UNEXPECTED_SERVER_CODE_TEXT = 'Unexpected server response: ' + +export const getCodeFromWSError = (error: Error) => { + let statusCode = 500 + if(error.message.includes(UNEXPECTED_SERVER_CODE_TEXT)) { + const code = +error.message.slice(UNEXPECTED_SERVER_CODE_TEXT.length) + if(!Number.isNaN(code) && code >= 400) { + statusCode = code + } + } else if((error as any).code?.startsWith('E')) { // handle ETIMEOUT, ENOTFOUND etc + statusCode = 408 + } + + return statusCode +} + +/** + * Is the given platform WA business + * @param platform AuthenticationCreds.platform + */ +export const isWABusinessPlatform = (platform: string) => { + return platform === 'smbi' || platform === 'smba' +} + +export function trimUndefineds(obj: any) { + for(const key in obj) { + if(typeof obj[key] === 'undefined') { + delete obj[key] + } + } + + return obj +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/history.ts b/whatsapp_addon/Baileys/src/Utils/history.ts new file mode 100644 index 0000000..b56a395 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/history.ts @@ -0,0 +1,112 @@ +import { AxiosRequestConfig } from 'axios' +import { promisify } from 'util' +import { inflate } from 'zlib' +import { proto } from '../../WAProto' +import { Chat, Contact, WAMessageStubType } from '../Types' +import { isJidUser } from '../WABinary' +import { toNumber } from './generics' +import { normalizeMessageContent } from './messages' +import { downloadContentFromMessage } from './messages-media' + +const inflatePromise = promisify(inflate) + +export const downloadHistory = async( + msg: proto.Message.IHistorySyncNotification, + options: AxiosRequestConfig +) => { + const stream = await downloadContentFromMessage(msg, 'md-msg-hist', { options }) + const bufferArray: Buffer[] = [] + for await (const chunk of stream) { + bufferArray.push(chunk) + } + + let buffer = Buffer.concat(bufferArray) + + // decompress buffer + buffer = await inflatePromise(buffer) + + const syncData = proto.HistorySync.decode(buffer) + return syncData +} + +export const processHistoryMessage = (item: proto.IHistorySync) => { + const messages: proto.IWebMessageInfo[] = [] + const contacts: Contact[] = [] + const chats: Chat[] = [] + + switch (item.syncType) { + case proto.HistorySync.HistorySyncType.INITIAL_BOOTSTRAP: + case proto.HistorySync.HistorySyncType.RECENT: + case proto.HistorySync.HistorySyncType.FULL: + for(const chat of item.conversations! as Chat[]) { + contacts.push({ id: chat.id, name: chat.name || undefined }) + + const msgs = chat.messages || [] + delete chat.messages + delete chat.archived + delete chat.muteEndTime + delete chat.pinned + + for(const item of msgs) { + const message = item.message! + messages.push(message) + + if(!chat.messages?.length) { + // keep only the most recent message in the chat array + chat.messages = [{ message }] + } + + if(!message.key.fromMe && !chat.lastMessageRecvTimestamp) { + chat.lastMessageRecvTimestamp = toNumber(message.messageTimestamp) + } + + if( + (message.messageStubType === WAMessageStubType.BIZ_PRIVACY_MODE_TO_BSP + || message.messageStubType === WAMessageStubType.BIZ_PRIVACY_MODE_TO_FB + ) + && message.messageStubParameters?.[0] + ) { + contacts.push({ + id: message.key.participant || message.key.remoteJid!, + verifiedName: message.messageStubParameters?.[0], + }) + } + } + + if(isJidUser(chat.id) && chat.readOnly && chat.archived) { + delete chat.readOnly + } + + chats.push({ ...chat }) + } + + break + case proto.HistorySync.HistorySyncType.PUSH_NAME: + for(const c of item.pushnames!) { + contacts.push({ id: c.id!, notify: c.pushname! }) + } + + break + } + + return { + chats, + contacts, + messages, + } +} + +export const downloadAndProcessHistorySyncNotification = async( + msg: proto.Message.IHistorySyncNotification, + options: AxiosRequestConfig +) => { + const historyMsg = await downloadHistory(msg, options) + return processHistoryMessage(historyMsg) +} + +export const getHistoryMsg = (message: proto.IMessage) => { + const normalizedContent = !!message ? normalizeMessageContent(message) : undefined + const anyHistoryMsg = normalizedContent?.protocolMessage?.historySyncNotification + + return anyHistoryMsg +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/index.ts b/whatsapp_addon/Baileys/src/Utils/index.ts new file mode 100644 index 0000000..82c0be4 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/index.ts @@ -0,0 +1,18 @@ +export * from "./generics"; +export * from "./decode-wa-message"; +export * from "./messages"; +export * from "./messages-media"; +export * from "./validate-connection"; +export * from "./crypto"; +export * from "./signal"; +export * from "./noise-handler"; +export * from "./history"; +export * from "./chat-utils"; +export * from "./lt-hash"; +export * from "./auth-utils"; +export * from "./baileys-event-stream"; +export * from "./use-multi-file-auth-state"; +export * from "./use-single-file-auth-state"; +export * from "./link-preview"; +export * from "./event-buffer"; +export * from "./process-message"; diff --git a/whatsapp_addon/Baileys/src/Utils/link-preview.ts b/whatsapp_addon/Baileys/src/Utils/link-preview.ts new file mode 100644 index 0000000..fba903f --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/link-preview.ts @@ -0,0 +1,91 @@ +import { Logger } from 'pino' +import { WAMediaUploadFunction, WAUrlInfo } from '../Types' +import { prepareWAMessageMedia } from './messages' +import { extractImageThumb, getHttpStream } from './messages-media' + +const THUMBNAIL_WIDTH_PX = 192 + +/** Fetches an image and generates a thumbnail for it */ +const getCompressedJpegThumbnail = async( + url: string, + { thumbnailWidth, fetchOpts }: URLGenerationOptions +) => { + const stream = await getHttpStream(url, fetchOpts) + const result = await extractImageThumb(stream, thumbnailWidth) + return result +} + +export type URLGenerationOptions = { + thumbnailWidth: number + fetchOpts: { + /** Timeout in ms */ + timeout: number + proxyUrl?: string + headers?: { [key: string]: string } + } + uploadImage?: WAMediaUploadFunction + logger?: Logger +} + +/** + * Given a piece of text, checks for any URL present, generates link preview for the same and returns it + * Return undefined if the fetch failed or no URL was found + * @param text first matched URL in text + * @returns the URL info required to generate link preview + */ +export const getUrlInfo = async( + text: string, + opts: URLGenerationOptions = { + thumbnailWidth: THUMBNAIL_WIDTH_PX, + fetchOpts: { timeout: 3000 } + }, +): Promise => { + try { + const { getLinkPreview } = await import('link-preview-js') + let previewLink = text + if(!text.startsWith('https://') && !text.startsWith('http://')) { + previewLink = 'https://' + previewLink + } + + const info = await getLinkPreview(previewLink, opts.fetchOpts) + if(info && 'title' in info && info.title) { + const [image] = info.images + + const urlInfo: WAUrlInfo = { + 'canonical-url': info.url, + 'matched-text': text, + title: info.title, + description: info.description, + originalThumbnailUrl: image + } + + if(opts.uploadImage) { + const { imageMessage } = await prepareWAMessageMedia( + { image: { url: image } }, + { upload: opts.uploadImage, mediaTypeOverride: 'thumbnail-link' } + ) + urlInfo.jpegThumbnail = imageMessage?.jpegThumbnail + ? Buffer.from(imageMessage.jpegThumbnail) + : undefined + urlInfo.highQualityThumbnail = imageMessage || undefined + } else { + try { + urlInfo.jpegThumbnail = image + ? (await getCompressedJpegThumbnail(image, opts)).buffer + : undefined + } catch(error) { + opts.logger?.debug( + { err: error.stack, url: previewLink }, + 'error in generating thumbnail' + ) + } + } + + return urlInfo + } + } catch(error) { + if(!error.message.includes('receive a valid')) { + throw error + } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/logger.ts b/whatsapp_addon/Baileys/src/Utils/logger.ts new file mode 100644 index 0000000..bb651e3 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/logger.ts @@ -0,0 +1,3 @@ +import P from 'pino' + +export default P({ timestamp: () => `,"time":"${new Date().toJSON()}"` }) \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/lt-hash.ts b/whatsapp_addon/Baileys/src/Utils/lt-hash.ts new file mode 100644 index 0000000..fa38484 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/lt-hash.ts @@ -0,0 +1,61 @@ +import { hkdf } from './crypto' + +/** + * LT Hash is a summation based hash algorithm that maintains the integrity of a piece of data + * over a series of mutations. You can add/remove mutations and it'll return a hash equal to + * if the same series of mutations was made sequentially. + */ + +const o = 128 + +class d { + + salt: string + + constructor(e: string) { + this.salt = e + } + add(e, t) { + var r = this + for(const item of t) { + e = r._addSingle(e, item) + } + + return e + } + subtract(e, t) { + var r = this + for(const item of t) { + e = r._subtractSingle(e, item) + } + + return e + } + subtractThenAdd(e, t, r) { + var n = this + return n.add(n.subtract(e, r), t) + } + _addSingle(e, t) { + var r = this + const n = new Uint8Array(hkdf(Buffer.from(t), o, { info: r.salt })).buffer + return r.performPointwiseWithOverflow(e, n, ((e, t) => e + t)) + } + _subtractSingle(e, t) { + var r = this + + const n = new Uint8Array(hkdf(Buffer.from(t), o, { info: r.salt })).buffer + return r.performPointwiseWithOverflow(e, n, ((e, t) => e - t)) + } + performPointwiseWithOverflow(e, t, r) { + const n = new DataView(e) + , i = new DataView(t) + , a = new ArrayBuffer(n.byteLength) + , s = new DataView(a) + for(let e = 0; e < n.byteLength; e += 2) { + s.setUint16(e, r(n.getUint16(e, !0), i.getUint16(e, !0)), !0) + } + + return a + } +} +export const LT_HASH_ANTI_TAMPERING = new d('WhatsApp Patch Integrity') \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/make-mutex.ts b/whatsapp_addon/Baileys/src/Utils/make-mutex.ts new file mode 100644 index 0000000..8bb9f54 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/make-mutex.ts @@ -0,0 +1,44 @@ +export const makeMutex = () => { + let task = Promise.resolve() as Promise + + let taskTimeout: NodeJS.Timeout | undefined + + return { + mutex(code: () => Promise | T): Promise { + task = (async() => { + // wait for the previous task to complete + // if there is an error, we swallow so as to not block the queue + try { + await task + } catch{ } + + try { + // execute the current task + const result = await code() + return result + } finally { + clearTimeout(taskTimeout) + } + })() + // we replace the existing task, appending the new piece of execution to it + // so the next task will have to wait for this one to finish + return task + }, + } +} + +export type Mutex = ReturnType + +export const makeKeyedMutex = () => { + const map: { [id: string]: Mutex } = {} + + return { + mutex(key: string, task: () => Promise | T): Promise { + if(!map[key]) { + map[key] = makeMutex() + } + + return map[key].mutex(task) + } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/messages-media.ts b/whatsapp_addon/Baileys/src/Utils/messages-media.ts new file mode 100644 index 0000000..26b6bc3 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/messages-media.ts @@ -0,0 +1,708 @@ +import { Boom } from '@hapi/boom' +import { AxiosRequestConfig } from 'axios' +import { exec } from 'child_process' +import * as Crypto from 'crypto' +import { once } from 'events' +import { createReadStream, createWriteStream, promises as fs, WriteStream } from 'fs' +import type { IAudioMetadata } from 'music-metadata' +import { tmpdir } from 'os' +import { join } from 'path' +import type { Logger } from 'pino' +import { Readable, Transform } from 'stream' +import { URL } from 'url' +import { proto } from '../../WAProto' +import { DEFAULT_ORIGIN, MEDIA_HKDF_KEY_MAPPING, MEDIA_PATH_MAP } from '../Defaults' +import { BaileysEventMap, DownloadableMessage, MediaConnInfo, MediaDecryptionKeyInfo, MediaType, MessageType, SocketConfig, WAGenericMediaMessage, WAMediaUpload, WAMediaUploadFunction, WAMessageContent } from '../Types' +import { BinaryNode, getBinaryNodeChild, getBinaryNodeChildBuffer, jidNormalizedUser } from '../WABinary' +import { aesDecryptGCM, aesEncryptGCM, hkdf } from './crypto' +import { generateMessageID } from './generics' + +const getTmpFilesDirectory = () => tmpdir() + +const getImageProcessingLibrary = async() => { + const [_jimp, sharp] = await Promise.all([ + (async() => { + const jimp = await ( + import('jimp') + .catch(() => { }) + ) + return jimp + })(), + (async() => { + const sharp = await ( + import('sharp') + .catch(() => { }) + ) + return sharp + })() + ]) + + if(sharp) { + return { sharp } + } + + const jimp = _jimp?.default || _jimp + if(jimp) { + return { jimp } + } + + throw new Boom('No image processing library available') +} + +export const hkdfInfoKey = (type: MediaType) => { + const hkdfInfo = MEDIA_HKDF_KEY_MAPPING[type] + return `WhatsApp ${hkdfInfo} Keys` +} + +/** generates all the keys required to encrypt/decrypt & sign a media message */ +export function getMediaKeys(buffer: Uint8Array | string | null | undefined, mediaType: MediaType): MediaDecryptionKeyInfo { + if(!buffer) { + throw new Boom('Cannot derive from empty media key') + } + + if(typeof buffer === 'string') { + buffer = Buffer.from(buffer.replace('data:;base64,', ''), 'base64') + } + + // expand using HKDF to 112 bytes, also pass in the relevant app info + const expandedMediaKey = hkdf(buffer, 112, { info: hkdfInfoKey(mediaType) }) + return { + iv: expandedMediaKey.slice(0, 16), + cipherKey: expandedMediaKey.slice(16, 48), + macKey: expandedMediaKey.slice(48, 80), + } +} + +/** Extracts video thumb using FFMPEG */ +const extractVideoThumb = async( + path: string, + destPath: string, + time: string, + size: { width: number; height: number }, +) => new Promise((resolve, reject) => { + const cmd = `ffmpeg -ss ${time} -i ${path} -y -vf scale=${size.width}:-1 -vframes 1 -f image2 ${destPath}` + exec(cmd, (err) => { + if(err) { + reject(err) + } else { + resolve() + } + }) +}) as Promise + +export const extractImageThumb = async(bufferOrFilePath: Readable | Buffer | string, width = 32) => { + if(bufferOrFilePath instanceof Readable) { + bufferOrFilePath = await toBuffer(bufferOrFilePath) + } + + const lib = await getImageProcessingLibrary() + if('sharp' in lib && typeof lib.sharp?.default === 'function') { + const img = lib.sharp!.default(bufferOrFilePath) + const dimensions = await img.metadata() + + const buffer = await img + .resize(width) + .jpeg({ quality: 50 }) + .toBuffer() + return { + buffer, + original: { + width: dimensions.width, + height: dimensions.height, + }, + } + } else if('jimp' in lib && typeof lib.jimp?.read === 'function') { + const { read, MIME_JPEG, RESIZE_BILINEAR, AUTO } = lib.jimp + + const jimp = await read(bufferOrFilePath as any) + const dimensions = { + width: jimp.getWidth(), + height: jimp.getHeight() + } + const buffer = await jimp + .quality(50) + .resize(width, AUTO, RESIZE_BILINEAR) + .getBufferAsync(MIME_JPEG) + return { + buffer, + original: dimensions + } + } else { + throw new Boom('No image processing library available') + } +} + +export const encodeBase64EncodedStringForUpload = (b64: string) => ( + encodeURIComponent( + b64 + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/\=+$/, '') + ) +) + +export const generateProfilePicture = async(mediaUpload: WAMediaUpload) => { + let bufferOrFilePath: Buffer | string + if(Buffer.isBuffer(mediaUpload)) { + bufferOrFilePath = mediaUpload + } else if('url' in mediaUpload) { + bufferOrFilePath = mediaUpload.url.toString() + } else { + bufferOrFilePath = await toBuffer(mediaUpload.stream) + } + + const lib = await getImageProcessingLibrary() + let img: Promise + if('sharp' in lib && typeof lib.sharp?.default === 'function') { + img = lib.sharp!.default(bufferOrFilePath) + .resize(640, 640) + .jpeg({ + quality: 50, + }) + .toBuffer() + } else if('jimp' in lib && typeof lib.jimp?.read === 'function') { + const { read, MIME_JPEG, RESIZE_BILINEAR } = lib.jimp + const jimp = await read(bufferOrFilePath as any) + const min = Math.min(jimp.getWidth(), jimp.getHeight()) + const cropped = jimp.crop(0, 0, min, min) + + img = cropped + .quality(50) + .resize(640, 640, RESIZE_BILINEAR) + .getBufferAsync(MIME_JPEG) + } else { + throw new Boom('No image processing library available') + } + + return { + img: await img, + } +} + +/** gets the SHA256 of the given media message */ +export const mediaMessageSHA256B64 = (message: WAMessageContent) => { + const media = Object.values(message)[0] as WAGenericMediaMessage + return media?.fileSha256 && Buffer.from(media.fileSha256).toString ('base64') +} + +export async function getAudioDuration(buffer: Buffer | string | Readable) { + const musicMetadata = await import('music-metadata') + let metadata: IAudioMetadata + if(Buffer.isBuffer(buffer)) { + metadata = await musicMetadata.parseBuffer(buffer, undefined, { duration: true }) + } else if(typeof buffer === 'string') { + const rStream = createReadStream(buffer) + metadata = await musicMetadata.parseStream(rStream, undefined, { duration: true }) + rStream.close() + } else { + metadata = await musicMetadata.parseStream(buffer, undefined, { duration: true }) + } + + return metadata.format.duration +} + +export const toReadable = (buffer: Buffer) => { + const readable = new Readable({ read: () => {} }) + readable.push(buffer) + readable.push(null) + return readable +} + +export const toBuffer = async(stream: Readable) => { + let buff = Buffer.alloc(0) + for await (const chunk of stream) { + buff = Buffer.concat([ buff, chunk ]) + } + + stream.destroy() + return buff +} + +export const getStream = async(item: WAMediaUpload) => { + if(Buffer.isBuffer(item)) { + return { stream: toReadable(item), type: 'buffer' } + } + + if('stream' in item) { + return { stream: item.stream, type: 'readable' } + } + + if(item.url.toString().startsWith('http://') || item.url.toString().startsWith('https://')) { + return { stream: await getHttpStream(item.url), type: 'remote' } + } + + return { stream: createReadStream(item.url), type: 'file' } +} + +/** generates a thumbnail for a given media, if required */ +export async function generateThumbnail( + file: string, + mediaType: 'video' | 'image', + options: { + logger?: Logger + } +) { + let thumbnail: string | undefined + let originalImageDimensions: { width: number; height: number } | undefined + if(mediaType === 'image') { + const { buffer, original } = await extractImageThumb(file) + thumbnail = buffer.toString('base64') + if(original.width && original.height) { + originalImageDimensions = { + width: original.width, + height: original.height, + } + } + } else if(mediaType === 'video') { + const imgFilename = join(getTmpFilesDirectory(), generateMessageID() + '.jpg') + try { + await extractVideoThumb(file, imgFilename, '00:00:00', { width: 32, height: 32 }) + const buff = await fs.readFile(imgFilename) + thumbnail = buff.toString('base64') + + await fs.unlink(imgFilename) + } catch(err) { + options.logger?.debug('could not generate video thumb: ' + err) + } + } + + return { + thumbnail, + originalImageDimensions + } +} + +export const getHttpStream = async(url: string | URL, options: AxiosRequestConfig & { isStream?: true } = {}) => { + const { default: axios } = await import('axios') + const fetched = await axios.get(url.toString(), { ...options, responseType: 'stream' }) + return fetched.data as Readable +} + +export const encryptedStream = async( + media: WAMediaUpload, + mediaType: MediaType, + saveOriginalFileIfRequired = true, + logger?: Logger +) => { + const { stream, type } = await getStream(media) + + logger?.debug('fetched media stream') + + const mediaKey = Crypto.randomBytes(32) + const { cipherKey, iv, macKey } = getMediaKeys(mediaKey, mediaType) + // random name + //const encBodyPath = join(getTmpFilesDirectory(), mediaType + generateMessageID() + '.enc') + // const encWriteStream = createWriteStream(encBodyPath) + const encWriteStream = new Readable({ read: () => {} }) + + let bodyPath: string | undefined + let writeStream: WriteStream | undefined + let didSaveToTmpPath = false + if(type === 'file') { + bodyPath = (media as any).url + } else if(saveOriginalFileIfRequired) { + bodyPath = join(getTmpFilesDirectory(), mediaType + generateMessageID()) + writeStream = createWriteStream(bodyPath) + didSaveToTmpPath = true + } + + let fileLength = 0 + const aes = Crypto.createCipheriv('aes-256-cbc', cipherKey, iv) + let hmac = Crypto.createHmac('sha256', macKey!).update(iv) + let sha256Plain = Crypto.createHash('sha256') + let sha256Enc = Crypto.createHash('sha256') + + const onChunk = (buff: Buffer) => { + sha256Enc = sha256Enc.update(buff) + hmac = hmac.update(buff) + encWriteStream.push(buff) + } + + try { + for await (const data of stream) { + fileLength += data.length + sha256Plain = sha256Plain.update(data) + if(writeStream) { + if(!writeStream.write(data)) { + await once(writeStream, 'drain') + } + } + + onChunk(aes.update(data)) + } + + onChunk(aes.final()) + + const mac = hmac.digest().slice(0, 10) + sha256Enc = sha256Enc.update(mac) + + const fileSha256 = sha256Plain.digest() + const fileEncSha256 = sha256Enc.digest() + + encWriteStream.push(mac) + encWriteStream.push(null) + + writeStream && writeStream.end() + stream.destroy() + + logger?.debug('encrypted data successfully') + + return { + mediaKey, + encWriteStream, + bodyPath, + mac, + fileEncSha256, + fileSha256, + fileLength, + didSaveToTmpPath + } + } catch(error) { + encWriteStream.destroy(error) + writeStream?.destroy(error) + aes.destroy(error) + hmac.destroy(error) + sha256Plain.destroy(error) + sha256Enc.destroy(error) + stream.destroy(error) + + throw error + } +} + +const DEF_HOST = 'mmg.whatsapp.net' +const AES_CHUNK_SIZE = 16 + +const toSmallestChunkSize = (num: number) => { + return Math.floor(num / AES_CHUNK_SIZE) * AES_CHUNK_SIZE +} + +export type MediaDownloadOptions = { + startByte?: number + endByte?: number + options?: AxiosRequestConfig +} + +export const getUrlFromDirectPath = (directPath: string) => `https://${DEF_HOST}${directPath}` + +export const downloadContentFromMessage = ( + { mediaKey, directPath, url }: DownloadableMessage, + type: MediaType, + opts: MediaDownloadOptions = { } +) => { + const downloadUrl = url || getUrlFromDirectPath(directPath!) + const keys = getMediaKeys(mediaKey, type) + + return downloadEncryptedContent(downloadUrl, keys, opts) +} + +/** + * Decrypts and downloads an AES256-CBC encrypted file given the keys. + * Assumes the SHA256 of the plaintext is appended to the end of the ciphertext + * */ +export const downloadEncryptedContent = async( + downloadUrl: string, + { cipherKey, iv }: MediaDecryptionKeyInfo, + { startByte, endByte, options }: MediaDownloadOptions = { } +) => { + let bytesFetched = 0 + let startChunk = 0 + let firstBlockIsIV = false + // if a start byte is specified -- then we need to fetch the previous chunk as that will form the IV + if(startByte) { + const chunk = toSmallestChunkSize(startByte || 0) + if(chunk) { + startChunk = chunk - AES_CHUNK_SIZE + bytesFetched = chunk + + firstBlockIsIV = true + } + } + + const endChunk = endByte ? toSmallestChunkSize(endByte || 0) + AES_CHUNK_SIZE : undefined + + const headers: { [_: string]: string } = { + ...options?.headers || { }, + Origin: DEFAULT_ORIGIN, + } + if(startChunk || endChunk) { + headers.Range = `bytes=${startChunk}-` + if(endChunk) { + headers.Range += endChunk + } + } + + // download the message + const fetched = await getHttpStream( + downloadUrl, + { + ...options || { }, + headers, + maxBodyLength: Infinity, + maxContentLength: Infinity, + } + ) + + let remainingBytes = Buffer.from([]) + + let aes: Crypto.Decipher + + const pushBytes = (bytes: Buffer, push: (bytes: Buffer) => void) => { + if(startByte || endByte) { + const start = bytesFetched >= startByte! ? undefined : Math.max(startByte! - bytesFetched, 0) + const end = bytesFetched + bytes.length < endByte! ? undefined : Math.max(endByte! - bytesFetched, 0) + + push(bytes.slice(start, end)) + + bytesFetched += bytes.length + } else { + push(bytes) + } + } + + const output = new Transform({ + transform(chunk, _, callback) { + let data = Buffer.concat([remainingBytes, chunk]) + + const decryptLength = toSmallestChunkSize(data.length) + remainingBytes = data.slice(decryptLength) + data = data.slice(0, decryptLength) + + if(!aes) { + let ivValue = iv + if(firstBlockIsIV) { + ivValue = data.slice(0, AES_CHUNK_SIZE) + data = data.slice(AES_CHUNK_SIZE) + } + + aes = Crypto.createDecipheriv('aes-256-cbc', cipherKey, ivValue) + // if an end byte that is not EOF is specified + // stop auto padding (PKCS7) -- otherwise throws an error for decryption + if(endByte) { + aes.setAutoPadding(false) + } + + } + + try { + pushBytes(aes.update(data), b => this.push(b)) + callback() + } catch(error) { + callback(error) + } + }, + final(callback) { + try { + pushBytes(aes.final(), b => this.push(b)) + callback() + } catch(error) { + callback(error) + } + }, + }) + return fetched.pipe(output, { end: true }) +} + +export function extensionForMediaMessage(message: WAMessageContent) { + const getExtension = (mimetype: string) => mimetype.split(';')[0].split('/')[1] + const type = Object.keys(message)[0] as MessageType + let extension: string + if( + type === 'locationMessage' || + type === 'liveLocationMessage' || + type === 'productMessage' + ) { + extension = '.jpeg' + } else { + const messageContent = message[type] as WAGenericMediaMessage + extension = getExtension(messageContent.mimetype!) + } + + return extension +} + +export const getWAUploadToServer = ( + { customUploadHosts, fetchAgent, logger, options }: SocketConfig, + refreshMediaConn: (force: boolean) => Promise, +): WAMediaUploadFunction => { + return async(stream, { mediaType, fileEncSha256B64, timeoutMs }) => { + const { default: axios } = await import('axios') + // send a query JSON to obtain the url & auth token to upload our media + let uploadInfo = await refreshMediaConn(false) + + let urls: { mediaUrl: string, directPath: string } | undefined + const hosts = [ ...customUploadHosts, ...uploadInfo.hosts ] + + const chunks: Buffer[] = [] + for await (const chunk of stream) { + chunks.push(chunk) + } + + const reqBody = Buffer.concat(chunks) + fileEncSha256B64 = encodeBase64EncodedStringForUpload(fileEncSha256B64) + + for(const { hostname, maxContentLengthBytes } of hosts) { + logger.debug(`uploading to "${hostname}"`) + + const auth = encodeURIComponent(uploadInfo.auth) // the auth token + const url = `https://${hostname}${MEDIA_PATH_MAP[mediaType]}/${fileEncSha256B64}?auth=${auth}&token=${fileEncSha256B64}` + let result: any + try { + if(maxContentLengthBytes && reqBody.length > maxContentLengthBytes) { + throw new Boom(`Body too large for "${hostname}"`, { statusCode: 413 }) + } + + const body = await axios.post( + url, + reqBody, + { + ...options, + headers: { + ...options.headers || { }, + 'Content-Type': 'application/octet-stream', + 'Origin': DEFAULT_ORIGIN + }, + httpsAgent: fetchAgent, + timeout: timeoutMs, + responseType: 'json', + maxBodyLength: Infinity, + maxContentLength: Infinity, + } + ) + result = body.data + + if(result?.url || result?.directPath) { + urls = { + mediaUrl: result.url, + directPath: result.direct_path + } + break + } else { + uploadInfo = await refreshMediaConn(true) + throw new Error(`upload failed, reason: ${JSON.stringify(result)}`) + } + } catch(error) { + if(axios.isAxiosError(error)) { + result = error.response?.data + } + + const isLast = hostname === hosts[uploadInfo.hosts.length - 1]?.hostname + logger.warn({ trace: error.stack, uploadResult: result }, `Error in uploading to ${hostname} ${isLast ? '' : ', retrying...'}`) + } + } + + if(!urls) { + throw new Boom( + 'Media upload failed on all hosts', + { statusCode: 500 } + ) + } + + return urls + } +} + +const getMediaRetryKey = (mediaKey: Buffer | Uint8Array) => { + return hkdf(mediaKey, 32, { info: 'WhatsApp Media Retry Notification' }) +} + +/** + * Generate a binary node that will request the phone to re-upload the media & return the newly uploaded URL + */ +export const encryptMediaRetryRequest = ( + key: proto.IMessageKey, + mediaKey: Buffer | Uint8Array, + meId: string +) => { + const recp: proto.IServerErrorReceipt = { stanzaId: key.id } + const recpBuffer = proto.ServerErrorReceipt.encode(recp).finish() + + const iv = Crypto.randomBytes(12) + const retryKey = getMediaRetryKey(mediaKey) + const ciphertext = aesEncryptGCM(recpBuffer, retryKey, iv, Buffer.from(key.id!)) + + const req: BinaryNode = { + tag: 'receipt', + attrs: { + id: key.id!, + to: jidNormalizedUser(meId), + type: 'server-error' + }, + content: [ + // this encrypt node is actually pretty useless + // the media is returned even without this node + // keeping it here to maintain parity with WA Web + { + tag: 'encrypt', + attrs: { }, + content: [ + { tag: 'enc_p', attrs: { }, content: ciphertext }, + { tag: 'enc_iv', attrs: { }, content: iv } + ] + }, + { + tag: 'rmr', + attrs: { + jid: key.remoteJid!, + from_me: (!!key.fromMe).toString(), + // @ts-ignore + participant: key.participant || undefined + } + } + ] + } + + return req +} + +export const decodeMediaRetryNode = (node: BinaryNode) => { + const rmrNode = getBinaryNodeChild(node, 'rmr')! + + const event: BaileysEventMap['messages.media-update'][number] = { + key: { + id: node.attrs.id, + remoteJid: rmrNode.attrs.jid, + fromMe: rmrNode.attrs.from_me === 'true', + participant: rmrNode.attrs.participant + } + } + + const errorNode = getBinaryNodeChild(node, 'error') + if(errorNode) { + const errorCode = +errorNode.attrs.code + event.error = new Boom( + `Failed to re-upload media (${errorCode})`, + { data: errorNode.attrs, statusCode: getStatusCodeForMediaRetry(errorCode) } + ) + } else { + const encryptedInfoNode = getBinaryNodeChild(node, 'encrypt') + const ciphertext = getBinaryNodeChildBuffer(encryptedInfoNode, 'enc_p') + const iv = getBinaryNodeChildBuffer(encryptedInfoNode, 'enc_iv') + if(ciphertext && iv) { + event.media = { ciphertext, iv } + } else { + event.error = new Boom('Failed to re-upload media (missing ciphertext)', { statusCode: 404 }) + } + } + + return event +} + +export const decryptMediaRetryData = ( + { ciphertext, iv }: { ciphertext: Uint8Array, iv: Uint8Array }, + mediaKey: Uint8Array, + msgId: string +) => { + const retryKey = getMediaRetryKey(mediaKey) + const plaintext = aesDecryptGCM(ciphertext, retryKey, iv, Buffer.from(msgId)) + return proto.MediaRetryNotification.decode(plaintext) +} + +export const getStatusCodeForMediaRetry = (code: number) => MEDIA_RETRY_STATUS_MAP[code] + +const MEDIA_RETRY_STATUS_MAP = { + [proto.MediaRetryNotification.ResultType.SUCCESS]: 200, + [proto.MediaRetryNotification.ResultType.DECRYPTION_ERROR]: 412, + [proto.MediaRetryNotification.ResultType.NOT_FOUND]: 404, + [proto.MediaRetryNotification.ResultType.GENERAL_ERROR]: 418, +} as const diff --git a/whatsapp_addon/Baileys/src/Utils/messages.ts b/whatsapp_addon/Baileys/src/Utils/messages.ts new file mode 100644 index 0000000..d540b67 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/messages.ts @@ -0,0 +1,792 @@ +import { Boom } from '@hapi/boom' +import axios from 'axios' +import { promises as fs } from 'fs' +import { Logger } from 'pino' +import { proto } from '../../WAProto' +import { MEDIA_KEYS, URL_EXCLUDE_REGEX, URL_REGEX, WA_DEFAULT_EPHEMERAL } from '../Defaults' +import { + AnyMediaMessageContent, + AnyMessageContent, + DownloadableMessage, + MediaGenerationOptions, + MediaType, + MessageContentGenerationOptions, + MessageGenerationOptions, + MessageGenerationOptionsFromContent, + MessageType, + MessageUserReceipt, + WAMediaUpload, + WAMessage, + WAMessageContent, + WAMessageKey, + WAMessageStatus, + WAProto, + WATextMessage, +} from '../Types' +import { isJidGroup, jidNormalizedUser } from '../WABinary' +import { generateMessageID, unixTimestampSeconds } from './generics' +import { downloadContentFromMessage, encryptedStream, generateThumbnail, getAudioDuration, MediaDownloadOptions } from './messages-media' + +type MediaUploadData = { + media: WAMediaUpload + caption?: string + ptt?: boolean + seconds?: number + gifPlayback?: boolean + fileName?: string + jpegThumbnail?: string + mimetype?: string + width?: number + height?: number +} + +const MIMETYPE_MAP: { [T in MediaType]?: string } = { + image: 'image/jpeg', + video: 'video/mp4', + document: 'application/pdf', + audio: 'audio/ogg; codecs=opus', + sticker: 'image/webp', + 'product-catalog-image': 'image/jpeg', +} + +const MessageTypeProto = { + 'image': WAProto.Message.ImageMessage, + 'video': WAProto.Message.VideoMessage, + 'audio': WAProto.Message.AudioMessage, + 'sticker': WAProto.Message.StickerMessage, + 'document': WAProto.Message.DocumentMessage, +} as const + +const ButtonType = proto.Message.ButtonsMessage.HeaderType + +/** + * Uses a regex to test whether the string contains a URL, and returns the URL if it does. + * @param text eg. hello https://google.com + * @returns the URL, eg. https://google.com + */ +export const extractUrlFromText = (text: string) => ( + !URL_EXCLUDE_REGEX.test(text) ? text.match(URL_REGEX)?.[0] : undefined +) + +export const generateLinkPreviewIfRequired = async(text: string, getUrlInfo: MessageGenerationOptions['getUrlInfo'], logger: MessageGenerationOptions['logger']) => { + const url = extractUrlFromText(text) + if(!!getUrlInfo && url) { + try { + const urlInfo = await getUrlInfo(url) + return urlInfo + } catch(error) { // ignore if fails + logger?.warn({ trace: error.stack }, 'url generation failed') + } + } +} + +export const prepareWAMessageMedia = async( + message: AnyMediaMessageContent, + options: MediaGenerationOptions +) => { + const logger = options.logger + + let mediaType: typeof MEDIA_KEYS[number] | undefined + for(const key of MEDIA_KEYS) { + if(key in message) { + mediaType = key + } + } + + if(!mediaType) { + throw new Boom('Invalid media type', { statusCode: 400 }) + } + + const uploadData: MediaUploadData = { + ...message, + media: message[mediaType] + } + delete uploadData[mediaType] + // check if cacheable + generate cache key + const cacheableKey = typeof uploadData.media === 'object' && + ('url' in uploadData.media) && + !!uploadData.media.url && + !!options.mediaCache && ( + // generate the key + mediaType + ':' + uploadData.media.url!.toString() + ) + + if(mediaType === 'document' && !uploadData.fileName) { + uploadData.fileName = 'file' + } + + if(!uploadData.mimetype) { + uploadData.mimetype = MIMETYPE_MAP[mediaType] + } + + // check for cache hit + if(cacheableKey) { + const mediaBuff = options.mediaCache!.get(cacheableKey) + if(mediaBuff) { + logger?.debug({ cacheableKey }, 'got media cache hit') + + const obj = WAProto.Message.decode(mediaBuff) + const key = `${mediaType}Message` + + Object.assign(obj[key], { ...uploadData, media: undefined }) + + return obj + } + } + + const requiresDurationComputation = mediaType === 'audio' && typeof uploadData.seconds === 'undefined' + const requiresThumbnailComputation = (mediaType === 'image' || mediaType === 'video') && + (typeof uploadData['jpegThumbnail'] === 'undefined') + const requiresOriginalForSomeProcessing = requiresDurationComputation || requiresThumbnailComputation + const { + mediaKey, + encWriteStream, + bodyPath, + fileEncSha256, + fileSha256, + fileLength, + didSaveToTmpPath + } = await encryptedStream( + uploadData.media, + options.mediaTypeOverride || mediaType, + requiresOriginalForSomeProcessing + ) + // url safe Base64 encode the SHA256 hash of the body + const fileEncSha256B64 = fileEncSha256.toString('base64') + const [{ mediaUrl, directPath }] = await Promise.all([ + (async() => { + const result = await options.upload( + encWriteStream, + { fileEncSha256B64, mediaType, timeoutMs: options.mediaUploadTimeoutMs } + ) + logger?.debug({ mediaType, cacheableKey }, 'uploaded media') + return result + })(), + (async() => { + try { + if(requiresThumbnailComputation) { + const { + thumbnail, + originalImageDimensions + } = await generateThumbnail(bodyPath!, mediaType as any, options) + uploadData.jpegThumbnail = thumbnail + if(!uploadData.width && originalImageDimensions) { + uploadData.width = originalImageDimensions.width + uploadData.height = originalImageDimensions.height + logger?.debug('set dimensions') + } + + logger?.debug('generated thumbnail') + } + + if(requiresDurationComputation) { + uploadData.seconds = await getAudioDuration(bodyPath!) + logger?.debug('computed audio duration') + } + } catch(error) { + logger?.warn({ trace: error.stack }, 'failed to obtain extra info') + } + })(), + ]) + .finally( + async() => { + encWriteStream.destroy() + // remove tmp files + if(didSaveToTmpPath && bodyPath) { + await fs.unlink(bodyPath) + logger?.debug('removed tmp files') + } + } + ) + + const obj = WAProto.Message.fromObject({ + [`${mediaType}Message`]: MessageTypeProto[mediaType].fromObject( + { + url: mediaUrl, + directPath, + mediaKey, + fileEncSha256, + fileSha256, + fileLength, + mediaKeyTimestamp: unixTimestampSeconds(), + ...uploadData, + media: undefined + } + ) + }) + + if(cacheableKey) { + logger?.debug({ cacheableKey }, 'set cache') + options.mediaCache!.set(cacheableKey, WAProto.Message.encode(obj).finish()) + } + + return obj +} + +export const prepareDisappearingMessageSettingContent = (ephemeralExpiration?: number) => { + ephemeralExpiration = ephemeralExpiration || 0 + const content: WAMessageContent = { + ephemeralMessage: { + message: { + protocolMessage: { + type: WAProto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING, + ephemeralExpiration + } + } + } + } + return WAProto.Message.fromObject(content) +} + +/** + * Generate forwarded message content like WA does + * @param message the message to forward + * @param options.forceForward will show the message as forwarded even if it is from you + */ +export const generateForwardMessageContent = ( + message: WAMessage, + forceForward?: boolean +) => { + let content = message.message + if(!content) { + throw new Boom('no content in message', { statusCode: 400 }) + } + + // hacky copy + content = normalizeMessageContent(content) + content = proto.Message.decode(proto.Message.encode(content!).finish()) + + let key = Object.keys(content)[0] as MessageType + + let score = content[key].contextInfo?.forwardingScore || 0 + score += message.key.fromMe && !forceForward ? 0 : 1 + if(key === 'conversation') { + content.extendedTextMessage = { text: content[key] } + delete content.conversation + + key = 'extendedTextMessage' + } + + if(score > 0) { + content[key].contextInfo = { forwardingScore: score, isForwarded: true } + } else { + content[key].contextInfo = {} + } + + return content +} + +export const generateWAMessageContent = async( + message: AnyMessageContent, + options: MessageContentGenerationOptions +) => { + let m: WAMessageContent = {} + if('text' in message) { + const extContent = { text: message.text } as WATextMessage + + let urlInfo = message.linkPreview + if(typeof urlInfo === 'undefined') { + urlInfo = await generateLinkPreviewIfRequired(message.text, options.getUrlInfo, options.logger) + } + + if(urlInfo) { + extContent.canonicalUrl = urlInfo['canonical-url'] + extContent.matchedText = urlInfo['matched-text'] + extContent.jpegThumbnail = urlInfo.jpegThumbnail + extContent.description = urlInfo.description + extContent.title = urlInfo.title + extContent.previewType = 0 + + const img = urlInfo.highQualityThumbnail + if(img) { + extContent.thumbnailDirectPath = img.directPath + extContent.mediaKey = img.mediaKey + extContent.mediaKeyTimestamp = img.mediaKeyTimestamp + extContent.thumbnailWidth = img.width + extContent.thumbnailHeight = img.height + extContent.thumbnailSha256 = img.fileSha256 + extContent.thumbnailEncSha256 = img.fileEncSha256 + } + } + + m.extendedTextMessage = extContent + } else if('contacts' in message) { + const contactLen = message.contacts.contacts.length + if(!contactLen) { + throw new Boom('require atleast 1 contact', { statusCode: 400 }) + } + + if(contactLen === 1) { + m.contactMessage = WAProto.Message.ContactMessage.fromObject(message.contacts.contacts[0]) + } else { + m.contactsArrayMessage = WAProto.Message.ContactsArrayMessage.fromObject(message.contacts) + } + } else if('location' in message) { + m.locationMessage = WAProto.Message.LocationMessage.fromObject(message.location) + } else if('react' in message) { + if(!message.react.senderTimestampMs) { + message.react.senderTimestampMs = Date.now() + } + + m.reactionMessage = WAProto.Message.ReactionMessage.fromObject(message.react) + } else if('delete' in message) { + m.protocolMessage = { + key: message.delete, + type: WAProto.Message.ProtocolMessage.Type.REVOKE + } + } else if('forward' in message) { + m = generateForwardMessageContent( + message.forward, + message.force + ) + } else if('disappearingMessagesInChat' in message) { + const exp = typeof message.disappearingMessagesInChat === 'boolean' ? + (message.disappearingMessagesInChat ? WA_DEFAULT_EPHEMERAL : 0) : + message.disappearingMessagesInChat + m = prepareDisappearingMessageSettingContent(exp) + } else if('buttonReply' in message) { + switch (message.type) { + case 'template': + m.templateButtonReplyMessage = { + selectedDisplayText: message.buttonReply.displayText, + selectedId: message.buttonReply.id, + selectedIndex: message.buttonReply.index, + } + break + case 'plain': + m.buttonsResponseMessage = { + selectedButtonId: message.buttonReply.id, + selectedDisplayText: message.buttonReply.displayText, + type: proto.Message.ButtonsResponseMessage.Type.DISPLAY_TEXT, + } + break + } + } else if('product' in message) { + const { imageMessage } = await prepareWAMessageMedia( + { image: message.product.productImage }, + options + ) + m.productMessage = WAProto.Message.ProductMessage.fromObject({ + ...message, + product: { + ...message.product, + productImage: imageMessage, + } + }) + } else if('listReply' in message) { + m.listResponseMessage = { ...message.listReply } + } else { + m = await prepareWAMessageMedia( + message, + options + ) + } + + if('buttons' in message && !!message.buttons) { + const buttonsMessage: proto.Message.IButtonsMessage = { + buttons: message.buttons!.map(b => ({ ...b, type: proto.Message.ButtonsMessage.Button.Type.RESPONSE })) + } + if('text' in message) { + buttonsMessage.contentText = message.text + buttonsMessage.headerType = ButtonType.EMPTY + } else { + if('caption' in message) { + buttonsMessage.contentText = message.caption + } + + const type = Object.keys(m)[0].replace('Message', '').toUpperCase() + buttonsMessage.headerType = ButtonType[type] + + Object.assign(buttonsMessage, m) + } + + if('footer' in message && !!message.footer) { + buttonsMessage.footerText = message.footer + } + + m = { buttonsMessage } + } else if('templateButtons' in message && !!message.templateButtons) { + const msg: proto.Message.TemplateMessage.IHydratedFourRowTemplate = { + hydratedButtons: message.templateButtons + } + + if('text' in message) { + msg.hydratedContentText = message.text + } else { + + if('caption' in message) { + msg.hydratedContentText = message.caption + } + + Object.assign(msg, m) + } + + if('footer' in message && !!message.footer) { + msg.hydratedFooterText = message.footer + } + + m = { + templateMessage: { + fourRowTemplate: msg, + hydratedTemplate: msg + } + } + } + + if('sections' in message && !!message.sections) { + const listMessage: proto.Message.IListMessage = { + sections: message.sections, + buttonText: message.buttonText, + title: message.title, + footerText: message.footer, + description: message.text, + listType: proto.Message.ListMessage.ListType.SINGLE_SELECT + } + + m = { listMessage } + } + + if('viewOnce' in message && !!message.viewOnce) { + m = { viewOnceMessage: { message: m } } + } + + if('mentions' in message && message.mentions?.length) { + const [messageType] = Object.keys(m) + m[messageType].contextInfo = m[messageType] || { } + m[messageType].contextInfo.mentionedJid = message.mentions + } + + return WAProto.Message.fromObject(m) +} + +export const generateWAMessageFromContent = ( + jid: string, + message: WAMessageContent, + options: MessageGenerationOptionsFromContent +) => { + if(!options.timestamp) { + options.timestamp = new Date() + } // set timestamp to now + + const key = Object.keys(message)[0] + const timestamp = unixTimestampSeconds(options.timestamp) + const { quoted, userJid } = options + + if(quoted) { + const participant = quoted.key.fromMe ? userJid : (quoted.participant || quoted.key.participant || quoted.key.remoteJid) + + let quotedMsg = normalizeMessageContent(quoted.message)! + const msgType = getContentType(quotedMsg)! + // strip any redundant properties + quotedMsg = proto.Message.fromObject({ [msgType]: quotedMsg[msgType] }) + + const quotedContent = quotedMsg[msgType] + if(typeof quotedContent === 'object' && quotedContent && 'contextInfo' in quotedContent) { + delete quotedContent.contextInfo + } + + const contextInfo: proto.IContextInfo = message[key].contextInfo || { } + contextInfo.participant = jidNormalizedUser(participant!) + contextInfo.stanzaId = quoted.key.id + contextInfo.quotedMessage = quotedMsg + + // if a participant is quoted, then it must be a group + // hence, remoteJid of group must also be entered + if(quoted.key.participant || quoted.participant) { + contextInfo.remoteJid = quoted.key.remoteJid + } + + message[key].contextInfo = contextInfo + } + + if( + // if we want to send a disappearing message + !!options?.ephemeralExpiration && + // and it's not a protocol message -- delete, toggle disappear message + key !== 'protocolMessage' && + // already not converted to disappearing message + key !== 'ephemeralMessage' + ) { + message[key].contextInfo = { + ...(message[key].contextInfo || {}), + expiration: options.ephemeralExpiration || WA_DEFAULT_EPHEMERAL, + //ephemeralSettingTimestamp: options.ephemeralOptions.eph_setting_ts?.toString() + } + message = { + ephemeralMessage: { + message + } + } + } + + message = WAProto.Message.fromObject(message) + + const messageJSON = { + key: { + remoteJid: jid, + fromMe: true, + id: options?.messageId || generateMessageID(), + }, + message: message, + messageTimestamp: timestamp, + messageStubParameters: [], + participant: isJidGroup(jid) ? userJid : undefined, + status: WAMessageStatus.PENDING + } + return WAProto.WebMessageInfo.fromObject(messageJSON) +} + +export const generateWAMessage = async( + jid: string, + content: AnyMessageContent, + options: MessageGenerationOptions, +) => { + // ensure msg ID is with every log + options.logger = options?.logger?.child({ msgId: options.messageId }) + return generateWAMessageFromContent( + jid, + await generateWAMessageContent( + content, + options + ), + options + ) +} + +/** Get the key to access the true type of content */ +export const getContentType = (content: WAProto.IMessage | undefined) => { + if(content) { + const keys = Object.keys(content) + const key = keys.find(k => (k === 'conversation' || k.endsWith('Message')) && k !== 'senderKeyDistributionMessage') + return key as keyof typeof content + } +} + +/** + * Normalizes ephemeral, view once messages to regular message content + * Eg. image messages in ephemeral messages, in view once messages etc. + * @param content + * @returns + */ +export const normalizeMessageContent = (content: WAMessageContent | null | undefined): WAMessageContent | undefined => { + if(!content) { + return undefined + } + + // set max iterations to prevent an infinite loop + for(let i = 0;i < 5;i++) { + const inner = getFutureProofMessage(content) + if(!inner) { + break + } + + content = inner.message + } + + return content! + + function getFutureProofMessage(message: typeof content) { + return ( + message?.ephemeralMessage + || message?.viewOnceMessage + || message?.documentWithCaptionMessage + || message?.viewOnceMessageV2 + || message?.editedMessage + ) + } +} + +/** + * Extract the true message content from a message + * Eg. extracts the inner message from a disappearing message/view once message + */ +export const extractMessageContent = (content: WAMessageContent | undefined | null): WAMessageContent | undefined => { + const extractFromTemplateMessage = (msg: proto.Message.TemplateMessage.IHydratedFourRowTemplate | proto.Message.IButtonsMessage) => { + if(msg.imageMessage) { + return { imageMessage: msg.imageMessage } + } else if(msg.documentMessage) { + return { documentMessage: msg.documentMessage } + } else if(msg.videoMessage) { + return { videoMessage: msg.videoMessage } + } else if(msg.locationMessage) { + return { locationMessage: msg.locationMessage } + } else { + return { + conversation: + 'contentText' in msg + ? msg.contentText + : ('hydratedContentText' in msg ? msg.hydratedContentText : '') + } + } + } + + content = normalizeMessageContent(content) + + if(content?.buttonsMessage) { + return extractFromTemplateMessage(content.buttonsMessage!) + } + + if(content?.templateMessage?.hydratedFourRowTemplate) { + return extractFromTemplateMessage(content?.templateMessage?.hydratedFourRowTemplate) + } + + if(content?.templateMessage?.hydratedTemplate) { + return extractFromTemplateMessage(content?.templateMessage?.hydratedTemplate) + } + + if(content?.templateMessage?.fourRowTemplate) { + return extractFromTemplateMessage(content?.templateMessage?.fourRowTemplate) + } + + return content +} + +/** + * Returns the device predicted by message ID + */ +export const getDevice = (id: string) => { + const deviceType = id.length > 21 ? 'android' : id.substring(0, 2) === '3A' ? 'ios' : 'web' + return deviceType +} + +/** Upserts a receipt in the message */ +export const updateMessageWithReceipt = (msg: Pick, receipt: MessageUserReceipt) => { + msg.userReceipt = msg.userReceipt || [] + const recp = msg.userReceipt.find(m => m.userJid === receipt.userJid) + if(recp) { + Object.assign(recp, receipt) + } else { + msg.userReceipt.push(receipt) + } +} + +const getKeyAuthor = (key: WAMessageKey | undefined | null) => ( + (key?.fromMe ? 'me' : key?.participant || key?.remoteJid) || '' +) + +/** Update the message with a new reaction */ +export const updateMessageWithReaction = (msg: Pick, reaction: proto.IReaction) => { + const authorID = getKeyAuthor(reaction.key) + + const reactions = (msg.reactions || []) + .filter(r => getKeyAuthor(r.key) !== authorID) + if(reaction.text) { + reactions.push(reaction) + } + + msg.reactions = reactions +} + +/** Given a list of message keys, aggregates them by chat & sender. Useful for sending read receipts in bulk */ +export const aggregateMessageKeysNotFromMe = (keys: proto.IMessageKey[]) => { + const keyMap: { [id: string]: { jid: string, participant: string | undefined, messageIds: string[] } } = { } + for(const { remoteJid, id, participant, fromMe } of keys) { + if(!fromMe) { + const uqKey = `${remoteJid}:${participant || ''}` + if(!keyMap[uqKey]) { + keyMap[uqKey] = { + jid: remoteJid!, + participant: participant!, + messageIds: [] + } + } + + keyMap[uqKey].messageIds.push(id!) + } + } + + return Object.values(keyMap) +} + +type DownloadMediaMessageContext = { + reuploadRequest: (msg: WAMessage) => Promise + logger: Logger +} + +const REUPLOAD_REQUIRED_STATUS = [410, 404] + +/** + * Downloads the given message. Throws an error if it's not a media message + */ +export const downloadMediaMessage = async( + message: WAMessage, + type: 'buffer' | 'stream', + options: MediaDownloadOptions, + ctx?: DownloadMediaMessageContext +) => { + try { + const result = await downloadMsg() + return result + } catch(error) { + if(ctx) { + if(axios.isAxiosError(error)) { + // check if the message requires a reupload + if(REUPLOAD_REQUIRED_STATUS.includes(error.response?.status!)) { + ctx.logger.info({ key: message.key }, 'sending reupload media request...') + // request reupload + message = await ctx.reuploadRequest(message) + const result = await downloadMsg() + return result + } + } + } + + throw error + } + + async function downloadMsg() { + const mContent = extractMessageContent(message.message) + if(!mContent) { + throw new Boom('No message present', { statusCode: 400, data: message }) + } + + const contentType = getContentType(mContent) + let mediaType = contentType?.replace('Message', '') as MediaType + const media = mContent[contentType!] + + if(!media || typeof media !== 'object' || (!('url' in media) && !('thumbnailDirectPath' in media))) { + throw new Boom(`"${contentType}" message is not a media message`) + } + + let download: DownloadableMessage + if('thumbnailDirectPath' in media && !('url' in media)) { + download = { + directPath: media.thumbnailDirectPath, + mediaKey: media.mediaKey + } + mediaType = 'thumbnail-link' + } else { + download = media + } + + const stream = await downloadContentFromMessage(download, mediaType, options) + if(type === 'buffer') { + const bufferArray: Buffer[] = [] + for await (const chunk of stream) { + bufferArray.push(chunk) + } + + return Buffer.concat(bufferArray) + } + + return stream + } +} + +/** Checks whether the given message is a media message; if it is returns the inner content */ +export const assertMediaContent = (content: proto.IMessage | null | undefined) => { + content = extractMessageContent(content) + const mediaContent = content?.documentMessage + || content?.imageMessage + || content?.videoMessage + || content?.audioMessage + || content?.stickerMessage + if(!mediaContent) { + throw new Boom( + 'given message is not a media message', + { statusCode: 400, data: content } + ) + } + + return mediaContent +} diff --git a/whatsapp_addon/Baileys/src/Utils/noise-handler.ts b/whatsapp_addon/Baileys/src/Utils/noise-handler.ts new file mode 100644 index 0000000..bd61ddf --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/noise-handler.ts @@ -0,0 +1,169 @@ +import { Boom } from '@hapi/boom' +import { Logger } from 'pino' +import { proto } from '../../WAProto' +import { NOISE_MODE, NOISE_WA_HEADER, WA_CERT_DETAILS } from '../Defaults' +import { KeyPair } from '../Types' +import { BinaryNode, decodeBinaryNode } from '../WABinary' +import { aesDecryptGCM, aesEncryptGCM, Curve, hkdf, sha256 } from './crypto' + +const generateIV = (counter: number) => { + const iv = new ArrayBuffer(12) + new DataView(iv).setUint32(8, counter) + + return new Uint8Array(iv) +} + +export const makeNoiseHandler = ( + { public: publicKey, private: privateKey }: KeyPair, + logger: Logger +) => { + logger = logger.child({ class: 'ns' }) + + const authenticate = (data: Uint8Array) => { + if(!isFinished) { + hash = sha256(Buffer.concat([hash, data])) + } + } + + const encrypt = (plaintext: Uint8Array) => { + const result = aesEncryptGCM(plaintext, encKey, generateIV(writeCounter), hash) + + writeCounter += 1 + + authenticate(result) + return result + } + + const decrypt = (ciphertext: Uint8Array) => { + // before the handshake is finished, we use the same counter + // after handshake, the counters are different + const iv = generateIV(isFinished ? readCounter : writeCounter) + const result = aesDecryptGCM(ciphertext, decKey, iv, hash) + + if(isFinished) { + readCounter += 1 + } else { + writeCounter += 1 + } + + authenticate(ciphertext) + return result + } + + const localHKDF = (data: Uint8Array) => { + const key = hkdf(Buffer.from(data), 64, { salt, info: '' }) + return [key.slice(0, 32), key.slice(32)] + } + + const mixIntoKey = (data: Uint8Array) => { + const [write, read] = localHKDF(data) + salt = write + encKey = read + decKey = read + readCounter = 0 + writeCounter = 0 + } + + const finishInit = () => { + const [write, read] = localHKDF(new Uint8Array(0)) + encKey = write + decKey = read + hash = Buffer.from([]) + readCounter = 0 + writeCounter = 0 + isFinished = true + } + + const data = Buffer.from(NOISE_MODE) + let hash = Buffer.from(data.byteLength === 32 ? data : sha256(data)) + let salt = hash + let encKey = hash + let decKey = hash + let readCounter = 0 + let writeCounter = 0 + let isFinished = false + let sentIntro = false + + let inBytes = Buffer.alloc(0) + + authenticate(NOISE_WA_HEADER) + authenticate(publicKey) + + return { + encrypt, + decrypt, + authenticate, + mixIntoKey, + finishInit, + processHandshake: ({ serverHello }: proto.HandshakeMessage, noiseKey: KeyPair) => { + authenticate(serverHello!.ephemeral!) + mixIntoKey(Curve.sharedKey(privateKey, serverHello!.ephemeral!)) + + const decStaticContent = decrypt(serverHello!.static!) + mixIntoKey(Curve.sharedKey(privateKey, decStaticContent)) + + const certDecoded = decrypt(serverHello!.payload!) + const { intermediate: certIntermediate } = proto.CertChain.decode(certDecoded) + + const { issuerSerial } = proto.CertChain.NoiseCertificate.Details.decode(certIntermediate!.details!) + + if(issuerSerial !== WA_CERT_DETAILS.SERIAL) { + throw new Boom('certification match failed', { statusCode: 400 }) + } + + const keyEnc = encrypt(noiseKey.public) + mixIntoKey(Curve.sharedKey(noiseKey.private, serverHello!.ephemeral!)) + + return keyEnc + }, + encodeFrame: (data: Buffer | Uint8Array) => { + if(isFinished) { + data = encrypt(data) + } + + const introSize = sentIntro ? 0 : NOISE_WA_HEADER.length + const frame = Buffer.alloc(introSize + 3 + data.byteLength) + + if(!sentIntro) { + frame.set(NOISE_WA_HEADER) + sentIntro = true + } + + frame.writeUInt8(data.byteLength >> 16, introSize) + frame.writeUInt16BE(65535 & data.byteLength, introSize + 1) + frame.set(data, introSize + 3) + + return frame + }, + decodeFrame: (newData: Buffer | Uint8Array, onFrame: (buff: Uint8Array | BinaryNode) => void) => { + // the binary protocol uses its own framing mechanism + // on top of the WS frames + // so we get this data and separate out the frames + const getBytesSize = () => { + if(inBytes.length >= 3) { + return (inBytes.readUInt8() << 16) | inBytes.readUInt16BE(1) + } + } + + inBytes = Buffer.concat([ inBytes, newData ]) + + logger.trace(`recv ${newData.length} bytes, total recv ${inBytes.length} bytes`) + + let size = getBytesSize() + while(size && inBytes.length >= size + 3) { + let frame: Uint8Array | BinaryNode = inBytes.slice(3, size + 3) + inBytes = inBytes.slice(size + 3) + + if(isFinished) { + const result = decrypt(frame as Uint8Array) + frame = decodeBinaryNode(result) + } + + logger.trace({ msg: (frame as any)?.attrs?.id }, 'recv frame') + + onFrame(frame) + size = getBytesSize() + } + } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/process-message.ts b/whatsapp_addon/Baileys/src/Utils/process-message.ts new file mode 100644 index 0000000..9953f09 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/process-message.ts @@ -0,0 +1,267 @@ +import { AxiosRequestConfig } from 'axios' +import type { Logger } from 'pino' +import { proto } from '../../WAProto' +import { AuthenticationCreds, BaileysEventEmitter, Chat, GroupMetadata, ParticipantAction, SignalKeyStoreWithTransaction, WAMessageStubType } from '../Types' +import { downloadAndProcessHistorySyncNotification, getContentType, normalizeMessageContent, toNumber } from '../Utils' +import { areJidsSameUser, jidNormalizedUser } from '../WABinary' + +type ProcessMessageContext = { + shouldProcessHistoryMsg: boolean + creds: AuthenticationCreds + keyStore: SignalKeyStoreWithTransaction + ev: BaileysEventEmitter + logger?: Logger + options: AxiosRequestConfig +} + +const REAL_MSG_STUB_TYPES = new Set([ + WAMessageStubType.CALL_MISSED_GROUP_VIDEO, + WAMessageStubType.CALL_MISSED_GROUP_VOICE, + WAMessageStubType.CALL_MISSED_VIDEO, + WAMessageStubType.CALL_MISSED_VOICE +]) + +const REAL_MSG_REQ_ME_STUB_TYPES = new Set([ + WAMessageStubType.GROUP_PARTICIPANT_ADD +]) + +/** Cleans a received message to further processing */ +export const cleanMessage = (message: proto.IWebMessageInfo, meId: string) => { + // ensure remoteJid and participant doesn't have device or agent in it + message.key.remoteJid = jidNormalizedUser(message.key.remoteJid!) + message.key.participant = message.key.participant ? jidNormalizedUser(message.key.participant!) : undefined + const content = normalizeMessageContent(message.message) + // if the message has a reaction, ensure fromMe & remoteJid are from our perspective + if(content?.reactionMessage) { + const msgKey = content.reactionMessage.key! + // if the reaction is from another user + // we've to correctly map the key to this user's perspective + if(!message.key.fromMe) { + // if the sender believed the message being reacted to is not from them + // we've to correct the key to be from them, or some other participant + msgKey.fromMe = !msgKey.fromMe + ? areJidsSameUser(msgKey.participant || msgKey.remoteJid!, meId) + // if the message being reacted to, was from them + // fromMe automatically becomes false + : false + // set the remoteJid to being the same as the chat the message came from + msgKey.remoteJid = message.key.remoteJid + // set participant of the message + msgKey.participant = msgKey.participant || message.key.participant + } + } +} + +export const isRealMessage = (message: proto.IWebMessageInfo, meId: string) => { + const normalizedContent = normalizeMessageContent(message.message) + const hasSomeContent = !!getContentType(normalizedContent) + return ( + !!normalizedContent + || REAL_MSG_STUB_TYPES.has(message.messageStubType!) + || ( + REAL_MSG_REQ_ME_STUB_TYPES.has(message.messageStubType!) + && message.messageStubParameters?.some(p => areJidsSameUser(meId, p)) + ) + ) + && hasSomeContent + && !normalizedContent?.protocolMessage + && !normalizedContent?.reactionMessage +} + +export const shouldIncrementChatUnread = (message: proto.IWebMessageInfo) => ( + !message.key.fromMe && !message.messageStubType +) + +const processMessage = async( + message: proto.IWebMessageInfo, + { + shouldProcessHistoryMsg, + ev, + creds, + keyStore, + logger, + options + }: ProcessMessageContext +) => { + const meId = creds.me!.id + const { accountSettings } = creds + + const chat: Partial = { id: jidNormalizedUser(message.key.remoteJid!) } + const isRealMsg = isRealMessage(message, meId) + + if(isRealMsg) { + chat.conversationTimestamp = toNumber(message.messageTimestamp) + // only increment unread count if not CIPHERTEXT and from another person + if(shouldIncrementChatUnread(message)) { + chat.unreadCount = (chat.unreadCount || 0) + 1 + } + } + + const content = normalizeMessageContent(message.message) + + // unarchive chat if it's a real message, or someone reacted to our message + // and we've the unarchive chats setting on + if( + (isRealMsg || content?.reactionMessage?.key?.fromMe) + && accountSettings?.unarchiveChats + ) { + chat.archived = false + chat.readOnly = false + } + + const protocolMsg = content?.protocolMessage + if(protocolMsg) { + switch (protocolMsg.type) { + case proto.Message.ProtocolMessage.Type.HISTORY_SYNC_NOTIFICATION: + const histNotification = protocolMsg!.historySyncNotification! + const process = shouldProcessHistoryMsg + const isLatest = !creds.processedHistoryMessages?.length + + logger?.info({ + histNotification, + process, + id: message.key.id, + isLatest, + }, 'got history notification') + + if(process) { + ev.emit('creds.update', { + processedHistoryMessages: [ + ...(creds.processedHistoryMessages || []), + { key: message.key, messageTimestamp: message.messageTimestamp } + ] + }) + + const data = await downloadAndProcessHistorySyncNotification( + histNotification, + options + ) + + ev.emit('messaging-history.set', { ...data, isLatest }) + } + + break + case proto.Message.ProtocolMessage.Type.APP_STATE_SYNC_KEY_SHARE: + const keys = protocolMsg.appStateSyncKeyShare!.keys + if(keys?.length) { + let newAppStateSyncKeyId = '' + await keyStore.transaction( + async() => { + const newKeys: string[] = [] + for(const { keyData, keyId } of keys) { + const strKeyId = Buffer.from(keyId!.keyId!).toString('base64') + newKeys.push(strKeyId) + + await keyStore.set({ 'app-state-sync-key': { [strKeyId]: keyData! } }) + + newAppStateSyncKeyId = strKeyId + } + + logger?.info( + { newAppStateSyncKeyId, newKeys }, + 'injecting new app state sync keys' + ) + } + ) + + ev.emit('creds.update', { myAppStateKeyId: newAppStateSyncKeyId }) + } else { + logger?.info({ protocolMsg }, 'recv app state sync with 0 keys') + } + + break + case proto.Message.ProtocolMessage.Type.REVOKE: + ev.emit('messages.update', [ + { + key: { + ...message.key, + id: protocolMsg.key!.id + }, + update: { message: null, messageStubType: WAMessageStubType.REVOKE, key: message.key } + } + ]) + break + case proto.Message.ProtocolMessage.Type.EPHEMERAL_SETTING: + Object.assign(chat, { + ephemeralSettingTimestamp: toNumber(message.messageTimestamp), + ephemeralExpiration: protocolMsg.ephemeralExpiration || null + }) + break + } + } else if(content?.reactionMessage) { + const reaction: proto.IReaction = { + ...content.reactionMessage, + key: message.key, + } + ev.emit('messages.reaction', [{ + reaction, + key: content.reactionMessage!.key!, + }]) + } else if(message.messageStubType) { + const jid = message.key!.remoteJid! + //let actor = whatsappID (message.participant) + let participants: string[] + const emitParticipantsUpdate = (action: ParticipantAction) => ( + ev.emit('group-participants.update', { id: jid, participants, action }) + ) + const emitGroupUpdate = (update: Partial) => { + ev.emit('groups.update', [{ id: jid, ...update }]) + } + + const participantsIncludesMe = () => participants.find(jid => areJidsSameUser(meId, jid)) + + switch (message.messageStubType) { + case WAMessageStubType.GROUP_PARTICIPANT_LEAVE: + case WAMessageStubType.GROUP_PARTICIPANT_REMOVE: + participants = message.messageStubParameters || [] + emitParticipantsUpdate('remove') + // mark the chat read only if you left the group + if(participantsIncludesMe()) { + chat.readOnly = true + } + + break + case WAMessageStubType.GROUP_PARTICIPANT_ADD: + case WAMessageStubType.GROUP_PARTICIPANT_INVITE: + case WAMessageStubType.GROUP_PARTICIPANT_ADD_REQUEST_JOIN: + participants = message.messageStubParameters || [] + if(participantsIncludesMe()) { + chat.readOnly = false + } + + emitParticipantsUpdate('add') + break + case WAMessageStubType.GROUP_PARTICIPANT_DEMOTE: + participants = message.messageStubParameters || [] + emitParticipantsUpdate('demote') + break + case WAMessageStubType.GROUP_PARTICIPANT_PROMOTE: + participants = message.messageStubParameters || [] + emitParticipantsUpdate('promote') + break + case WAMessageStubType.GROUP_CHANGE_ANNOUNCE: + const announceValue = message.messageStubParameters?.[0] + emitGroupUpdate({ announce: announceValue === 'true' || announceValue === 'on' }) + break + case WAMessageStubType.GROUP_CHANGE_RESTRICT: + const restrictValue = message.messageStubParameters?.[0] + emitGroupUpdate({ restrict: restrictValue === 'true' || restrictValue === 'on' }) + break + case WAMessageStubType.GROUP_CHANGE_SUBJECT: + const name = message.messageStubParameters?.[0] + chat.name = name + emitGroupUpdate({ subject: name }) + break + case WAMessageStubType.GROUP_CHANGE_INVITE_LINK: + const code = message.messageStubParameters?.[0] + emitGroupUpdate({ inviteCode: code }) + break + } + } + + if(Object.keys(chat).length > 1) { + ev.emit('chats.update', [chat]) + } +} + +export default processMessage \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/signal.ts b/whatsapp_addon/Baileys/src/Utils/signal.ts new file mode 100644 index 0000000..acf787e --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/signal.ts @@ -0,0 +1,307 @@ +import * as libsignal from 'libsignal' +import { proto } from '../../WAProto' +import { GroupCipher, GroupSessionBuilder, SenderKeyDistributionMessage, SenderKeyName, SenderKeyRecord } from '../../WASignalGroup' +import { KEY_BUNDLE_TYPE } from '../Defaults' +import { AuthenticationCreds, AuthenticationState, KeyPair, SignalAuthState, SignalIdentity, SignalKeyStore, SignedKeyPair } from '../Types/Auth' +import { assertNodeErrorFree, BinaryNode, getBinaryNodeChild, getBinaryNodeChildBuffer, getBinaryNodeChildren, getBinaryNodeChildUInt, jidDecode, JidWithDevice, S_WHATSAPP_NET } from '../WABinary' +import { Curve, generateSignalPubKey } from './crypto' +import { encodeBigEndian } from './generics' + +const jidToSignalAddress = (jid: string) => jid.split('@')[0] + +export const jidToSignalProtocolAddress = (jid: string) => { + return new libsignal.ProtocolAddress(jidToSignalAddress(jid), 0) +} + +export const jidToSignalSenderKeyName = (group: string, user: string): string => { + return new SenderKeyName(group, jidToSignalProtocolAddress(user)).toString() +} + +export const createSignalIdentity = ( + wid: string, + accountSignatureKey: Uint8Array +): SignalIdentity => { + return { + identifier: { name: wid, deviceId: 0 }, + identifierKey: generateSignalPubKey(accountSignatureKey) + } +} + +export const getPreKeys = async({ get }: SignalKeyStore, min: number, limit: number) => { + const idList: string[] = [] + for(let id = min; id < limit;id++) { + idList.push(id.toString()) + } + + return get('pre-key', idList) +} + +export const generateOrGetPreKeys = (creds: AuthenticationCreds, range: number) => { + const avaliable = creds.nextPreKeyId - creds.firstUnuploadedPreKeyId + const remaining = range - avaliable + const lastPreKeyId = creds.nextPreKeyId + remaining - 1 + const newPreKeys: { [id: number]: KeyPair } = { } + if(remaining > 0) { + for(let i = creds.nextPreKeyId;i <= lastPreKeyId;i++) { + newPreKeys[i] = Curve.generateKeyPair() + } + } + + return { + newPreKeys, + lastPreKeyId, + preKeysRange: [creds.firstUnuploadedPreKeyId, range] as const, + } +} + +export const xmppSignedPreKey = (key: SignedKeyPair): BinaryNode => ( + { + tag: 'skey', + attrs: { }, + content: [ + { tag: 'id', attrs: { }, content: encodeBigEndian(key.keyId, 3) }, + { tag: 'value', attrs: { }, content: key.keyPair.public }, + { tag: 'signature', attrs: { }, content: key.signature } + ] + } +) + +export const xmppPreKey = (pair: KeyPair, id: number): BinaryNode => ( + { + tag: 'key', + attrs: { }, + content: [ + { tag: 'id', attrs: { }, content: encodeBigEndian(id, 3) }, + { tag: 'value', attrs: { }, content: pair.public } + ] + } +) + +export const signalStorage = ({ creds, keys }: SignalAuthState) => ({ + loadSession: async(id: string) => { + const { [id]: sess } = await keys.get('session', [id]) + if(sess) { + return libsignal.SessionRecord.deserialize(sess) + } + }, + storeSession: async(id, session) => { + await keys.set({ 'session': { [id]: session.serialize() } }) + }, + isTrustedIdentity: () => { + return true + }, + loadPreKey: async(id: number | string) => { + const keyId = id.toString() + const { [keyId]: key } = await keys.get('pre-key', [keyId]) + if(key) { + return { + privKey: Buffer.from(key.private), + pubKey: Buffer.from(key.public) + } + } + }, + removePreKey: (id: number) => keys.set({ 'pre-key': { [id]: null } }), + loadSignedPreKey: () => { + const key = creds.signedPreKey + return { + privKey: Buffer.from(key.keyPair.private), + pubKey: Buffer.from(key.keyPair.public) + } + }, + loadSenderKey: async(keyId: string) => { + const { [keyId]: key } = await keys.get('sender-key', [keyId]) + if(key) { + return new SenderKeyRecord(key) + } + }, + storeSenderKey: async(keyId, key) => { + await keys.set({ 'sender-key': { [keyId]: key.serialize() } }) + }, + getOurRegistrationId: () => ( + creds.registrationId + ), + getOurIdentity: () => { + const { signedIdentityKey } = creds + return { + privKey: Buffer.from(signedIdentityKey.private), + pubKey: generateSignalPubKey(signedIdentityKey.public), + } + } +}) + +export const decryptGroupSignalProto = (group: string, user: string, msg: Buffer | Uint8Array, auth: SignalAuthState) => { + const senderName = jidToSignalSenderKeyName(group, user) + const cipher = new GroupCipher(signalStorage(auth), senderName) + + return cipher.decrypt(Buffer.from(msg)) +} + +export const processSenderKeyMessage = async( + authorJid: string, + item: proto.Message.ISenderKeyDistributionMessage, + auth: SignalAuthState +) => { + const builder = new GroupSessionBuilder(signalStorage(auth)) + const senderName = jidToSignalSenderKeyName(item.groupId!, authorJid) + + const senderMsg = new SenderKeyDistributionMessage(null, null, null, null, item.axolotlSenderKeyDistributionMessage) + const { [senderName]: senderKey } = await auth.keys.get('sender-key', [senderName]) + if(!senderKey) { + const record = new SenderKeyRecord() + await auth.keys.set({ 'sender-key': { [senderName]: record } }) + } + + await builder.process(senderName, senderMsg) +} + +export const decryptSignalProto = async(user: string, type: 'pkmsg' | 'msg', msg: Buffer | Uint8Array, auth: SignalAuthState) => { + const addr = jidToSignalProtocolAddress(user) + const session = new libsignal.SessionCipher(signalStorage(auth), addr) + let result: Buffer + switch (type) { + case 'pkmsg': + result = await session.decryptPreKeyWhisperMessage(msg) + break + case 'msg': + result = await session.decryptWhisperMessage(msg) + break + } + + return result +} + + +export const encryptSignalProto = async(user: string, buffer: Buffer, auth: SignalAuthState) => { + const addr = jidToSignalProtocolAddress(user) + const cipher = new libsignal.SessionCipher(signalStorage(auth), addr) + + const { type: sigType, body } = await cipher.encrypt(buffer) + const type = sigType === 3 ? 'pkmsg' : 'msg' + return { type, ciphertext: Buffer.from(body, 'binary') } +} + +export const encryptSenderKeyMsgSignalProto = async(group: string, data: Uint8Array | Buffer, meId: string, auth: SignalAuthState) => { + const storage = signalStorage(auth) + const senderName = jidToSignalSenderKeyName(group, meId) + const builder = new GroupSessionBuilder(storage) + + const { [senderName]: senderKey } = await auth.keys.get('sender-key', [senderName]) + if(!senderKey) { + const record = new SenderKeyRecord() + await auth.keys.set({ 'sender-key': { [senderName]: record } }) + } + + const senderKeyDistributionMessage = await builder.create(senderName) + const session = new GroupCipher(storage, senderName) + return { + ciphertext: await session.encrypt(data) as Uint8Array, + senderKeyDistributionMessageKey: senderKeyDistributionMessage.serialize() as Buffer, + } +} + +export const parseAndInjectE2ESessions = async(node: BinaryNode, auth: SignalAuthState) => { + const extractKey = (key: BinaryNode) => ( + key ? ({ + keyId: getBinaryNodeChildUInt(key, 'id', 3), + publicKey: generateSignalPubKey(getBinaryNodeChildBuffer(key, 'value')!), + signature: getBinaryNodeChildBuffer(key, 'signature'), + }) : undefined + ) + const nodes = getBinaryNodeChildren(getBinaryNodeChild(node, 'list'), 'user') + for(const node of nodes) { + assertNodeErrorFree(node) + } + + await Promise.all( + nodes.map( + async node => { + const signedKey = getBinaryNodeChild(node, 'skey')! + const key = getBinaryNodeChild(node, 'key')! + const identity = getBinaryNodeChildBuffer(node, 'identity')! + const jid = node.attrs.jid + const registrationId = getBinaryNodeChildUInt(node, 'registration', 4) + + const device = { + registrationId, + identityKey: generateSignalPubKey(identity), + signedPreKey: extractKey(signedKey), + preKey: extractKey(key) + } + const cipher = new libsignal.SessionBuilder(signalStorage(auth), jidToSignalProtocolAddress(jid)) + await cipher.initOutgoing(device) + } + ) + ) +} + +export const extractDeviceJids = (result: BinaryNode, myJid: string, excludeZeroDevices: boolean) => { + const { user: myUser, device: myDevice } = jidDecode(myJid)! + const extracted: JidWithDevice[] = [] + for(const node of result.content as BinaryNode[]) { + const list = getBinaryNodeChild(node, 'list')?.content + if(list && Array.isArray(list)) { + for(const item of list) { + const { user } = jidDecode(item.attrs.jid)! + const devicesNode = getBinaryNodeChild(item, 'devices') + const deviceListNode = getBinaryNodeChild(devicesNode, 'device-list') + if(Array.isArray(deviceListNode?.content)) { + for(const { tag, attrs } of deviceListNode!.content) { + const device = +attrs.id + if( + tag === 'device' && // ensure the "device" tag + (!excludeZeroDevices || device !== 0) && // if zero devices are not-excluded, or device is non zero + (myUser !== user || myDevice !== device) && // either different user or if me user, not this device + (device === 0 || !!attrs['key-index']) // ensure that "key-index" is specified for "non-zero" devices, produces a bad req otherwise + ) { + extracted.push({ user, device }) + } + } + } + } + } + } + + return extracted +} + +/** + * get the next N keys for upload or processing + * @param count number of pre-keys to get or generate + */ +export const getNextPreKeys = async({ creds, keys }: AuthenticationState, count: number) => { + const { newPreKeys, lastPreKeyId, preKeysRange } = generateOrGetPreKeys(creds, count) + + const update: Partial = { + nextPreKeyId: Math.max(lastPreKeyId + 1, creds.nextPreKeyId), + firstUnuploadedPreKeyId: Math.max(creds.firstUnuploadedPreKeyId, lastPreKeyId + 1) + } + + await keys.set({ 'pre-key': newPreKeys }) + + const preKeys = await getPreKeys(keys, preKeysRange[0], preKeysRange[0] + preKeysRange[1]) + + return { update, preKeys } +} + +export const getNextPreKeysNode = async(state: AuthenticationState, count: number) => { + const { creds } = state + const { update, preKeys } = await getNextPreKeys(state, count) + + const node: BinaryNode = { + tag: 'iq', + attrs: { + xmlns: 'encrypt', + type: 'set', + to: S_WHATSAPP_NET, + }, + content: [ + { tag: 'registration', attrs: { }, content: encodeBigEndian(creds.registrationId) }, + { tag: 'type', attrs: { }, content: KEY_BUNDLE_TYPE }, + { tag: 'identity', attrs: { }, content: creds.signedIdentityKey.public }, + { tag: 'list', attrs: { }, content: Object.keys(preKeys).map(k => xmppPreKey(preKeys[+k], +k)) }, + xmppSignedPreKey(creds.signedPreKey) + ] + } + + return { update, node } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/use-multi-file-auth-state.ts b/whatsapp_addon/Baileys/src/Utils/use-multi-file-auth-state.ts new file mode 100644 index 0000000..4758d3c --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/use-multi-file-auth-state.ts @@ -0,0 +1,90 @@ +import { mkdir, readFile, stat, unlink, writeFile } from 'fs/promises' +import { join } from 'path' +import { proto } from '../../WAProto' +import { AuthenticationCreds, AuthenticationState, SignalDataTypeMap } from '../Types' +import { initAuthCreds } from './auth-utils' +import { BufferJSON } from './generics' + +/** + * stores the full authentication state in a single folder. + * Far more efficient than singlefileauthstate + * + * Again, I wouldn't endorse this for any production level use other than perhaps a bot. + * Would recommend writing an auth state for use with a proper SQL or No-SQL DB + * */ +export const useMultiFileAuthState = async(folder: string): Promise<{ state: AuthenticationState, saveCreds: () => Promise }> => { + + const writeData = (data: any, file: string) => { + return writeFile(join(folder, fixFileName(file)!), JSON.stringify(data, BufferJSON.replacer)) + } + + const readData = async(file: string) => { + try { + const data = await readFile(join(folder, fixFileName(file)!), { encoding: 'utf-8' }) + return JSON.parse(data, BufferJSON.reviver) + } catch(error) { + return null + } + } + + const removeData = async(file: string) => { + try { + await unlink(join(folder, fixFileName(file)!)) + } catch{ + + } + } + + const folderInfo = await stat(folder).catch(() => { }) + if(folderInfo) { + if(!folderInfo.isDirectory()) { + throw new Error(`found something that is not a directory at ${folder}, either delete it or specify a different location`) + } + } else { + await mkdir(folder, { recursive: true }) + } + + const fixFileName = (file?: string) => file?.replace(/\//g, '__')?.replace(/:/g, '-') + + const creds: AuthenticationCreds = await readData('creds.json') || initAuthCreds() + + return { + state: { + creds, + keys: { + get: async(type, ids) => { + const data: { [_: string]: SignalDataTypeMap[typeof type] } = { } + await Promise.all( + ids.map( + async id => { + let value = await readData(`${type}-${id}.json`) + if(type === 'app-state-sync-key' && value) { + value = proto.Message.AppStateSyncKeyData.fromObject(value) + } + + data[id] = value + } + ) + ) + + return data + }, + set: async(data) => { + const tasks: Promise[] = [] + for(const category in data) { + for(const id in data[category]) { + const value = data[category][id] + const file = `${category}-${id}.json` + tasks.push(value ? writeData(value, file) : removeData(file)) + } + } + + await Promise.all(tasks) + } + } + }, + saveCreds: () => { + return writeData(creds, 'creds.json') + } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/use-single-file-auth-state.ts b/whatsapp_addon/Baileys/src/Utils/use-single-file-auth-state.ts new file mode 100644 index 0000000..6ec2b48 --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/use-single-file-auth-state.ts @@ -0,0 +1,85 @@ +import type { Logger } from 'pino' +import { proto } from '../../WAProto' +import type { AuthenticationCreds, AuthenticationState, SignalDataTypeMap } from '../Types' +import { initAuthCreds } from './auth-utils' +import { BufferJSON } from './generics' + +// useless key map only there to maintain backwards compatibility +// do not use in your own systems please +const KEY_MAP: { [T in keyof SignalDataTypeMap]: string } = { + 'pre-key': 'preKeys', + 'session': 'sessions', + 'sender-key': 'senderKeys', + 'app-state-sync-key': 'appStateSyncKeys', + 'app-state-sync-version': 'appStateVersions', + 'sender-key-memory': 'senderKeyMemory' +} +/** + * @deprecated use multi file auth state instead please + * stores the full authentication state in a single JSON file + * + * DO NOT USE IN A PROD ENVIRONMENT, only meant to serve as an example + * */ +export const useSingleFileAuthState = (filename: string, logger?: Logger): { state: AuthenticationState, saveState: () => void } => { + // require fs here so that in case "fs" is not available -- the app does not crash + const { readFileSync, writeFileSync, existsSync } = require('fs') + let creds: AuthenticationCreds + let keys: any = { } + + // save the authentication state to a file + const saveState = () => { + logger && logger.trace('saving auth state') + writeFileSync( + filename, + // BufferJSON replacer utility saves buffers nicely + JSON.stringify({ creds, keys }, BufferJSON.replacer, 2) + ) + } + + if(existsSync(filename)) { + const result = JSON.parse( + readFileSync(filename, { encoding: 'utf-8' }), + BufferJSON.reviver + ) + creds = result.creds + keys = result.keys + } else { + creds = initAuthCreds() + keys = { } + } + + return { + state: { + creds, + keys: { + get: (type, ids) => { + const key = KEY_MAP[type] + return ids.reduce( + (dict, id) => { + let value = keys[key]?.[id] + if(value) { + if(type === 'app-state-sync-key') { + value = proto.Message.AppStateSyncKeyData.fromObject(value) + } + + dict[id] = value + } + + return dict + }, { } + ) + }, + set: (data) => { + for(const _key in data) { + const key = KEY_MAP[_key as keyof SignalDataTypeMap] + keys[key] = keys[key] || { } + Object.assign(keys[key], data[_key]) + } + + saveState() + } + } + }, + saveState + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/Utils/validate-connection.ts b/whatsapp_addon/Baileys/src/Utils/validate-connection.ts new file mode 100644 index 0000000..444634d --- /dev/null +++ b/whatsapp_addon/Baileys/src/Utils/validate-connection.ts @@ -0,0 +1,208 @@ +import { Boom } from '@hapi/boom' +import { createHash } from 'crypto' +import { proto } from '../../WAProto' +import { KEY_BUNDLE_TYPE } from '../Defaults' +import type { AuthenticationCreds, SignalCreds, SocketConfig } from '../Types' +import { BinaryNode, getBinaryNodeChild, jidDecode, S_WHATSAPP_NET } from '../WABinary' +import { Curve, hmacSign } from './crypto' +import { encodeBigEndian } from './generics' +import { createSignalIdentity } from './signal' + +type ClientPayloadConfig = Pick + +const getUserAgent = ({ version }: ClientPayloadConfig): proto.ClientPayload.IUserAgent => { + const osVersion = '0.1' + return { + appVersion: { + primary: version[0], + secondary: version[1], + tertiary: version[2], + }, + platform: proto.ClientPayload.UserAgent.Platform.WEB, + releaseChannel: proto.ClientPayload.UserAgent.ReleaseChannel.RELEASE, + mcc: '000', + mnc: '000', + osVersion: osVersion, + manufacturer: '', + device: 'Desktop', + osBuildNumber: osVersion, + localeLanguageIso6391: 'en', + localeCountryIso31661Alpha2: 'US', + } +} + +const PLATFORM_MAP = { + 'Mac OS': proto.ClientPayload.WebInfo.WebSubPlatform.DARWIN, + 'Windows': proto.ClientPayload.WebInfo.WebSubPlatform.WIN32 +} + +const getWebInfo = (config: ClientPayloadConfig): proto.ClientPayload.IWebInfo => { + let webSubPlatform = proto.ClientPayload.WebInfo.WebSubPlatform.WEB_BROWSER + if(config.syncFullHistory && PLATFORM_MAP[config.browser[0]]) { + webSubPlatform = PLATFORM_MAP[config.browser[0]] + } + + return { webSubPlatform } +} + +const getClientPayload = (config: ClientPayloadConfig): proto.IClientPayload => { + return { + connectType: proto.ClientPayload.ConnectType.WIFI_UNKNOWN, + connectReason: proto.ClientPayload.ConnectReason.USER_ACTIVATED, + userAgent: getUserAgent(config), + webInfo: getWebInfo(config), + } +} + +export const generateLoginNode = (userJid: string, config: ClientPayloadConfig): proto.IClientPayload => { + const { user, device } = jidDecode(userJid)! + const payload: proto.IClientPayload = { + ...getClientPayload(config), + passive: true, + username: +user, + device: device, + } + return proto.ClientPayload.fromObject(payload) +} + +export const generateRegistrationNode = ( + { registrationId, signedPreKey, signedIdentityKey }: SignalCreds, + config: ClientPayloadConfig +) => { + // the app version needs to be md5 hashed + // and passed in + const appVersionBuf = createHash('md5') + .update(config.version.join('.')) // join as string + .digest() + const browserVersion = config.browser[2].split('.') + + const companion: proto.IDeviceProps = { + os: config.browser[0], + version: { + primary: +(browserVersion[0] || 0), + secondary: +(browserVersion[1] || 1), + tertiary: +(browserVersion[2] || 0), + }, + platformType: proto.DeviceProps.PlatformType[config.browser[1].toUpperCase()] + || proto.DeviceProps.PlatformType.UNKNOWN, + requireFullSync: config.syncFullHistory, + } + + const companionProto = proto.DeviceProps.encode(companion).finish() + + const registerPayload: proto.IClientPayload = { + ...getClientPayload(config), + passive: false, + devicePairingData: { + buildHash: appVersionBuf, + deviceProps: companionProto, + eRegid: encodeBigEndian(registrationId), + eKeytype: KEY_BUNDLE_TYPE, + eIdent: signedIdentityKey.public, + eSkeyId: encodeBigEndian(signedPreKey.keyId, 3), + eSkeyVal: signedPreKey.keyPair.public, + eSkeySig: signedPreKey.signature, + }, + } + + return proto.ClientPayload.fromObject(registerPayload) +} + +export const configureSuccessfulPairing = ( + stanza: BinaryNode, + { advSecretKey, signedIdentityKey, signalIdentities }: Pick +) => { + const msgId = stanza.attrs.id + + const pairSuccessNode = getBinaryNodeChild(stanza, 'pair-success') + + const deviceIdentityNode = getBinaryNodeChild(pairSuccessNode, 'device-identity') + const platformNode = getBinaryNodeChild(pairSuccessNode, 'platform') + const deviceNode = getBinaryNodeChild(pairSuccessNode, 'device') + const businessNode = getBinaryNodeChild(pairSuccessNode, 'biz') + + if(!deviceIdentityNode || !deviceNode) { + throw new Boom('Missing device-identity or device in pair success node', { data: stanza }) + } + + const bizName = businessNode?.attrs.name + const jid = deviceNode.attrs.jid + + const { details, hmac } = proto.ADVSignedDeviceIdentityHMAC.decode(deviceIdentityNode.content as Buffer) + // check HMAC matches + const advSign = hmacSign(details, Buffer.from(advSecretKey, 'base64')) + if(Buffer.compare(hmac, advSign) !== 0) { + throw new Boom('Invalid account signature') + } + + const account = proto.ADVSignedDeviceIdentity.decode(details) + const { accountSignatureKey, accountSignature, details: deviceDetails } = account + // verify the device signature matches + const accountMsg = Buffer.concat([ Buffer.from([6, 0]), deviceDetails, signedIdentityKey.public ]) + if(!Curve.verify(accountSignatureKey, accountMsg, accountSignature)) { + throw new Boom('Failed to verify account signature') + } + + // sign the details with our identity key + const deviceMsg = Buffer.concat([ Buffer.from([6, 1]), deviceDetails, signedIdentityKey.public, accountSignatureKey ]) + account.deviceSignature = Curve.sign(signedIdentityKey.private, deviceMsg) + + const identity = createSignalIdentity(jid, accountSignatureKey) + const accountEnc = encodeSignedDeviceIdentity(account, false) + + const deviceIdentity = proto.ADVDeviceIdentity.decode(account.details) + + const reply: BinaryNode = { + tag: 'iq', + attrs: { + to: S_WHATSAPP_NET, + type: 'result', + id: msgId, + }, + content: [ + { + tag: 'pair-device-sign', + attrs: { }, + content: [ + { + tag: 'device-identity', + attrs: { 'key-index': deviceIdentity.keyIndex.toString() }, + content: accountEnc + } + ] + } + ] + } + + const authUpdate: Partial = { + account, + me: { id: jid, name: bizName }, + signalIdentities: [ + ...(signalIdentities || []), + identity + ], + platform: platformNode?.attrs.name + } + + return { + creds: authUpdate, + reply + } +} + +export const encodeSignedDeviceIdentity = ( + account: proto.IADVSignedDeviceIdentity, + includeSignatureKey: boolean +) => { + account = { ...account } + // set to null if we are not to include the signature key + // or if we are including the signature key but it is empty + if(!includeSignatureKey || !account.accountSignatureKey?.length) { + account.accountSignatureKey = null + } + + const accountEnc = proto.ADVSignedDeviceIdentity + .encode(account) + .finish() + return accountEnc +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/WABinary/constants.ts b/whatsapp_addon/Baileys/src/WABinary/constants.ts new file mode 100644 index 0000000..0e4c439 --- /dev/null +++ b/whatsapp_addon/Baileys/src/WABinary/constants.ts @@ -0,0 +1,42 @@ + +export const TAGS = { + LIST_EMPTY: 0, + DICTIONARY_0: 236, + DICTIONARY_1: 237, + DICTIONARY_2: 238, + DICTIONARY_3: 239, + AD_JID: 247, + LIST_8: 248, + LIST_16: 249, + JID_PAIR: 250, + HEX_8: 251, + BINARY_8: 252, + BINARY_20: 253, + BINARY_32: 254, + NIBBLE_8: 255, + PACKED_MAX: 127, + SINGLE_BYTE_MAX: 256, + STREAM_END: 2 +} +export const DOUBLE_BYTE_TOKENS = [ + ['media-for1-1.cdn.whatsapp.net', 'relay', 'media-gru2-2.cdn.whatsapp.net', 'uncompressed', 'medium', 'voip_settings', 'device', 'reason', 'media-lim1-1.cdn.whatsapp.net', 'media-qro1-2.cdn.whatsapp.net', 'media-gru1-2.cdn.whatsapp.net', 'action', 'features', 'media-gru2-1.cdn.whatsapp.net', 'media-gru1-1.cdn.whatsapp.net', 'media-otp1-1.cdn.whatsapp.net', 'kyc-id', 'priority', 'phash', 'mute', 'token', '100', 'media-qro1-1.cdn.whatsapp.net', 'none', 'media-mrs2-2.cdn.whatsapp.net', 'sign_credential', '03', 'media-mrs2-1.cdn.whatsapp.net', 'protocol', 'timezone', 'transport', 'eph_setting', '1080', 'original_dimensions', 'media-frx5-1.cdn.whatsapp.net', 'background', 'disable', 'original_image_url', '5', 'transaction-id', 'direct_path', '103', 'appointment_only', 'request_image_url', 'peer_pid', 'address', '105', '104', '102', 'media-cdt1-1.cdn.whatsapp.net', '101', '109', '110', '106', 'background_location', 'v_id', 'sync', 'status-old', '111', '107', 'ppic', 'media-scl2-1.cdn.whatsapp.net', 'business_profile', '108', 'invite', '04', 'audio_duration', 'media-mct1-1.cdn.whatsapp.net', 'media-cdg2-1.cdn.whatsapp.net', 'media-los2-1.cdn.whatsapp.net', 'invis', 'net', 'voip_payload_type', 'status-revoke-delay', '404', 'state', 'use_correct_order_for_hmac_sha1', 'ver', 'media-mad1-1.cdn.whatsapp.net', 'order', '540', 'skey', 'blinded_credential', 'android', 'contact_remove', 'enable_downlink_relay_latency_only', 'duration', 'enable_vid_one_way_codec_nego', '6', 'media-sof1-1.cdn.whatsapp.net', 'accept', 'all', 'signed_credential', 'media-atl3-1.cdn.whatsapp.net', 'media-lhr8-1.cdn.whatsapp.net', 'website', '05', 'latitude', 'media-dfw5-1.cdn.whatsapp.net', 'forbidden', 'enable_audio_piggyback_network_mtu_fix', 'media-dfw5-2.cdn.whatsapp.net', 'note.m4r', 'media-atl3-2.cdn.whatsapp.net', 'jb_nack_discard_count_fix', 'longitude', 'Opening.m4r', 'media-arn2-1.cdn.whatsapp.net', 'email', 'timestamp', 'admin', 'media-pmo1-1.cdn.whatsapp.net', 'America/Sao_Paulo', 'contact_add', 'media-sin6-1.cdn.whatsapp.net', 'interactive', '8000', 'acs_public_key', 'sigquit_anr_detector_release_rollover_percent', 'media.fmed1-2.fna.whatsapp.net', 'groupadd', 'enabled_for_video_upgrade', 'latency_update_threshold', 'media-frt3-2.cdn.whatsapp.net', 'calls_row_constraint_layout', 'media.fgbb2-1.fna.whatsapp.net', 'mms4_media_retry_notification_encryption_enabled', 'timeout', 'media-sin6-3.cdn.whatsapp.net', 'audio_nack_jitter_multiplier', 'jb_discard_count_adjust_pct_rc', 'audio_reserve_bps', 'delta', 'account_sync', 'default', 'media.fjed4-6.fna.whatsapp.net', '06', 'lock_video_orientation', 'media-frt3-1.cdn.whatsapp.net', 'w:g2', 'media-sin6-2.cdn.whatsapp.net', 'audio_nack_algo_mask', 'media.fgbb2-2.fna.whatsapp.net', 'media.fmed1-1.fna.whatsapp.net', 'cond_range_target_bitrate', 'mms4_server_error_receipt_encryption_enabled', 'vid_rc_dyn', 'fri', 'cart_v1_1_order_message_changes_enabled', 'reg_push', 'jb_hist_deposit_value', 'privatestats', 'media.fist7-2.fna.whatsapp.net', 'thu', 'jb_discard_count_adjust_pct', 'mon', 'group_call_video_maximization_enabled', 'mms_cat_v1_forward_hot_override_enabled', 'audio_nack_new_rtt', 'media.fsub2-3.fna.whatsapp.net', 'media_upload_aggressive_retry_exponential_backoff_enabled', 'tue', 'wed', 'media.fruh4-2.fna.whatsapp.net', 'audio_nack_max_seq_req', 'max_rtp_audio_packet_resends', 'jb_hist_max_cdf_value', '07', 'audio_nack_max_jb_delay', 'mms_forward_partially_downloaded_video', 'media-lcy1-1.cdn.whatsapp.net', 'resume', 'jb_inband_fec_aware', 'new_commerce_entry_point_enabled', '480', 'payments_upi_generate_qr_amount_limit', 'sigquit_anr_detector_rollover_percent', 'media.fsdu2-1.fna.whatsapp.net', 'fbns', 'aud_pkt_reorder_pct', 'dec', 'stop_probing_before_accept_send', 'media_upload_max_aggressive_retries', 'edit_business_profile_new_mode_enabled', 'media.fhex4-1.fna.whatsapp.net', 'media.fjed4-3.fna.whatsapp.net', 'sigquit_anr_detector_64bit_rollover_percent', 'cond_range_ema_jb_last_delay', 'watls_enable_early_data_http_get', 'media.fsdu2-2.fna.whatsapp.net', 'message_qr_disambiguation_enabled', 'media-mxp1-1.cdn.whatsapp.net', 'sat', 'vertical', 'media.fruh4-5.fna.whatsapp.net', '200', 'media-sof1-2.cdn.whatsapp.net', '-1', 'height', 'product_catalog_hide_show_items_enabled', 'deep_copy_frm_last', 'tsoffline', 'vp8/h.264', 'media.fgye5-3.fna.whatsapp.net', 'media.ftuc1-2.fna.whatsapp.net', 'smb_upsell_chat_banner_enabled', 'canonical', '08', '9', '.', 'media.fgyd4-4.fna.whatsapp.net', 'media.fsti4-1.fna.whatsapp.net', 'mms_vcache_aggregation_enabled', 'mms_hot_content_timespan_in_seconds', 'nse_ver', 'rte', 'third_party_sticker_web_sync', 'cond_range_target_total_bitrate', 'media_upload_aggressive_retry_enabled', 'instrument_spam_report_enabled', 'disable_reconnect_tone', 'move_media_folder_from_sister_app', 'one_tap_calling_in_group_chat_size', '10', 'storage_mgmt_banner_threshold_mb', 'enable_backup_passive_mode', 'sharechat_inline_player_enabled', 'media.fcnq2-1.fna.whatsapp.net', 'media.fhex4-2.fna.whatsapp.net', 'media.fist6-3.fna.whatsapp.net', 'ephemeral_drop_column_stage', 'reconnecting_after_network_change_threshold_ms', 'media-lhr8-2.cdn.whatsapp.net', 'cond_jb_last_delay_ema_alpha', 'entry_point_block_logging_enabled', 'critical_event_upload_log_config', 'respect_initial_bitrate_estimate', 'smaller_image_thumbs_status_enabled', 'media.fbtz1-4.fna.whatsapp.net', 'media.fjed4-1.fna.whatsapp.net', 'width', '720', 'enable_frame_dropper', 'enable_one_side_mode', 'urn:xmpp:whatsapp:dirty', 'new_sticker_animation_behavior_v2', 'media.flim3-2.fna.whatsapp.net', 'media.fuio6-2.fna.whatsapp.net', 'skip_forced_signaling', 'dleq_proof', 'status_video_max_bitrate', 'lazy_send_probing_req', 'enhanced_storage_management', 'android_privatestats_endpoint_dit_enabled', 'media.fscl13-2.fna.whatsapp.net', 'video_duration'], + ['group_call_discoverability_enabled', 'media.faep9-2.fna.whatsapp.net', 'msgr', 'bloks_loggedin_access_app_id', 'db_status_migration_step', 'watls_prefer_ip6', 'jabber:iq:privacy', '68', 'media.fsaw1-11.fna.whatsapp.net', 'mms4_media_conn_persist_enabled', 'animated_stickers_thread_clean_up', 'media.fcgk3-2.fna.whatsapp.net', 'media.fcgk4-6.fna.whatsapp.net', 'media.fgye5-2.fna.whatsapp.net', 'media.flpb1-1.fna.whatsapp.net', 'media.fsub2-1.fna.whatsapp.net', 'media.fuio6-3.fna.whatsapp.net', 'not-allowed', 'partial_pjpeg_bw_threshold', 'cap_estimated_bitrate', 'mms_chatd_resume_check_over_thrift', 'smb_upsell_business_profile_enabled', 'product_catalog_webclient', 'groups', 'sigquit_anr_detector_release_updated_rollout', 'syncd_key_rotation_enabled', 'media.fdmm2-1.fna.whatsapp.net', 'media-hou1-1.cdn.whatsapp.net', 'remove_old_chat_notifications', 'smb_biztools_deeplink_enabled', 'use_downloadable_filters_int', 'group_qr_codes_enabled', 'max_receipt_processing_time', 'optimistic_image_processing_enabled', 'smaller_video_thumbs_status_enabled', 'watls_early_data', 'reconnecting_before_relay_failover_threshold_ms', 'cond_range_packet_loss_pct', 'groups_privacy_blacklist', 'status-revoke-drop', 'stickers_animated_thumbnail_download', 'dedupe_transcode_shared_images', 'dedupe_transcode_shared_videos', 'media.fcnq2-2.fna.whatsapp.net', 'media.fgyd4-1.fna.whatsapp.net', 'media.fist7-1.fna.whatsapp.net', 'media.flim3-3.fna.whatsapp.net', 'add_contact_by_qr_enabled', 'https://faq.whatsapp.com/payments', 'multicast_limit_global', 'sticker_notification_preview', 'smb_better_catalog_list_adapters_enabled', 'bloks_use_minscript_android', 'pen_smoothing_enabled', 'media.fcgk4-5.fna.whatsapp.net', 'media.fevn1-3.fna.whatsapp.net', 'media.fpoj7-1.fna.whatsapp.net', 'media-arn2-2.cdn.whatsapp.net', 'reconnecting_before_network_change_threshold_ms', 'android_media_use_fresco_for_gifs', 'cond_in_congestion', 'status_image_max_edge', 'sticker_search_enabled', 'starred_stickers_web_sync', 'db_blank_me_jid_migration_step', 'media.fist6-2.fna.whatsapp.net', 'media.ftuc1-1.fna.whatsapp.net', '09', 'anr_fast_logs_upload_rollout', 'camera_core_integration_enabled', '11', 'third_party_sticker_caching', 'thread_dump_contact_support', 'wam_privatestats_enabled', 'vcard_as_document_size_kb', 'maxfpp', 'fbip', 'ephemeral_allow_group_members', 'media-bom1-2.cdn.whatsapp.net', 'media-xsp1-1.cdn.whatsapp.net', 'disable_prewarm', 'frequently_forwarded_max', 'media.fbtz1-5.fna.whatsapp.net', 'media.fevn7-1.fna.whatsapp.net', 'media.fgyd4-2.fna.whatsapp.net', 'sticker_tray_animation_fully_visible_items', 'green_alert_banner_duration', 'reconnecting_after_p2p_failover_threshold_ms', 'connected', 'share_biz_vcard_enabled', 'stickers_animation', '0a', '1200', 'WhatsApp', 'group_description_length', 'p_v_id', 'payments_upi_intent_transaction_limit', 'frequently_forwarded_messages', 'media-xsp1-2.cdn.whatsapp.net', 'media.faep8-1.fna.whatsapp.net', 'media.faep8-2.fna.whatsapp.net', 'media.faep9-1.fna.whatsapp.net', 'media.fdmm2-2.fna.whatsapp.net', 'media.fgzt3-1.fna.whatsapp.net', 'media.flim4-2.fna.whatsapp.net', 'media.frao1-1.fna.whatsapp.net', 'media.fscl9-2.fna.whatsapp.net', 'media.fsub2-2.fna.whatsapp.net', 'superadmin', 'media.fbog10-1.fna.whatsapp.net', 'media.fcgh28-1.fna.whatsapp.net', 'media.fjdo10-1.fna.whatsapp.net', 'third_party_animated_sticker_import', 'delay_fec', 'attachment_picker_refresh', 'android_linked_devices_re_auth_enabled', 'rc_dyn', 'green_alert_block_jitter', 'add_contact_logging_enabled', 'biz_message_logging_enabled', 'conversation_media_preview_v2', 'media-jnb1-1.cdn.whatsapp.net', 'ab_key', 'media.fcgk4-2.fna.whatsapp.net', 'media.fevn1-1.fna.whatsapp.net', 'media.fist6-1.fna.whatsapp.net', 'media.fruh4-4.fna.whatsapp.net', 'media.fsti4-2.fna.whatsapp.net', 'mms_vcard_autodownload_size_kb', 'watls_enabled', 'notif_ch_override_off', 'media.fsaw1-14.fna.whatsapp.net', 'media.fscl13-1.fna.whatsapp.net', 'db_group_participant_migration_step', '1020', 'cond_range_sterm_rtt', 'invites_logging_enabled', 'triggered_block_enabled', 'group_call_max_participants', 'media-iad3-1.cdn.whatsapp.net', 'product_catalog_open_deeplink', 'shops_required_tos_version', 'image_max_kbytes', 'cond_low_quality_vid_mode', 'db_receipt_migration_step', 'jb_early_prob_hist_shrink', 'media.fdmm2-3.fna.whatsapp.net', 'media.fdmm2-4.fna.whatsapp.net', 'media.fruh4-1.fna.whatsapp.net', 'media.fsaw2-2.fna.whatsapp.net', 'remove_geolocation_videos', 'new_animation_behavior', 'fieldstats_beacon_chance', '403', 'authkey_reset_on_ban', 'continuous_ptt_playback', 'reconnecting_after_relay_failover_threshold_ms', 'false', 'group', 'sun', 'conversation_swipe_to_reply', 'ephemeral_messages_setting', 'smaller_video_thumbs_enabled', 'md_device_sync_enabled', 'bloks_shops_pdp_url_regex', 'lasso_integration_enabled', 'media-bom1-1.cdn.whatsapp.net', 'new_backup_format_enabled', '256', 'media.faep6-1.fna.whatsapp.net', 'media.fasr1-1.fna.whatsapp.net', 'media.fbtz1-7.fna.whatsapp.net', 'media.fesb4-1.fna.whatsapp.net', 'media.fjdo1-2.fna.whatsapp.net', 'media.frba2-1.fna.whatsapp.net', 'watls_no_dns', '600', 'db_broadcast_me_jid_migration_step', 'new_wam_runtime_enabled', 'group_update', 'enhanced_block_enabled', 'sync_wifi_threshold_kb', 'mms_download_nc_cat', 'bloks_minification_enabled', 'ephemeral_messages_enabled', 'reject', 'voip_outgoing_xml_signaling', 'creator', 'dl_bw', 'payments_request_messages', 'target_bitrate', 'bloks_rendercore_enabled', 'media-hbe1-1.cdn.whatsapp.net', 'media-hel3-1.cdn.whatsapp.net', 'media-kut2-2.cdn.whatsapp.net', 'media-lax3-1.cdn.whatsapp.net', 'media-lax3-2.cdn.whatsapp.net', 'sticker_pack_deeplink_enabled', 'hq_image_bw_threshold', 'status_info', 'voip', 'dedupe_transcode_videos', 'grp_uii_cleanup', 'linked_device_max_count', 'media.flim1-1.fna.whatsapp.net', 'media.fsaw2-1.fna.whatsapp.net', 'reconnecting_after_call_active_threshold_ms', '1140', 'catalog_pdp_new_design', 'media.fbtz1-10.fna.whatsapp.net', 'media.fsaw1-15.fna.whatsapp.net', '0b', 'consumer_rc_provider', 'mms_async_fast_forward_ttl', 'jb_eff_size_fix', 'voip_incoming_xml_signaling', 'media_provider_share_by_uuid', 'suspicious_links', 'dedupe_transcode_images', 'green_alert_modal_start', 'media-cgk1-1.cdn.whatsapp.net', 'media-lga3-1.cdn.whatsapp.net', 'template_doc_mime_types', 'important_messages', 'user_add', 'vcard_max_size_kb', 'media.fada2-1.fna.whatsapp.net', 'media.fbog2-5.fna.whatsapp.net', 'media.fbtz1-3.fna.whatsapp.net', 'media.fcgk3-1.fna.whatsapp.net', 'media.fcgk7-1.fna.whatsapp.net', 'media.flim1-3.fna.whatsapp.net', 'media.fscl9-1.fna.whatsapp.net', 'ctwa_context_enterprise_enabled', 'media.fsaw1-13.fna.whatsapp.net', 'media.fuio11-2.fna.whatsapp.net', 'status_collapse_muted', 'db_migration_level_force', 'recent_stickers_web_sync', 'bloks_session_state', 'bloks_shops_enabled', 'green_alert_setting_deep_links_enabled', 'restrict_groups', 'battery', 'green_alert_block_start', 'refresh', 'ctwa_context_enabled', 'md_messaging_enabled', 'status_image_quality', 'md_blocklist_v2_server', 'media-del1-1.cdn.whatsapp.net', '13', 'userrate', 'a_v_id', 'cond_rtt_ema_alpha', 'invalid'], + ['media.fada1-1.fna.whatsapp.net', 'media.fadb3-2.fna.whatsapp.net', 'media.fbhz2-1.fna.whatsapp.net', 'media.fcor2-1.fna.whatsapp.net', 'media.fjed4-2.fna.whatsapp.net', 'media.flhe4-1.fna.whatsapp.net', 'media.frak1-2.fna.whatsapp.net', 'media.fsub6-3.fna.whatsapp.net', 'media.fsub6-7.fna.whatsapp.net', 'media.fvvi1-1.fna.whatsapp.net', 'search_v5_eligible', 'wam_real_time_enabled', 'report_disk_event', 'max_tx_rott_based_bitrate', 'product', 'media.fjdo10-2.fna.whatsapp.net', 'video_frame_crc_sample_interval', 'media_max_autodownload', '15', 'h.264', 'wam_privatestats_buffer_count', 'md_phash_v2_enabled', 'account_transfer_enabled', 'business_product_catalog', 'enable_non_dyn_codec_param_fix', 'is_user_under_epd_jurisdiction', 'media.fbog2-4.fna.whatsapp.net', 'media.fbtz1-2.fna.whatsapp.net', 'media.fcfc1-1.fna.whatsapp.net', 'media.fjed4-5.fna.whatsapp.net', 'media.flhe4-2.fna.whatsapp.net', 'media.flim1-2.fna.whatsapp.net', 'media.flos5-1.fna.whatsapp.net', 'android_key_store_auth_ver', '010', 'anr_process_monitor', 'delete_old_auth_key', 'media.fcor10-3.fna.whatsapp.net', 'storage_usage_enabled', 'android_camera2_support_level', 'dirty', 'consumer_content_provider', 'status_video_max_duration', '0c', 'bloks_cache_enabled', 'media.fadb2-2.fna.whatsapp.net', 'media.fbko1-1.fna.whatsapp.net', 'media.fbtz1-9.fna.whatsapp.net', 'media.fcgk4-4.fna.whatsapp.net', 'media.fesb4-2.fna.whatsapp.net', 'media.fevn1-2.fna.whatsapp.net', 'media.fist2-4.fna.whatsapp.net', 'media.fjdo1-1.fna.whatsapp.net', 'media.fruh4-6.fna.whatsapp.net', 'media.fsrg5-1.fna.whatsapp.net', 'media.fsub6-6.fna.whatsapp.net', 'minfpp', '5000', 'locales', 'video_max_bitrate', 'use_new_auth_key', 'bloks_http_enabled', 'heartbeat_interval', 'media.fbog11-1.fna.whatsapp.net', 'ephemeral_group_query_ts', 'fec_nack', 'search_in_storage_usage', 'c', 'media-amt2-1.cdn.whatsapp.net', 'linked_devices_ui_enabled', '14', 'async_data_load_on_startup', 'voip_incoming_xml_ack', '16', 'db_migration_step', 'init_bwe', 'max_participants', 'wam_buffer_count', 'media.fada2-2.fna.whatsapp.net', 'media.fadb3-1.fna.whatsapp.net', 'media.fcor2-2.fna.whatsapp.net', 'media.fdiy1-2.fna.whatsapp.net', 'media.frba3-2.fna.whatsapp.net', 'media.fsaw2-3.fna.whatsapp.net', '1280', 'status_grid_enabled', 'w:biz', 'product_catalog_deeplink', 'media.fgye10-2.fna.whatsapp.net', 'media.fuio11-1.fna.whatsapp.net', 'optimistic_upload', 'work_manager_init', 'lc', 'catalog_message', 'cond_net_medium', 'enable_periodical_aud_rr_processing', 'cond_range_ema_rtt', 'media-tir2-1.cdn.whatsapp.net', 'frame_ms', 'group_invite_sending', 'payments_web_enabled', 'wallpapers_v2', '0d', 'browser', 'hq_image_max_edge', 'image_edit_zoom', 'linked_devices_re_auth_enabled', 'media.faly3-2.fna.whatsapp.net', 'media.fdoh5-3.fna.whatsapp.net', 'media.fesb3-1.fna.whatsapp.net', 'media.fknu1-1.fna.whatsapp.net', 'media.fmex3-1.fna.whatsapp.net', 'media.fruh4-3.fna.whatsapp.net', '255', 'web_upgrade_to_md_modal', 'audio_piggyback_timeout_msec', 'enable_audio_oob_fec_feature', 'from_ip', 'image_max_edge', 'message_qr_enabled', 'powersave', 'receipt_pre_acking', 'video_max_edge', 'full', '011', '012', 'enable_audio_oob_fec_for_sender', 'md_voip_enabled', 'enable_privatestats', 'max_fec_ratio', 'payments_cs_faq_url', 'media-xsp1-3.cdn.whatsapp.net', 'hq_image_quality', 'media.fasr1-2.fna.whatsapp.net', 'media.fbog3-1.fna.whatsapp.net', 'media.ffjr1-6.fna.whatsapp.net', 'media.fist2-3.fna.whatsapp.net', 'media.flim4-3.fna.whatsapp.net', 'media.fpbc2-4.fna.whatsapp.net', 'media.fpku1-1.fna.whatsapp.net', 'media.frba1-1.fna.whatsapp.net', 'media.fudi1-1.fna.whatsapp.net', 'media.fvvi1-2.fna.whatsapp.net', 'gcm_fg_service', 'enable_dec_ltr_size_check', 'clear', 'lg', 'media.fgru11-1.fna.whatsapp.net', '18', 'media-lga3-2.cdn.whatsapp.net', 'pkey', '0e', 'max_subject', 'cond_range_lterm_rtt', 'announcement_groups', 'biz_profile_options', 's_t', 'media.fabv2-1.fna.whatsapp.net', 'media.fcai3-1.fna.whatsapp.net', 'media.fcgh1-1.fna.whatsapp.net', 'media.fctg1-4.fna.whatsapp.net', 'media.fdiy1-1.fna.whatsapp.net', 'media.fisb4-1.fna.whatsapp.net', 'media.fpku1-2.fna.whatsapp.net', 'media.fros9-1.fna.whatsapp.net', 'status_v3_text', 'usync_sidelist', '17', 'announcement', '...', 'md_group_notification', '0f', 'animated_pack_in_store', '013', 'America/Mexico_City', '1260', 'media-ams4-1.cdn.whatsapp.net', 'media-cgk1-2.cdn.whatsapp.net', 'media-cpt1-1.cdn.whatsapp.net', 'media-maa2-1.cdn.whatsapp.net', 'media.fgye10-1.fna.whatsapp.net', 'e', 'catalog_cart', 'hfm_string_changes', 'init_bitrate', 'packless_hsm', 'group_info', 'America/Belem', '50', '960', 'cond_range_bwe', 'decode', 'encode', 'media.fada1-8.fna.whatsapp.net', 'media.fadb1-2.fna.whatsapp.net', 'media.fasu6-1.fna.whatsapp.net', 'media.fbog4-1.fna.whatsapp.net', 'media.fcgk9-2.fna.whatsapp.net', 'media.fdoh5-2.fna.whatsapp.net', 'media.ffjr1-2.fna.whatsapp.net', 'media.fgua1-1.fna.whatsapp.net', 'media.fgye1-1.fna.whatsapp.net', 'media.fist1-4.fna.whatsapp.net', 'media.fpbc2-2.fna.whatsapp.net', 'media.fres2-1.fna.whatsapp.net', 'media.fsdq1-2.fna.whatsapp.net', 'media.fsub6-5.fna.whatsapp.net', 'profilo_enabled', 'template_hsm', 'use_disorder_prefetching_timer', 'video_codec_priority', 'vpx_max_qp', 'ptt_reduce_recording_delay', '25', 'iphone', 'Windows', 's_o', 'Africa/Lagos', 'abt', 'media-kut2-1.cdn.whatsapp.net', 'media-mba1-1.cdn.whatsapp.net', 'media-mxp1-2.cdn.whatsapp.net', 'md_blocklist_v2', 'url_text', 'enable_short_offset', 'group_join_permissions', 'enable_audio_piggyback_feature', 'image_quality', 'media.fcgk7-2.fna.whatsapp.net', 'media.fcgk8-2.fna.whatsapp.net', 'media.fclo7-1.fna.whatsapp.net', 'media.fcmn1-1.fna.whatsapp.net', 'media.feoh1-1.fna.whatsapp.net', 'media.fgyd4-3.fna.whatsapp.net', 'media.fjed4-4.fna.whatsapp.net', 'media.flim1-4.fna.whatsapp.net', 'media.flim2-4.fna.whatsapp.net', 'media.fplu6-1.fna.whatsapp.net', 'media.frak1-1.fna.whatsapp.net', 'media.fsdq1-1.fna.whatsapp.net', 'to_ip', '015', 'vp8', '19', '21', '1320', 'auth_key_ver', 'message_processing_dedup', 'server-error', 'wap4_enabled', '420', '014', 'cond_range_rtt', 'ptt_fast_lock_enabled', 'media-ort2-1.cdn.whatsapp.net', 'fwd_ui_start_ts'], + ['contact_blacklist', 'Asia/Jakarta', 'media.fepa10-1.fna.whatsapp.net', 'media.fmex10-3.fna.whatsapp.net', 'disorder_prefetching_start_when_empty', 'America/Bogota', 'use_local_probing_rx_bitrate', 'America/Argentina/Buenos_Aires', 'cross_post', 'media.fabb1-1.fna.whatsapp.net', 'media.fbog4-2.fna.whatsapp.net', 'media.fcgk9-1.fna.whatsapp.net', 'media.fcmn2-1.fna.whatsapp.net', 'media.fdel3-1.fna.whatsapp.net', 'media.ffjr1-1.fna.whatsapp.net', 'media.fgdl5-1.fna.whatsapp.net', 'media.flpb1-2.fna.whatsapp.net', 'media.fmex2-1.fna.whatsapp.net', 'media.frba2-2.fna.whatsapp.net', 'media.fros2-2.fna.whatsapp.net', 'media.fruh2-1.fna.whatsapp.net', 'media.fybz2-2.fna.whatsapp.net', 'options', '20', 'a', '017', '018', 'mute_always', 'user_notice', 'Asia/Kolkata', 'gif_provider', 'locked', 'media-gua1-1.cdn.whatsapp.net', 'piggyback_exclude_force_flush', '24', 'media.frec39-1.fna.whatsapp.net', 'user_remove', 'file_max_size', 'cond_packet_loss_pct_ema_alpha', 'media.facc1-1.fna.whatsapp.net', 'media.fadb2-1.fna.whatsapp.net', 'media.faly3-1.fna.whatsapp.net', 'media.fbdo6-2.fna.whatsapp.net', 'media.fcmn2-2.fna.whatsapp.net', 'media.fctg1-3.fna.whatsapp.net', 'media.ffez1-2.fna.whatsapp.net', 'media.fist1-3.fna.whatsapp.net', 'media.fist2-2.fna.whatsapp.net', 'media.flim2-2.fna.whatsapp.net', 'media.fmct2-3.fna.whatsapp.net', 'media.fpei3-1.fna.whatsapp.net', 'media.frba3-1.fna.whatsapp.net', 'media.fsdu8-2.fna.whatsapp.net', 'media.fstu2-1.fna.whatsapp.net', 'media_type', 'receipt_agg', '016', 'enable_pli_for_crc_mismatch', 'live', 'enc_rekey', 'frskmsg', 'd', 'media.fdel11-2.fna.whatsapp.net', 'proto', '2250', 'audio_piggyback_enable_cache', 'skip_nack_if_ltrp_sent', 'mark_dtx_jb_frames', 'web_service_delay', '7282', 'catalog_send_all', 'outgoing', '360', '30', 'LIMITED', '019', 'audio_picker', 'bpv2_phase', 'media.fada1-7.fna.whatsapp.net', 'media.faep7-1.fna.whatsapp.net', 'media.fbko1-2.fna.whatsapp.net', 'media.fbni1-2.fna.whatsapp.net', 'media.fbtz1-1.fna.whatsapp.net', 'media.fbtz1-8.fna.whatsapp.net', 'media.fcjs3-1.fna.whatsapp.net', 'media.fesb3-2.fna.whatsapp.net', 'media.fgdl5-4.fna.whatsapp.net', 'media.fist2-1.fna.whatsapp.net', 'media.flhe2-2.fna.whatsapp.net', 'media.flim2-1.fna.whatsapp.net', 'media.fmex1-1.fna.whatsapp.net', 'media.fpat3-2.fna.whatsapp.net', 'media.fpat3-3.fna.whatsapp.net', 'media.fros2-1.fna.whatsapp.net', 'media.fsdu8-1.fna.whatsapp.net', 'media.fsub3-2.fna.whatsapp.net', 'payments_chat_plugin', 'cond_congestion_no_rtcp_thr', 'green_alert', 'not-a-biz', '..', 'shops_pdp_urls_config', 'source', 'media-dus1-1.cdn.whatsapp.net', 'mute_video', '01b', 'currency', 'max_keys', 'resume_check', 'contact_array', 'qr_scanning', '23', 'b', 'media.fbfh15-1.fna.whatsapp.net', 'media.flim22-1.fna.whatsapp.net', 'media.fsdu11-1.fna.whatsapp.net', 'media.fsdu15-1.fna.whatsapp.net', 'Chrome', 'fts_version', '60', 'media.fada1-6.fna.whatsapp.net', 'media.faep4-2.fna.whatsapp.net', 'media.fbaq5-1.fna.whatsapp.net', 'media.fbni1-1.fna.whatsapp.net', 'media.fcai3-2.fna.whatsapp.net', 'media.fdel3-2.fna.whatsapp.net', 'media.fdmm3-2.fna.whatsapp.net', 'media.fhex3-1.fna.whatsapp.net', 'media.fisb4-2.fna.whatsapp.net', 'media.fkhi5-2.fna.whatsapp.net', 'media.flos2-1.fna.whatsapp.net', 'media.fmct2-1.fna.whatsapp.net', 'media.fntr7-1.fna.whatsapp.net', 'media.frak3-1.fna.whatsapp.net', 'media.fruh5-2.fna.whatsapp.net', 'media.fsub6-1.fna.whatsapp.net', 'media.fuab1-2.fna.whatsapp.net', 'media.fuio1-1.fna.whatsapp.net', 'media.fver1-1.fna.whatsapp.net', 'media.fymy1-1.fna.whatsapp.net', 'product_catalog', '1380', 'audio_oob_fec_max_pkts', '22', '254', 'media-ort2-2.cdn.whatsapp.net', 'media-sjc3-1.cdn.whatsapp.net', '1600', '01a', '01c', '405', 'key_frame_interval', 'body', 'media.fcgh20-1.fna.whatsapp.net', 'media.fesb10-2.fna.whatsapp.net', '125', '2000', 'media.fbsb1-1.fna.whatsapp.net', 'media.fcmn3-2.fna.whatsapp.net', 'media.fcpq1-1.fna.whatsapp.net', 'media.fdel1-2.fna.whatsapp.net', 'media.ffor2-1.fna.whatsapp.net', 'media.fgdl1-4.fna.whatsapp.net', 'media.fhex2-1.fna.whatsapp.net', 'media.fist1-2.fna.whatsapp.net', 'media.fjed5-2.fna.whatsapp.net', 'media.flim6-4.fna.whatsapp.net', 'media.flos2-2.fna.whatsapp.net', 'media.fntr6-2.fna.whatsapp.net', 'media.fpku3-2.fna.whatsapp.net', 'media.fros8-1.fna.whatsapp.net', 'media.fymy1-2.fna.whatsapp.net', 'ul_bw', 'ltrp_qp_offset', 'request', 'nack', 'dtx_delay_state_reset', 'timeoffline', '28', '01f', '32', 'enable_ltr_pool', 'wa_msys_crypto', '01d', '58', 'dtx_freeze_hg_update', 'nack_if_rpsi_throttled', '253', '840', 'media.famd15-1.fna.whatsapp.net', 'media.fbog17-2.fna.whatsapp.net', 'media.fcai19-2.fna.whatsapp.net', 'media.fcai21-4.fna.whatsapp.net', 'media.fesb10-4.fna.whatsapp.net', 'media.fesb10-5.fna.whatsapp.net', 'media.fmaa12-1.fna.whatsapp.net', 'media.fmex11-3.fna.whatsapp.net', 'media.fpoa33-1.fna.whatsapp.net', '1050', '021', 'clean', 'cond_range_ema_packet_loss_pct', 'media.fadb6-5.fna.whatsapp.net', 'media.faqp4-1.fna.whatsapp.net', 'media.fbaq3-1.fna.whatsapp.net', 'media.fbel2-1.fna.whatsapp.net', 'media.fblr4-2.fna.whatsapp.net', 'media.fclo8-1.fna.whatsapp.net', 'media.fcoo1-2.fna.whatsapp.net', 'media.ffjr1-4.fna.whatsapp.net', 'media.ffor9-1.fna.whatsapp.net', 'media.fisb3-1.fna.whatsapp.net', 'media.fkhi2-2.fna.whatsapp.net', 'media.fkhi4-1.fna.whatsapp.net', 'media.fpbc1-2.fna.whatsapp.net', 'media.fruh2-2.fna.whatsapp.net', 'media.fruh5-1.fna.whatsapp.net', 'media.fsub3-1.fna.whatsapp.net', 'payments_transaction_limit', '252', '27', '29', 'tintagel', '01e', '237', '780', 'callee_updated_payload', '020', '257', 'price', '025', '239', 'payments_cs_phone_number', 'mediaretry', 'w:auth:backup:token', 'Glass.caf', 'max_bitrate', '240', '251', '660', 'media.fbog16-1.fna.whatsapp.net', 'media.fcgh21-1.fna.whatsapp.net', 'media.fkul19-2.fna.whatsapp.net', 'media.flim21-2.fna.whatsapp.net', 'media.fmex10-4.fna.whatsapp.net', '64', '33', '34', '35', 'interruption', 'media.fabv3-1.fna.whatsapp.net', 'media.fadb6-1.fna.whatsapp.net', 'media.fagr1-1.fna.whatsapp.net', 'media.famd1-1.fna.whatsapp.net', 'media.famm6-1.fna.whatsapp.net', 'media.faqp2-3.fna.whatsapp.net'], + +] +export const SINGLE_BYTE_TOKENS: (string | null)[] = [ + '', 'xmlstreamstart', 'xmlstreamend', 's.whatsapp.net', 'type', 'participant', 'from', 'receipt', 'id', 'broadcast', 'status', 'message', 'notification', 'notify', 'to', 'jid', 'user', 'class', 'offline', 'g.us', 'result', 'mediatype', 'enc', 'skmsg', 'off_cnt', 'xmlns', 'presence', 'participants', 'ack', 't', 'iq', 'device_hash', 'read', 'value', 'media', 'picture', 'chatstate', 'unavailable', 'text', 'urn:xmpp:whatsapp:push', 'devices', 'verified_name', 'contact', 'composing', 'edge_routing', 'routing_info', 'item', 'image', 'verified_level', 'get', 'fallback_hostname', '2', 'media_conn', '1', 'v', 'handshake', 'fallback_class', 'count', 'config', 'offline_preview', 'download_buckets', 'w:profile:picture', 'set', 'creation', 'location', 'fallback_ip4', 'msg', 'urn:xmpp:ping', 'fallback_ip6', 'call-creator', 'relaylatency', 'success', 'subscribe', 'video', 'business_hours_config', 'platform', 'hostname', 'version', 'unknown', '0', 'ping', 'hash', 'edit', 'subject', 'max_buckets', 'download', 'delivery', 'props', 'sticker', 'name', 'last', 'contacts', 'business', 'primary', 'preview', 'w:p', 'pkmsg', 'call-id', 'retry', 'prop', 'call', 'auth_ttl', 'available', 'relay_id', 'last_id', 'day_of_week', 'w', 'host', 'seen', 'bits', 'list', 'atn', 'upload', 'is_new', 'w:stats', 'key', 'paused', 'specific_hours', 'multicast', 'stream:error', 'mmg.whatsapp.net', 'code', 'deny', 'played', 'profile', 'fna', 'device-list', 'close_time', 'latency', 'gcm', 'pop', 'audio', '26', 'w:web', 'open_time', 'error', 'auth', 'ip4', 'update', 'profile_options', 'config_value', 'category', 'catalog_not_created', '00', 'config_code', 'mode', 'catalog_status', 'ip6', 'blocklist', 'registration', '7', 'web', 'fail', 'w:m', 'cart_enabled', 'ttl', 'gif', '300', 'device_orientation', 'identity', 'query', '401', 'media-gig2-1.cdn.whatsapp.net', 'in', '3', 'te2', 'add', 'fallback', 'categories', 'ptt', 'encrypt', 'notice', 'thumbnail-document', 'item-not-found', '12', 'thumbnail-image', 'stage', 'thumbnail-link', 'usync', 'out', 'thumbnail-video', '8', '01', 'context', 'sidelist', 'thumbnail-gif', 'terminate', 'not-authorized', 'orientation', 'dhash', 'capability', 'side_list', 'md-app-state', 'description', 'serial', 'readreceipts', 'te', 'business_hours', 'md-msg-hist', 'tag', 'attribute_padding', 'document', 'open_24h', 'delete', 'expiration', 'active', 'prev_v_id', 'true', 'passive', 'index', '4', 'conflict', 'remove', 'w:gp2', 'config_expo_key', 'screen_height', 'replaced', '02', 'screen_width', 'uploadfieldstat', '2:47DEQpj8', 'media-bog1-1.cdn.whatsapp.net', 'encopt', 'url', 'catalog_exists', 'keygen', 'rate', 'offer', 'opus', 'media-mia3-1.cdn.whatsapp.net', 'privacy', 'media-mia3-2.cdn.whatsapp.net', 'signature', 'preaccept', 'token_id', 'media-eze1-1.cdn.whatsapp.net' +] + +export const TOKEN_MAP: { [token: string]: { dict?: number, index: number } } = { } + +for(let i = 0;i < SINGLE_BYTE_TOKENS.length;i++) { + TOKEN_MAP[SINGLE_BYTE_TOKENS[i]!] = { index: i } +} + +for(let i = 0;i < DOUBLE_BYTE_TOKENS.length;i++) { + for(let j = 0;j < DOUBLE_BYTE_TOKENS[i].length;j++) { + TOKEN_MAP[DOUBLE_BYTE_TOKENS[i][j]] = { dict: i, index: j } + } +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/WABinary/decode.ts b/whatsapp_addon/Baileys/src/WABinary/decode.ts new file mode 100644 index 0000000..6095c55 --- /dev/null +++ b/whatsapp_addon/Baileys/src/WABinary/decode.ts @@ -0,0 +1,265 @@ +import { inflateSync } from 'zlib' +import * as constants from './constants' +import { jidEncode } from './jid-utils' +import type { BinaryNode, BinaryNodeCodingOptions } from './types' + +export const decompressingIfRequired = (buffer: Buffer) => { + if(2 & buffer.readUInt8()) { + buffer = inflateSync(buffer.slice(1)) + } else { // nodes with no compression have a 0x00 prefix, we remove that + buffer = buffer.slice(1) + } + + return buffer +} + +export const decodeDecompressedBinaryNode = ( + buffer: Buffer, + opts: Pick, + indexRef: { index: number } = { index: 0 } +): BinaryNode => { + const { DOUBLE_BYTE_TOKENS, SINGLE_BYTE_TOKENS, TAGS } = opts + + const checkEOS = (length: number) => { + if(indexRef.index + length > buffer.length) { + throw new Error('end of stream') + } + } + + const next = () => { + const value = buffer[indexRef.index] + indexRef.index += 1 + return value + } + + const readByte = () => { + checkEOS(1) + return next() + } + + const readBytes = (n: number) => { + checkEOS(n) + const value = buffer.slice(indexRef.index, indexRef.index + n) + indexRef.index += n + return value + } + + const readStringFromChars = (length: number) => { + return readBytes(length).toString('utf-8') + } + + const readInt = (n: number, littleEndian = false) => { + checkEOS(n) + let val = 0 + for(let i = 0; i < n; i++) { + const shift = littleEndian ? i : n - 1 - i + val |= next() << (shift * 8) + } + + return val + } + + const readInt20 = () => { + checkEOS(3) + return ((next() & 15) << 16) + (next() << 8) + next() + } + + const unpackHex = (value: number) => { + if(value >= 0 && value < 16) { + return value < 10 ? '0'.charCodeAt(0) + value : 'A'.charCodeAt(0) + value - 10 + } + + throw new Error('invalid hex: ' + value) + } + + const unpackNibble = (value: number) => { + if(value >= 0 && value <= 9) { + return '0'.charCodeAt(0) + value + } + + switch (value) { + case 10: + return '-'.charCodeAt(0) + case 11: + return '.'.charCodeAt(0) + case 15: + return '\0'.charCodeAt(0) + default: + throw new Error('invalid nibble: ' + value) + } + } + + const unpackByte = (tag: number, value: number) => { + if(tag === TAGS.NIBBLE_8) { + return unpackNibble(value) + } else if(tag === TAGS.HEX_8) { + return unpackHex(value) + } else { + throw new Error('unknown tag: ' + tag) + } + } + + const readPacked8 = (tag: number) => { + const startByte = readByte() + let value = '' + + for(let i = 0; i < (startByte & 127); i++) { + const curByte = readByte() + value += String.fromCharCode(unpackByte(tag, (curByte & 0xf0) >> 4)) + value += String.fromCharCode(unpackByte(tag, curByte & 0x0f)) + } + + if(startByte >> 7 !== 0) { + value = value.slice(0, -1) + } + + return value + } + + const isListTag = (tag: number) => { + return tag === TAGS.LIST_EMPTY || tag === TAGS.LIST_8 || tag === TAGS.LIST_16 + } + + const readListSize = (tag: number) => { + switch (tag) { + case TAGS.LIST_EMPTY: + return 0 + case TAGS.LIST_8: + return readByte() + case TAGS.LIST_16: + return readInt(2) + default: + throw new Error('invalid tag for list size: ' + tag) + } + } + + const readJidPair = () => { + const i = readString(readByte()) + const j = readString(readByte()) + if(j) { + return (i || '') + '@' + j + } + + throw new Error('invalid jid pair: ' + i + ', ' + j) + } + + const readAdJid = () => { + const agent = readByte() + const device = readByte() + const user = readString(readByte()) + + return jidEncode(user, 's.whatsapp.net', device, agent) + } + + const readString = (tag: number): string => { + if(tag >= 1 && tag < SINGLE_BYTE_TOKENS.length) { + return SINGLE_BYTE_TOKENS[tag] || '' + } + + switch (tag) { + case TAGS.DICTIONARY_0: + case TAGS.DICTIONARY_1: + case TAGS.DICTIONARY_2: + case TAGS.DICTIONARY_3: + return getTokenDouble(tag - TAGS.DICTIONARY_0, readByte()) + case TAGS.LIST_EMPTY: + return '' + case TAGS.BINARY_8: + return readStringFromChars(readByte()) + case TAGS.BINARY_20: + return readStringFromChars(readInt20()) + case TAGS.BINARY_32: + return readStringFromChars(readInt(4)) + case TAGS.JID_PAIR: + return readJidPair() + case TAGS.AD_JID: + return readAdJid() + case TAGS.HEX_8: + case TAGS.NIBBLE_8: + return readPacked8(tag) + default: + throw new Error('invalid string with tag: ' + tag) + } + } + + const readList = (tag: number) => { + const items: BinaryNode[] = [] + const size = readListSize(tag) + for(let i = 0;i < size;i++) { + items.push(decodeDecompressedBinaryNode(buffer, opts, indexRef)) + } + + return items + } + + const getTokenDouble = (index1: number, index2: number) => { + const dict = DOUBLE_BYTE_TOKENS[index1] + if(!dict) { + throw new Error(`Invalid double token dict (${index1})`) + } + + const value = dict[index2] + if(typeof value === 'undefined') { + throw new Error(`Invalid double token (${index2})`) + } + + return value + } + + const listSize = readListSize(readByte()) + const header = readString(readByte()) + if(!listSize || !header.length) { + throw new Error('invalid node') + } + + const attrs: BinaryNode['attrs'] = { } + let data: BinaryNode['content'] + if(listSize === 0 || !header) { + throw new Error('invalid node') + } + + // read the attributes in + const attributesLength = (listSize - 1) >> 1 + for(let i = 0; i < attributesLength; i++) { + const key = readString(readByte()) + const value = readString(readByte()) + + attrs[key] = value + } + + if(listSize % 2 === 0) { + const tag = readByte() + if(isListTag(tag)) { + data = readList(tag) + } else { + let decoded: Buffer | string + switch (tag) { + case TAGS.BINARY_8: + decoded = readBytes(readByte()) + break + case TAGS.BINARY_20: + decoded = readBytes(readInt20()) + break + case TAGS.BINARY_32: + decoded = readBytes(readInt(4)) + break + default: + decoded = readString(tag) + break + } + + data = decoded + } + } + + return { + tag: header, + attrs, + content: data + } +} + +export const decodeBinaryNode = (buff: Buffer): BinaryNode => { + const decompBuff = decompressingIfRequired(buff) + return decodeDecompressedBinaryNode(decompBuff, constants) +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/WABinary/encode.ts b/whatsapp_addon/Baileys/src/WABinary/encode.ts new file mode 100644 index 0000000..929c2a3 --- /dev/null +++ b/whatsapp_addon/Baileys/src/WABinary/encode.ts @@ -0,0 +1,236 @@ + +import * as constants from './constants' +import { FullJid, jidDecode } from './jid-utils' +import type { BinaryNode, BinaryNodeCodingOptions } from './types' + +export const encodeBinaryNode = ( + { tag, attrs, content }: BinaryNode, + opts: Pick = constants, + buffer: number[] = [0] +) => { + const { TAGS, TOKEN_MAP } = opts + + const pushByte = (value: number) => buffer.push(value & 0xff) + + const pushInt = (value: number, n: number, littleEndian = false) => { + for(let i = 0; i < n; i++) { + const curShift = littleEndian ? i : n - 1 - i + buffer.push((value >> (curShift * 8)) & 0xff) + } + } + + const pushBytes = (bytes: Uint8Array | Buffer | number[]) => ( + bytes.forEach (b => buffer.push(b)) + ) + const pushInt16 = (value: number) => { + pushBytes([(value >> 8) & 0xff, value & 0xff]) + } + + const pushInt20 = (value: number) => ( + pushBytes([(value >> 16) & 0x0f, (value >> 8) & 0xff, value & 0xff]) + ) + const writeByteLength = (length: number) => { + if(length >= 4294967296) { + throw new Error('string too large to encode: ' + length) + } + + if(length >= 1 << 20) { + pushByte(TAGS.BINARY_32) + pushInt(length, 4) // 32 bit integer + } else if(length >= 256) { + pushByte(TAGS.BINARY_20) + pushInt20(length) + } else { + pushByte(TAGS.BINARY_8) + pushByte(length) + } + } + + const writeStringRaw = (str: string) => { + const bytes = Buffer.from (str, 'utf-8') + writeByteLength(bytes.length) + pushBytes(bytes) + } + + const writeJid = ({ agent, device, user, server }: FullJid) => { + if(typeof agent !== 'undefined' || typeof device !== 'undefined') { + pushByte(TAGS.AD_JID) + pushByte(agent || 0) + pushByte(device || 0) + writeString(user) + } else { + pushByte(TAGS.JID_PAIR) + if(user.length) { + writeString(user) + } else { + pushByte(TAGS.LIST_EMPTY) + } + + writeString(server) + } + } + + const packNibble = (char: string) => { + switch (char) { + case '-': + return 10 + case '.': + return 11 + case '\0': + return 15 + default: + if(char >= '0' && char <= '9') { + return char.charCodeAt(0) - '0'.charCodeAt(0) + } + + throw new Error(`invalid byte for nibble "${char}"`) + } + } + + const packHex = (char: string) => { + if(char >= '0' && char <= '9') { + return char.charCodeAt(0) - '0'.charCodeAt(0) + } + + if(char >= 'A' && char <= 'F') { + return 10 + char.charCodeAt(0) - 'A'.charCodeAt(0) + } + + if(char >= 'a' && char <= 'f') { + return 10 + char.charCodeAt(0) - 'a'.charCodeAt(0) + } + + if(char === '\0') { + return 15 + } + + throw new Error(`Invalid hex char "${char}"`) + } + + const writePackedBytes = (str: string, type: 'nibble' | 'hex') => { + if(str.length > TAGS.PACKED_MAX) { + throw new Error('Too many bytes to pack') + } + + pushByte(type === 'nibble' ? TAGS.NIBBLE_8 : TAGS.HEX_8) + + let roundedLength = Math.ceil(str.length / 2.0) + if(str.length % 2 !== 0) { + roundedLength |= 128 + } + + pushByte(roundedLength) + const packFunction = type === 'nibble' ? packNibble : packHex + + const packBytePair = (v1: string, v2: string) => { + const result = (packFunction(v1) << 4) | packFunction(v2) + return result + } + + const strLengthHalf = Math.floor(str.length / 2) + for(let i = 0; i < strLengthHalf;i++) { + pushByte(packBytePair(str[2 * i], str[2 * i + 1])) + } + + if(str.length % 2 !== 0) { + pushByte(packBytePair(str[str.length - 1], '\x00')) + } + } + + const isNibble = (str: string) => { + if(str.length > TAGS.PACKED_MAX) { + return false + } + + for(let i = 0;i < str.length;i++) { + const char = str[i] + const isInNibbleRange = char >= '0' && char <= '9' + if(!isInNibbleRange && char !== '-' && char !== '.') { + return false + } + } + + return true + } + + const isHex = (str: string) => { + if(str.length > TAGS.PACKED_MAX) { + return false + } + + for(let i = 0;i < str.length;i++) { + const char = str[i] + const isInNibbleRange = char >= '0' && char <= '9' + if(!isInNibbleRange && !(char >= 'A' && char <= 'F') && !(char >= 'a' && char <= 'f')) { + return false + } + } + + return true + } + + const writeString = (str: string) => { + const tokenIndex = TOKEN_MAP[str] + if(tokenIndex) { + if(typeof tokenIndex.dict === 'number') { + pushByte(TAGS.DICTIONARY_0 + tokenIndex.dict) + } + + pushByte(tokenIndex.index) + } else if(isNibble(str)) { + writePackedBytes(str, 'nibble') + } else if(isHex(str)) { + writePackedBytes(str, 'hex') + } else if(str) { + const decodedJid = jidDecode(str) + if(decodedJid) { + writeJid(decodedJid) + } else { + writeStringRaw(str) + } + } + } + + const writeListStart = (listSize: number) => { + if(listSize === 0) { + pushByte(TAGS.LIST_EMPTY) + } else if(listSize < 256) { + pushBytes([TAGS.LIST_8, listSize]) + } else { + pushByte(TAGS.LIST_16) + pushInt16(listSize) + } + } + + const validAttributes = Object.keys(attrs).filter(k => ( + typeof attrs[k] !== 'undefined' && attrs[k] !== null + )) + + writeListStart(2 * validAttributes.length + 1 + (typeof content !== 'undefined' ? 1 : 0)) + writeString(tag) + + for(const key of validAttributes) { + if(typeof attrs[key] === 'string') { + writeString(key) + writeString(attrs[key]) + } + } + + if(typeof content === 'string') { + writeString(content) + } else if(Buffer.isBuffer(content) || content instanceof Uint8Array) { + writeByteLength(content.length) + pushBytes(content) + } else if(Array.isArray(content)) { + writeListStart(content.length) + for(const item of content) { + encodeBinaryNode(item, opts, buffer) + } + } else if(typeof content === 'undefined') { + // do nothing + } else { + throw new Error(`invalid children for header "${tag}": ${content} (${typeof content})`) + } + + return Buffer.from(buffer) +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/WABinary/generic-utils.ts b/whatsapp_addon/Baileys/src/WABinary/generic-utils.ts new file mode 100644 index 0000000..dd38620 --- /dev/null +++ b/whatsapp_addon/Baileys/src/WABinary/generic-utils.ts @@ -0,0 +1,90 @@ +import { Boom } from '@hapi/boom' +import { proto } from '../../WAProto' +import { BinaryNode } from './types' + +// some extra useful utilities + +export const getBinaryNodeChildren = (node: BinaryNode | undefined, childTag: string) => { + if(Array.isArray(node?.content)) { + return node!.content.filter(item => item.tag === childTag) + } + + return [] +} + +export const getAllBinaryNodeChildren = ({ content }: BinaryNode) => { + if(Array.isArray(content)) { + return content + } + + return [] +} + +export const getBinaryNodeChild = (node: BinaryNode | undefined, childTag: string) => { + if(Array.isArray(node?.content)) { + return node?.content.find(item => item.tag === childTag) + } +} + +export const getBinaryNodeChildBuffer = (node: BinaryNode | undefined, childTag: string) => { + const child = getBinaryNodeChild(node, childTag)?.content + if(Buffer.isBuffer(child) || child instanceof Uint8Array) { + return child + } +} + +export const getBinaryNodeChildString = (node: BinaryNode | undefined, childTag: string) => { + const child = getBinaryNodeChild(node, childTag)?.content + if(Buffer.isBuffer(child) || child instanceof Uint8Array) { + return Buffer.from(child).toString('utf-8') + } else if(typeof child === 'string') { + return child + } +} + +export const getBinaryNodeChildUInt = (node: BinaryNode, childTag: string, length: number) => { + const buff = getBinaryNodeChildBuffer(node, childTag) + if(buff) { + return bufferToUInt(buff, length) + } +} + +export const assertNodeErrorFree = (node: BinaryNode) => { + const errNode = getBinaryNodeChild(node, 'error') + if(errNode) { + throw new Boom(errNode.attrs.text || 'Unknown error', { data: +errNode.attrs.code }) + } +} + +export const reduceBinaryNodeToDictionary = (node: BinaryNode, tag: string) => { + const nodes = getBinaryNodeChildren(node, tag) + const dict = nodes.reduce( + (dict, { attrs }) => { + dict[attrs.name || attrs.config_code] = attrs.value || attrs.config_value + return dict + }, { } as { [_: string]: string } + ) + return dict +} + +export const getBinaryNodeMessages = ({ content }: BinaryNode) => { + const msgs: proto.WebMessageInfo[] = [] + if(Array.isArray(content)) { + for(const item of content) { + if(item.tag === 'message') { + msgs.push(proto.WebMessageInfo.decode(item.content as Buffer)) + } + } + } + + return msgs +} + +function bufferToUInt(e: Uint8Array | Buffer, t: number) { + let a = 0 + for(let i = 0; i < t; i++) { + a = 256 * a + e[i] + } + + return a +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/WABinary/index.ts b/whatsapp_addon/Baileys/src/WABinary/index.ts new file mode 100644 index 0000000..ecf0c9f --- /dev/null +++ b/whatsapp_addon/Baileys/src/WABinary/index.ts @@ -0,0 +1,5 @@ +export * from './encode' +export * from './decode' +export * from './generic-utils' +export * from './jid-utils' +export * from './types' \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/WABinary/jid-utils.ts b/whatsapp_addon/Baileys/src/WABinary/jid-utils.ts new file mode 100644 index 0000000..840f770 --- /dev/null +++ b/whatsapp_addon/Baileys/src/WABinary/jid-utils.ts @@ -0,0 +1,64 @@ +export const S_WHATSAPP_NET = '@s.whatsapp.net' +export const OFFICIAL_BIZ_JID = '16505361212@c.us' +export const SERVER_JID = 'server@c.us' +export const PSA_WID = '0@c.us' +export const STORIES_JID = 'status@broadcast' + +export type JidServer = 'c.us' | 'g.us' | 'broadcast' | 's.whatsapp.net' | 'call' + +export type JidWithDevice = { + user: string + device?: number +} + +export type FullJid = JidWithDevice & { + server: JidServer | string + agent?: number +} + +export const jidEncode = (user: string | number | null, server: JidServer, device?: number, agent?: number) => { + return `${user || ''}${!!agent ? `_${agent}` : ''}${!!device ? `:${device}` : ''}@${server}` +} + +export const jidDecode = (jid: string | undefined): FullJid | undefined => { + const sepIdx = typeof jid === 'string' ? jid.indexOf('@') : -1 + if(sepIdx < 0) { + return undefined + } + + const server = jid!.slice(sepIdx + 1) + const userCombined = jid!.slice(0, sepIdx) + + const [userAgent, device] = userCombined.split(':') + const [user, agent] = userAgent.split('_') + + return { + server, + user, + agent: agent ? +agent : undefined, + device: device ? +device : undefined + } +} + +/** is the jid a user */ +export const areJidsSameUser = (jid1: string | undefined, jid2: string | undefined) => ( + jidDecode(jid1)?.user === jidDecode(jid2)?.user +) +/** is the jid a user */ +export const isJidUser = (jid: string | undefined) => (jid?.endsWith('@s.whatsapp.net')) +/** is the jid a broadcast */ +export const isJidBroadcast = (jid: string | undefined) => (jid?.endsWith('@broadcast')) +/** is the jid a group */ +export const isJidGroup = (jid: string | undefined) => (jid?.endsWith('@g.us')) +/** is the jid the status broadcast */ +export const isJidStatusBroadcast = (jid: string) => jid === 'status@broadcast' + +export const jidNormalizedUser = (jid: string | undefined) => { + const result = jidDecode(jid) + if(!result) { + return '' + } + + const { user, server } = result + return jidEncode(user, server === 'c.us' ? 's.whatsapp.net' : server as JidServer) +} \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/WABinary/types.ts b/whatsapp_addon/Baileys/src/WABinary/types.ts new file mode 100644 index 0000000..dcc0ea2 --- /dev/null +++ b/whatsapp_addon/Baileys/src/WABinary/types.ts @@ -0,0 +1,17 @@ +import * as constants from './constants' +/** + * the binary node WA uses internally for communication + * + * this is manipulated soley as an object and it does not have any functions. + * This is done for easy serialization, to prevent running into issues with prototypes & + * to maintain functional code structure + * */ +export type BinaryNode = { + tag: string + attrs: { [key: string]: string } + content?: BinaryNode[] | string | Uint8Array +} +export type BinaryNodeAttributes = BinaryNode['attrs'] +export type BinaryNodeData = BinaryNode['content'] + +export type BinaryNodeCodingOptions = typeof constants \ No newline at end of file diff --git a/whatsapp_addon/Baileys/src/index.ts b/whatsapp_addon/Baileys/src/index.ts new file mode 100644 index 0000000..e9eed52 --- /dev/null +++ b/whatsapp_addon/Baileys/src/index.ts @@ -0,0 +1,12 @@ +import makeWASocket from './Socket' + +export * from '../WAProto' +export * from './Utils' +export * from './Types' +export * from './Store' +export * from './Defaults' +export * from './WABinary' + +export type WASocket = ReturnType + +export default makeWASocket \ No newline at end of file diff --git a/whatsapp_addon/Baileys/tsconfig.json b/whatsapp_addon/Baileys/tsconfig.json new file mode 100644 index 0000000..3f8dd8c --- /dev/null +++ b/whatsapp_addon/Baileys/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "es2018", + "module": "commonjs", + "experimentalDecorators": true, + "allowJs": false, + "checkJs": false, + "outDir": "lib", + "strict": false, + "strictNullChecks": true, + "skipLibCheck": true, + "noImplicitThis": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "lib": ["es2020", "esnext.array", "DOM"] + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules", "src/Tests/*", "src/Binary/GenerateStatics.ts"] +} diff --git a/whatsapp_addon/Baileys/typedoc.json b/whatsapp_addon/Baileys/typedoc.json new file mode 100644 index 0000000..5c7b1d1 --- /dev/null +++ b/whatsapp_addon/Baileys/typedoc.json @@ -0,0 +1,8 @@ +{ + "entryPoints": ["./src/index.ts"], + "excludePrivate": true, + "excludeProtected": true, + "excludeExternals": true, + "includeVersion": false, + "out": "docs" +} diff --git a/whatsapp_addon/Baileys/yarn.lock b/whatsapp_addon/Baileys/yarn.lock new file mode 100644 index 0000000..0b198ff --- /dev/null +++ b/whatsapp_addon/Baileys/yarn.lock @@ -0,0 +1,5181 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adiwajshing/eslint-config@git+https://github.com/adiwajshing/eslint-config": + version "1.0.0" + resolved "git+ssh://git@github.com/adiwajshing/eslint-config.git" + integrity sha512-HULNoC+LBV0TG/ckR7Tnd78ML7sxCk4v8trlFma7ATE5OsrpUhhwKqL5UFjyHMjiHfPrpFtlyy9r36f0XWkqew== + dependencies: + "@typescript-eslint/eslint-plugin" "^5.33.1" + "@typescript-eslint/parser" "^5.33.1" + eslint-plugin-react "^7.30.0" + eslint-plugin-simple-import-sort "^7.0.0" + +"@adiwajshing/keyed-db@^0.2.4": + version "0.2.4" + resolved "https://registry.npmjs.org/@adiwajshing/keyed-db/-/keyed-db-0.2.4.tgz" + integrity sha512-yprSnAtj80/VKuDqRcFFLDYltoNV8tChNwFfIgcf6PGD4sjzWIBgs08pRuTqGH5mk5wgL6PBRSsMCZqtZwzFEw== + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz" + integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.2" + "@babel/parser" "^7.18.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.2", "@babel/generator@^7.7.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== + dependencies: + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz" + integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz" + integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== + +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz" + integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== + +"@babel/helper-simple-access@^7.17.7": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz" + integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== + dependencies: + "@babel/types" "^7.18.2" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.18.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz" + integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": + version "7.18.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.3.tgz" + integrity sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.17.12" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz" + integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/runtime@^7.7.2": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz" + integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.7.2": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz" + integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.18.2" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz" + integrity sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@hapi/boom@^9.1.3": + version "9.1.4" + resolved "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/hoek@9.x.x": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jimp/bmp@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz" + integrity sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + bmp-js "^0.1.0" + +"@jimp/core@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz" + integrity sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + any-base "^1.1.0" + buffer "^5.2.0" + exif-parser "^0.1.12" + file-type "^9.0.0" + load-bmfont "^1.3.1" + mkdirp "^0.5.1" + phin "^2.9.1" + pixelmatch "^4.0.2" + tinycolor2 "^1.4.1" + +"@jimp/custom@^0.16.1", "@jimp/custom@>=0.3.5": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz" + integrity sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/core" "^0.16.1" + +"@jimp/gif@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz" + integrity sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + gifwrap "^0.9.2" + omggif "^1.0.9" + +"@jimp/jpeg@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz" + integrity sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + jpeg-js "0.4.2" + +"@jimp/plugin-blit@^0.16.1", "@jimp/plugin-blit@>=0.3.5": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz" + integrity sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-blur@^0.16.1", "@jimp/plugin-blur@>=0.3.5": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz" + integrity sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-circle@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz" + integrity sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-color@^0.16.1", "@jimp/plugin-color@>=0.8.0": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz" + integrity sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + tinycolor2 "^1.4.1" + +"@jimp/plugin-contain@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz" + integrity sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-cover@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz" + integrity sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-crop@^0.16.1", "@jimp/plugin-crop@>=0.3.5": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz" + integrity sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-displace@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz" + integrity sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-dither@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz" + integrity sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-fisheye@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz" + integrity sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-flip@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz" + integrity sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-gaussian@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz" + integrity sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-invert@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz" + integrity sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-mask@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz" + integrity sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-normalize@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz" + integrity sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-print@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz" + integrity sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + load-bmfont "^1.4.0" + +"@jimp/plugin-resize@^0.16.1", "@jimp/plugin-resize@>=0.3.5", "@jimp/plugin-resize@>=0.8.0": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz" + integrity sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-rotate@^0.16.1", "@jimp/plugin-rotate@>=0.3.5": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz" + integrity sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-scale@^0.16.1", "@jimp/plugin-scale@>=0.3.5": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz" + integrity sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-shadow@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz" + integrity sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugin-threshold@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz" + integrity sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + +"@jimp/plugins@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz" + integrity sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/plugin-blit" "^0.16.1" + "@jimp/plugin-blur" "^0.16.1" + "@jimp/plugin-circle" "^0.16.1" + "@jimp/plugin-color" "^0.16.1" + "@jimp/plugin-contain" "^0.16.1" + "@jimp/plugin-cover" "^0.16.1" + "@jimp/plugin-crop" "^0.16.1" + "@jimp/plugin-displace" "^0.16.1" + "@jimp/plugin-dither" "^0.16.1" + "@jimp/plugin-fisheye" "^0.16.1" + "@jimp/plugin-flip" "^0.16.1" + "@jimp/plugin-gaussian" "^0.16.1" + "@jimp/plugin-invert" "^0.16.1" + "@jimp/plugin-mask" "^0.16.1" + "@jimp/plugin-normalize" "^0.16.1" + "@jimp/plugin-print" "^0.16.1" + "@jimp/plugin-resize" "^0.16.1" + "@jimp/plugin-rotate" "^0.16.1" + "@jimp/plugin-scale" "^0.16.1" + "@jimp/plugin-shadow" "^0.16.1" + "@jimp/plugin-threshold" "^0.16.1" + timm "^1.6.1" + +"@jimp/png@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz" + integrity sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.16.1" + pngjs "^3.3.3" + +"@jimp/tiff@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz" + integrity sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ== + dependencies: + "@babel/runtime" "^7.7.2" + utif "^2.0.1" + +"@jimp/types@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz" + integrity sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/bmp" "^0.16.1" + "@jimp/gif" "^0.16.1" + "@jimp/jpeg" "^0.16.1" + "@jimp/png" "^0.16.1" + "@jimp/tiff" "^0.16.1" + timm "^1.6.1" + +"@jimp/utils@^0.16.1": + version "0.16.1" + resolved "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz" + integrity sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw== + dependencies: + "@babel/runtime" "^7.7.2" + regenerator-runtime "^0.13.3" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.1.19" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.17.1" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/got@^9.6.11": + version "9.6.12" + resolved "https://registry.npmjs.org/@types/got/-/got-9.6.12.tgz" + integrity sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + form-data "^2.5.0" + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^27.0.0", "@types/jest@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.5.1.tgz" + integrity sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/long@^4.0.0", "@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/node@*", "@types/node@^16.0.0", "@types/node@>=13.7.0": + version "16.11.38" + resolved "https://registry.npmjs.org/@types/node/-/node-16.11.38.tgz" + integrity sha512-hjO/0K140An3GWDw2HJfq7gko3wWeznbjXgg+rzPdVzhe198hp4x2i1dgveAOEiFKd8sOilAxzoSJiVv5P/CUg== + +"@types/node@^10.1.0": + version "10.17.60" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/node@16.9.1": + version "16.9.1" + resolved "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz" + integrity sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g== + +"@types/prettier@^2.1.5": + version "2.6.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz" + integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== + +"@types/sharp@^0.29.4": + version "0.29.5" + resolved "https://registry.npmjs.org/@types/sharp/-/sharp-0.29.5.tgz" + integrity sha512-3TC+S3H5RwnJmLYMHrcdfNjz/CaApKmujjY9b6PU/pE6n0qfooi99YqXGWoW8frU9EWYj/XTI35Pzxa+ThAZ5Q== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/ws@^8.0.0": + version "8.5.3" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz" + integrity sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ== + dependencies: + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/type-utils" "5.33.1" + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz" + integrity sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA== + dependencies: + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/typescript-estree" "5.33.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz" + integrity sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + +"@typescript-eslint/type-utils@5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz" + integrity sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g== + dependencies: + "@typescript-eslint/utils" "5.33.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz" + integrity sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ== + +"@typescript-eslint/typescript-estree@5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz" + integrity sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA== + dependencies: + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/visitor-keys" "5.33.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz" + integrity sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.33.1" + "@typescript-eslint/types" "5.33.1" + "@typescript-eslint/typescript-estree" "5.33.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.33.1": + version "5.33.1" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz" + integrity sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg== + dependencies: + "@typescript-eslint/types" "5.33.1" + eslint-visitor-keys "^3.3.0" + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-base@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz" + integrity sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg== + +anymatch@^3.0.3: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-includes@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flatmap@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz" + integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + +babel-jest@^27.5.1, "babel-jest@>=27.0.0 <28": + version "27.5.1" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bmp-js@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz" + integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.20.2: + version "4.20.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz" + integrity sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.2.0, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001332: + version "1.0.30001344" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz" + integrity sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@1.0.0-rc.11: + version "1.0.0-rc.11" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz" + integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + tslib "^2.4.0" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +ci-info@^3.2.0: + version "3.3.1" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz" + integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@2.x: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +combined-stream@^1.0.6, combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-type@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +curve25519-js@^0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/curve25519-js/-/curve25519-js-0.0.4.tgz" + integrity sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0, detect-libc@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +duplexify@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz" + integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== + dependencies: + end-of-stream "^1.4.1" + inherits "^2.0.3" + readable-stream "^3.1.1" + stream-shift "^1.0.0" + +electron-to-chromium@^1.4.118: + version "1.4.141" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz" + integrity sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-plugin-react@^7.30.0: + version "7.30.1" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz" + integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-plugin-simple-import-sort@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz" + integrity sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@*, "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", eslint@^8.0.0, eslint@>=5, eslint@>=5.0.0: + version "8.16.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz" + integrity sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exif-parser@^0.1.12: + version "0.1.12" + resolved "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz" + integrity sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw== + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.x: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-redact@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.1.tgz" + integrity sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-type@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz" + integrity sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw== + +file-type@16.5.3: + version "16.5.3" + resolved "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz" + integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A== + dependencies: + readable-web-to-node-stream "^3.0.0" + strtok3 "^6.2.4" + token-types "^4.1.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +follow-redirects@^1.14.4: + version "1.15.1" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +form-data@^2.5.0: + version "2.5.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +futoin-hkdf@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz" + integrity sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +gifwrap@^0.9.2: + version "0.9.4" + resolved "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz" + integrity sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ== + dependencies: + image-q "^4.0.0" + omggif "^1.0.10" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global@~4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.15.0: + version "13.15.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz" + integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +image-q@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz" + integrity sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw== + dependencies: + "@types/node" "16.9.1" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.4" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@*, jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^27.0.0, jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.0.0, jest@^27.0.6: + version "27.5.1" + resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +jimp@^0.16.1: + version "0.16.1" + resolved "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz" + integrity sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/custom" "^0.16.1" + "@jimp/plugins" "^0.16.1" + "@jimp/types" "^0.16.1" + regenerator-runtime "^0.13.3" + +jpeg-js@0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz" + integrity sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.1, json5@2.x: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +"libsignal@git+https://github.com/giuseppecastaldo/libsignal-node": + version "2.0.1" + resolved "git+ssh://git@github.com/giuseppecastaldo/libsignal-node.git#318cc9bda3c9a87ca4ac5eb8fb3799dbfc7ad260" + dependencies: + curve25519-js "^0.0.4" + protobufjs "6.8.8" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +link-preview-js@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/link-preview-js/-/link-preview-js-3.0.4.tgz" + integrity sha512-xsuxMigAZd4xmj6BIwMNuQjjpJdh0DWeIo1NXQgaoWSi9Z/dzz/Kxy6vzzsUonFlMTPJ1i0EC8aeOg/xrOMidg== + dependencies: + abort-controller "^3.0.0" + cheerio "1.0.0-rc.11" + cross-fetch "3.1.5" + url "0.11.0" + +load-bmfont@^1.3.1, load-bmfont@^1.4.0: + version "1.4.1" + resolved "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz" + integrity sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA== + dependencies: + buffer-equal "0.0.1" + mime "^1.3.4" + parse-bmfont-ascii "^1.0.3" + parse-bmfont-binary "^1.0.5" + parse-bmfont-xml "^1.1.4" + phin "^2.9.1" + xhr "^2.0.1" + xtend "^4.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1, make-error@1.x: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +marked@^4.0.12: + version "4.0.16" + resolved "https://registry.npmjs.org/marked/-/marked-4.0.16.tgz" + integrity sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^1.3.4: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.0" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz" + integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +music-metadata@^7.12.3: + version "7.12.3" + resolved "https://registry.npmjs.org/music-metadata/-/music-metadata-7.12.3.tgz" + integrity sha512-6pZngaroNxGBf8KZjE8reGZJiS533eJq7dBFsyoiEAZIORQAxmVVx20ABh9W2tsLT+5mKYyDzcNi5GuHf3jitg== + dependencies: + "@tokenizer/token" "^0.3.0" + content-type "^1.0.4" + debug "^4.3.4" + file-type "16.5.3" + media-typer "^1.1.0" + strtok3 "^6.3.0" + token-types "^4.2.0" + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-abi@^3.3.0: + version "3.22.0" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz" + integrity sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w== + dependencies: + semver "^7.3.5" + +node-addon-api@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz" + integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== + +node-cache@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz" + integrity sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg== + dependencies: + clone "2.x" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.1: + version "4.1.2" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2, object.assign@^4.1.3: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz" + integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.19.5" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +omggif@^1.0.10, omggif@^1.0.9: + version "1.0.10" + resolved "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz" + integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + +on-exit-leak-free@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz" + integrity sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@^1.0.5: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-bmfont-ascii@^1.0.3: + version "1.0.6" + resolved "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz" + integrity sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA== + +parse-bmfont-binary@^1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz" + integrity sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA== + +parse-bmfont-xml@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz" + integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ== + dependencies: + xml-parse-from-string "^1.0.0" + xml2js "^0.4.5" + +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz" + integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + dependencies: + entities "^4.4.0" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +peek-readable@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz" + integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg== + +phin@^2.9.1: + version "2.9.3" + resolved "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz" + integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pino-abstract-transport@v0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz" + integrity sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ== + dependencies: + duplexify "^4.1.2" + split2 "^4.0.0" + +pino-std-serializers@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz" + integrity sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q== + +pino@^7.0.0: + version "7.11.0" + resolved "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz" + integrity sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.0.0" + on-exit-leak-free "^0.2.0" + pino-abstract-transport v0.5.0 + pino-std-serializers "^4.0.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.1.0" + safe-stable-stringify "^2.1.0" + sonic-boom "^2.2.1" + thread-stream "^0.15.1" + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pixelmatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz" + integrity sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA== + dependencies: + pngjs "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pngjs@^3.0.0, pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +prebuild-install@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz" + integrity sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +pretty-format@^27.0.0, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +protobufjs@^6.11.3: + version "6.11.3" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz" + integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protobufjs@6.8.8: + version "6.8.8" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz" + integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +qrcode-terminal@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz" + integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-web-to-node-stream@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + +real-require@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz" + integrity sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg== + +regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.20.0: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-stable-stringify@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz" + integrity sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@7.x: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +sharp@^0.30.5: + version "0.30.5" + resolved "https://registry.npmjs.org/sharp/-/sharp-0.30.5.tgz" + integrity sha512-0T28KxqY4DzUMLSAp1/IhGVeHpPIQyp1xt7esmuXCAfyi/+6tYMUeRhQok+E/+E52Yk5yFjacXp90cQOkmkl4w== + dependencies: + color "^4.2.3" + detect-libc "^2.0.1" + node-addon-api "^5.0.0" + prebuild-install "^7.1.0" + semver "^7.3.7" + simple-get "^4.0.1" + tar-fs "^2.1.1" + tunnel-agent "^0.6.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shiki@^0.10.1: + version "0.10.1" + resolved "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz" + integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== + dependencies: + jsonc-parser "^3.0.0" + vscode-oniguruma "^1.6.1" + vscode-textmate "5.2.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0, simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sonic-boom@^2.2.1: + version "2.8.0" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz" + integrity sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg== + dependencies: + atomic-sleep "^1.0.0" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +split2@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^1.0.1, "string-width@^1.0.2 || 2 || 3 || 4": + version "1.0.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strtok3@^6.2.4, strtok3@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz" + integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^4.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tar-fs@^2.0.0, tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thread-stream@^0.15.1: + version "0.15.2" + resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz" + integrity sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA== + dependencies: + real-require "^0.1.0" + +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +timm@^1.6.1: + version "1.7.1" + resolved "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz" + integrity sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw== + +tinycolor2@^1.4.1: + version "1.4.2" + resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz" + integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +token-types@^4.1.1, token-types@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/token-types/-/token-types-4.2.0.tgz" + integrity sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-jest@^27.0.3: + version "27.1.5" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz" + integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-node@^10.8.1, ts-node@>=9.0.0: + version "10.8.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz" + integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedoc@^0.22.0: + version "0.22.15" + resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.22.15.tgz" + integrity sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q== + dependencies: + glob "^7.2.0" + lunr "^2.3.9" + marked "^4.0.12" + minimatch "^5.0.1" + shiki "^0.10.1" + +typescript@^4.0.0, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.8 <5.0", typescript@>=4, "typescript@4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x": + version "4.6.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +utif@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz" + integrity sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg== + dependencies: + pako "^1.0.5" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +vscode-oniguruma@^1.6.1: + version "1.6.2" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz" + integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== + +vscode-textmate@5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.4.6: + version "7.5.8" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz" + integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + +ws@^8.0.0: + version "8.7.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz" + integrity sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg== + +xhr@^2.0.1: + version "2.6.0" + resolved "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml-parse-from-string@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz" + integrity sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g== + +xml2js@^0.4.5: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^20.2.2, yargs-parser@20.x: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/whatsapp_addon/CHANGELOG.md b/whatsapp_addon/CHANGELOG.md index 2726aee..2f7d98d 100644 --- a/whatsapp_addon/CHANGELOG.md +++ b/whatsapp_addon/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.0 + +- Bug fixed. + ## 1.2.4 - Bug fixed. diff --git a/whatsapp_addon/Dockerfile b/whatsapp_addon/Dockerfile index 4891997..83683dc 100644 --- a/whatsapp_addon/Dockerfile +++ b/whatsapp_addon/Dockerfile @@ -7,7 +7,7 @@ COPY . / RUN chmod a+x /run.sh RUN chmod a+x /finish.sh -RUN cd / && npm install -f +RUN cd /Baileys && npm i -f && cd .. && npm install -f EXPOSE 3000 CMD [ "/run.sh" ] \ No newline at end of file diff --git a/whatsapp_addon/config.yaml b/whatsapp_addon/config.yaml index c1d8caf..c8721ea 100644 --- a/whatsapp_addon/config.yaml +++ b/whatsapp_addon/config.yaml @@ -1,5 +1,5 @@ name: Whatsapp -version: "1.2.4" +version: "1.3.0" slug: whatsapp_addon description: Whatsapp addon for send message from Home Assistant url: "https://github.com/giuseppecastaldo/ha-addons/tree/main/whatsapp_addon" diff --git a/whatsapp_addon/package.json b/whatsapp_addon/package.json index b14e3c4..7e1dfd7 100644 --- a/whatsapp_addon/package.json +++ b/whatsapp_addon/package.json @@ -1,6 +1,6 @@ { - "name": "whatsapp", - "version": "1.2.2", + "name": "whatsapp_hass_addon", + "version": "1.3.0", "description": "", "main": "index.js", "scripts": { @@ -10,7 +10,6 @@ "author": "Giuseppe Castaldo", "license": "ISC", "dependencies": { - "@adiwajshing/baileys": "github:adiwajshing/baileys", "axios": "^0.27.2", "body-parser": "^1.20.0", "cors": "^2.8.5", @@ -21,4 +20,4 @@ "pino": "^8.4.2", "qr-image": "^3.2.0" } -} +} \ No newline at end of file diff --git a/whatsapp_addon/utils/useFileAuthState.js b/whatsapp_addon/utils/useFileAuthState.js deleted file mode 100644 index df5ee83..0000000 --- a/whatsapp_addon/utils/useFileAuthState.js +++ /dev/null @@ -1,73 +0,0 @@ -const { - proto, - initAuthCreds, - BufferJSON -} = require("@adiwajshing/baileys"); -const fs = require('fs'); - -const KEY_MAP = { - 'pre-key': 'preKeys', - 'session': 'sessions', - 'sender-key': 'senderKeys', - 'app-state-sync-key': 'appStateSyncKeys', - 'app-state-sync-version': 'appStateVersions', - 'sender-key-memory': 'senderKeyMemory' -}; - -async function readFileAsync(filename) { - try { - return await fs.promises.readFile(filename, 'utf8'); - } catch (error) { - if (error.code === 'ENOENT') { - return null; - } - } -} - -async function writeToFileAsync(filename, text) { - await fs.promises.writeFile(filename, text, 'utf8'); -} - -const useFileAuthState = async (path) => { - const saved_data = await readFileAsync(path) - - let creds = saved_data != null ? JSON.parse(saved_data, BufferJSON.reviver).creds : initAuthCreds(); - let keys = saved_data != null ? JSON.parse(saved_data, BufferJSON.reviver).keys : {}; - - const saveState = () => { - writeToFileAsync(path, JSON.stringify({ creds, keys }, BufferJSON.replacer, 2)); - }; - - return { - state: { - creds, - keys: { - get: (type, ids) => { - const key = KEY_MAP[type]; - return ids.reduce((dict, id) => { - var _a; - let value = (_a = keys[key]) === null || _a === void 0 ? void 0 : _a[id]; - if (value) { - if (type === 'app-state-sync-key') { - value = proto.Message.AppStateSyncKeyData.fromObject(value); - } - dict[id] = value; - } - return dict; - }, {}); - }, - set: (data) => { - for (const _key in data) { - const key = KEY_MAP[_key]; - keys[key] = keys[key] || {}; - Object.assign(keys[key], data[_key]); - } - saveState(); - } - } - }, - saveState - }; -}; - -module.exports = useFileAuthState \ No newline at end of file diff --git a/whatsapp_addon/whatsapp.js b/whatsapp_addon/whatsapp.js index 729f961..3008bdf 100644 --- a/whatsapp_addon/whatsapp.js +++ b/whatsapp_addon/whatsapp.js @@ -1,10 +1,10 @@ const EventEmitter = require("eventemitter2"); -const makeWASocket = require("@adiwajshing/baileys").default; +const makeWASocket = require("./Baileys").default; const { DisconnectReason, -} = require("@adiwajshing/baileys"); -const useFileAuthState = require("./utils/useFileAuthState"); + useSingleFileAuthState +} = require("./Baileys"); const MessageType = { text: "conversation", @@ -48,7 +48,7 @@ class WhatsappClient extends EventEmitter { connect = async () => { if (this.#status.connected) return - const { state, saveState } = await useFileAuthState(this.#path) + const { state, saveState } = useSingleFileAuthState(this.#path) this.#conn = makeWASocket({ auth: state, @@ -169,7 +169,7 @@ class WhatsappClient extends EventEmitter { const statusCode = lastDisconnect?.error?.output?.statusCode if (statusCode === DisconnectReason.restartRequired) { - this.waitFor('ready').then(() => { + this.waitFor('ready').then(() => { setTimeout(() => { this.restart() }, 5000)

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%0Dowe`_W*$Z=O=^BK(F~& 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